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

    classdef FrameWork < mbcmodelview.FrameWork
    %mbcmodelview.testplan.FrameWork framework for test plan
    
    %  Copyright 2015-2016 The MathWorks, Inc. and Ford Global Technologies, Inc.
    
    properties (SetAccess=private)
        %CrossSectionView cross section plot
        CrossSectionView
        %BlockDiagram block diagram 
        BlockDiagram
        %TabLayout tab to select BlockDiagram or CrossSectionView
        TabLayout
    end
    
    methods
        
        function show(obj,TP)
        %show show test plan view
        ms = obj.MessageService;
        obj.ForceReset = true;
        setNewTestPlan(ms, address(TP));
        % restore any stored layout
        s = viewLayout(ms.Testplan,'Testplan');
        deserializeView(obj,s)

        end
        
        function view(obj,TP) %#ok<INUSD>
        %view update test plan view
        
        obj.ForceReset = false;
        update(obj.MessageService)
        
        end
        
        function ok = hide(obj)
        %hide hide test plan view
        
        ms = obj.MessageService;
        if ~isnull(ms.Pointer) 
            % ask message service to perform any tidy up actions 
            if any(ms.ModelFitted)
                % store layout settings
                s = serializeView(obj);
                ms.Testplan = viewLayout(ms.Testplan,'Testplan',s);
            end
            ok = leaveNode(ms);
        else
            ok=1;
        end
        end
        
        function openDesignEditor(obj)
        %openDesignEditor open DoE editor
        
        obj.Actions.EditDesign.execute();
        end
        
        function change(obj,pTestplan)
        %change change test plan state
        %    change(obj,pTestplan)
        if nargin<2
            pTestplan = obj.Pointer;
        end
        change(obj.MessageService,pTestplan)
        end
        
        function s = serializeView(obj)
        %SERIALIZEVIEW Get serializable setup data for the view
        %  OUT = SERIALIZEVIEW(OBJ) retuns a MATLAB array that contains the setup
        %  data that will allow this view to be recreated via the deserializeView
        %  function in the future. 
        
        ms = obj.MessageService;
        if ~isnull(ms.Pointer) && any(ms.ModelFitted)       
            % store cross-section settings only if models are fitted
            s = serializeView(obj.CrossSectionView);
            currentCard = find(obj.TabLayout.SelectedTab == obj.TabLayout.Children);
            s.CardNumber = currentCard;
        else
            s = [];
        end
        end
        function deserializeView(obj,s)
        %DESERIALIZEVIEW Set saved state data
        %  DESERIALIZEVIEW(OBJ, DATA) sets a copy of the serialized state of this
        %  View.  DATA is a MATLAB array that will have been created by a
        %  previous call to SERIALIZEVIEW on this View object.
        
        if ~isempty(s)
            tabNumber = s.CardNumber;
            currentTab = find(obj.TabLayout.SelectedTab == obj.TabLayout.Children);
            deserializeView(obj.CrossSectionView,s);
            if currentTab~=tabNumber
                % set main tab and side layout view
                %synchronize info pane
                set(obj.TabLayout, 'SelectedTab', obj.TabLayout.Children(tabNumber));
                selectView(obj.InfoPane,tabNumber)
            end
        end


        end        
        
    end
    
    methods (Access=private)
        function obj = FrameWork(MBrowser,MessageService)
        %FrameWork private constructor
        if nargin<2
            MessageService = mbcmodelview.testplan.MessageService;
        end
        
        obj@mbcmodelview.FrameWork(MBrowser,MessageService)
        
        addListeners(obj,event.listener(obj.MessageService,'NodeChanged',@obj.onNodeChanged));        
        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
        
        
        testPlanMainPanel = mbcgui.container.layoutpanel('Parent',obj.ViewParent,...
            'LayoutBorder',[0,0,0,0],...
            'Tag', 'TestPlanMainPanel', ...
            'BorderType', 'beveledin');
        
        % create tab layout and add the block diagram and cross view
        tabLayout = uitabgroup('Parent',testPlanMainPanel,...
            'SelectionChangedFcn', @obj.onTabChanged,...
            'Units','pixels');
        
        % block diagram tab
        blockDiagramTab = mbcgui.container.uitab('Parent',tabLayout,...
            'Title','Test Plan');
        obj.BlockDiagram = mbcmodelview.testplan.BlockDiagram('Parent',blockDiagramTab,...
            'MessageService',obj.MessageService);
        blockDiagramTab.LayoutComponent = obj.BlockDiagram;
        
        % cross-section tab
        crossSectionTab = mbcgui.container.uitab('Parent',tabLayout,...
            'Title','Response Models');
        crossView = mbcmodelview.testplan.CrossSectionView('Parent',crossSectionTab, ...
            'MessageService', obj.MessageService);
        crossSectionTab.LayoutComponent = crossView;
        obj.CrossSectionView = crossView;
        
        set(testPlanMainPanel,'LayoutComponent',{tabLayout});
        obj.TabLayout = tabLayout;

        
        % Workfow and other summary info displayed in a separate splitter
        % to the right
        obj.Workflow = mbcWorkflowPanel(obj.ViewParent);
        obj.InfoPane = mbcmodelview.testplan.InfoPane('MessageService',obj.MessageService,...
            'CrossSectionView',obj.CrossSectionView,...
            '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', testPlanMainPanel,...
            'right', lytRightPane ,...
            'minwidth',[400 250],...
            'split',[0.98 0.02],...
            'border',[-1 -1 -1 -1],...
            'style','toright');        
        
        % create menus, toolbars, workflow controls
        Labels = {'&TestPlan';'&View'};
        createControls(obj,Labels);        
        
        % context menu for tree
        if ~isempty(obj.Browser)
            obj.NodeContextMenu = makeContextMenuBase(obj.Browser);
            createMenuItem(obj.Actions.MakeTemplate,obj.NodeContextMenu);
        end
        
        end
        
        function onTabChanged(obj,src,~)
        %onTabChanged change infopane view to match tab
        currentCard = find(src.SelectedTab == src.Children);
        selectView(obj.InfoPane,currentCard)
        end
        
        function onNodeChanged(obj,~,~)
        %onNodeChanged respond to NodeChanged event
        selectView(obj)
        if ~obj.ForceReset && isInBrowser(obj) 
            % update list view
            listview(obj.Browser);
        end
        
        end
        
        function selectView(obj)
        %selectView select  state of test plan view
        %  select tab and synchronize info pane based on model fitted
        
        ms = obj.MessageService;
        s = viewLayout(ms.Testplan,'Testplan');
        % selected tab
        currentTab = find(obj.TabLayout.SelectedTab == obj.TabLayout.Children);
        if isempty(s) 
            % switch view if no layout stored (initial state). This causes
            % the layout to switch to the cross-section view when models
            % are fitted.
            if any(ms.ModelFitted)
                % show cross-section if models are fitted
                tabNumber = 2;
            else
                % block diagram tab
                tabNumber = 1;
            end
            if currentTab~=tabNumber
                % set main tab and side layout view
                set(obj.TabLayout, 'SelectedTab', obj.TabLayout.Children(tabNumber));
                %synchronize info pane
                selectView(obj.InfoPane,tabNumber)
            end
        end

        end

        
    end
    
    methods (Static)
        function obj = createFigure(pNode)
        %createFigure make view in a separate figure for testing
        obj = mbcmodelview.testplan.FrameWork([]);
        figure(obj);
        set(obj.Figure,'Name','Test Plan');
        drawnow update
        setNewTestPlan(obj.MessageService,pNode);
        selectView(obj)
        update(obj.MessageService);

        end
        
        function [lyt, tblyt, obj]=creategui(mdev,infoParent)
        %create view for inside the model browser
        
        MessageService = mbcmodelview.testplan.MessageService;
        setNewTestPlan(MessageService, address(mdev));
        obj = mbcmodelview.testplan.FrameWork(MBrowser,MessageService);
        create(obj,infoParent);
        lyt = xreglayerlayout(obj.ViewParent,'elements',{obj.MainLayout});
        tblyt = obj.Toolbar;
        
        end 
    end
    
end