www.gusucode.com > mbcdata 工具箱 matlab 源码程序 > mbcdata/@cgprec/guiChooserEditor.m

    function [obj, ok] = guiChooserEditor(obj, varargin)
%GUIEDITOR Open a dialog for editing precision class and settings
%
%  [OBJ, OK] = GUIEDITOR(OBJ) displays a blocking dialog that allows the
%  user to edit the class and parameters of a precision object.
%
%  GUIEDITOR(OBJ, 'Parent', HFIG) specifies a parent figure to center the
%  dialog on.

%  Copyright 2006-2015 The MathWorks, Inc.


[Classes, Descs] = cgprecClassList;
ThisClass = class(obj);
Objects = cell(size(Classes));
ObjectIndex = 0;
for n = 1:numel(Objects)
    if strcmp(Classes{n}, ThisClass)
        Objects{n} = obj;
        ObjectIndex = n;
    else
        Objects{n} = @(dlg) i_createobject(dlg, Classes{n});
    end
end

if ObjectIndex==0
    Objects = [Objects, {obj}];
    Descs = [Descs, {'<Unknown Type>'}];
    ObjectIndex = length(Objects);
end


hDialog = mbcgui.dialog.MultiObjectDialog( ...
    'PageInfoFunction', @generateEditorPages, ...
    'DisplaySinglePageAsTab', false, ...
    'Title', 'Edit Precision', ...
    'ChooserLabel', 'Precision type:', ...
    'ChooserLabelWidth', 85, ...
    'OptionStrings', Descs, ...
    'OptionFunctions', Objects, ...
    'CurrentOption', ObjectIndex, ...
    'LayoutFunction', @i_LayoutFunction, ...
    'DialogPanelSize', [380 450], ...
    varargin{:});

ok = hDialog.show;
if ok
    obj = hDialog.Object;
end
delete(hDialog);



function lyt = i_LayoutFunction( dlg, hLabel, hCards )

ud = dlg.UserData;

ud.hWriteableCheck = uicontrol('Parent', dlg.Figure, ...
    'Visible', 'off', ...
    'Style', 'checkbox', ...
    'String', 'Read-only', ...
    'Callback', {@i_editcheck, dlg});
div = xregGui.dividerline('Parent', dlg.Figure, 'Visible', 'off');

ud.upperClip = mbcgui.widget.Spinner('Parent', dlg.Figure, ...
    'Visible', 'off', ...
    'Callback', {@i_editclips, dlg});
ud.lowerClip = mbcgui.widget.Spinner('Parent', dlg.Figure, ...
    'Visible', 'off', ...
    'Callback', {@i_editclips, dlg});
clipLabel = xregGui.labelcontrol('parent', dlg.Figure, ...
    'Visible', 'off', ...
    'LabelSizeMode', 'absolute', ...
    'LabelSize', 85, ...
    'ControlSizeMode', 'absolute', ...
    'ControlSize', 70, ...
    'String', 'Value limits:', ...
    'Control', ud.lowerClip);
clipTo = xregGui.labelcontrol('parent', dlg.Figure, ...
    'Visible', 'off', ...
    'LabelSizeMode', 'absolute', ...
    'LabelSize', 10, ...
    'ControlSizeMode', 'absolute', ...
    'ControlSize', 70, ...
    'Gap', 10, ...
    'String', 'to', ...
    'Control', ud.upperClip);

lyt = xreggridbaglayout(dlg.Figure, ...
    'dimension', [4 3], ...
    'rowsizes', [20 20 2 -1], ...
    'colsizes', [160 90 -1], ...
    'gapy', 10, ...
    'gapx', 10, ...
    'mergeblock', {[1 1], [1 2]}, ...
    'mergeblock', {[3 3], [1 3]}, ...
    'mergeblock', {[4 4], [1 3]}, ...
    'elements', {hLabel, clipLabel, div, hCards, ...
    [], clipTo, [], [], ...
    ud.hWriteableCheck});

% Listener to keep checkbox and range updated with object changes
ud.hListener = event.listener( dlg, 'OptionChanged', @i_update );

ud.WritableFlag = 1;
ud.Range = [-inf inf];
dlg.UserData = ud;


function i_update(dlg, ~)
ud = dlg.UserData;
prec = dlg.Object;

set(ud.hWriteableCheck, 'Value', 1-get(prec, 'writable'));

lims = get(prec, 'PhysRange');
ud.lowerClip.Value = lims(1);
ud.upperClip.Value = lims(2);

% Save writable flag and range for use when creating objects
ud.WritableFlag = get(prec, 'writable');
ud.Range = lims;
dlg.UserData = ud;


function i_editcheck(src, ~, dlg)
Writeable = 1-get(src, 'Value');

% Set all existing objects to the same writable value
for n = 1:length(dlg.OptionStrings)
    if dlg.isOptionCreated(n)
        prec = dlg.getOptionObject(n);
        prec = set(prec, 'Writable', Writeable);
        dlg.updateOptionObject(n, prec);
    end
end

% Save writable flag for use when creating new objects
ud = dlg.UserData;
ud.WritableFlag = Writeable;
dlg.UserData = ud;


function i_editclips(~, ~, dlg)
ud = dlg.UserData;

lims = sort([ud.lowerClip.Value, ud.upperClip.Value]);
if lims(2)<=lims(1);
    lims(2) = lims(1)+1;
end

% Set all existing objects to the same range value
for n = 1:length(dlg.OptionStrings)
    if dlg.isOptionCreated(n)
        prec = dlg.getOptionObject(n);
        prec = set(prec, 'PhysRange', lims);
        dlg.updateOptionObject(n, prec);
    end
end

% Save range for use when creating new objects
ud.Range = lims;
dlg.UserData = ud;


function obj = i_createobject(dlg, ClassName)
obj = feval(ClassName);

% Set correct initial writable state
ud = dlg.UserData;
obj = set(obj, 'Writable', ud.WritableFlag);
obj = set(obj, 'PhysRange', ud.Range);