changeset 21843:f7a57b07c81d

Overhaul uigetfile, uiputfile, __file_filter__ (bug #48183). * uiputfile.m: Call __file_filter__ using "uiputfile" as caller arg. Use strcmp to check for exact match for empty '.' extension. * uigetfile.m: Simplify input validation by using strcmpi, and getting rid of for loop. Call __file_filter__ using "uigetfile" as caller arg. Use isempty() rather than checking for length() > 0. Echo unknown argument in error message so user knows what it was. * __file_filter__.m: Accept first input which is the function which called __file_filter__. Use 'caller' in any error messages. Allow an empty input.
author Rik <rik@octave.org>
date Wed, 08 Jun 2016 21:30:49 -0700
parents 7da4671f3a5b
children c0a552e71ceb
files scripts/gui/private/__file_filter__.m scripts/gui/uigetfile.m scripts/gui/uiputfile.m
diffstat 3 files changed, 40 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/gui/private/__file_filter__.m	Tue Jun 07 01:09:08 2016 -0500
+++ b/scripts/gui/private/__file_filter__.m	Wed Jun 08 21:30:49 2016 -0700
@@ -17,22 +17,25 @@
 ## <http://www.gnu.org/licenses/>.
 
 ## -*- texinfo -*-
-## @deftypefn {} {} __file_filter__ (@var{file_filter})
+## @deftypefn {} {} __file_filter__ (@var{caller}, @var{file_filter})
 ## Undocumented internal function.
 ## @end deftypefn
 
 ## Author: Kai Habel
 
-function [retval, defname, defdir] = __file_filter__ (file_filter, name)
+function [retval, defname, defdir] = __file_filter__ (caller, file_filter)
 
+  #keyboard;
   revtal = {};
   defname = "";
   defdir = "";
 
-  if (iscell (file_filter))
+  if (nargin == 1 || isempty (file_filter))
+    ## Do nothing, and just add default pattern.
+  elseif (iscell (file_filter))
     [r, c] = size (file_filter);
     if (c != 1 && c != 2)
-      error ("%s: invalid filter specification", name);
+      error ("%s: invalid filter specification", caller);
     endif
     if (c == 1)
       retval = cell (r, 2);
@@ -53,12 +56,14 @@
     if (! strcmp (fname, "*"))
       defname = [fname, fext];
     endif
-    if ((length (fext) > 0) && (! strcmp (fext, ".*")))
+    if (! isempty (fext))
       fext = ["*" fext];
       retval = {fext, __default_filtername__(fext)};
     endif
   endif
 
+  ## Delete any "*.*" pattern, and add "* All Files"
+  retval(strcmp (retval(1,:), "*.*"), :) = [];
   retval(end+1,:) = {"*", __default_filtername__("*")};
 
 endfunction
--- a/scripts/gui/uigetfile.m	Tue Jun 07 01:09:08 2016 -0500
+++ b/scripts/gui/uigetfile.m	Wed Jun 08 21:30:49 2016 -0700
@@ -81,44 +81,32 @@
              pwd};               # Default directory
 
   idx1 = idx2 = [];
-  if (length (varargin) > 0)
-    for i = 1 : length (varargin)
-      val = varargin{i};
-      if (ischar (val))
-        val = tolower (val);
-        if (strcmp (val, "multiselect"))
-          idx1 = i;
-        elseif (strcmp (val, "position"))
-          idx2 = i;
-        endif
-      endif
-    endfor
+  has_opts = false;
+  if (nargin > 0)
+    idx1 = find (strcmpi (varargin, "multiselect"), 1);
+    idx2 = find (strcmpi (varargin, "position"), 1);
+    if (idx1 || idx2)
+      has_opts = true;
+    endif
   endif
 
-  stridx = [idx1, idx2, 0];
-  if (length (stridx) > 1)
-    stridx = min (stridx(1 : end - 1));
-  endif
+  optidx = min ([idx1, idx2, nargin+1]);
+
+  args = varargin(1:optidx-1);
 
-  args = varargin;
-  if (stridx)
-    args = varargin(1 : stridx - 1);
-  endif
-
-  len = length (args);
+  len = numel (args);
   if (len > 0)
-    file_filter = args{1};
-    [outargs{1}, outargs{3}, defdir] = __file_filter__ (file_filter);
-    if (length (defdir) > 0)
+    [outargs{1}, outargs{3}, defdir] = __file_filter__ ("uigetfile", args{1});
+    if (! isempty (defdir))
       outargs{6} = defdir;
     endif
   else
-    outargs{1} = __file_filter__ (outargs{1});
+    outargs{1} = __file_filter__ ("uigetfile", outargs{1});
   endif
 
   if (len > 1)
     if (ischar (args{2}))
-      if (length (args{2}) > 0)
+      if (! isempty (args{2}))
         outargs{2} = args{2};
       endif
     elseif (! isempty (args{2}))
@@ -134,10 +122,10 @@
       else
         [fdir, fname, fext] = fileparts (varargin{3});
       endif
-      if (length (fdir) > 0)
+      if (! isempty (fdir))
         outargs{6} = fdir;
       endif
-      if (length (fname) > 0 || length (fext) > 0)
+      if (! isempty (fname) || ! isempty (fext))
         outargs{3} = [fname fext];
       endif
     elseif (! isempty (args{3}))
@@ -145,31 +133,29 @@
     endif
   endif
 
-  if (stridx)
+  if (has_opts)
     ## string arguments ("position" or "multiselect")
 
     ## check for even number of remaining arguments, prop/value pair(s)
-    if (rem (nargin - stridx + 1, 2))
+    if (rem (nargin - optidx + 1, 2))
       error ("uigetfile: PROPERTY/VALUE arguments must occur in pairs");
     endif
 
-    for i = stridx : 2 : nargin
+    for i = optidx : 2 : nargin
       prop = varargin{i};
       val = varargin{i + 1};
       if (strcmpi (prop, "position"))
-        if (isnumeric (val) && length (val) == 2)
-          outargs{4} = val;
-        else
+        if (! isnumeric (val) || length (val) != 2)
           error ('uigetfile: "Position" must be a 2-element vector');
         endif
+        outargs{4} = val;
       elseif (strcmpi (prop, "multiselect"))
-        if (ischar (val))
-          outargs{5} = tolower (val);
-        else
+        if (! ischar (val))
           error ('uigetfile: MultiSelect value must be a string ("on"/"off")');
         endif
+        outargs{5} = tolower (val);
       else
-        error ("uigetfile: unknown argument");
+        error ("uigetfile: unknown argument '%s'", prop);
       endif
     endfor
   endif
--- a/scripts/gui/uiputfile.m	Tue Jun 07 01:09:08 2016 -0500
+++ b/scripts/gui/uiputfile.m	Wed Jun 08 21:30:49 2016 -0700
@@ -71,13 +71,13 @@
              pwd};           # Default directory
 
   if (nargin > 0)
-    file_filter = varargin{1};
-    [outargs{1}, outargs{3}, defdir] = __file_filter__ (file_filter);
-    if (length (defdir) > 0)
+    [outargs{1}, outargs{3}, defdir] = __file_filter__ ("uiputfile",
+                                                        varargin{1});
+    if (! isempty (defdir))
       outargs{6} = defdir;
     endif
   else
-    outargs{1} = __file_filter__ (outargs{1});
+    outargs{1} = __file_filter__ ("uiputfile", outargs{1});
   endif
 
   if (nargin > 1)
@@ -120,7 +120,7 @@
     if (isempty (ext))
       ext = outargs{1}{retindex};
       ext = strrep (ext, "*", "");
-      if (ext != '.')
+      if (! strcmp (ext, '.'))
         [~, ~, ext] = fileparts (ext);  # paranoid checking of extension
         retfile = [retfile ext];
       endif