diff m-toolbox/m/gui/@jcontrol/subsref.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/subsref.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,152 @@
+function ret=subsref(obj, index)
+% SUBSREF method overloaded for jcontrol class
+%
+% subsref provides access to jcontrol properties via MATLAB's dot notation
+% Examples:
+% obj.hgcontainer
+% obj.hgcontrol.Name
+%
+% subsref also provides access to the java component's methods
+% Example:
+% obj.setToolTipText('MyText');
+% a=obj.getToolTipText();
+%
+% See also: jcontrol
+%
+% -------------------------------------------------------------------------
+% Author: Malcolm Lidierth 07/07
+% Copyright © The Author & King's College London 2007
+% -------------------------------------------------------------------------
+
+% Revisions:
+% 21.08.07    Methods now called properly when index(1).subs=='hgcontrol'.
+%             Previously subsref(obj.hgcontrol,...) was called from here with
+%             index(1:end) instead of index(2:end).
+% 21.08.07    Tests nargout before calling hgcontrol methods. No output is
+%             requested if nargout==0. This prevents "One or more output 
+%             arguments not assigned..." errors being generated internally
+%             e.g calling setXXXX calls. These errors will still be generated
+%             (as they should)if an output is requested when none is
+%             available. See 09.09.07 below.
+% 09.09.07    Improve above fix with try/catch blocks. Now getXXXX calls
+%             return in ans if nargout==0
+% 20.09.07    Nest try/catch blocks to reduce isprop() and ismethod()
+%             calls. This is substantially faster.
+
+switch index(1).type
+    case '.'
+        switch lower(index(1).subs)
+            case 'hgcontainer'
+                if length(index)==1
+                    % obj.hgcontainer
+                    ret=obj.hgcontainer;
+                elseif isprop(obj.hgcontainer, index(2).subs)
+                    % obj.hgcontainer.property
+                    ret=subsref(obj.hgcontainer,index(2:end));
+                elseif isempty(obj.hgcontainer)
+                    % Empty default object?
+                    ret=[];
+                else
+                    % Otherwise no property with this name
+                    error('No appropriate property %s',index(2).subs);
+                end
+            case 'hgcontrol'
+                if length(index)==1
+                    % obj.hgcontrol
+                    ret=obj.hgcontrol;
+                else
+                    try
+                        ret=subsref(obj.hgcontrol, index(2:end));
+                    catch
+                        try
+                            CheckErr();
+                            subsref(obj.hgcontrol, index(2:end));
+                        catch
+                            if isempty(obj.hghandle)
+                                % Maybe subsref failed because obj has
+                                % empty properties
+                                ret=[];
+                            elseif ~isprop(obj.hghandle, index(2).subs) &&...
+                                    ~ismethod(obj.hghandle, index(2).subs)
+                                error('jcontrol:subsref: No such property or method');
+                            else
+                                error('jcontrol:subsref: Unexpected error');
+                            end
+                        end
+                    end
+                end
+            case 'hghandle'
+                ret=obj.hghandle;
+            otherwise
+                % obj.property/method where the property could be in hgcontainer
+                % or hgcontrol. Find out which and invoke subsref
+                % recursively
+                if isprop(obj.hgcontainer, index(1).subs) &&...
+                        isprop(obj.hgcontrol, index(1).subs)
+                    % Visible is an exception -  take this from the container, MATLAB
+                    % links this property for the container and object
+                    if strcmpi(index(1).subs,'visible')
+                        ret=obj.hgcontainer.Visible;
+                        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
+                    ret=subsref(obj.hgcontainer, index);
+                else
+                    % hgcontrol property or method?
+                    try
+                        ret=subsref(obj.hgcontrol, index);
+                    catch
+                        try
+                            CheckErr();
+                            subsref(obj.hgcontrol, index);
+                        catch
+                            if isempty(obj.hghandle)
+                                % Maybe subsref failed because obj has
+                                % empty properties
+                                ret=[];
+                            elseif ~isprop(obj.hghandle, index(1).subs) &&...
+                                    ~ismethod(obj.hghandle, index(1).subs)
+                                error('jcontrol:subsref: No such property or method');
+                            else
+                                error('jcontrol:subsref: Unexpected error');
+                            end
+                        end
+                    end
+                end
+        end
+    case '()'
+        % array of jcontrols
+        if length(index)==1
+            % One or more elements or a JCONTROL array/matrix wanted
+            ret=obj(index(1).subs{:});
+        else
+            obj=obj(index(1).subs{:});
+            if numel(obj)==1
+                ret=subsref(obj, index(2:end));
+            else
+                error('Single element of ''%s'' must be specified', inputname(1));
+            end
+        end
+end
+return
+end
+
+%-------------------------------------------------------------------------
+function CheckErr()
+% CheckErr checks that the exception has been thrown for the expected
+% reason - if not rethrow it.
+err=lasterror();
+if strcmp(err.identifier,'MATLAB:unassignedOutputs');
+    return
+else
+    rethrow(err);
+end
+return
+end
+%-------------------------------------------------------------------------