changeset 12263:c626741871a0 release-3-4-x

Allow ui file function to work if gnuplot is the selected toolkit and fltk is available
author Kai Habel <kai.habel@gmx.de>
date Thu, 27 Jan 2011 17:58:19 +0100
parents b22c00315df5
children 9086df10c460
files scripts/ChangeLog scripts/plot/uigetdir.m scripts/plot/uigetfile.m scripts/plot/uiputfile.m src/ChangeLog src/DLD-FUNCTIONS/__fltk_uigetfile__.cc src/DLD-FUNCTIONS/__init_fltk__.cc src/DLD-FUNCTIONS/module-files
diffstat 8 files changed, 144 insertions(+), 102 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/ChangeLog
+++ b/scripts/ChangeLog
@@ -1,3 +1,8 @@
+2011-01-27  Kai Habel  <kai.habel@gmx.de>
+
+	* plot/uigetfile.m, plot/uiputfile.m, plot/uigetdir.m: Check
+	for __fltk_uigetfile__.
+
 2011-01-27  John W. Eaton  <jwe@octave.org>
 
 	* Makefile.am (check-missing-semicolon): New rule.
--- a/scripts/plot/uigetdir.m
+++ b/scripts/plot/uigetdir.m
@@ -33,11 +33,11 @@
     print_usage ();
   endif
 
-  if (!ischar(init_path) || !ischar(dialog_name))
+  if (!ischar (init_path) || !ischar (dialog_name))
     error ("uigetdir: INIT_PATH and DIALOG_NAME must be string arguments");
   endif
 
-  if (any (strcmp (available_graphics_toolkits (), "fltk")))
+  if (exist ("__fltk_uigetfile__") == 3)
       if (!isdir (init_path))
         init_path = fileparts (init_path);
       endif
--- a/scripts/plot/uigetfile.m
+++ b/scripts/plot/uigetfile.m
@@ -150,7 +150,7 @@
     error ("uigetfile: number of input arguments must be less than eight");
   endif
 
-  if (any (cellfun(@(x)strcmp (x, "fltk"), available_graphics_toolkits ())))
+  if (exist("__fltk_uigetfile__") == 3)
     [retfile, retpath, retindex] = __fltk_uigetfile__ (outargs{:});
   else
     error ("uigetfile: fltk graphics toolkit required");
--- a/scripts/plot/uiputfile.m
+++ b/scripts/plot/uiputfile.m
@@ -88,7 +88,7 @@
     error ("uiputfile: number of input arguments must be less than four");
   endif
 
-  if (any (cellfun(@(x)strcmp (x, "fltk"), available_graphics_toolkits ())))
+  if (exist("__fltk_uigetfile__") == 3)
     [retfile, retpath, retindex] = __fltk_uigetfile__ (outargs{:});
   else
     error ("uiputfile: fltk graphics toolkit required");
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,10 @@
+2011-01-27  Kai Habel  <kai.habel@gmx.de>
+
+	* DLD-FUNCTIONS/__init_fltk__.cc (__fltk_uigetfile__): Remove here.
+	* DLD-FUNCTIONS/__fltk_uigetfile__.cc: New file. 
+	* DLD-FUNCTIONS/module-files: Add __fltk_uigetfile__.cc.
+	Bug #32190.
+
 2011-01-27  John W. Eaton  <jwe@octave.org>
 
 	* DLD-FUNCTIONS/dlmread.cc (Fdlmread): Skip leading whitespace
new file mode 100644
--- /dev/null
+++ b/src/DLD-FUNCTIONS/__fltk_uigetfile__.cc
@@ -0,0 +1,127 @@
+/*
+
+Copyright (C) 2010-2011 Kai Habel
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, see
+<http://www.gnu.org/licenses/>.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#if defined (HAVE_FLTK)
+
+#include <FL/Fl.H>
+#include <Fl/Fl_File_Chooser.H>
+#include "defun-dld.h"
+#include "file-ops.h"
+
+
+DEFUN_DLD (__fltk_uigetfile__, args, ,
+  "-*- texinfo -*-\n\
+@deftypefn {Built-in Function} {} __fltk_uigetfile__ (@dots{})\n\
+Undocumented internal function.\n\
+@end deftypefn")
+{
+  
+  // Expected argument list
+  // args(0) ... FileFilter in fltk format
+  // args(1) ... Title
+  // args(2) ... Default Filename
+  // args(3) ... PostionValue [x,y]
+  // args(4) ... SelectValue "on"/"off"/"dir"/"create"
+
+  octave_value_list fargs, retval;
+
+  std::string file_filter = args(0).string_value();
+  std::string title = args(1).string_value();
+  std::string default_name = args(2).string_value();
+  Matrix pos = args(3).matrix_value();
+
+  int multi_type = Fl_File_Chooser::SINGLE;
+  std::string flabel = "Filename:";
+  
+  std::string multi = args(4).string_value();
+  if (multi == "on")
+    multi_type = Fl_File_Chooser::MULTI;
+  else if (multi == "dir")
+    {
+      multi_type = Fl_File_Chooser::DIRECTORY;
+      flabel = "Directory:";
+    }
+  else if (multi == "create")
+    multi_type = Fl_File_Chooser::CREATE;
+
+  Fl_File_Chooser::filename_label = flabel.c_str ();
+  Fl_File_Chooser *fc = new Fl_File_Chooser (default_name.c_str (), file_filter.c_str (), multi_type, title.c_str ());
+  fc->preview (0);
+
+  if (multi_type == Fl_File_Chooser::CREATE)
+    fc->ok_label ("Save");
+
+  fc->show ();
+
+  while (fc->shown ())
+    Fl::wait ();
+
+  retval(0) = octave_value(0);
+  retval(1) = octave_value(0);
+  retval(2) = octave_value(0);  
+
+  if (fc->value())
+    {
+      int file_count = fc->count ();
+      std::string fname;
+      std::string sep = file_ops::dir_sep_str ();
+      std::size_t idx;
+
+      if (file_count == 1 && multi_type != Fl_File_Chooser::DIRECTORY)
+        {
+          fname = fc->value ();
+          idx = fname.find_last_of (sep);
+          retval(0) = fname.substr (idx + 1);
+        }
+      else
+        {
+          Cell file_cell = Cell(file_count, 1);
+          for (octave_idx_type n = 1; n <= file_count; n++)
+            {
+              fname = fc->value (n);
+              idx = fname.find_last_of (sep);
+              file_cell(n - 1) = fname.substr (idx + 1);
+            }
+          retval(0) = file_cell;
+        }
+
+      if (multi_type == Fl_File_Chooser::DIRECTORY)
+        retval(0) = std::string (fc->value ());
+      else
+        {
+          retval(1) = std::string (fc->directory ()) + sep;
+          retval(2) = fc->filter_value ();
+        }
+    }
+
+  fc->hide ();
+  Fl::flush ();
+  delete fc;
+
+  return retval;
+}
+
+#endif
--- a/src/DLD-FUNCTIONS/__init_fltk__.cc
+++ b/src/DLD-FUNCTIONS/__init_fltk__.cc
@@ -2036,103 +2036,5 @@
   return octave_value(mode_str);
 }
 
-DEFUN_DLD (__fltk_uigetfile__, args, ,
-  "-*- texinfo -*-\n\
-@deftypefn {Built-in Function} {} __fltk_uigetfile__ (@dots{})\n\
-Undocumented internal function.\n\
-@end deftypefn")
-{
-  // This function should be called by uigetfile.m
-  // Error checking should be done in uigetfile.m!
-  //
-  // Expected argument list
-  // args(0) ... FileFilter in fltk format
-  // args(1) ... Title
-  // args(2) ... Default Filename
-  // args(3) ... PostionValue [x,y]
-  // args(4) ... SelectValue "on"/"off"/"dir"/"create"
-
-  std::string file_filter, title, default_name, multi;
-  if (args(0).is_string ())
-    file_filter = args(0).string_value();
-
-  if (args(1).is_string ())
-    title = args(1).string_value();
-
-  if (args(2).is_string ())
-    default_name = args(2).string_value();
-
-  if (args(3).is_real_matrix ())
-    Matrix pos = args(3).matrix_value();
-
-  int multi_type = Fl_File_Chooser::SINGLE;
-  std::string flabel = "Filename:";
-  if (args(4).is_string ())
-    {
-      multi = args(4).string_value();
-      if (multi == "on")
-        multi_type = Fl_File_Chooser::MULTI;
-      else if (multi == "dir")
-        {
-          multi_type = Fl_File_Chooser::DIRECTORY;
-          flabel = "Directory:";
-        }
-      else if (multi == "create")
-        multi_type = Fl_File_Chooser::CREATE;
-    }
-
-  Fl_File_Chooser::filename_label = flabel.c_str ();
-  Fl_File_Chooser *fc = new Fl_File_Chooser(default_name.c_str (), file_filter.c_str (), multi_type, title.c_str ());
-  fc->preview(0);
-
-  if (multi_type == Fl_File_Chooser::CREATE)
-    fc->ok_label("Save");
-
-  fc->show();
-  while (fc->shown ())
-        { Fl::wait (); }
-
-  octave_value_list fargs, retval;
-
-  retval(0) = octave_value(0);
-  retval(1) = octave_value(0);
-  retval(2) = octave_value(0);
-
-  if (fc->value() != NULL)
-    {
-      int file_count = fc->count ();
-      std::string fname;
-      std::string sep = file_ops::dir_sep_str ();
-      std::size_t idx;
-
-      if ((file_count == 1) && (multi_type != Fl_File_Chooser::DIRECTORY))
-        {
-          fname = fc->value ();
-          idx = fname.find_last_of(sep);
-          retval(0) = fname.substr(idx + 1);
-        }
-      else
-        {
-          Cell file_cell = Cell(file_count, 1);
-          for (octave_idx_type n = 1; n <= file_count; n++)
-            {
-              fname = fc->value (n);
-              idx = fname.find_last_of(sep);
-              file_cell(n - 1) = fname.substr(idx + 1);
-            }
-          retval(0) = file_cell;
-        }
-
-      if (multi_type == Fl_File_Chooser::DIRECTORY)
-        retval(0) = std::string(fc->value ());
-      else
-        {
-          retval(1) = std::string(fc->directory ()) + sep;
-          retval(2) = fc->filter_value();
-        }
-    }
-
-  return retval;
-}
 
 #endif
--- a/src/DLD-FUNCTIONS/module-files
+++ b/src/DLD-FUNCTIONS/module-files
@@ -2,6 +2,7 @@
 __delaunayn__.cc
 __dispatch__.cc
 __dsearchn__.cc
+__fltk_uigetfile__.cc
 __glpk__.cc
 __init_fltk__.cc
 __lin_interpn__.cc