www.gusucode.com > mbctools 工具箱 matlab 源码程序 > mbctools/MBrowser.m

    function h=MBrowser(varargin)
% MBROWSER Instantiate a Model Browser object
%
%  obj=MBrowser;

%  Copyright 2000-2010 The MathWorks, Inc. and Ford Global Technologies, Inc.


% This file also houses the activeX callbacks for the MBrowser object

persistent objH

% Search for a current MBrowser, else return a new one
if isempty(objH)
    % make absolutely sure MB isn't around somewhere?
    fH=mvf;
    if ~isempty(fH)
        % get handle from userdata
        objH= get(fH,'MBH');
    else
        % create a blank new object
        objH= xregtools.MBrowser;
    end
elseif ~isa(objH,'xregtools.MBrowser')
    % handle has been deleted?  Create a valid one
    objH= xregtools.MBrowser;
end


if nargin
    % ActiveX event codes
    ev=varargin{2};
    srcobj=varargin{1};
    try
        srcobj.Nodes;
        tree=1;
    catch
        tree=0;
    end
    hFig=objH.Figure;
    MM=MotionManager(hFig);
    MM.EnableTree=false;
    if tree
        %%%%%  TreeView Callbacks  %%%%%
        switch ev
            case {13,11}
                % click event, node collapse event
                PR=xregGui.PointerRepository;
                ptrID=PR.stackSetPointer(hFig,'watch');
                p = iGetPointer(srcobj);
                if ~isempty(p);
                    objH.SelectNode(p);
                end
                PR.stackRemovePointer(hFig,ptrID);
            case 3
                % Key press event
                keycode= double(varargin{3});
                switch keycode
                    case {16,17}
                        % shift and control keys do nothing
                    case 45
                        % Insert
                        p = iGetPointer(srcobj);
                        MB = p.MBsupport;
                        if MB.newmodel
                            objH.NewNode;
                        end
                    case 46
                        % Delete
                        objH.DeleteNode;
                    case 113
                        % F2 edit
                        srcobj.StartLabelEdit;
                    otherwise
                        % Spoof a click event
                        MBrowser(varargin{1}, 13);
                end
            case 9
                % Label Event
                cancel=varargin{3};
                newstring=varargin{4};
                if ~cancel
                    if ~isempty(deblank(newstring))
                        p = iGetPointer(srcobj);
                        oldname = p.name;
                        p.name(newstring);
                        newname = p.name;
                        if ~strcmp(newname, newstring)
                            % Name was rejected by node: revert to old name
                            p.name(oldname);
                            srcobj.CancelNextLabelEdit = 1;
                            h = errordlg(sprintf(['Cannot rename %s: an item with the name you' ...
                                ' specified already exists.  Specify a different name.'], oldname), ...
                                'Error Renaming Item', 'modal');
                            waitfor(h);
                        else
                            objH.doDrawText;
                        end
                    else
                        srcobj.CancelNextLabelEdit = 1;
                    end
                end
            case 14
                % Right-click event
                % Call the context handler for the current node
                objH.opencontext(srcobj,varargin{3},varargin{4});
        end
    else
        %%%%%  ListView Callbacks  %%%%%
        switch ev
            case 2
                % Double click - same as tree nodeclick
                PR=xregGui.PointerRepository;
                ptrID=PR.stackSetPointer(hFig,'watch');
                p = iGetPointer(srcobj);
                if ~isempty(p)
                    objH.SelectNode(p);
                end
                PR.stackRemovePointer(hFig,ptrID);
            case 5
                % Key up
                keycode= double(varargin{3});
                switch keycode
                    case 45
                        % Insert
                        p = objH.CurrentNode;
                        MB = p.MBsupport;
                        if MB.newmodel
                            objH.NewNode;
                        end
                    case 46
                        % Delete
                        objH.DeleteNode('ListView');
                end
        end
    end
    MM.EnableTree=true;
else
    h=objH;
end


function p = iGetPointer(srcobj)

try
    key = srcobj.SelectedItem.Key;
    pindex = sscanf(key,'K%d');
    p = assign(xregpointer,pindex);
catch
    p = null(xregpointer,0);
end