www.gusucode.com > mbcguitools 工具箱 matlab 源码程序 > mbcguitools/@xregGui/@tree/redraw.m

    function redraw(h)
%REDRAW  Redraw the tree
%
%  h.redraw
%

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


% get a sequence of numbers indicating the images to stictch together
%
% 0 == blank
% 1 == vert line
% 2 == corner
% 3 == T-junction
% 4 == corner with plus
% 5 == corner with minus
% 6 == T with plus
% 7 == T with minus

if strcmp(h.PerformDraw,'on')
   ch=h.VirtualRoot.down;
   ims={};  lyts={};  invislyts={}; visnds=[];
   while ~isempty(ch)
      [ch_ims,ch_lyts,ch_invislyts,ch_vis]=i_getnodesinfo(ch,[]);
      ims=[ims ch_ims];
      lyts=[lyts ch_lyts];
      invislyts=[invislyts ch_invislyts];
      visnds=[visnds ch_vis]; 
      ch=ch.right;
   end
   
   
   Nims=length(ims);
   if Nims<length(h.Images)
      delete(h.Images(Nims+1:end));
      h.Images=h.Images(1:Nims);
   elseif Nims>length(h.Images)
      i=h.Images;
      if isempty(i)
         clear i
      end
      for n=Nims:-1:(length(h.Images)+1)
          P = com.mathworks.toolbox.mbc.gui.peer.TreeStructureStripPeer;
          i(n) = mbcwidgets.javacomponent(P, ...
              'Parent', h.Parent, ...
              'Visible', 'off');
      end
      h.Images=i;
   end
   
   % set all bits invisible
   set(h.Images,'Visible','off');
   for n=1:length(lyts)
      set(lyts{n},'Visible','off');
   end
   for n=1:length(invislyts)
      set(invislyts{n},'Visible','off');
   end
   
   managemerge(h.lytobj,'clearall');
   set(h.lytobj,'packstatus','off','dimension',[Nims,h.MaxLvls+1],...
      'rowsizes',repmat(h.NodeHeight,1,Nims),...
      'colsizes',[repmat(h.Indentation,1,h.MaxLvls), -1]);
   
   els=cell(Nims,h.MaxLvls+1);
   hIms = h.Images;
   indent = h.Indentation;
   for n=1:Nims
      % loop that sets tree structures, sets elements and merges blocks
      hThisIm = hIms(n);
      hThisIm.Peer.setTreeStructure(ims{n});
      hThisIm.Peer.setIndent(indent);
      cb = hThisIm.Peer.getTreeCallback;
      set(handle(cb, 'callbackProperties'), 'delayedCallback', {@i_imageclick, visnds(n)});
      
      els{n,1} = hThisIm;  
      els(n,length(ims{n})+1)=lyts(n);
      managemerge(h.lytobj,'createblock',[n n],[1 length(ims{n})])
      managemerge(h.lytobj,'createblock',[n n],[length(ims{n})+1 h.MaxLvls+1]);
   end
   set(h.lytobj,'elements',els,'packstatus','on');
end


function [ims,lyts,invislyts,visnds]=i_getnodesinfo(h, base)

haschild= ~isempty(h.down);
hassibling= ~isempty(h.right);

doChildVis=0;
doChildInVis=0;
if hassibling
   if haschild
      if h.IsExpanded
         im=7;  % T minus
         doChildVis=1;
      else
         im=6;  % T plus
         doChildInVis=1;
      end
   else
      im=3;  % T
   end
   newbase=[base 1];
else
   if haschild
      if h.IsExpanded
         im=5;  % T minus
         doChildVis=1;
      else
         im=4;  % T plus
         doChildInVis=1;
      end
   else
      im=2;  % corner
   end
   newbase=[base 0];
end
ims={[base im]};
lyts={h.Layout};
visnds=h;
if doChildVis
   invislyts={};
   ch=h.down;
   while ~isempty(ch)
      [ch_ims,ch_lyts,ch_invislyts,ch_vis]=i_getnodesinfo(ch,newbase);
      ims=[ims ch_ims];
      lyts=[lyts ch_lyts];
      invislyts=[invislyts ch_invislyts];
      visnds=[visnds ch_vis];
      ch=ch.right;
   end
elseif doChildInVis
   invislyts=i_getlayouts(h);
else
   invislyts={};
end



function lyts=i_getlayouts(h)
lyts={};
ch=h.down;
while ~isempty(ch);
   lyts=[lyts {ch.Layout} i_getlayouts(ch)];   
   ch=ch.right;
end



function i_imageclick(~,~,nd)
if nd.IsExpanded
    nd.contract;
else
    nd.expand;
end