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