www.gusucode.com > mbclayouts 工具箱 matlab 源码程序 > mbclayouts/@xregcurtainfxlayout/set.m

    function  varargout=set(obj,varargin)
%  Synopsis
%     function  set(obj,parameter,value,setChildren)
%
%  Description
%     Set the parameter of the handles. This works very similar
%     to the set methods for handles. The only difference is that
%     some methods have been overloaded to perform differently
%     on the package. Non overload methods just perform the set
%     recursively on all submembers.
%
%  Overloaded set methods
%     POSITION       : [xmin ymin width height] of the whole package.
%     VISIBLE        : 'on' or 'off'
%     CURTAINDIRECTION: North/South/East/West
%     CURTAINFX      : 'on'/'off'
%     CENTER         : Layout to use
%     EDGEITEM       : 'on'/'off'
%     EDGEITEMTYPE   
%     OPENOFFSET     : Offset of the curtain edge away from the layout
%                      position when open
%     CLOSEDOFFSET   : Offset of the curtain edge away from the layout
%                      position when closed
%     STEPSIZE       : Pixels to step in each iteration
%

%  Copyright 2000-2011 The MathWorks, Inc. and Ford Global Technologies, Inc.



norepack = 1;
if ~isa(obj,'xregcurtainfxlayout')
   set(mbcgui.hgclassesutil.toHandle(obj),varargin{:});
else      
   ud=obj.g.info;
   for arg=1:2:nargin-1
      parameter = varargin{arg};
      value = varargin{arg+1};
      reqnorepack=0;
      switch upper(parameter)
      case 'POSITION'
         position=value;
         position(3:4)=max(position(3:4),[1 1]);
         set(obj.xregcontainer,'Position',position);
      case 'VISIBLE'
         vis=find( strcmp( value,{'off', 'on' } ) )-1;
         if vis~=ud.visible
            ud.visible=vis;
            if vis
               % vis ON FX
               ud=i_vison(obj,ud);
            else
               % vis OFF FX
               ud=i_visoff(obj,ud);
            end
         end   
         reqnorepack=1;
      case 'CENTER'
         set(obj.xregcontainer,'elements',{value});         
      case 'CURTAINDIRECTION'
         ud.slidedir=find( strcmpi( value,{ 'north'; 'east'; 'south'; 'west' } ) );
         reqnorepack=1;
      case 'CURTAINFX'
         ud.slidefx=find( strcmp( value,{ 'off'; 'on' } ) )-1;
         reqnorepack=1;
      case 'EDGEITEM'
         ud.edgeitem=find( strcmp( value,{ 'off'; 'on' } ) )-1;
         reqnorepack=1;
      case 'EDGEITEMTYPE'
         reqnorepack=1;
      case 'OPENOFFSET'
         ud.offsets(1)=value;
         reqnorepack=1;
      case 'CLOSEOFFSET'
         ud.offsets(2)=value;
         reqnorepack=1;
      case 'STEPSIZE'
         ud.stepsize=value;
         reqnorepack=1;
      otherwise
         [obj.xregcontainer,reqnorepack]=set(obj.xregcontainer,parameter,value);
      end
      norepack=(norepack & reqnorepack);   
   end
   obj.g.info=ud;
end

if nargout>1
   varargout{1}=obj;
   varargout{2}=norepack;   
else
   varargout{1}=obj;
   if ~norepack && get(obj,'boolpackstatus')
         repack(obj);
   end
end





function ud=i_vison(obj,ud)
el=get(obj.xregcontainer,'elements');
if ~isempty(el)
   h=el{1};
   if ud.slidefx
      objpos=get(obj,'innerposition');
      % add offsets
      switch ud.slidedir 
      case 1
         objpos([2 4])=objpos([2 4])+[-ud.offsets(2) sum(ud.offsets)];
         dist=objpos(4);
         orient='horizontal';
         divpos=[objpos(1) objpos(2)-1 objpos(3) 2];
      case 2
         objpos([1 3])=objpos([1 3])+[-ud.offsets(2) sum(ud.offsets)];
         dist=objpos(3);
         orient='vertical';
         divpos=[objpos(1)-1 objpos(2) 2 objpos(4)];
      case 3
         objpos([2 4])=objpos([2 4])+[-ud.offsets(1) sum(ud.offsets)];
         dist=objpos(4);
         orient='horizontal';
         divpos=[objpos(1) objpos(2)+objpos(4)-2 objpos(3) 2];
      case 4
         objpos([1 3])=objpos([1 3])+[-ud.offsets(1) sum(ud.offsets)];
         dist=objpos(3);
         orient='vertical';
         divpos=[objpos(1)+objpos(3)-2 objpos(2) 2 objpos(4)];
      end
      Nsteps=max(1,floor(dist./ud.stepsize));
      % exact stepsize
      step=dist./Nsteps;
      step=step.*(0:Nsteps)-1;
      step=step(:);
      objdelt=zeros(Nsteps+1,4);
      edgedelt=objdelt;
      switch ud.slidedir
      case 1
         objdelt(:,2)=step;
         objdelt(:,4)=-step;
         edgedelt(:,2)=step;
      case 2
         objdelt(:,1)=step;
         objdelt(:,3)=-step;
         edgedelt(:,1)=step;
      case 3
         objdelt(:,4)=-step;
         edgedelt(:,2)=-step;
      case 4
         objdelt(:,3)=-step;
         edgedelt(:,1)=-step;
      end
      objpos=repmat(objpos,Nsteps+1,1)+objdelt;
      divpos=repmat(divpos,Nsteps+1,1)+edgedelt;
      
      % create curtain object(s)
      curtain=uicontrol('Parent',ud.parent,...
         'Style','text',...
         'BackgroundColor',get(ancestor(ud.parent,'figure'),'Color'),...
         'Position',objpos(1,:));
      if ud.edgeitem
         edge=xregGui.dividerline(ud.parent,'Position',divpos(1,:),'orientation',orient,'Visible','on');
      end
      set(h,'Visible','on');
      drawnow;
      
      % curtain up
      for n=2:Nsteps+1
         set(curtain,'Position',objpos(n,:));
         if ud.edgeitem
            set(edge,'Position',divpos(n,:));
         end
         drawnow
      end
      
      delete(curtain);
      delete(edge);
   else
      set(h,'Visible','on');
   end
end
return





function ud=i_visoff(obj,ud)
el=get(obj.xregcontainer,'elements');
if ~isempty(el)
   h=el{1};
   if ud.slidefx
      objpos=get(obj,'innerposition');
      % add offsets
      switch ud.slidedir 
      case 1
         objpos([2 4])=objpos([2 4])+[-ud.offsets(2) sum(ud.offsets)];
         dist=objpos(4);
         orient='horizontal';
         divpos=[objpos(1) objpos(2)-1 objpos(3) 2];
      case 2
         objpos([1 3])=objpos([1 3])+[-ud.offsets(2) sum(ud.offsets)];
         dist=objpos(3);
         orient='vertical';
         divpos=[objpos(1)-1 objpos(2) 2 objpos(4)];
      case 3
         objpos([2 4])=objpos([2 4])+[-ud.offsets(1) sum(ud.offsets)];
         dist=objpos(4);
         orient='horizontal';
         divpos=[objpos(1) objpos(2)+objpos(4)-2 objpos(3) 2];
      case 4
         objpos([1 3])=objpos([1 3])+[-ud.offsets(1) sum(ud.offsets)];
         dist=objpos(3);
         orient='vertical';
         divpos=[objpos(1)+objpos(3)-2 objpos(2) 2 objpos(4)];
      end
      Nsteps=max(1,floor(dist./ud.stepsize));
      % exact stepsize
      step=dist./Nsteps;
      step=step.*(0:Nsteps)-1;
      step=step(:);
      objdelt=zeros(Nsteps+1,4);
      edgedelt=objdelt;
      switch ud.slidedir
      case 1
         objdelt(:,2)=step;
         objdelt(:,4)=-step;
         edgedelt(:,2)=step;
      case 2
         objdelt(:,1)=step;
         objdelt(:,3)=-step;
         edgedelt(:,1)=step;
      case 3
         objdelt(:,4)=-step;
         edgedelt(:,2)=-step;
      case 4
         objdelt(:,3)=-step;
         edgedelt(:,1)=-step;
      end
      objpos=repmat(objpos,Nsteps+1,1)+objdelt;
      divpos=repmat(divpos,Nsteps+1,1)+edgedelt;
      objpos=objpos(end:-1:1,:);
      divpos=divpos(end:-1:1,:);
      
      % create curtain object(s)
      curtain=uicontrol('Parent',ud.parent,...
         'Style','text',...
         'BackgroundColor',get(ancestor(ud.parent,'figure'),'Color'),...
         'Position',objpos(1,:));
      if ud.edgeitem
         edge=xregGui.dividerline(ud.parent,'Position',divpos(1,:),'orientation',orient,'Visible','on');
      end
      drawnow;
      
      % curtain up
      for n=2:Nsteps+1
         set(curtain,'Position',objpos(n,:));
         if ud.edgeitem
            set(edge,'Position',divpos(n,:));
         end
         drawnow
      end
      set(h,'Visible','off');
      drawnow;
      delete(curtain);
      delete(edge);
   else
      set(h,'Visible','off');
   end
end
return