# HG changeset patch # User Michael Goffioul # Date 1318520788 -3600 # Node ID 0f8ff98929b2af0aab6a0803170c8341a5ab0d28 # Parent d6118a2c0644cb362546307b2103e2c8c917aa67 Allow a toolkit to provide its own version of UI dialogs. * plot/modules.mk (plot_PRIVATE_FCN_FILES): Add __file_filter__.m, __is_function__.m, __uigetdir_fltk__.m, __uigetfile_fltk__.m, __uiputfile_fltk__.m. * plot/uigetdir.m: Rework to remove FLTK-specific stuffs and allow use of toolkit-provided dialogs. Fallback to FLTK dialogs. * plot/uigetfile.m: Likewise. * plot/uiputfile.m: Likewise. * plot/private/__fltk_file_filter__.m: Assumes input is now always a cell array of strings. * plot/private/__file_filter__.m: New file. * plot/private/__is_function__.m: Likewise. * plot/private/uigetdir_fltk__.m: Likewise. * plot/private/uigetfile_fltk__.m: Likewise. * plot/private/uiputfile_fltk__.m: Likewise. diff -r d6118a2c0644 -r 0f8ff98929b2 scripts/plot/module.mk --- a/scripts/plot/module.mk Thu Oct 13 11:05:30 2011 -0400 +++ b/scripts/plot/module.mk Thu Oct 13 16:46:28 2011 +0100 @@ -19,6 +19,7 @@ plot/private/__errcomm__.m \ plot/private/__errplot__.m \ plot/private/__ezplot__.m \ + plot/private/__file_filter__.m \ plot/private/__fltk_file_filter__.m \ plot/private/__fltk_ginput__.m \ plot/private/__fltk_print__.m \ @@ -34,6 +35,7 @@ plot/private/__go_draw_axes__.m \ plot/private/__go_draw_figure__.m \ plot/private/__interp_cube__.m \ + plot/private/__is_function__.m \ plot/private/__line__.m \ plot/private/__marching_cube__.m \ plot/private/__next_line_color__.m \ @@ -47,6 +49,9 @@ plot/private/__scatter__.m \ plot/private/__stem__.m \ plot/private/__tight_eps_bbox__.m \ + plot/private/__uigetdir_fltk__.m \ + plot/private/__uigetfile_fltk__.m \ + plot/private/__uiputfile_fltk__.m \ plot/private/__uiobject_split_args__.m plot_FCN_FILES = \ diff -r d6118a2c0644 -r 0f8ff98929b2 scripts/plot/private/__file_filter__.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/plot/private/__file_filter__.m Thu Oct 13 16:46:28 2011 +0100 @@ -0,0 +1,93 @@ +## 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 +## . + +## -*- texinfo -*- +## @deftypefn {Function File} {} __file_filter__ (@var{file_filter}) +## Undocumented internal function. +## @end deftypefn + +## Author: Kai Habel + +function [retval, defname, defdir] = __file_filter__ (file_filter, name) + + revtal = {}; + defname = ""; + defdir = ""; + + if (iscell (file_filter)) + [r, c] = size (file_filter); + if (c != 1 && c != 2) + error ("%s: invalid filter specification", name); + endif + if (c == 1) + retval = cell (r, 2); + for i = 1:r + retval{i, 1} = file_filter{i}; + retval{i, 2} = __default_filtername__ (file_filter{i}); + endfor + else + retval = file_filter; + for i = 1:r + if (isempty (retval{i, 2})) + retval{i, 2} = __default_filtername__ (retval{i, 1}); + endif + endfor + endif + elseif (ischar (file_filter)) + [defdir, fname, fext] = fileparts (file_filter); + if (! strcmp (fname, "*")) + defname = strcat (fname, fext); + endif + if (length (fext) > 0) + fext = strcat ("*", fext); + retval = {fext, __default_filtername__(fext)}; + endif + endif + + retval(end+1,:) = {"*", __default_filtername__("*")}; + +endfunction + +function name = __default_filtername__ (filterext) + + name = ""; + + switch (filterext) + case "*" + name = "All Files"; + case "*.m" + name = "Octave Source Files"; + case "*.c" + name = "C Source Files"; + case {"*.cc" "*.c++" "*.cpp"} + name = "C++ Source Files"; + case "*.oct" + name = "Octave Compiled Files"; + endswitch + + if (isempty (name)) + extlist = strsplit(filterext, ";"); + extlist = strrep (extlist, "*.", ""); + extlist = toupper (extlist); + extlist(end+1, :) = repmat ({","}, 1, length (extlist)); + extlist = strcat (extlist{:}); + extlist = extlist(1:end-1); + name = strcat (extlist, "-Files"); + endif + +endfunction diff -r d6118a2c0644 -r 0f8ff98929b2 scripts/plot/private/__fltk_file_filter__.m --- a/scripts/plot/private/__fltk_file_filter__.m Thu Oct 13 11:05:30 2011 -0400 +++ b/scripts/plot/private/__fltk_file_filter__.m Thu Oct 13 16:46:28 2011 +0100 @@ -1,4 +1,4 @@ -## Copyright (C) 2010-2011 Kai Habel +## Copyright (C) 2011 Michael Goffioul ## ## This file is part of Octave. ## @@ -17,56 +17,48 @@ ## . ## -*- texinfo -*- -## @deftypefn {Function File} {} __fltk_file_filter__ (@var{file_filter}) +## @deftypefn {Function File} {@var{filterspec} =} __fltk_file_filter__ (@var{filter}) ## Undocumented internal function. ## @end deftypefn -## Author: Kai Habel +## Author: Michael Goffioul function retval = __fltk_file_filter__ (file_filter) - # converts octave's file filter format into fltk's. - retval = ""; - if (iscell (file_filter)) - [r, c] = size (file_filter); - if ((c == 0) || (c > 2)) - error ("expecting 1 or to 2 columns for file filter cell"); - endif - fltk_str = ""; - for idx = 1 : r - curr_ext = file_filter{idx, 1}; - curr_ext = strsplit (curr_ext, ";"); + retval = ""; + [r, c] = size (file_filter); + if ((c == 0) || (c > 2)) + error ("expecting 1 or to 2 columns for file filter cell"); + endif + fltk_str = ""; + for idx = 1 : r - if (length (curr_ext) > 1) - curr_ext = regexprep (curr_ext, '\*\.', ','); - curr_ext = strcat (curr_ext{:})(2 : end); - curr_ext = strcat ("*.{", curr_ext, "}"); - else - curr_ext = curr_ext{:}; - endif - - curr_desc = strcat (curr_ext(3:end), "-Files"); + curr_ext = file_filter{idx, 1}; + curr_ext = strsplit (curr_ext, ";"); - if (c == 2) - curr_desc = file_filter{idx, 2}; - curr_desc = regexprep (curr_desc, '\(', '<'); - curr_desc = regexprep (curr_desc, '\)', '>'); - endif + if (length (curr_ext) > 1) + curr_ext = regexprep (curr_ext, '\*\.', ','); + curr_ext = strcat (curr_ext{:})(2 : end); + curr_ext = strcat ("*.{", curr_ext, "}"); + else + curr_ext = curr_ext{:}; + endif - if (length (fltk_str) > 0) - fltk_str = strcat (fltk_str, "\t", curr_desc, " (", curr_ext, ")"); - else - fltk_str = strcat (curr_desc, " (", curr_ext, ")"); - endif + curr_desc = strcat (curr_ext(3:end), "-Files"); - endfor - retval = fltk_str; - elseif (ischar (file_filter)) - if (!isdir (file_filter)) - [fdir, fname, fext] = fileparts (file_filter); - if (length (fext) > 0) - retval = strcat ("*", fext, "\t*"); - endif + if (c == 2) + curr_desc = file_filter{idx, 2}; + curr_desc = regexprep (curr_desc, '\(', '<'); + curr_desc = regexprep (curr_desc, '\)', '>'); endif - endif + + if (length (fltk_str) > 0) + fltk_str = strcat (fltk_str, "\t", curr_desc, " (", curr_ext, ")"); + else + fltk_str = strcat (curr_desc, " (", curr_ext, ")"); + endif + + endfor + retval = fltk_str; + endfunction diff -r d6118a2c0644 -r 0f8ff98929b2 scripts/plot/private/__is_function__.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/plot/private/__is_function__.m Thu Oct 13 16:46:28 2011 +0100 @@ -0,0 +1,31 @@ +## Copyright (C) 2011 Michael Goffioul +## +## 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 +## . + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{result} =} __is_function__ (@var{func}) +## Undocumented internal function. +## @end deftypefn + +## Author: Michael Goffioul + +function result = __is_function__ (func) + + existval = exist (func); + result = (existval == 2 || existval == 3 || existval == 5 || existval == 6); + +endfunction diff -r d6118a2c0644 -r 0f8ff98929b2 scripts/plot/private/__uigetdir_fltk__.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/plot/private/__uigetdir_fltk__.m Thu Oct 13 16:46:28 2011 +0100 @@ -0,0 +1,34 @@ +## Copyright (C) 2011 Michael Goffioul +## +## 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 +## . + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{dirname} =} __uigetdir_fltk__ (@var{start_path}, @var{dialog_title}) +## Undocumented internal function. +## @end deftypefn + +## Author: Michael Goffioul + +function dirname = __uigetdir_fltk__ (start_path, dialog_title) + + if (exist("__fltk_uigetfile__") != 3) + error ("uigetdir: fltk graphics toolkit required"); + endif + + dirname = __fltk_uigetfile__ ("", dialog_title, start_path, [240, 120], "dir"); + +endfunction diff -r d6118a2c0644 -r 0f8ff98929b2 scripts/plot/private/__uigetfile_fltk__.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/plot/private/__uigetfile_fltk__.m Thu Oct 13 16:46:28 2011 +0100 @@ -0,0 +1,38 @@ +## Copyright (C) 2011 Michael Goffioul +## +## 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 +## . + +## -*- texinfo -*- +## @deftypefn {Function File} {[@var{fname}, @var{fpath}, @var{fltidx}] =} __uigetfile_fltk__ () +## Undocumented internal function. +## @end deftypefn + +## Author: Michael Goffioul + +function [retval, retpath, retindex] = __uigetfile_fltk__ (filters, title, defval, position, multiselect, defdir) + + if (exist("__fltk_uigetfile__") != 3) + error ("uigetfile: fltk graphics toolkit required"); + endif + + filters = __fltk_file_filter__ (filters); + if (length (defdir) > 0) + defval = fullfile (defdir, defval); + endif + [retval, retpath, retindex] = __fltk_uigetfile__ (filters, title, defval, position, multiselect); + +endfunction diff -r d6118a2c0644 -r 0f8ff98929b2 scripts/plot/private/__uiobject_split_args__.m diff -r d6118a2c0644 -r 0f8ff98929b2 scripts/plot/private/__uiputfile_fltk__.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/plot/private/__uiputfile_fltk__.m Thu Oct 13 16:46:28 2011 +0100 @@ -0,0 +1,38 @@ +## Copyright (C) 2011 Michael Goffioul +## +## 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 +## . + +## -*- texinfo -*- +## @deftypefn {Function File} {[@var{fname}, @var{fpath}, @var{fltidx}] =} __uiputfile_fltk__ () +## Undocumented internal function. +## @end deftypefn + +## Author: Michael Goffioul + +function [retval, retpath, retindex] = __uiputfile_fltk__ (filters, title, defval, position, tag, defdir) + + if (exist("__fltk_uigetfile__") != 3) + error ("uiputfile: fltk graphics toolkit required"); + endif + + filters = __fltk_file_filter__ (filters); + if (length (defdir) > 0) + defval = fullfile (defdir, defval); + endif + [retval, retpath, retindex] = __fltk_uigetfile__ (filters, title, defval, position, tag); + +endfunction diff -r d6118a2c0644 -r 0f8ff98929b2 scripts/plot/uigetdir.m --- a/scripts/plot/uigetdir.m Thu Oct 13 11:05:30 2011 -0400 +++ b/scripts/plot/uigetdir.m Thu Oct 13 16:46:28 2011 +0100 @@ -28,10 +28,19 @@ ## Author: Kai Habel -function dirname = uigetdir (init_path = pwd, dialog_name = "Choose directory?") +function dirname = uigetdir (init_path = pwd, dialog_name = "Select Directory to Open") - if (exist("__fltk_uigetfile__") != 3) - error ("uigetfile: fltk graphics toolkit required"); + defaulttoolkit = get (0, "defaultfigure__graphics_toolkit__"); + funcname = ["__uigetdir_", defaulttoolkit, "__"]; + functype = exist (funcname); + if (! __is_function__ (funcname)) + funcname = "__uigetdir_fltk__"; + if (! __is_function__ (funcname)) + error ("uigetdir: fltk graphics toolkit required"); + elseif (! strcmp (defaulttoolkit, "gnuplot")) + warning ("uigetdir: no implementation for toolkit `%s', using `fltk' instead", + defaulttoolkit); + endif endif if (nargin > 2) @@ -45,7 +54,7 @@ if (!isdir (init_path)) init_path = fileparts (init_path); endif - dirname = __fltk_uigetfile__ ("", dialog_name, init_path, [240, 120], "dir"); + dirname = feval (funcname, init_path, dialog_name); endfunction diff -r d6118a2c0644 -r 0f8ff98929b2 scripts/plot/uigetfile.m --- a/scripts/plot/uigetfile.m Thu Oct 13 11:05:30 2011 -0400 +++ b/scripts/plot/uigetfile.m Thu Oct 13 16:46:28 2011 +0100 @@ -64,22 +64,32 @@ function [retfile, retpath, retindex] = uigetfile (varargin) - if (exist("__fltk_uigetfile__") != 3) - error ("uigetfile: fltk graphics toolkit required"); + defaulttoolkit = get (0, "defaultfigure__graphics_toolkit__"); + funcname = ["__uigetfile_", defaulttoolkit, "__"]; + functype = exist (funcname); + if (! __is_function__ (funcname)) + funcname = "__uigetfile_fltk__"; + if (! __is_function__ (funcname)) + error ("uigetfile: fltk graphics toolkit required"); + elseif (! strcmp (defaulttoolkit, "gnuplot")) + warning ("uigetfile: no implementation for toolkit `%s', using `fltk' instead", + defaulttoolkit); + endif endif if (nargin > 7) error ("uigetfile: number of input arguments must be less than eight"); endif - defaultvals = {"All Files(*)", #FLTK File Filter - "Open File?", #Dialog Title - pwd, #FLTK default file name - [240, 120], #Dialog Position (pixel x/y) - "off"}; #MultiSelect on/off + defaultvals = {cell(0, 2), # File Filter + "Open File", # Dialog Title + "", # Default file name + [240, 120], # Dialog Position (pixel x/y) + "off", # MultiSelect on/off + pwd}; # Default directory - outargs = cell (5, 1); - for i = 1 : 5 + outargs = cell (6, 1); + for i = 1 : 6 outargs{i} = defaultvals{i}; endfor @@ -88,9 +98,9 @@ for i = 1 : length (varargin) val = varargin{i}; if (ischar (val)) - if (strncmp (tolower (val), "multiselect", 11)) + if (strncmpi (val, "multiselect", 11)) idx1 = i; - elseif (strncmp(tolower (val), "position", 8)) + elseif (strncmpi (val, "position", 8)) idx2 = i; endif endif @@ -110,18 +120,36 @@ len = length (args); if (len > 0) file_filter = args{1}; - outargs{1} = __fltk_file_filter__ (file_filter); - if (ischar (file_filter)) - outargs{3} = file_filter; + [outargs{1}, outargs{3}, defdir] = __file_filter__ (file_filter); + if (length (defdir) > 0) + outargs{6} = defdir; + endif + else + outargs{1} = __file_filter__ (outargs{1}); + endif + + if (len > 1) + if (ischar (args{2})) + if (length (args{2}) > 0) + outargs{2} = args{2}; + endif + elseif (! isempty (args{2})) + print_usage (); endif endif - if (len > 1) - outargs{2} = args{2}; - endif - if (len > 2) - outargs{3} = args{3}; + if (ischar (args{3})) + [fdir, fname, fext] = fileparts (args{3}); + if (length (fdir) > 0) + outargs{6} = fdir; + endif + if (length (fname) > 0 || length (fext) > 0) + outargs{3} = strcat (fname, fext); + endif + elseif (! isempty (args{3})) + print_usage (); + endif endif if (stridx) @@ -153,7 +181,7 @@ endfor endif - [retfile, retpath, retindex] = __fltk_uigetfile__ (outargs{:}); + [retfile, retpath, retindex] = feval (funcname, outargs{:}); endfunction diff -r d6118a2c0644 -r 0f8ff98929b2 scripts/plot/uiputfile.m --- a/scripts/plot/uiputfile.m Thu Oct 13 11:05:30 2011 -0400 +++ b/scripts/plot/uiputfile.m Thu Oct 13 16:46:28 2011 +0100 @@ -55,42 +55,68 @@ function [retfile, retpath, retindex] = uiputfile (varargin) - if (exist("__fltk_uigetfile__") != 3) - error ("uiputfile: fltk graphics toolkit required"); + defaulttoolkit = get (0, "defaultfigure__graphics_toolkit__"); + funcname = ["__uiputfile_", defaulttoolkit, "__"]; + functype = exist (funcname); + if (! __is_function__ (funcname)) + funcname = "__uiputfile_fltk__"; + if (! __is_function__ (funcname)) + error ("uiputfile: fltk graphics toolkit required"); + elseif (! strcmp (defaulttoolkit, "gnuplot")) + warning ("uiputfile: no implementation for toolkit `%s', using `fltk' instead", + defaulttoolkit); + endif endif if (nargin > 3) print_usage (); endif - defaultvals = {"All Files(*)", #FLTK File Filter - "Save File?", #Dialog Title - pwd, #FLTK default file name - [240, 120], #Dialog Position (pixel x/y) - "create"}; + defaultvals = {cell(0, 2), # File Filter + "Save File", # Dialog Title + "", # Default file name + [240, 120], # Dialog Position (pixel x/y) + "create", + pwd}; # Default directory - outargs = cell(5, 1); - for i = 1 : 5 + outargs = cell(6, 1); + for i = 1 : 6 outargs{i} = defaultvals{i}; endfor if (nargin > 0) file_filter = varargin{1}; - outargs{1} = __fltk_file_filter__ (file_filter); - if (ischar (file_filter)) - outargs{3} = file_filter; + [outargs{1}, outargs{3}, defdir] = __file_filter__ (file_filter); + if (length (defdir) > 0) + outargs{6} = defdir; endif + else + outargs{1} = __file_filter__ (outargs{1}); endif if (nargin > 1) - outargs{2} = varargin{2}; + if (ischar (varargin{2})) + outargs{2} = varargin{2}; + elseif (! isempty (varargin{2})) + print_usage (); + endif endif if (nargin > 2) - outargs{3} = varargin{3}; + if (ischar (varargin{3})) + [fdir, fname, fext] = fileparts (varargin{3}); + if (! isempty (fdir)) + outargs{6} = fdir; + endif + if (! isempty (fname) || ! isempty (fext)) + outargs{3} = strcat (fname, fext); + endif + elseif (! isempty (varargin{3})) + print_usage (); + endif endif - [retfile, retpath, retindex] = __fltk_uigetfile__ (outargs{:}); + [retfile, retpath, retindex] = feval (funcname, outargs{:}); endfunction