www.gusucode.com > mbctools 工具箱 matlab 源码程序 > mbctools/+mbcmodelview/+global/FrameWork.m

    classdef FrameWork < mbcmodelview.FrameWork
    %mbcmodelview.global.FrameWork multiview GUI framework for global models
    
    %  Copyright 2015-2015 The MathWorks, Inc. and Ford Global Technologies, Inc.
    
    properties (SetAccess=private)
        %ListSplit snapsplit layout for alternative models
        %  FrameWork will show or hide List depending on the number of
        %  alternative model
        ListSplit
        %ListView listview for alternative models
        ListView                
    end
    
    methods
        
        function show(obj,mdev)
        %show initialize node from MBrowser for showing

        % top node must be initalized
        InitModel(mdev);
        
        pSelected = iBestAlternative(mdev);
        if pSelected ~=address(mdev)
            % model must be initialised
            InitModel(info(pSelected));
            mdev= info(info(pSelected));
        end
        
        % model fit has been deferred - can we refit now
        [Deferred,~,CanUpdate]=isDeferred(mdev);
        if Deferred && CanUpdate
            % refit model
            refit(mdev);
        end
        % causes reset of all views the first time that the FrameWork is
        % viewed
        obj.ForceReset = true;
        
        % restore layout from testplan
        T = mdevtestplan(mdev);
        s = viewLayout(T,'Global');
        if ~isempty(s)
           restoreViewLayout(obj.MultiView,obj.MultiView.ViewLayoutName,s); 
        end
        
        end
        
        function view(obj,mdev)
        %view update with correct node from MBrowser
        updateNode(obj.MessageService, iBestAlternative(mdev),address(mdev),obj.ForceReset )
        %subsequent calls to view will not force a reset
        obj.ForceReset = false;
 
        end
        
        function ok = hide(obj)
        %hide hide node from MBrowser
        
        ms = obj.MessageService;
        if ~isnull(ms.Pointer)        
            % save layout to test plan
            T = mdevtestplan(obj.MessageService.ModelDev);
            s = saveViewLayout(obj.MultiView);
            if ~isempty(s)
                viewLayout(T,'Global',s);
            end
            
            % ask message service to perform any tidy up actions
            ok = leaveNode(obj.MessageService);
        else
            ok = true;
        end
        
        end
        
    end
    
    methods(Access=private)
        function obj = FrameWork(MBrowser,MessageService)
        %FrameWork private constructor
        if nargin<2
            MessageService = mbcmodelview.global.MessageService;
        end
        
        obj@mbcmodelview.FrameWork(MBrowser,MessageService)
        
        addListeners(obj,[event.listener(obj.MessageService,'NodeChanged',@obj.onNodeChanged),...
            event.listener(obj.MessageService,'NodeUpdated',@obj.onNodeUpdated)]);
        end        
        
        
        function onNodeChanged(obj,~,~)
        %onNodeChanged update utility functions when node is changed
        
        % restore multiview layout
        
        if ~isempty(obj.Toolbar)
            % update utility functions in toolbar
            createUtilityFunctions(obj.MessageService.Actions,obj.Toolbar)
        end
        
        end
        
        function onNodeUpdated(obj,~,~)
        %onNodeUpdated update model browser text when node is updated
        
        if isInBrowser(obj)
            doDrawText(obj.Browser);
        end
        
        % determine whether to display the list or not
        if iShowList(info(obj.MessageService.CurrentNode) )
            if strcmpi(get(obj.ListSplit,'splitenable'),'off')
                % set default list position and enable
                set(obj.ListSplit,'splitenable','on','state','center','split',[0.02,0.98]);
            end
        else
            % close listsplitier and disable
            set(obj.ListSplit,'splitenable','off','state','top');
        end          
        
        end        
        
        
    end
    
    methods (Access=protected)
        
        function create(obj,parentInfo)
        %create create graphical components
        %   create(obj,parentInfo)
        
        if isstruct(parentInfo)
            % MBrowser provides a structure containing the parent panel and
            % the toolbar panel
            obj.ViewParent = parentInfo.ViewParent;
            obj.ToolbarParent = parentInfo.ToolbarParent;
        else
            obj.ViewParent = parentInfo;
        end
        
        des = mbcmodelview.Description('Parent', obj.ViewParent, ...
            'MessageService', obj.MessageService);

        % multiview plots
        obj.MultiView = obj.createMultiView(obj.ViewParent,obj.MessageService);
        
        % model selection listview
        obj.ListView = mbcmodelview.ListView('Parent', obj.ViewParent, ...
            'MessageService', obj.MessageService);
        % splitter for multiview and list so the list can be hidden
        obj.ListSplit = xregsnapsplitlayout(obj.ViewParent,...
            'orientation','ud',...
            'barstyle', 1,...
            'top',obj.ListView,...
            'bottom',obj.MultiView,...
            'minwidth',[100 435],...
            'split',[0.02,0.98],...
            'style','totop',...
            'splitenable','off',...
            'state','top');
       
        lytLeftPane = xreggridbaglayout(obj.ViewParent,...
            'dimension',[2,1],...
            'rowsizes',[37,-1],...
            'gapy',1,...
            'elements',{des,obj.ListSplit});        
        
        % Workfow and other summary info displayed in a separate splitter
        % to the right
        obj.Workflow = mbcWorkflowPanel(obj.ViewParent);
        obj.InfoPane = mbcmodelview.global.InfoPane('MessageService',obj.MessageService,...
            'Parent',obj.ViewParent);
        
        lytRightPane = xreggridbaglayout(obj.ViewParent,...
            'dimension',[2,1],...
            'rowsizes',[150,-1],...
            'gapy',5,...
            'elements',{obj.Workflow,obj.InfoPane });
        
        % put main view and info pane side-by-side
        obj.MainLayout = xregsnapsplitlayout(obj.ViewParent,...
            'barstyle', 0,...
            'orientation', 'lr',...
            'left', lytLeftPane,...
            'right', lytRightPane ,...
            'minwidth',[400 250],...
            'split',[0.98 0.02],...
            'border',[-1 -1 -1 -1],...
            'style','toright');        
        
        % create menus, toolbars, workflow controls
        createControls(obj);
        
        end
        
        function createControls(obj)
        %createControls create controls for framework actions
        %   The message service has the actions
        
        createControls@mbcmodelview.FrameWork(obj);
        % add utility function controls
        createUtilityFunctions(obj.MessageService.Actions,obj.Toolbar);
        
        end
    end
    
    methods (Static)
        function obj = createFigure(pNode)
        %createFigure make view in a separate figure for testing
        obj = mbcmodelview.global.FrameWork([]);
        updateNode(obj.MessageService, pNode);
        
        figure(obj);

        end
        
        function [lyt, tblyt, View]=creategui(mdev,infoParent)
        %create view for inside the model browser
        
        View = mbcmodelview.global.FrameWork(MBrowser);
        updateNode(View.MessageService, address(mdev));
        
        create(View,infoParent);
        lyt = View.MainLayout;
        tblyt = View.Toolbar;
        
        end
        
        function MultiView = createMultiView(ViewParent,MessageService,LayoutName)
        %createMultiView create multiview panel 
        %    MultiView = createMultiView(ViewParent,MessageService,LayoutName)
        %
        %    The multiview can be created independently of the rest of the
        %    FrameWork/Model Browser for testing
        
        if nargin<3
            %The default layout name is stored in preferences to give a
            %surface viewer and scatter plot by default
            LayoutName = 'GlobalModelViews';
        end
        
        vl = mbcgui.multiview.ViewList;
        add(vl,mbcmodelview.SurfaceViewer.ViewInfo);        
        add(vl,mbcmodelview.ScatterPlot.ViewInfo);        
        add(vl,mbcmodelview.global.PredictedObservedPlot.ViewInfo);        
        add(vl,mbcmodelview.NormalPlot.ViewInfo);        
        add(vl,mbcmodelview.ValidationData.ViewInfo);        
        add(vl,mbcmodelview.ModelViewer.ViewInfo);        
        
        MultiView = mbcgui.multiview.MultiViewPanel('Parent', ViewParent, ...
            'Visible','off',...
            'MessageService', MessageService, ...
            'ViewLayoutName', LayoutName, ...
            'ViewList', vl);
        splitView(MultiView,[],2);
        MultiView.Visible = 'on';
        end
        
    end
    
end

function OK = iShowList(mdev)
%iShowList show list when more than 1 alternative model and not a mdevmlerf

OK = ~isa(mdev,'mdevmlerf') && numChildren(mdev)>0;
end

function p = iBestAlternative(mdev)
%iBestAlternative

if isa(mdev,'mdevmlerf')
    p = address(mdev);
else
    pBest = bestmdev(mdev);
    if isa(pBest,'xregpointer') && ~isnull(pBest) && pBest~=address(mdev)
        % view best model
        p  = pBest;
    else
        % best alternative is the same as self
        p = address(mdev);
    end
    
end
end