www.gusucode.com > mbcguitools 工具箱 matlab 源码程序 > mbcguitools/@mbctree/@tree/tree.m
function obj = tree( varargin ) % mbctree.tree class constructor % Copyright 2006-2015 The MathWorks, Inc. % Is the first input argument a udd object derived from me? If it is then % we are being called as a super class constructor and don't have to % construct an object if nargin && isa(varargin{1}, 'mbctree.tree') obj = varargin{1}; varargin(1) = []; else obj = mbctree.tree; end P = com.mathworks.toolbox.mbc.gui.peer.MBCTreePeer(); % Call the inherited constructor javacomponent(obj, P, 'BorderType','none',varargin{:}); set( obj, varargin{:} ); % sync properties across to the peer. if ~isempty( obj.Root ) obj.Peer.setRootNode( obj.Root.TreeNode ); end if ~isempty( obj.SelectedNode ) obj.Peer.selectNode( obj.SelectedNode.TreeNode ); end obj.Peer.setEditable( obj.Editable ); obj.Peer.setIconLocation( obj.IconLocation ); if ~isempty( obj.IconTransparentColor ) obj.Peer.addIconTransparentColor( obj.IconTransparentColor(1), obj.IconTransparentColor(2), obj.IconTransparentColor(3) ); end % add listeners L = [... handle.listener( obj.Peer, 'SelectionChanged', {@nodeSelected, obj} ),... handle.listener( obj.Peer, 'NodeExpanded', {@nodeExpanded, obj} ),... handle.listener( obj.Peer, 'TreePopup', {@treePopup, obj} ),... handle.listener( obj.Peer, 'KeyTyped', {@keyTyped, obj} ),... handle.listener( obj.Peer, 'TreeEdited', {@treeEdited, obj} )]; set(L, 'RecursionLimit', 1); obj.addListeners( L ); obj.pSelectionListener = L(1); % addPropertyListeners(obj, Prop, Callback, Event) obj.addPropertyListeners( 'Root', @iSetRoot ); obj.addPropertyListeners( 'Editable', @iSetEditable ); obj.addPropertyListeners( 'IconLocation', @iSetIconLocation ); obj.addPropertyListeners( 'IconTransparentColor', @iSetIconTransparentColor ); end %------------------------------------------ function iSetRoot( obj, val ) newRoot = val.NewValue; if isempty( newRoot ) obj.Peer.setRootNode( [] ); else % tell the root which tree it belongs to newRoot.Tree = obj; obj.Peer.setRootNode( newRoot.TreeNode ); end end %------------------------------------------ function iSetEditable( obj, val ) if isscalar( val.NewValue ) && islogical( val.NewValue ) obj.Peer.setEditable( val.NewValue ); else error(message('mbc:mbctree:tree:InvalidPropertyValue')); end end %------------------------------------------ function iSetIconLocation( obj, val ) obj.Peer.setIconLocation( val.NewValue ); end %------------------------------------------ function iSetIconTransparentColor( obj, val ) obj.Peer.clearIconTransparentColors(); obj.Peer.addIconTransparentColor( val.NewValue(1), val.NewValue(2), val.NewValue(3) ); end %------------------------------------------ function treePopup( ~, evt, obj ) comppos = get(obj, 'Position'); relpos = comppos(1:2) + [mbcgui.util.unScaleSizeForDPI(evt.JavaEvent.getX) comppos(4)-1-mbcgui.util.unScaleSizeForDPI(evt.JavaEvent.getY)]; if ~isempty(obj.TreePopupCallback) data.Node = obj.SelectedNode; data.Position = relpos; evt = xregGui.xregEventData( obj, 'TreePopup', data ); xregcallback( obj.TreePopupCallback, obj, evt ); end end %------------------------------------------ function keyTyped( ~, evt, obj ) persistent PROCESSING if isempty(PROCESSING) PROCESSING = true; n = handle(evt.JavaEvent.getNode); data.Node = n; if ~evt.JavaEvent.getModifiers switch evt.JavaEvent.getKeyCode case mbcgui.util.KeyCode.INSERT data.Type = 'Insert'; name = 'InsertPressed'; case mbcgui.util.KeyCode.DELETE data.Type = 'Delete'; name = 'DeletePressed'; otherwise name = ''; end if ~isempty(name) % Fire the event off with the mbctree.tree as the source. e = xregGui.xregEventData( obj, name, data ); try obj.send( name, e ); xregcallback( get( obj, [name, 'Callback'] ), obj, e ); end end end PROCESSING = []; end end %------------------------------------------ function nodeSelected( src, evt, obj ) % Translate event data % and fire new event persistent STACK if ~obj.Locked; obj.Locked = true; ExitCbk = onCleanup(@() set(obj,'Locked',false)); newSel = evt.JavaEvent.getNewSelection; newnode = []; if ~isempty( newSel ) newnode = handle( newSel ); end obj.pSelectedNode = newnode; oldSel = evt.JavaEvent.getOldSelection; oldnode = []; if ~isempty( oldSel ) oldnode = handle( oldSel ); end try obj.fireSelectionChanged( newnode, oldnode ); while ~isempty(STACK) % execute last item put on stack evt = STACK{1}; %discard intermediate items STACK = {}; obj.Locked = false; nodeSelected(src,evt,obj) end catch ME rethrow(ME) end else % make a structure with event data fields evtdd.JavaEvent.getNewSelection = handle(evt.JavaEvent.getNewSelection); evtdd.JavaEvent.getOldSelection = handle(evt.JavaEvent.getOldSelection); % add to end of STACK STACK = [{evtdd} STACK]; end end function nodeExpanded(~,evt,obj) node = evt.JavaEvent.getCurrentNode.getNodeData; if ~isempty( node ) node = handle( node ); end data.Node = node; e = xregGui.xregEventData( obj, 'NodeExpanded', data ); xregcallback( get( obj, 'NodeExpandedCallback' ), obj, e ); end %------------------------------------------ function treeEdited(src, evt, obj ) changedNode = evt.JavaEvent.getSource(); node = handle( changedNode ); newName = char( evt.JavaEvent.getNewName ); oldName = char( evt.JavaEvent.getOldName ); node.Name = newName; % We also send a tree level event - the information *may be* out of data - % somebody listening to the node Name change might have changed the % name. We could allow the node the first veto, and then pass on the % results to the tree so listeners to this can have a turn at responding to % the edit. if ~strcmp( node.Name, oldName ) data = struct('Node', node, 'NewName', node.Name, 'OldName', oldName ); e = xregGui.xregEventData(src, 'TreeEdited', data); obj.send( 'TreeEdited', e); xregcallback(obj.TreeEditedCallback, obj, e); end end