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