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