Mercurial > hg > octave-nkf
changeset 6851:05f6f120a65f
[project @ 2007-08-31 17:58:00 by jwe]
author | jwe |
---|---|
date | Fri, 31 Aug 2007 17:58:00 +0000 |
parents | 9398f6a81bdf |
children | a34d59fc7a91 |
files | scripts/ChangeLog scripts/plot/ancestor.m scripts/plot/axes.m |
diffstat | 3 files changed, 87 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,12 @@ +2007-08-31 Michael goffioul <michael.goffioul@gmail.com> + + * plot/axes.m: Allow parent to be specified when creating axes + objects. Support non-figure parents. + +2007-08-31 John W. Eaton <jwe@octave.org> + + * plot/ancestor.m: New function, adapted from Octave Forge. + 2007-08-31 Søren Hauberg <hauberg@gmail.com> * polynomial/polygcd.m: Better layout of example.
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
--- 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