www.gusucode.com > mbcdesign 工具箱 matlab 源码程序 > mbcdesign/@cset_stratlattice/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);

%  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{:});
end
return




function lyt=i_createlyt(figh,varargin)

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

ud.lstbox=uicontrol('Parent',figh,...
   'BackgroundColor','w',...
   'Value',1,...
   'Style','listbox');
lattsztxt=uicontrol('Parent',figh,...
   'Style','text',...
   'String','Lattice size:',...
   'Position',[0 0 70 15],...
   'HorizontalAlignment','left');
ud.lattszedt=mbcgui.widget.Spinner('Parent', figh,...
   'Min',2,...
   'Max',1e6,...
   'ClickIncrementMode','auto',...
   'Rule','int',...
   'Position',[0 0 70 20]);
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]);
frm = mbcgui.container.layoutpanel( ...
    'Parent', figh, ...
    'Title','Stratification',...
    'BorderType', 'etchedin', ...
    'LayoutBorder', [10 0 10 5]);
ud.dostratify=uicontrol('Parent',frm,...
   'Style','checkbox',...
   'String','Stratify levels for X',...
   'Interruptible','off');
ud.strattxt=uicontrol('Parent',frm,...
   'Style','text',...
   'HorizontalAlignment','left',...
   'Position',[0 0 120 15]);
ud.stratedt=mbcgui.widget.Spinner('Parent', frm,...
   'Rule','list',...
   'List',(2:100),...
   '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});
set(ud.lattszedt,'Callback',{@i_Nchng,udh});
set(ud.dostratify,'Callback',{@i_stratchng,udh});
set(ud.stratedt,'Callback',{@i_stratchng,udh});

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});
flw4=xregflowlayout(frm,'orientation','left/center','gap',10,...
   'border',[-10 0 0 0],'elements',{ud.strattxt,ud.stratedt});
grd=xreggridlayout(frm,'correctalg','on', ...
    'dimension',[2 1],...
    'rowsizes', [20 20], ...
    'gap', 5, ...
   'elements',{ud.dostratify,flw4});
set(frm, 'LayoutComponent', {grd});
grd=xreggridlayout(figh,'dimension',[4 1],'correctalg','on','gapy',5,...
   'elements',{flw1,flw2,flw3, frm},'rowsizes',[20 20 20 80]);
flwbtm=xregflowlayout(figh,'orientation','left/center','gap',5,'border',[-5 10 0 0],...
   'elements',{lattsztxt,ud.lattszedt});
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',[30 -1],...
   'elements',{flwbtm,spl});

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



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% External update function.  Finds udh the dirty way %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function lyt=i_update(lyt,p,m)
% update current layout
el=get(lyt,'elements');
el=get(el{2},'left');
ud=get(el,'UserData');
ud.pointer=p;
ud.model=m;
ud=i_setvalues(ud);
set(ud.lstbox,'UserData',ud);
return



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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;ud.strattxt;ud.dostratify],{'String'},...
   {['Minimum ' fact ' value:'];['Maximum ' fact ' value:'];...
      ['Prime number for ' fact ':'];['Number of levels for ' fact ':'];['Stratify levels for ' fact]});

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

set(ud.lattszedt,'Value',get(cs,'n'));
maxg=primes(get(cs,'n'));
maxg=maxg(end);
g=get(cs,'g');
set(ud.gedt,'Max',maxg,'Value',g(factnum));
nl=get(cs,'nlevels');


if nl(factnum)
   % stratify levels are list-taken+my one
   lst=(2:100);  lst=setxor(lst,setxor(nl(nl~=0),nl(factnum)));
   set(ud.dostratify,'Value',1);
   set(ud.stratedt,'List',lst,'Value',nl(factnum),'Enable','on');
   set(ud.strattxt,'Enable','on');
   set(ud.gtxt,'Enable','off');
   set(ud.gedt,'Enable','off');
else
   % stratify levels are list-taken+my one
   lst=(2:100);  lst=setxor(lst,nl(nl~=0));
   set(ud.dostratify,'Value',0);
   set(ud.stratedt,'List',lst,'Value',nl(factnum),'Enable','off');
   set(ud.strattxt,'Enable','off');
   set(ud.gtxt,'Enable','on');
   set(ud.gedt,'Enable','on');
end
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');

% increment prime numbers
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_stratchng(obj,nul,udh)
ud=get(udh,'UserData');
factnum=get(ud.lstbox,'Value');
cs=ud.pointer.info;
strat=get(cs,'nlevels');
newval=get(ud.dostratify,'Value');
if newval
   strat(factnum)=get(ud.stratedt,'Value');
   set(ud.strattxt,'Enable','on');
   set(ud.stratedt,'Enable','on');
   set(ud.gtxt,'Enable','off');
   set(ud.gedt,'Enable','off');   
else
   strat(factnum)=0;  
   set(ud.strattxt,'Enable','off');
   set(ud.stratedt,'Enable','off');
   set(ud.gtxt,'Enable','on');
   set(ud.gedt,'Enable','on');
end
cs=set(cs,'nlevels',strat);
ud.pointer.info=cs;
i_firecb(ud);
return



function i_firecb(ud)
if ischar(ud.callback)
   evalin('base',ud.callback);
else
   str=[ud.callback(1) {ud.layout,[]} ud.callback(2:end)];
   feval(str{:});
end
return