www.gusucode.com > mbcdesign 工具箱 matlab 源码程序 > mbcdesign/@cset_lattice/propertypage.m

    function out=propertypage(obj,action,varargin)
% PROPERTYPAGE  Create a property gui for CandidateSet
%
%
%   This should be overloaded by child classes
%
%   Interface:  Lyt=propertypage(cs,'layout',fig);
%               Lyt=propertypage(cs,'update',lyt,p_cs,model);
%               Lyt=propertypage(cs,'enable',lyt,enstate);

%  Copyright 2000-2015 The MathWorks, Inc. and Ford Global Technologies, Inc.




switch lower(action)
    case 'layout'
        out=i_createlyt(varargin{:});
    case 'update'
        out=i_update(varargin{:});
    case 'enable'
        out=i_setenable(varargin{:});
end
return




function lyt=i_createlyt(figh,varargin)

% create new layout in figure
ud.pointer=[];
ud.figure=figh;
ud.model=[];
ud.callback='';
ud.editablePoints = true;
if nargin>1
    for n=1:2:length(varargin)
        switch lower(varargin{n})
            case 'callback'
                ud.callback=varargin{n+1};
            case 'editablepoints'
                ud.editablePoints = varargin{n+1};
        end
    end
end

ud.lstbox=uicontrol('Parent',figh,...
    'BackgroundColor','w',...
    'Value',1,...
    'Style','listbox');

if ud.editablePoints
    ud.lattszedt=mbcgui.widget.Spinner('Parent', figh,...
        'Min',2,...
        'Max',1e6,...
        'ClickIncrement',10,...
        'Rule','int',...
        'Position',[0 0 70 20]);
else
    ud.lattszedt = uicontrol('Parent', figh, ...
        'Style', 'text', ...
        'String', '', ...
        'HorizontalAlignment','left');
end
lattsztxt = xregGui.labelcontrol('parent',figh,...
    'String','Lattice size:',...
    'ControlSize', 70, ...
    'LabelSizeMode', 'absolute', ...
    'LabelSize', 70, ...
    'Control', ud.lattszedt);
ud.mintxt=uicontrol('Parent',figh,...
    'Style','text',...
    'HorizontalAlignment','left',...
    'Position',[0 0 110 15]);
ud.maxtxt=uicontrol('Parent',figh,...
    'Style','text',...
    'HorizontalAlignment','left',...
    'Position',[0 0 110 15]);
ud.minedt=uicontrol('Parent',figh,...
    'Style','edit',...
    'BackgroundColor','w',...
    'Position',[0 0 70 20],...
    'Interruptible','off');
ud.maxedt=uicontrol('Parent',figh,...
    'Style','edit',...
    'BackgroundColor','w',...
    'Position',[0 0 70 20],...
    'Interruptible','off');
ud.gtxt=uicontrol('Parent',figh,...
    'Style','text',...
    'HorizontalAlignment','left',...
    'Position',[0 0 110 15]);
ud.gedt=mbcgui.widget.Spinner('Parent', figh,...
    'Min',2,...
    'Rule','prime',...
    'Position',[0 0 70 20]);

udh=ud.lstbox;
% callbacks
set(ud.lstbox,'Callback',{@i_factchng,udh});
set(ud.minedt,'Callback',{@i_minchng,udh});
set(ud.maxedt,'Callback',{@i_maxchng,udh});
set(ud.gedt,'Callback',{@i_gchng,udh});
if ud.editablePoints
    set(ud.lattszedt,'Callback',{@i_Nchng,udh});
end

flw1=xregflowlayout(figh,'orientation','left/center','gap',10,...
    'border',[-10 0 0 0],'elements',{ud.mintxt,ud.minedt});
flw2=xregflowlayout(figh,'orientation','left/center','gap',10,...
    'border',[-10 0 0 0],'elements',{ud.maxtxt,ud.maxedt});
flw3=xregflowlayout(figh,'orientation','left/center','gap',10,...
    'border',[-10 0 0 0],'elements',{ud.gtxt,ud.gedt});
grd=xreggridlayout(figh,'dimension',[3 1],'correctalg','on','gapy',5,...
    'elements',{flw1,flw2,flw3},'rowsizes',[20 20 20]);
spl=xregsplitlayout(figh,...
    'left',ud.lstbox,...
    'right',grd,...
    'split',[.25 .75],...
    'leftinnerborder',[0 5 0 0],...
    'rightinnerborder',[0 0 0 5],...
    'resizable','off');
lyt=xreggridlayout(figh,...
    'correctalg','on',...
    'dimension',[2 1],...
    'rowsizes',[20 -1],...
    'gapy',5,...
    'elements',{lattsztxt,spl},...
    'userdata',udh);

ud.layout=lyt;
set(udh,'UserData',ud);



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% External update function.  Finds udh the dirty way %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function lyt=i_update(lyt,p,m)
% update current layout
listbox = get(lyt, 'UserData');
ud=get(listbox, 'UserData');
ud.pointer=p;
ud.model=m;
ud=i_setvalues(ud);
set(ud.lstbox,'UserData',ud);


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Set all strings, values etc from data in udh %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ud=i_setvalues(ud)
% set up the listbox
fact=get(ud.model,'symbol');
set(ud.lstbox,'String',fact);

factnum=get(ud.lstbox,'Value');
fact=fact{factnum};
cs=ud.pointer.info;
set([ud.mintxt;ud.maxtxt;ud.gtxt],{'String'},...
    {['Minimum ' fact ' value:'];['Maximum ' fact ' value:'];['Prime number for ' fact ':']});

lims=get(cs,'limits');
lims=invcode(ud.model,lims{factnum}',factnum);
set([ud.minedt;ud.maxedt],{'String'},...
    {lims(1);lims(2)});

if ud.editablePoints
    set(ud.lattszedt,'Value',get(cs,'n'));
else
    set(ud.lattszedt,'String',sprintf('%d', get(cs,'n')));
end
maxg=primes(get(cs,'n'));
maxg=maxg(end);
g=get(cs,'g');
set(ud.gedt,'Max',maxg,'Value',g(factnum));
return


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Callbacks from each object %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function i_factchng(obj,nul,udh)
ud=get(udh,'UserData');
ud=i_setvalues(ud);
set(udh,'UserData',ud);
return



function i_minchng(obj,nul,udh)
ud=get(udh,'UserData');
factnum=get(ud.lstbox,'Value');
mnval=str2double(get(ud.minedt,'String'));
mnval=code(ud.model,mnval,factnum);
cs=ud.pointer.info;
lims=get(cs,'limits');
mxval=lims{factnum}(2);
if isempty(mnval) || length(mnval)~=1 || mnval>=mxval || isnan(mnval)
    % reset display
    lims=invcode(ud.model,lims{factnum}(:),factnum);
    set(ud.minedt,'String',min(lims));
else
    lims{factnum}(1)=mnval;
    cs=set(cs,'limits',lims);
    ud.pointer.info=cs;
    set(udh,'UserData',ud);
    i_firecb(ud);
end
return



function i_maxchng(obj,nul,udh)
ud=get(udh,'UserData');
factnum=get(ud.lstbox,'Value');
mxval=str2double(get(ud.maxedt,'String'));
mxval=code(ud.model,mxval,factnum);
cs=ud.pointer.info;
lims=get(cs,'limits');
mnval=lims{factnum}(1);
if isempty(mxval) || length(mxval)~=1 || mnval>=mxval || isnan(mxval)
    % reset display
    lims=invcode(ud.model,lims{factnum}(:),factnum);
    set(ud.maxedt,'String',max(lims));
else
    lims{factnum}(2)=mxval;
    cs=set(cs,'limits',lims);
    ud.pointer.info=cs;
    set(udh,'UserData',ud);
    i_firecb(ud);
end
return



function i_Nchng(obj,nul,udh)
ud=get(udh,'UserData');
val=get(ud.lattszedt,'Value');
cs=set(ud.pointer.info,'N',val);
p=primes(val);
p=p(end);
set(ud.gedt,'Max',p);
% check the g values are all below Nmax
g=get(cs,'g');
if any(g>p)
    % uh-oh
    g(g>p)=p;
    cs=set(cs,'g',g);
    factnum=get(ud.lstbox,'Value');
    set(ud.gedt,'Value',g(factnum));
end
ud.pointer.info=cs;
set(udh,'UserData',ud);
i_firecb(ud);
return



function i_gchng(obj,nul,udh)
ud=get(udh,'UserData');
factnum=get(ud.lstbox,'Value');
g=get(ud.pointer.info,'g');
p=get(ud.gedt,'Value');
g(factnum)=p;
cs=set(ud.pointer.info,'g',g);
ud.pointer.info=cs;
set(udh,'UserData',ud);
i_firecb(ud);
return


function i_firecb(ud)
xregcallback(ud.callback,ud.layout,[]);
return


function lyt=i_setenable(lyt,state)
udh=get(lyt,'UserData');
ud=get(udh,'UserData');
sc=xregGui.SystemColorsDbl;
if strcmp(state,'on')
    bgc=[1 1 1];
else
    bgc=sc.CTRL_BACK;
end
set([ud.minedt;ud.maxedt],'BackgroundColor',bgc,'Enable',state);
set([ud.gedt;ud.lattszedt],'Enable',state);