Mercurial > hg > ltpda
diff m-toolbox/m/gui/@jcontrol/subsasgn.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/subsasgn.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,90 @@ +function obj=subsasgn(obj, index, val) +% SUBSASGN method overloaded for JCONTROL class +% +% subsasgn provides access to JCONTROL properties via MATLAB's dot notation +% Examples: +% obj.Units='characters'; +% obj.Enabled=1 +% obj.hgcontainer.Opaque='on' +% +% obj may be an element of a JCONTROL vector e.g. +% obj(3).Units='pixels'; +% +% See also: jcontrol +% ------------------------------------------------------------------------- +% Author: Malcolm Lidierth 06/07 +% Copyright © The Author & King's College London 2007 +% ------------------------------------------------------------------------- + +% Note: Left-hand assignments are not needed with dot assignments +% because both the hgcontainer and the hgcontrol are passed by reference +% rather than by value. +% With () calls, left-hand assignments are needed when initializing an +% element. In these cases the caller workspace will contain a reference to +% the JCONTROL set up by subsasgn or passed to subsasgn by MATLAB in val. +% In all cases, changes here to JCONTROL properties affect the original +% JCONTROL contents, and all copies of them in all MATLAB workspaces. + +switch index(1).type + case '.' + switch lower(index(1).subs) + case {'hgcontainer' 'hgcontrol' 'hghandle'} + if length(index)==1 || strcmp(index(1).subs,'hghandle') + error('The %s property is not settable',index(1).subs); + else + subsasgn(obj.(index(1).subs), index(2:end), val); + end + otherwise + % obj.property/method where the property could be in hgcontainer + % or hgcontrol. Find out which and invoke appropriate subsasgn + if isprop(obj.hgcontainer, index(1).subs) &&... + isprop(obj.hgcontrol, index(1).subs) + if strcmpi(index(end).subs,'visible') + % Set Visible property in the container, MATLAB will + % update the hgcontrol + obj.hgcontainer.Visible=VisibleProperty(val); + return + else + error('Shared property name ''%s''\nYou must explicitly specify the target object',... + index(1).subs); + end + end + if isprop(obj.hgcontainer, index(1).subs) + % hgcontainer property + subsasgn(obj.hgcontainer, index, val); + elseif isprop(obj.hgcontrol, index(1).subs) || ismethod(obj.hgcontrol,index(1).subs) + % hgcontrol property or method + subsasgn(obj.hgcontrol, index, val); + else + error('No such property or method'); + end + end + case '()' + % obj is empty so initialize + if isempty(obj) + % Assign first element - avoids conversion to double errors + % when initializing with subscripts + obj=jcontrol(); + % Set the target element - need not already exist + obj(index(1).subs{1})=val; + return + end + + if strcmp(class(val),'jcontrol') + % Initializing or adding element to an array + obj(index(1).subs{1})=val; + else + % Assigning field to pre-existing element + if isvector(obj) && length(index(1).subs)==1 &&... + index(1).subs{1}<=length(obj) + subsasgn(obj(index(1).subs{1}), index(2:end), val); + elseif ~isvector(obj) || length(index(1).subs)>1 + error('Scalar or vector JCONTROL and index required on input'); + elseif index(1).subs{1}>length(obj) + error('Index exceeds length of JCONTROL vector'); + end + end +end +return +end +