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

    classdef OperatingPointNavigator < mbcgui.multiview.View
    %OperatingPointNavigator contains test navigator and operating points table
    
    %  Copyright 2015-2015 The MathWorks, Inc. and Ford Global Technologies, Inc.
    
    properties (SetAccess=private)
        %EditTest test selector edit box
        EditTest;
        %NextTest Next test button
        NextTest;
        %PreviousTest Previous test button
        PreviousTest;
        %SelectTest Select test button
        SelectTest;
        %MaxTestNumber Maximum test value
        MaxTestNumber;
        %OperatingPointsTable Table displaying table of operating points
        OperatingPointsTable;
        %OperatingPointsPanel Panel that contains the operating points table
        OperatingPointsPanel;
    end
    
    methods
        function obj = OperatingPointNavigator(parent, ms)
            %OperatingPointNavigator - constructor
            
            obj@mbcgui.multiview.View('Parent', parent, ...
                'MessageService', ms);
            
            testSelectorPanel = createTestNavigator(obj);
            addMessageServiceListener(obj, 'NodeChanged', @obj.onNodeChanged)
            
            obj.OperatingPointsPanel = createOperatingPointsTable(obj);
            
            testSelectorLayout= xreggridbaglayout(obj.Parent, ...
                'dimension',[2 1],...
                'elements',{testSelectorPanel, obj.OperatingPointsPanel},...
                'Rowsizes',[37 -1],...
                'gapy',5);
            
            update(obj)
            obj.ContentHandle = testSelectorLayout;
        end
        
        function updatePanelValuesFromMessageService(obj)
            %updatePanelValuesFromMessageService update the navigator panel
            % if the message service was updated
            update(obj);
        end
        
        function update(obj)
            %update main update method
            ms = obj.MessageService;
            
            if ms.IsPointByPoint && ms.Pointer.IsMatched
                testData = getdata(ms.Pointer.info,'Y');
                obj.MaxTestNumber = size(testData, 3);
                TestNumberList= testnum(testData);
                % update test spinner
                set(obj.EditTest,'String', TestNumberList(ms.CurrentTest));
            end
            
            %enable enable actions
            enableActions(obj);
        
            % Update the table showing operating points and their values
            header = {'Value'};
            names = obj.MessageService.OperatingPointNames;
            values = obj.MessageService.OperatingPointValues;
            tableValues = values';
            
            opPoints = obj.OperatingPointsTable;
            obj.OperatingPointsPanel.UserData = tableValues;
            % any NaN cells are invisible as well
            InvisibleIndex = isnan(tableValues);
            %store up the set calls so we only have to redraw the table once.
            opPoints.Peer.setStoreSwingCalls(true);
            opPoints.Peer.setRowData(names);
            if isempty(header)
                opPoints.Peer.setDisplayColumnHeaders(false);
            else
                opPoints.Peer.setDisplayColumnHeaders(true);
                opPoints.Peer.setColumnData(header);
            end
            opPoints.Peer.setTableData(tableValues);
            opPoints.Peer.setCellVisible(~InvisibleIndex);
            % flush all the set calls we have been storing.
            opPoints.Peer.setStoreSwingCalls(false);
        end
    end
    
    methods
        function createTestNavigatorActions(obj)
            %createTestNavigatorActions create actions for test navigation
            % controls
            obj.NextTest = mbcgui.actions.StatefulAction(@obj.onNextTest,...
                '&Next Test','Next test',xregrespath('arrow_move_right_lg.bmp'));
            obj.PreviousTest = mbcgui.actions.StatefulAction(@obj.onPreviousTest,...
                '&Previous Test','Previous test',xregrespath('arrow_move_left_lg.bmp'));
            obj.SelectTest = mbcgui.actions.StatefulAction(@obj.onSelectTest,...
                '&Select Test...','Select test','');
        end
        
        function testSelectorPanel = createTestNavigator(obj)
            %createTestNavigator Create the panel that allows moving
            % between tests
            
            createTestNavigatorActions(obj)
            
            % Sweep selector controls
            testSelectorPanel = mbcgui.container.layoutpanel(...
                'Parent', obj.Parent, ...
                'BorderType', 'etchedin', ...
                'Visible', 'on');
            obj.EditTest = uicontrol('Parent',testSelectorPanel,...
                'Style','edit',...
                'Units','pixels',...
                'Callback',@obj.onEditTest,...
                'Tag', 'TestEdit');
            
            % next and previous buttons are controlled by
            % mbcmodel.local.ViewActions.
            hPreviousTest = createButton(obj.PreviousTest,testSelectorPanel);
            hPreviousTest.Tag = 'PreviousTest';
            
            hNextTest = createButton(obj.NextTest,testSelectorPanel);
            hNextTest.Tag = 'NextTest';
            
            hSelectTest = createButton(obj.SelectTest,testSelectorPanel);
            hSelectTest.Tag = 'SelectTest';
            seltext = uicontrol('Parent', testSelectorPanel,...
                'Style','text',...
                'FontWeight','demi',...
                'HorizontalAlignment','left',...
                'String','Test:');
            % Page 1
            % sweep selector
            g=xreggridbaglayout(testSelectorPanel,...
                'dimension',[5 6],...
                'rowsizes',[1 5 15 5 1],...
                'colsizes',[30 25,60,25,2,85],...
                'gapx',1,...
                'mergeblock',{[1 5],[2 2]},...
                'mergeblock',{[2 4],[3 3]},...
                'mergeblock',{[1 5],[4 4]},...
                'mergeblock',{[1 5],[6 6]},...
                'elements',{[],[],seltext,[],[],...
                hPreviousTest,[],[],[],[],...
                [],obj.EditTest,[],[],[],...
                hNextTest,[],[],[],[],...
                [],[],[],[],[],...
                hSelectTest,[],[],[],[]},...
                'border',[5 5 5 5]);
            set(testSelectorPanel, 'LayoutComponent', {g});
        end
        
        function operatingPointsPanel = createOperatingPointsTable(obj)
            %createOperatingPointsTable Create the table that shows
            % operating points and their values
            operatingPointsPanel = mbcgui.container.layoutpanel(...
                'Parent', obj.Parent, ...
                'BorderType', 'etchedin', ...
                'LayoutBorder', [5 5 5 5], ...
                'Title', 'Operating Point',...
                'Tag', 'OperatingPointTable');

            obj.OperatingPointsTable = mbcwidgets.Table2D('extendednumeric',...
                'Parent',operatingPointsPanel,...
                'ShowHeaderSelection', false,...
                'Editable', false);        
            obj.OperatingPointsTable.Peer.setRowHeaderWidth( 100 );
            obj.OperatingPointsTable.Peer.setCornerAsBlank();
            set(operatingPointsPanel, 'LayoutComponent', {obj.OperatingPointsTable});
        end
    end
    
    methods (Access=protected)
        
        function onNodeChanged(obj,~,~)
            %onNodeChanged Callback when the selected node in the tree
            % changes
            update(obj);
        end
        
        
        function onEditTest(obj,~,~)
            %onEditTest edit box callback
            ms = obj.MessageService;
            
            NewTestNum = str2double(get(obj.EditTest,'String'));
            TestNumberList = testnum(getdata(ms.Pointer.info,'Y'));
            if isfinite(NewTestNum)
                
                NewTest = find(NewTestNum==TestNumberList);
                if isempty(NewTest)
                    % find closest test number
                    [~,NewTest] = min( abs(TestNumberList-NewTestNum) );
                end
                updateCurrentTest(ms, NewTest);
            else
                errordlg('Numeric test number required','Test Selection','modal')
                set(obj,'String',TestNumberList(ms.CurrentTest));
            end
        end
        
        function onNextTest(obj,~,~)
            %onNextTest Callback for next test button
            ms = obj.MessageService;
            updateCurrentTest(ms, ms.CurrentTest+1)
        end
        
        function onPreviousTest(obj,~,~)
            %onPreviousTest Callback for previous test button
            ms = obj.MessageService;
            updateCurrentTest(ms, ms.CurrentTest-1)
        end
        
        function onSelectTest(obj, ~, ~)
            %onSelectTest Callback for the select test button that opens
            % the test chooser dialog
            ms = obj.MessageService;
            responses = children(ms.Pointer.info);
            if ~isempty(responses)
                NewTest = TestChooser(responses(1).info,ms.CurrentTest);
                OK= NewTest~=0;
                if OK
                    updateCurrentTest(ms, NewTest);
                end
            end
        end
        
        function enableActions(obj)
            %enableActions Will enable/disable actions
            ms = obj.MessageService;
            if ~isnull(ms.Pointer) && ms.Pointer.IsMatched
                obj.PreviousTest.Enabled = (ms.CurrentTest>1);
                obj.NextTest.Enabled = (ms.CurrentTest<obj.MaxTestNumber);
                obj.EditTest.Enable = 'on';
                obj.SelectTest.Enabled = true;
            else
                obj.PreviousTest.Enabled = false;
                obj.NextTest.Enabled = false;
                obj.EditTest.Enable = 'off';
                obj.SelectTest.Enabled = false;
            end
        end
        
    end
    
end