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

    classdef FrameWork < mbcmodelview.FrameWork
    %mbcmodelview.local.FrameWork multiview GUI framework for local (two-stage) models
    
    %  Copyright 2015-2015 The MathWorks, Inc. and Ford Global Technologies, Inc.
    
    properties (SetAccess=private)
        %TestNavigator test navigator component
        TestNavigator
        %RMSEPlots RMSE Plots
        RMSEPlots
    end
    
    methods
        
        function show(obj,mdev)
        %show initialize node from Browser for showing

        % top node must be initalized
        if status(mdev)==0
            obj.MessageService.NeedsUpdate=3;
        else
            obj.MessageService.NeedsUpdate=0;
        end
        
        if mle_NeedsUpdate(mdev)
            mledialog(mdev,'The MLE Model has changed and needs to be updated.');
        end
        obj.ForceReset = true;
        
        % restore layout from testplan
        T = mdevtestplan(mdev);
        s = viewLayout(T,'Local');
        if ~isempty(s)
           restoreViewLayout(obj.MultiView,obj.MultiView.ViewLayoutName,s.MultiView); 
        end        
        
        end
        
        function view(obj,mdev)
        % view update view from Browser
        
        T = mdevtestplan(mdev);
        s = viewLayout(T,'Local');
        if obj.ForceReset && ~isempty(s)
            % use stored current test
            CurrentTest = s.CurrentTest;
        else
            CurrentTest = obj.MessageService.CurrentTest;
        end
        
        updateNode(obj.MessageService, address(mdev), CurrentTest,obj.ForceReset)
        obj.ForceReset = false;
        end
        
        function ok = hide(obj)
        %hide hide node from Browser
        
        ms = obj.MessageService;
        if ~isnull(ms.Pointer)
            ok = true;
            if ms.NeedsUpdate && ( numChildren(ms.ModelDev)>0 || ~isempty(covmodel(model(ms.ModelDev))) )
                % must have response features or covariance model for anything to be required.
                resp = questdlg('Do you want to update all dependent model fits now?','Local Model Fit',...
                    'Yes','No','Cancel','Yes');
                switch resp
                    case 'Yes'
                        UpdateLinks(ms.ModelDev,ms.NeedsUpdate);
                    case 'No'
                        % set status to 0 for all dependent nodes
                        ClearLinks(ms.ModelDev);
                    case {'Cancel',[]}
                        % include ESC key
                        
                        % don't leave node
                        ok = false;
                end
                if isInBrowser(obj)
                    doDrawIcons(obj.Browser);
                end
            end
            
            % save layout to test plan
            T = mdevtestplan(obj.MessageService.ModelDev);
            s.MultiView = saveViewLayout(obj.MultiView);
            s.CurrentTest = obj.MessageService.CurrentTest;
            viewLayout(T,'Local',s);
            
            % ask message service to perform any tidy up actions
            ok = ok && leaveNode(ms);
        else
            ok = true;
        end
        end
        
    end
    
    methods(Access=protected)
        
        function create(obj,parentInfo)
        %create create graphical components
        if isstruct(parentInfo)
            obj.ViewParent = parentInfo.ViewParent;
            obj.ToolbarParent = parentInfo.ToolbarParent;
        else
            obj.ViewParent = parentInfo;
        end
        
        % test navigator and model description at top
        obj.TestNavigator = mbcmodelview.local.TestNavigator('MessageService',obj.MessageService,...
            'Parent',obj.ViewParent);     
        des = mbcmodelview.Description('MessageService',obj.MessageService,...
            'Parent',obj.ViewParent);
        TopLyt = xreggridbaglayout(obj.ViewParent,...
            'dimension',[1,2],...
            'colsizes',[250,-1],...
            'elements',{obj.TestNavigator,des});
        
        % Multiview construction
        
        obj.MultiView = obj.createMultiView(obj.ViewParent,obj.MessageService);
        topLeft = xreggridbaglayout(obj.ViewParent,...
            'dimension',[2,1],...
            'rowsizes',[37,-1],...
            'gapy',1,...
            'elements',{TopLyt,obj.MultiView});
        
        rmseContainer = mbcgui.container.titlebarpanel('Parent',obj.ViewParent,...
            'BarTitle','RMSE Plots');
        obj.RMSEPlots = mbcmodelview.local.RMSEPlots('Parent',rmseContainer,'MessageService',obj.MessageService);
        rmseContainer.ContentHandle = obj.RMSEPlots;
        MainPane = xregsplitlayout(obj.ViewParent,...
            'Orientation','ud',...
            'split',[0.9 0.1],...
            'minwidth',[220,220],...
            'DividerWidth',4,...
            'DividerStyle','flat',...
            'BottomInnerBorder',[2 0 0 0],... 
            'top',topLeft,...
            'bottom',rmseContainer);
        
        % Workfow and other summary info displayed in a separate splitter
        obj.Workflow = mbcWorkflowPanel(obj.ViewParent);
        
        obj.InfoPane = mbcmodelview.local.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', MainPane,...
            '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        
end
    
    methods(Access=private)
        function obj = FrameWork(Browser,MessageService)
        %FrameWork private constructor
        
        if nargin<2
            MessageService = mbcmodelview.local.TwoStageMessageService;
        end
        
        obj@mbcmodelview.FrameWork(Browser,MessageService)
        
        addListeners(obj,[event.listener(obj.MessageService,'NodeUpdated',@obj.onNodeUpdated),...
            event.listener(obj.MessageService,'ModelChanged',@obj.onModelChanged)]);
        end        
        
        function onNodeUpdated(obj,~,~)
        %onNodeUpdated update Browser when MessageService is updated
        
        ms = obj.MessageService;
        
        if ms.NeedsUpdate
            mdev = ms.ModelDev;
            if ~isempty(BestModel(mdev)) 
                % deselect two-stage model
                mdev = BestModel(mdev,0);
                if isInBrowser(obj) 
                    % Browser interactions
                    mbH = obj.Browser;
                    mbH.doDrawTree(ms.Pointer);
                    mbH.doDrawIcons;
                    % lower listview
                    listview(mbH);
                    mbH.doDrawTree(children(mdev));
                end
            end
            if isInBrowser(obj)
                doDrawText(obj.Browser);
            end
        end
        
        end
        
        
        function onModelChanged(obj,ms,evt)
        %onModelChanged model definition is changed
        
        OldP = evt.data.OldPointer;
        NewP = evt.data.NewPointer;
        if isInBrowser(obj)
            mbH = obj.Browser;
            
            mbH.treeview(OldP,'remove');
            mbH.CurrentNode= xregpointer;
            Parent = OldP.delete;
            mbH.treeview(Parent,'add');
            % select node
            mbH.GUILocked=false;
            % we deleted the tree node so we need to reselect
            mbH.SelectNode(NewP);
        else
            % delete old node
            OldP.delete;
            updateNode(ms,NewP);
        end
        
        end
        
    end
    
    methods (Static)
        function obj = createFigure(pNode)
        %createFigure make view in a separate figure for testing
        obj = mbcmodelview.local.FrameWork([]);
        updateNode(obj.MessageService, pNode);
        
        figure(obj);

        end
        
        function [lyt, tblyt, ViewData]=creategui(mdev,infoParent)
        %create view for inside the model browser
        
        ViewData = mbcmodelview.local.FrameWork(MBrowser);
        updateNode(ViewData.MessageService, address(mdev));
        
        create(ViewData,infoParent);
        lyt = ViewData.MainLayout;
        tblyt = ViewData.Toolbar;
        
        end
        
        function MultiView = createMultiView(ViewParent,MessageService,LayoutName)
        %createMultiView multiview for plots
                
        if nargin<3
            LayoutName = 'localModelViews';
        end                
        
        vl = mbcgui.multiview.ViewList;
        add(vl,mbcmodelview.local.PredObsPlot.ViewInfo);
        add(vl,mbcmodelview.ScatterPlot.ViewInfo);
        add(vl,mbcmodelview.local.DataPlots.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,'lr',2);
        MultiView.Visible = 'on';
        
        end

        
    end
    
end