www.gusucode.com > mbcdesign 工具箱 matlab 源码程序 > mbcdesign/+xregdesgui/Editor.m

    classdef Editor < mbcgui.Application
    %Editor Data Editor application object.
    %   xregdesgui.Editor creates an Application object for the Design
    %   Editor.  In addition to the standard Application properties, this adds
    %   properties, methods and events that are specific to the Design Editor.
    % 
    %   hDoE = xregdesgui.Editor.create();
    
    %   Copyright 2015-2016 The MathWorks, Inc.
    
    properties(SetAccess=private)
        %DesignTree mbctreeadapter.DesignEditorTree
        DesignTree
        %TreeView treeview component for DoE editor
        TreeView
        %InfoPane info pane component for DoE editor
        InfoPane
        %ViewCard card to switch between null view and multiview panel
        ViewCard
        %MultiView multiview panel for plots and tables
        MultiView
        %Toolbar figure toolbar
        Toolbar
        %FileMenu main file menu
        FileMenu
        %EditMenu main edir menu
        EditMenu
        %ViewMenu main view menu
        ViewMenu
        %DesignMenu main view menu
        DesignMenu
        %ToolsMenu main tools menu
        ToolsMenu
    end
    
    properties
        %CurrentStage stage for current design session (1,2)
        CurrentStage
    end
    
    % Miscellaneous storage
    properties(Access=private)
        PointerStack = cell(0,2);
    end
    
    properties(Dependent,SetAccess=private)
        %TreeStruct design tree structure for interface with storage in designdev
        TreeStruct
        %Locked lock design editor
        Locked
        %Actions design editor actions
        Actions
    end
    
    methods (Access=private)
        function obj = Editor(varargin)
        %Editor editor constructor
        obj@mbcgui.Application(...
            'Name', 'Design Editor',...
            'Visible','off',...
            varargin{:});
        obj.SleepOnClose = true;
        end
        
    end
    
    methods % set/get methods
        
        function s = get.TreeStruct(obj)

        % save design tree as structure for designdev
        s = saveTree(obj.DesignTree);
        %save multiview layout
        s.ViewInfo = obj.serializeDisplayLayout;
        
        end
        
        function set.TreeStruct(obj,s)
        %set.TreeStruct update DoE editor with structure stored in designdev
        loadTree(obj.DesignTree,s)
        if isfield(s,'ViewInfo')
            % multiview layout storage
            obj.replaceDisplayLayout(s.ViewInfo);
        end
        end
        
        function Locked = get.Locked(obj)
        Locked = obj.DesignTree.Locked;
        end
        function set.Locked(obj,Locked)
        obj.DesignTree.Locked = Locked;
        end
        
        function a = get.Actions(obj)
        
        a = obj.DesignTree.Actions;
        end
        
    end
    
    methods (Static)
        function obj = create(varargin)
        %create create or restore data editor
        %    obj = xregdesgui.Editor.create('TreeStruct',s,...
        %         'Title','DoE Editor',... 
        %         'Locked',false); 
        
        if nargin==0
            % create default tree and select empty design
            t.designs = {xregdesign,xregdesign};
            t.parents = [0 1];
            t.chosen = 1;
            t.CurrentIndex = 2;
            Args = {'TreeStruct',t};
        else
            Args = varargin;
        end
        
        Tag = 'DOEeditor';
        obj = xregdesgui.Editor.find(Tag);
        if isempty(obj)
            % initial default size
            deSize =   [50 100 800 600];
            obj = xregdesgui.Editor('Tag',Tag,...
                'Position',deSize);
            obj.Figure.Visible = 'on';
        else
            restore(obj);
        end

        busy(obj.DesignTree,'Initializing...')
        set(obj,Args{:});
        idle(obj.DesignTree)
        setStatusMessage(obj,'Ready');
        
        end
        
    end
    
    % mbcgui.Application overrides
    methods(Access=protected)
        function C = createContent(obj)
        %CREATECONTENT Create content layout.
        %   C = CREATECONTENT(OBJ) constructs the basic content layout for the Data
        %   Editor.
        
        % create design tree
        obj.DesignTree = xregdesgui.DesignEditorTree;
        % DesignPackage acts as MessageService
        ms = obj.DesignTree.Package;
        obj.Listeners = [obj.Listeners(:); event.listener(ms,'Busy',@obj.onBusy)
            event.listener(ms,'Idle',@obj.onIdle)];
        
        hFig = obj.Figure;
        
        % Create the menuview object to generate and maintain the menus and toolbar
        % Top level menus
        obj.FileMenu = uimenu('Parent', hFig, 'Label', '&File');
        obj.EditMenu = uimenu('Parent', hFig, 'Label', '&Edit');
        obj.ViewMenu = uimenu('Parent', hFig, 'Label', '&View');
        obj.DesignMenu = uimenu('Parent', hFig, 'Label', '&Design');
        obj.ToolsMenu = uimenu('Parent', hFig, 'Label', '&Tools');
        % Add a window and help menu
        xregwinlist(hFig);
        mv_helpmenu(hFig, {'&Data Editor Help', 'xreg_dataEditor'});
        
        toolbarPanel = mbcgui.container.layoutpanel(...
            'Parent', obj.Figure, ...
            'BorderType', 'beveledin');
        % Create the toolbar
        toolbar = xregGui.uitoolbar('Parent', toolbarPanel,...
            'resourcelocation', xregrespath);
        
        obj.Toolbar = toolbar;
        set(toolbarPanel, 'LayoutComponent', toolbar);
        
        obj.setStatusProgress(0.25, 0, 1);
        msgID = obj.setStatusMessage('Creating information views...');
        
        obj.TreeView = xregdesgui.TreeView('Parent',obj.Figure,...
            'Actions',obj.Actions,...
            'DesignTree',obj.DesignTree);
        obj.InfoPane = xregdesgui.InfoPane('Parent',obj.Figure,...
            'DesignTree',obj.DesignTree);
        
        createMultiView(obj)
        
        % load in preferences defaults
        p=mbcprefs('mbc');
        userprefs=getpref(p,'DesignEditor');
        spl=xregsplitlayout(obj.Figure,...
            'orientation','ud',...
            'top',obj.TreeView,...
            'bottom',obj.InfoPane,...
            'split',[.7 .3],...
            'dividerstyle','flat',...
            'dividerwidth',4);
        spl=xregsplitlayout(obj.Figure,...
            'right',obj.ViewCard,...
            'left',spl,...
            'split',[userprefs.treesize obj.Figure.Position(3)-userprefs.treesize],...
            'minwidth', [30 30], ...
            'dividerstyle','flat',...
            'dividerwidth',4);
        
        % Link the visible components together
        C = xreggridbaglayout(obj.Figure,...
            'dimension', [2 1],...
            'elements', {toolbarPanel spl},...
            'rowsizes', [31 -1],...
            'gapy', 2);        
        
        obj.setStatusMessage(msgID, 'Regenerating saved views...');
        obj.setStatusProgress(0.6);
        % Get the layout preferences
        obj.setStatusMessage(msgID, 'Redrawing...');
        obj.setStatusProgress(0.9);
        
        % How far through are we?
        obj.setStatusMessage(msgID, 'Completing...');
        obj.setStatusProgress(1);
        
        createControls(obj)
        
        % Tell the user everything is ready
        obj.setStatusProgress(0);
        obj.setStatusMessage(msgID, 'Ready');
        
        end
        
        function sleep(obj)
        %SLEEP Take action when the window is made invisible
        %  SLEEP(OBJ)
        
        deleteWindows(obj.Actions)
        
        % Clear design data - accomplish this safely by setting a new, empty tree
        % switch to null view
        clear(obj.DesignTree);
        obj.CurrentStage = 1;
        clearStatusMessage(obj)
        resetPointer(obj);
        
        % save out any user preferences that may have changed
        p=mbcprefs('mbc');
        prefs=getpref(p,'DesignEditor');
        sz=get(get( obj.DesignTree.UITree,'Parent'),'Position');
        prefs.treesize=sz(3);
        setpref(p,'DesignEditor',prefs);
        
        % Save view layout
        hView = obj.MultiView;
        hView.saveViewLayout;
        end
        
    end
    
    methods
        function restore(obj)
        %RESTORE Make window visible again
        %   RESTORE(OBJ) will re-open an application that has been put into a
        %   "sleep" mode when closed.
        
        if strcmp(get(obj.Figure, 'Visible'), 'on')
            % Fake a close event before restoring the application
            obj.close(true);
        end
        
        obj.restore@mbcgui.Application();
        end
        
    end
    
    % Construction helper methods and callbacks
    methods(Access=private)
        function createControls(obj)
        %createControls create data editor controls
        
        hFig = obj.Figure;
        % process data on closing figure
        hFig.CloseRequestFcn = @(h,evt) obj.AcceptDataAction.execute();
        
        % file menu
        createFileMenu(obj.Actions,obj.FileMenu,obj.MultiView.Actions);
        % edit menu
        createEditMenu(obj.Actions,obj.EditMenu,obj.MultiView.Actions);
        % tools menu
        createDesignMenu(obj.Actions,obj.DesignMenu);
        % tools menu
        createToolsMenu(obj.Actions,obj.ToolsMenu);

        % create multiview toolbar
        AGview = mbcgui.actions.ActionGroup('','Toggle');
        AGview.MenuType = 'separate';
        AGview.Actions = obj.MultiView.Actions.ChangeView;        
        
        % create toolbar items
        obj.Toolbar.setRedraw(false);
        createToolbar(obj.Actions,obj.Toolbar,AGview);
        obj.Toolbar.setRedraw(true);
        
        end
        
        function createMultiView(obj)
        %createMultiView create data editor multiview area

        obj.ViewCard = xregcardlayout(obj.Figure,'numcards',3);
        
        
        % Create a MultiViewPanel that is setup for the design editor views
        obj.MultiView = mbcgui.multiview.MultiViewPanel('Parent', obj.Figure, ...
            'MessageService', obj.DesignTree.Package, ...
            'GlobalViewOptions',obj.Actions.AllViewOptionGroup,...
            'ViewLayoutName', 'DesignEditor', ...
            'ViewList', xregdesgui.ViewerList);
        
        % add multiview menus to main view menu
        addViewMenuItems(obj.MultiView,obj.ViewMenu);
        
        createRootView(obj)
        createNoPointsView(obj);
        
        attach(obj.ViewCard, obj.MultiView , 3);
        
        % Switch cards and disable global view options when no design is being viewed
        obj.MultiView.UserData = obj.DesignTree.Package.addlistener( ...
            'AnyChange',@obj.onItemChange);
        
        end
        
        function onItemChange(obj,~,~)
        %onItemChange switch view card for root node
        
        d = obj.DesignTree.Package.getdesign;
        
        if obj.DesignTree.Current == obj.DesignTree.Root
            % root node
            set(obj.ViewCard,'currentcard',1);
            set(obj.Actions.AllViewOptionGroup, 'Enabled', false);
        elseif npoints(d)==0
            % no points
            set(obj.ViewCard,'currentcard',2);
            set(obj.Actions.AllViewOptionGroup, 'Enabled', false);
        else
            % ordinary view
            set(obj.ViewCard,'currentcard',3);
            set(obj.Actions.AllViewOptionGroup, 'Enabled', true);
        end
        
        end
        
        function onBusy(obj,~,evt)
        %onBusy listen for MessageService.Busy and change the figure pointer
        ptrID = setPointer(obj,'watch');
        msgID = setStatusMessage(obj,evt.Data.Message);
        
        obj.PointerStack(end+1,:) = {ptrID,msgID};
        
        end
        
        function onIdle(obj,~,~)
        %onIdle listen for MessageService.Idle and change the figure pointer
        if ~isempty(obj.PointerStack)
            removePointer(obj,obj.PointerStack{end,1})
            removeStatusMessage(obj,obj.PointerStack{end,2})
            obj.PointerStack(end,:) = [];
        end
        end
        
        function onPostClose(obj,~,~)
        %onPostClose clean up design editor before closing
        
        obj.CurrentStage = 1;
        closeSubWindows(obj.Actions);
        % clean up status bar and pointer
        resetPointer(obj);
        clearStatusMessage(obj);
        % save out any user preferences that may have changed
        p=mbcprefs('mbc');
        prefs=getpref(p,'DesignEditor');
        sz=get(get( obj.DesignTree.UITree,'Parent'),'Position');
        prefs.treesize=sz(3);
        setpref(p,'DesignEditor',prefs);
        
        % Save view layout in preferences
        hView = obj.MultiView;
        hView.saveViewLayout;
        
        set(obj.ViewCard,'CurrentCard',1);
        
        end
        
    end
    
    %  View manipulation methods
    methods
        function ViewInfo = serializeDisplayLayout(obj)
        %serializeDisplayLayout serialize data editor layout
        
        ViewInfo = saveViewLayout(obj.MultiView);
        end
        
        function replaceDisplayLayout(obj, ViewInfo)
        %replaceDisplayLayout replace data editor layout
        %   replaceDisplayLayout(obj, ViewInfo)
        
        restoreViewLayout(obj.MultiView,'DesignEditor',ViewInfo);
        end
        
        function views = enumerateViews(obj)
        %enumerateViews get list of views
        
        viewContainers = getViewContainers(obj.MultiView);
        views = [viewContainers.View];
        end
        
    end
    
end


function createRootView(obj)

rootsview = mbcgui.container.layoutpanel('Parent', obj.Figure, ...
    'BackgroundColor', 'w');
wk=mbcWorkflowPanel(rootsview);
wk.Title.String = 'Get Started';
createWorkflowItems(obj.Actions.NewDesign,wk);

txt = uicontrol('Parent',rootsview,...
    'Style','text',...
    'BackgroundColor', 'w',...
    'FontSize',10,...
    'String','You have no design selected. Create a new design or select a design with the tree.');

btn = uicontrol('Parent',rootsview,...
    'Style','pushbutton',...
    'Callback',@onNewDesign,...
    'String','New Design');


lyt = xreggridbaglayout(rootsview,...
    'dimension',[4 3],...
    'gapy',10,...
    'rowsizes',[-1 20 25 -1],...
    'colsizes',[-1 120 -1],...
    'elements',{[],[],[]
    txt,[],[]
    [],btn,[]
    [],[],[]},...
    'MergeBlock',{[2 2],[ 1 3]});
rootsview.LayoutComponent = lyt;
    
attach(obj.ViewCard, rootsview , 1);
    function onNewDesign(~,~)
    obj.Actions.NewDesign.execute;
    end
end



function createNoPointsView(obj)

nopointsview = mbcgui.container.layoutpanel('Parent', obj.Figure, ...
    'BackgroundColor', 'w');
wk=mbcWorkflowPanel(nopointsview);
AG = mbcgui.actions.ActionGroup('Setup');
AG.Actions = [obj.Actions.Constraints obj.Actions.SpaceFill obj.Actions.Optimal];
createWorkflowItems(AG,wk);
% Make the optimal design action interuptible so users can stop the
% algorithm
wk.Items(3).Interruptible = 'on';

txt = uicontrol('Parent',nopointsview,...
    'Style','text',...
    'BackgroundColor', 'w',...
    'FontSize',10,...
    'String','Your design has no points. Define constraints and create a design.');

lyt = xreggridbaglayout(nopointsview,...
    'dimension',[4 3],...
    'gapy',10,...
    'rowsizes',[-1 20 120 -1],...
    'colsizes',[-1 230 -1],...
    'elements',{[],[],[]
    txt,[],[]
    [],wk,[]
    [],[],[]},...
    'MergeBlock',{[2 2],[ 1 3]});
nopointsview.LayoutComponent = lyt;
    
attach(obj.ViewCard, nopointsview , 2);
end