# HG changeset patch # User jwe # Date 1188583080 0 # Node ID 05f6f120a65f5bc3758c43d50b89258634f6e175 # Parent 9398f6a81bdf84611836bc639824bddebb27a412 [project @ 2007-08-31 17:58:00 by jwe] diff --git a/scripts/ChangeLog b/scripts/ChangeLog --- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,12 @@ +2007-08-31 Michael goffioul + + * plot/axes.m: Allow parent to be specified when creating axes + objects. Support non-figure parents. + +2007-08-31 John W. Eaton + + * plot/ancestor.m: New function, adapted from Octave Forge. + 2007-08-31 Søren Hauberg * polynomial/polygcd.m: Better layout of example. diff --git a/scripts/plot/ancestor.m b/scripts/plot/ancestor.m new file mode 100644 --- /dev/null +++ b/scripts/plot/ancestor.m @@ -0,0 +1,69 @@ +## Copyright (C) 2007 Michael Goffioul +## +## This program 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 2 of the License, or +## (at your option) any later version. +## +## This program 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 this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +## 02110-1301 USA + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{parent} =} ancestor (@var{h}, @var{type}) +## @deftypefnx {Function File} {@var{parent} =} ancestor (@var{h}, @var{type}, 'toplevel') +## Return the first ancestor of handle object @var{h} whose type matches +## @var{type}, where @var{type} is a character string. If @var{type} is a +## cell array of strings, return the first parent whose type matches +## any of the given type strings. +## +## If the handle object @var{h} is of type @var{type}, return @var{h}. +## +## If @code{"toplevel"} is given as a 3rd argument, return the highest +## parent in the object hierarchy that matches the condition, instead +## of the first (nearest) one. +## @seealso{get, set} +## @end deftypefn + +function p = ancestor (h, type, toplevel) + + if (nargin == 2 || nargin == 3) + p = []; + if (ischar (type)) + type = { type }; + endif + if (iscellstr (type)) + look_first = true; + if (nargin == 3) + if (ischar (toplevel) && strcmp (toplevel, "toplevel")) + look_first = false; + else + error ("ancestor: third argument must be \"toplevel\""); + endif + endif + while (true) + if (isempty (h) || ! ishandle (h)) + break; + endif + if (any (strcmpi (get (h, "type"), type))) + p = h; + if (look_first) + break; + endif + endif + h = get (h, "Parent"); + endwhile + else + error ("ancestor: second argument must be a string or cell array of strings"); + endif + else + print_usage (); + endif + +endfunction diff --git a/scripts/plot/axes.m b/scripts/plot/axes.m --- a/scripts/plot/axes.m +++ b/scripts/plot/axes.m @@ -31,15 +31,21 @@ if (nargin == 0 || nargin > 1) ## make default axes object, and make it the current axes for the ## current figure. - cf = gcf (); + idx = find (strcmpi (varargin(1:2:end), "parent"), 1, "first"); + if (! isempty (idx) && length (varargin) >= 2*idx) + cf = varargin{2*idx}; + varargin([2*idx-1, 2*idx]) = []; + else + cf = gcf (); + endif tmp = __go_axes__ (cf, varargin{:}); - set (cf, "currentaxes", tmp); + set (ancestor (cf, "figure"), "currentaxes", tmp); else ## arg is axes handle, make it the current axes for the current ## figure. tmp = varargin{1}; if (ishandle (tmp) && strcmp (get (tmp, "type"), "axes")) - parent = get (tmp, "parent"); + parent = ancestor (tmp, "figure"); set (0, "currentfigure", parent); set (parent, "currentaxes", tmp); else