diff m-toolbox/m/gui/@jcontrol/set.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/m/gui/@jcontrol/set.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,129 @@
+function varargout=set(varargin)
+% SET method overloaded for JCONTROL class
+%
+% Examples:
+% set(obj,PropertyName, PropertyValue)
+% set(obj, PropertyName1, Value1, PropertyName2, Value2....)
+%
+% The propertyname/valuename sequence can have an embedded cell array if
+% that contains property/value pairs e.g
+%           standardvalues={'Units', 'normalized'}
+%           set(myobj, 'javax.swing.JPane',...
+%                      'ToolTipText','MyTip',...
+%                       standardvalues);
+%s
+% Also:
+% set(obj, s)
+% set(obj, pn, pm)
+% where s in a structure with fieldnames corresponding to property names
+% and values corresponding to property values
+% pn and pm and name/value cell vectors (note pm may not be a matrix)
+%
+% If obj is a vector of JCONTROLs, SET will act on each element.
+% In this case, the specified properties must be present in all the 
+% JCONTROLs or an error will result
+% 
+% 
+% See also: jcontrol
+%
+% -------------------------------------------------------------------------
+% Author: Malcolm Lidierth 07/07
+% Copyright © The Author & King's College London 2007
+% -------------------------------------------------------------------------
+
+% Note: The usual assignin(...) call is not needed here because both the
+% hgcontainer and the hgcontrol are passed by reference rather than by
+% value. Changes here affect the original JCONTROL contents, and all copies
+% of them in all MATLAB workspaces.
+
+obj=varargin{1};
+
+if nargin==1
+    % Return setable properties
+    s=set(obj.hgcontainer);
+    s.hgcontrol=set(obj.hgcontrol);
+    varargout{1}=s;
+    return
+end
+
+% Otherwise make sure we have enough inputs
+if nargin==2 && isstruct(varargin{2})
+    % Property/value pairs in structure
+    % Get the names
+    propnames=fieldnames(varargin{2});
+    % get the values
+    propvalues=cell(length(propnames),1);
+    for i=1:length(propnames)
+        propvalues{i}=varargin{2}.(propnames{i});
+    end
+    % Recursive call to set
+    set(varargin{1}, propnames, propvalues);
+    return
+elseif nargin==3 && iscell(varargin{2}) && iscell(varargin{3})
+    % set(obj, pn, pm) where pn and pm are property and value cell vectors
+    if numel(varargin{2})~=numel(varargin{3})
+        error('Multiple values for each property not supported'); %#ok<ERTAG>
+    end
+    proplist=cell(1,2*length(varargin{2}));
+    count=1;
+    for i=1:length(varargin{2})
+        proplist(count)=varargin{2}(i);
+        proplist(count+1)=varargin{3}(i);
+        count=count+2;
+    end
+else
+    % Allow cell arrays in the property/values pairs list
+    % Expand these where present
+    pcount=1;
+    vcount=2;
+    proplist={};
+    for i=1:(length(varargin)-1)/2
+        if ischar(varargin{vcount})
+            % Property/Value pair
+            proplist{pcount}=varargin{vcount};
+            proplist{pcount+1}=varargin{vcount+1};
+            pcount=pcount+2;
+            vcount=vcount+2;
+        elseif iscell(varargin{vcount})
+            % Cell array
+            proplist=[proplist varargin{vcount}]; %#ok<AGROW>
+            pcount=length(proplist)+1;
+            vcount=vcount+1;
+        end
+    end
+end
+            
+% For loop allows vector (or matrix) of JCONTROLs on input but all elements
+% must have all the target properties or an error will be generated
+for idx=1:numel(obj)
+    switch lower(proplist{1})
+        case {'hgcontainer', 'hgcontrol' 'hghandle' 'Parent' 'Children'}
+            error('The %s property of a jcontrol object can not be changed', lower(varargin{2}));
+        otherwise
+            for i=1:2:length(proplist)
+                property=proplist{i};
+                value=proplist{i+1};
+                if isprop(obj(idx).hgcontainer, property) &&...
+                        isprop(obj(idx).hgcontrol, property)
+                    if strcmpi(property,'Visible')
+                        % Set Visible property in the container, MATLAB will
+                        % update the hgcontrol
+                        obj(idx).hgcontainer.Visible=VisibleProperty(value);
+                        continue
+                    else
+                        error('Shared property name ''%s''\nYou must explicitly specify the target object',...
+                        proplist{i});
+                    end
+                end
+                if isprop(obj(idx).hgcontainer, property)
+                    obj(idx).hgcontainer.(property)=value;
+                elseif isprop(obj(idx).hgcontrol, property)
+                    obj(idx).hgcontrol.(property)=value;
+                else
+                    error('No such property: ''%s'' in %s(%d)', property, inputname(1), idx);
+                end
+            end
+    end
+end
+return
+end
\ No newline at end of file