www.gusucode.com > mbctools 工具箱 matlab 源码程序 > mbctools/+xregbdrygui/TreeView.m
classdef TreeView < xregbdrygui.AbstractBdryView %xregbdrygui.TreeView class % xregbdrygui.TreeView extends xregbdrygui.AbstractBdryView. % % xregbdrygui.TreeView properties: % Parent - Property is of type 'MATLAB array' % Position - Property is of type 'rect' % Enable - Property is of type 'on/off' % Visible - Property is of type 'on/off' % UserData - Property is of type 'MATLAB array' % Tag - Property is of type 'string' % MessageService - Property is of type 'handle' % Options - Property is of type 'handle vector' % Actions - Property is of type 'handle vector' % UIContextMenu - Property is of type 'MATLAB array' % TreeViewAdapter - Property is of type 'MATLAB array' (read only) % Copyright 2005-2015 The MathWorks, Inc. and Ford Global Technologies, Inc. properties (SetAccess=protected, AbortSet, SetObservable) %TreeViewAdapter Property is of type 'MATLAB array' (read only) TreeViewAdapter = []; end methods % constructor block function obj = TreeView( varargin ) % XREGBDRYGUI.TREEVIEW class constructor % Call the inherited constructor obj@xregbdrygui.AbstractBdryView(varargin{ : }); % converted super class constructor call obj.ContentHandle = mbcgui.container.titlebarpanel(... 'Parent', obj.Parent,... 'Visible', obj.Visible, ... 'BarTitle', 'Boundary Tree' ); obj.pPostSetMessageService; pPostSetRoot(obj) end % TreeView end % constructor block methods (Access=protected) % protected methods %---------------------------------------- function pPostSetMessageService(obj) %PPOSTSETMESSAGESERVICE Respond to change of MessageService % PPOSTSETMESSAGESERVICE(OBJ) is called when the MessageService property % is changed. % Clear the listeners obj.clearMessageServiceListeners; % Add new listeners bms = obj.MessageService; obj.addMessageServiceListener( event.listener(bms,'RootChange', @(src, evt) pPostSetRoot( obj )) ); obj.addMessageServiceListener( event.listener(bms,'TreeChange', @(src, evt) pRefreshView( obj )) ); obj.addMessageServiceListener( event.listener(bms,'NodeChange', @(src, evt) pRefreshView( obj )) ); obj.addMessageServiceListener( event.listener(bms,'BestChange', @(src, evt) pRefreshView( obj )) ); obj.addMessageServiceListener( event.listener(bms,'NameChange', @(src, evt) pRefreshView( obj )) ); end % pPostSetMessageService %---------------------------------------- function pPostSetRoot(obj) %PPOSTSETROOT Redraw the boundary tree after the root node has been set % PPOSTSETROOT(OBJ) % Get the root node from the message service root = obj.MessageService.Root; if ~isempty( root ) CALLBACKS = { ... 'TreeEditedCallback', @iAfterLabelEdit, ... 'SelectionChangedCallback', @iNodeClick, ... 'DeletePressedCallback', @iDelete,... 'InsertPressedCallback', @iInsert}; obj.TreeViewAdapter = root.treeview( 'create', [-1 -1 1 1], obj.ContentHandle, CALLBACKS,3,root ); view = obj.TreeViewAdapter; % % make root node non editable setEditableNodes(obj.TreeViewAdapter,root,false); if root.getnumstages>1 ch = root.children; setEditableNodes(obj.TreeViewAdapter,ch,false); expand(obj.TreeViewAdapter,ch); end else % Nothing in tree to display sc = xregGui.SystemColorsDbl; view = uipanel('Parent', obj.Parent, ... 'Units', 'pixels', ... 'BorderType', 'none', ... 'BackgroundColor', sc.WINDOW_BG); end % Delete the old view after replacing with the new one hOldView = get( obj.ContentHandle, 'ContentHandle' ); set(obj.ContentHandle, 'ContentHandle', {view}); delete( hOldView ); % Callbacks function iInsert( ~, ~ ) % Key press event bms = obj.MessageService; cn = bms.CurrentNode; % Make a new node bd = cn.makechildren; if ~isempty( bd ), pbd = address( bd ); cn.AddChild( pbd ); % add new node to tree bms.setCurrentNode( pbd ); end end function iDelete(~,~) bms = obj.MessageService; cn = bms.CurrentNode; pr = bms.Root; if ~isequal( cn, pr ), p = cn.Parent; p.removebest( cn ); p = cn.delete; bms.setCurrentNode( p ); end end function iNodeClick( ~, evt ) node = evt.Data.NewNode; if ~isempty(node) cn = obj.MessageService.CurrentNode; % Only reset the current node if a new node is really selected % rather than just the current node being clicked. if node ~= cn, obj.MessageService.setCurrentNode( node ); end end end function iAfterLabelEdit( ~, evd ) bms = obj.MessageService; cn = bms.CurrentNode; newstring = evd.Data.NewName; if ~isempty( strtrim( newstring ) ), % update mtree name cn.name( newstring ); end end end %---------------------------------------- function pRefreshView(obj) %PREFRESHVIEW Redraw the boundary tree % PREFRESHVIEW(OBJ) root = obj.MessageService.Root; cn = obj.MessageService.CurrentNode; if ~isempty( cn ) && ~isempty(obj.TreeViewAdapter) root.treeview( 'Refresh', obj.TreeViewAdapter,3,cn ); % make root node non editable setEditableNodes(obj.TreeViewAdapter,root,false); if root.getnumstages>1 % make two-stage nodes non editable ch = root.children; setEditableNodes(obj.TreeViewAdapter,ch,false); expand(obj.TreeViewAdapter,ch); end end end % pRefreshView %---------------------------------------- function pSetNode(obj) %pSetNode sets node in the boundary tree % pSetNode(OBJ) cn = obj.MessageService.CurrentNode; if ~isempty( cn ) && ~isempty(obj.TreeViewAdapter) cn.treeview( 'Select', obj.TreeViewAdapter ); end end % pSetNode end % protected methods end % classdef