www.gusucode.com > mbcview 工具箱matlab源码程序 > mbcview/+cgcalsetup/NormalizerEditor.m

    classdef NormalizerEditor < handle
    %NORMALIZEREDITOR component for editing normalizers for calibration setup
    %
    % obj = NormalizerEditor(fh,C,index);
    
    %  Copyright 2009-2013 The MathWorks, Inc. and Ford Global Technologies, Inc.
     
    properties
        %Layout main layout for normalizer editor
        Layout
        %Index index for normalizer (1 or 2)
        Index = 1;
        %Data TableData object storage
        Data;
        %pNorm pointer to normalizer
        pNorm 
    end
    
    properties (Access= protected)
        %hAxis popup control to select variable input
        hAxis 
        %hNormalizer popup control to select normalizer (new or list of
        %existing normalizers)
        hNormalizer
        %hSize clickedit control for normalizer size
        hSize
        %hNormTable java table for normalizer editor
        hNormTable
        %hNormLabel label for normalizer name
        hNormLabel
        %hEditBreakpoints pushbutton to edit breakpoints by dialog
        hEditBreakpoints
        %Listeners storage for listeners
        Listeners
    end
    
    methods
        function obj = NormalizerEditor(fh,C,index)
            %NORMALIZEREDITOR constructor
                        
            if index ==1
                label = 'Y';
                dimLabel = 'rows';
            else
                label = 'X';
                dimLabel = 'columns';
            end
            
            obj.Data = C;
            obj.Index = index;
            jt1 = com.mathworks.toolbox.mbc.gui.peer.NormaliserTablePeer;
            obj.hNormTable = mbcwidgets.Table1D(jt1, ...
                'Parent', fh, ...
                'SelectionMode', 'MultiRegion');
            
            obj.hNormLabel = mbcgui.widget.Label('Parent', fh, ...
                'HorizontalAlignment', 'left');
            
            obj.hSize = mbcgui.widget.Spinner('Parent', fh, ...
                'Min', 2, ...
                'Rule', 'int', ...
                'Tag',  sprintf('table%s',dimLabel), ...
                'Callback', {@cbEditBPLength, obj});
            obj.hEditBreakpoints = xregGui.iconuicontrol('Parent', fh, ...
                'ImageFile', fullfile(cgrespath,'autospace.bmp'), ...
                'ToolTipString', 'Edit breakpoints', ...
                'TransparentColor', [255 255 0],...
                'Tag',  sprintf('%s-axis autospace',label), ...
                'Callback', {@cbEditVectorDialog,obj});
         
            hTableSize = xregGui.labelcontrol('Parent', fh, ...
                'String', sprintf('Table %s:',dimLabel), ...
                'LabelSizeMode', 'absolute', ...
                'LabelSize', 85, ...
                'ControlSizeMode', 'absolute', ...
                'ControlSize', 60, ...
                'Gap', 5, ...
                'Control',obj.hSize );
              sizelyt = xreggridbaglayout(fh,...
                'dimension',[1 2],...
                'colsizes',[150 -1],...
                'gapx',3,...
                'border',[0 0 0 0],...
                'elements',{hTableSize,obj.hEditBreakpoints });          
            
            SC = xregGui.SystemColorsDbl;
            obj.hAxis = uicontrol('Parent', fh, ...
                'Style', 'Popupmenu', ...
                'String', {''}, ...
                'BackgroundColor', SC.WINDOW_BG, ...
                'Tag',  sprintf('%s-axis input',label), ...
                'Callback', {@cbChangeAxisVariable,obj});
            hAxisLabel = xregGui.labelcontrol('Parent', fh, ...
                'String', sprintf('%s-axis input:',label), ...
                'LabelSizeMode', 'absolute', ...
                'LabelSize', 85, ...
                'ControlSizeMode', 'absolute', ...
                'ControlSize', 115, ...
                'Gap', 5, ...
                'Control', obj.hAxis);
            
            obj.hNormalizer = uicontrol('Parent', fh, ...
                'Style', 'Popupmenu', ...
                'String', {''}, ...
                'BackgroundColor', SC.WINDOW_BG, ...
                'Tag',  sprintf('%sNorm',label), ...
                'Callback', {@cbExistingNorm,obj});
            hNormalizerLabel = xregGui.labelcontrol('Parent', fh, ...
                'String', 'Normalizer:', ...
                'LabelSizeMode', 'absolute', ...
                'LabelSize', 85, ...
                'ControlSizeMode', 'absolute', ...
                'ControlSize', 115, ...
                'Gap', 5, ...
                'Control', obj.hNormalizer);
            
            % make a layout
            lyt = xreggridbaglayout(fh,...
                'dimension',[5,1],...
                'rowsizes',[20 20 20 15 -1],...
                'gapy',3,...
                'UserData',obj,...
                'elements',{hAxisLabel,hNormalizerLabel,sizelyt,obj.hNormLabel,obj.hNormTable });
            obj.Layout = lyt;
            
            obj.Listeners =createBPListener(obj);
            
            % initialize object
            initialize(obj);
        end
        
        function initialize(obj)
            %INITIALIZE initializer normalizer editor with current settings
            
            C = obj.Data;
            index = obj.Index;
            bp = C.BreakPoints{index};
            pInput = C.pTableInputs(index);
            pTabInputs = C.TabInputList;
            
            % list possible model inputs available for normalizer inputs
            InpList = pveceval(pTabInputs,@getname);
            [~,loc]= ismember(pInput.getname,InpList);
            set(obj.hAxis,'String',InpList,'Value',loc);
            setTable(obj,bp);
            obj.hNormLabel.String = sprintf('%s normalizer:',pInput.getname);
            
            
            % list of normalizers in project with pInput as the input 
            A = C.Project.getConnections;
            NormInd = find(A,'Type','Normalizer');
            %there is always the ability to create a new normalizer
            NormNames = {'<New>'};
            pNorms = A.pData(NormInd);
            Selected = false(size(pNorms));
            for i= 1:length(pNorms)
               Selected(i) = ~C.UseOpPoints && getinputs(pNorms(i).info) == pInput;
            end
            obj.pNorm = pNorms(Selected);
            NormNames = [NormNames pveceval(obj.pNorm,@getname)];

            if any(C.pNorm(obj.Index) == obj.pNorm)
                % selected normalizer
                SelNorm = find(C.pNorm(obj.Index) == obj.pNorm) + 1;
            else
                SelNorm = 1;
            end
            
            set(obj.hNormalizer,'String',NormNames,'Value',SelNorm);
            
            if C.UseOpPoints
                % disable editing when using operating points
                obj.hNormTable.Enable = 'off';
                obj.hNormTable.Editable = false;
                obj.hSize.Enable = 'off';
                set(obj.hNormalizer,'Enable','off');
                set(obj.hEditBreakpoints,'Enable','off');
                
            else
                EditNormState = mbconoff(SelNorm==1);
                obj.hSize.Enable = EditNormState;
                obj.hNormTable.Enable = EditNormState;
                obj.hNormTable.Editable = SelNorm==1;
                set(obj.hNormalizer,'Enable','on');
                set(obj.hEditBreakpoints,'Enable',EditNormState);
            end
            
        end
        
        function enableListeners(obj,State)
            %enableListeners - remember to disable listeners when leaving
            %the normalizer page otherwise there will be strange side
            %effects
            %
            % enableListeners(obj,State)
            for i=1:length(obj.Listeners)
                if isa(obj.Listeners{i},'handle.listener')
                    obj.Listeners{i}.Enabled = State;
                else
                    obj.Listeners{i}.Enabled = strcmp(State,'on');
                end
            end
        end
        
        function setTable(obj,bp)
            %setTable set normalizer data in java table
            %
            % setTable(obj,bp)
            
            set(obj.hSize,'Value',length(bp));
            nrows = length(bp);
            obj.hNormTable.Peer.setNormaliserData([bp(:), (0:nrows-1)'], ...
                {'Input', 'Output'}, [], false);
        end
        
    end
    methods (Access=private)
        function L = createBPListener(obj)
            %CREATEBPLISTENER react to certain TableData changes
            %
            %  TableInputs, UseOpPoints
            % These listeners enable the two normalizer editors to keep in
            % sync (for example, when switching the order of the
            % normalizers or reverting to UseOpPoints (set from main
            % NormalizerPage control).
            
            C= obj.Data;
            
            L = {handle.listener(obj.hNormTable, 'ValueChanged',{@cbEditBPs, obj});
                event.proplistener(C, C.findprop('TableInputs'),'PostSet',@(h,evt) cbChangeOtherAxis(h,evt,obj))};
        end
        
    end
end

function cbEditBPLength(~,~,obj)
%CBEDITBPLENGTH callback for changing length of normalizer
C = obj.Data;
index = obj.Index;

changeBreakpointSize(C,index,obj.hSize.Value)
bp = C.BreakPoints{index};

% update normalizer table
nrows = length(bp);
obj.hNormTable.Peer.setNormaliserData([bp(:), (0:nrows-1)'], ...
    {'Input', 'Output'}, [], false);
end


function cbChangeAxisVariable(h,~,obj)
%CBCHANGEAXISVARIABLE callback for changing axis variable

C = obj.Data;
index = obj.Index;

loc = get(h,'Value');
if loc~=C.TableInputs(index)
    % reinitialize normalizer
    C.TableInputs(index) = loc;
    defineItems(C);
    initialize(obj)
end
end


function cbChangeOtherAxis(~,evt,obj)
%CBCHANGEAXIS swap other axis if necessary 
C = evt.AffectedObject;
pInpList = C.TabInputList;
pInput = C.pTableInputs(obj.Index);
loc = get(obj.hAxis,'Value');
if loc> length(pInpList) || pInput ~= pInpList(loc)
    % update all normalizer controls
    initialize(obj)
end

end



function cbExistingNorm(h,~,obj)
%CBEXISTINGNORM use an existing normalizer

NormInd = get(h,'Value')-1;
C= obj.Data;
if ~NormInd 
    %enable controls to edit normalizer
    obj.hSize.Enable = 'on';
    obj.hNormTable.Enable = 'on';
    obj.hNormTable.Editable = true;
    C.pNorm(obj.Index) = xregpointer;
else
    % set table from normalizer data
    C.BreakPoints{obj.Index} = get(obj.pNorm(NormInd).info,'breakpoints');
    C.pNorm(obj.Index) = obj.pNorm(NormInd);
    setTable(obj,C.BreakPoints{obj.Index});
    %disable editing
    obj.hSize.Enable = 'off';
    obj.hNormTable.Enable = 'off';
    obj.hNormTable.Editable = false;
end

end


function cbEditBPs(~,evt,obj)
%CBEDITBPS callback for editing normalizer

C = obj.Data;
index = obj.Index;

data = evt.Data.NewValue;
if isvector(data)
    % Get new breakpoints for setup
    thisbp = C.BreakPoints{index};
    thisbp(evt.data.Rows) = data(:);
    % update breakpoints
    C.BreakPoints{index} = thisbp;
end
end

function cbEditVectorDialog(~,~,obj)
%cbEditVectorDialog edit breakpoint values via vector dialog

C = obj.Data;
index = obj.Index;
bp = C.BreakPoints{index};
bp = bp(:)';

if isequal(linspace(bp(1),bp(end),length(bp)),bp)
    % equispaced points
    vectorEditor = com.mathworks.toolbox.mbc.gui.peer.VectorEditorDialogPeer(min(bp),max(bp),length(bp));
else
    %freeform vector
    vectorEditor = com.mathworks.toolbox.mbc.gui.peer.VectorEditorDialogPeer(bp);
end

hDlg = mbcwidgets.javawindow(vectorEditor);
hDlg.setTitle(sprintf('Edit Breakpoints for %s',C.pTableInputs(index).getname));
hDlg.centerWindow( ancestor(obj.hNormalizer,'figure'));

% set breakpoint mode so points are unique, increasing, and at least 2 points
vectorEditor.setBreakpointMode(true);
hDlg.blockingShow;
if vectorEditor.getOK
    vals = javaMethodEDT('getNumericValue',vectorEditor);
    C.BreakPoints{index} = vals;
    initialize(obj);
end

end