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