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);