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

    function out=propertypage(obj,action,varargin)
% PROPERTYPAGE  Create a property gui for CandidateSet
%
%
%   This should be overloaded by child classes
%
%   Property pages 

%  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='';
ud.rbgvalue=1;
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',...
   'Tag','GridInputList',...
   'Interruptible','off');
ud.mintxt=uicontrol('Parent',figh,...
   'Style','text',...
   'HorizontalAlignment','left');
ud.maxtxt=uicontrol('Parent',figh,...
   'Style','text',...
   'Visible','off',...
   'HorizontalAlignment','left');
ud.minedt=uicontrol('Parent',figh,...
   'Style','edit',...
   'BackgroundColor','w',...
   'Interruptible','off');
ud.maxedt=uicontrol('Parent',figh,...
   'Style','edit',...
   'BackgroundColor','w',...
   'Interruptible','off');
ud.nlvltxt=uicontrol('Parent',figh,...
   'Style','text',...
   'HorizontalAlignment','left');
ud.nlvledt=mbcgui.widget.Spinner('Parent', figh,...
   'Min',2,...
   'Max',1000,...
   'ClickIncrement',1,...
   'Rule','int',...
   'Tag','GridLevelSpinner');

ud.rbg=[uicontrol('Parent',figh,'Style','radiobutton',...
      'String','Equally spaced levels',...
      'Interruptible','off','Value',1);...
      uicontrol('Parent',figh,'Style','radiobutton',...
      'String','User-specified levels',...
      'Interruptible','off')];
ud.lvledt=uicontrol('Parent',figh,...
   'Style','edit',...
   'BackgroundColor','w',...
   'Enable','off',...
   'HorizontalAlignment','left',...
   'Interruptible','off');

% callbacks
udh=ud.lstbox;
set(ud.lstbox,'Callback',{@i_fact,udh});
set(ud.minedt,'Callback',{@i_min,udh});
set(ud.maxedt,'Callback',{@i_max,udh});
set(ud.nlvledt,'Callback',{@i_nlevels,udh});
set(ud.lvledt,'Callback',{@i_levels,udh});
set(ud.rbg,{'Callback'},{{@i_method,udh,1};{@i_method,udh,2}});

lyt=xreggridbaglayout(figh,'dimension',[17 5],...
   'rowsizes',[20 5 3 15 2 5 3 15 2 5 3 15 2 5 20 5 -1],...
   'colsizes',[-1 10 15 -1 70],...
   'colratios',[.3 0 0 .7 0],...
   'mergeblock',{[1 17],[1 1]},...    % listbox
   'mergeblock',{[1 1],[3 5]},...     % radiobutton
   'mergeblock',{[15 15],[3 5]},...   % radiobutton
   'mergeblock',{[3 5],[5 5]},...
   'mergeblock',{[7 9],[5 5]},...
   'mergeblock',{[11 13],[5 5]},...
   'mergeblock',{[17 17],[4 5]},...
   'elements',{ud.lstbox,[],ud.rbg(1),[],[];...
      [],[],[],[],[];...
      [],[],[],[],ud.minedt;...
      [],[],[],ud.mintxt,[];...
      [],[],[],[],[];...
      [],[],[],[],[];...
      [],[],[],[],ud.maxedt;...
      [],[],[],ud.maxtxt,[];...
      [],[],[],[],[];...
      [],[],[],[],[];... 
      [],[],[],[],ud.nlvledt;...
      [],[],[],ud.nlvltxt,[];...
      [],[],[],[],[];...
      [],[],[],[],[];...
      [],[],ud.rbg(2),[],[];...
      [],[],[],[],[];...
      [],[],[],ud.lvledt,[]},...
   'userdata',udh);
   
ud.layout=lyt;
set(udh,'UserData',ud);
return


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% External update function.  Finds udh the dirty way %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function lyt=i_update(lyt,p,m)
udh=get(lyt,'UserData');
ud=get(udh,'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.nlvltxt],{'String'},...
   {['Minimum ' fact ' value:'];['Maximum ' fact ' value:'];['Number of levels for ' fact ':']});

lvls=get(cs,'levels');
lvls=lvls{factnum};
lvls=invcode(ud.model,lvls(:),factnum);
set([ud.minedt;ud.maxedt],{'String'},...
   {min(lvls);max(lvls)});
set(ud.nlvledt,'Value',length(lvls));
str=prettify(lvls);
set(ud.lvledt,'String',str);
sc=xregGui.SystemColorsDbl;
% decide if the str represents a number of equal levels
if (length(strfind(str,':'))<=2 && isempty(strfind(str,' '))) || length(lvls)==2
   % use set levels
   set(ud.rbg,{'Value'},{1;0});
   % set enable statuses
   set(ud.lvledt,'Enable','off','BackgroundColor',sc.CTRL_BACK);
   set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','on');
   set([ud.minedt;ud.maxedt],'Enable','on','BackgroundColor',[1 1 1]);
   set(ud.nlvledt,'Enable','on');
   ud.rbgvalue=1;
else
   set(ud.rbg,{'Value'},{0;1});
   set(ud.lvledt,'Enable','on','BackgroundColor','w');
   set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','off');
   set([ud.minedt;ud.maxedt],'Enable','off','BackgroundColor',sc.CTRL_BACK);
   set(ud.nlvledt,'Enable','off');
   ud.rbgvalue=2;
end
return


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Callbacks from each object %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function i_fact(~,~,udh)
ud=get(udh,'UserData');
ud=i_setvalues(ud);
set(udh,'UserData',ud);
return

function i_max(~,~,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;
lvls=get(cs,'levels');
lims=lvls{factnum};
mnval=min(lims);

if isempty(mxval) || length(mxval)~=1 || mnval>=mxval || isnan(mxval)
   % reset display
   lims=invcode(ud.model,lims(:),factnum);
   set(ud.maxedt,'String',max(lims));
else
   % recreate levels vector
   nlvls=get(ud.nlvledt,'Value');
   lvls{factnum}=linspace(mnval,mxval,nlvls);
   cs=set(cs,'levels',lvls);
   set(ud.lvledt,'String',prettify(invcode(ud.model, lvls{factnum}', factnum)'));
   ud.pointer.info=cs;
   set(udh,'UserData',ud);
   i_firecb(ud);
end
return

function i_min(~,~,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;
lvls=get(cs,'levels');
lims=lvls{factnum};
mxval=max(lims);

if isempty(mnval) || length(mnval)~=1 || mnval>=mxval || isnan(mnval)
   % reset display
   lims=invcode(ud.model,lims(:),factnum);
   set(ud.minedt,'String',min(lims));
else
   % recreate levels vector
   nlvls=get(ud.nlvledt,'Value');
   lvls{factnum}=linspace(mnval,mxval,nlvls);
   cs=set(cs,'levels',lvls);
   set(ud.lvledt,'String',prettify(invcode(ud.model, lvls{factnum}', factnum)'));
   ud.pointer.info=cs;
   set(udh,'UserData',ud);
   i_firecb(ud);
end
return

function i_nlevels(obj,~,udh)
ud=get(udh,'UserData');
nlvls=get(obj,'Value');
factnum=get(ud.lstbox,'Value');
cs=ud.pointer.info;
lvls=get(cs,'levels');
mnval=min(lvls{factnum}(:));
mxval=max(lvls{factnum}(:));
lvls{factnum}= linspace(mnval,mxval,nlvls);
cs=set(cs,'levels',lvls);
ud.pointer.info=cs;
% update levels edit box
set(ud.lvledt,'String',prettify(invcode(ud.model, lvls{factnum}', factnum)'));
set(udh,'UserData',ud);
i_firecb(ud);
return

function i_levels(~,~,udh)
ud=get(udh,'UserData');
lvl=str2num(get(ud.lvledt,'String'));
factnum=get(ud.lstbox,'Value');
cs=ud.pointer.info;
lvls=get(cs,'levels');
if ~isempty(lvl) && isnumeric(lvl) && length(unique(lvl))>1
   lvls{factnum}=code(ud.model,lvl(:),factnum)';
   set([ud.minedt;ud.maxedt],{'String'},{min(lvl(:));max(lvl(:))});
   set(ud.nlvledt,'Value',length(lvl));
   cs=set(cs,'levels',lvls);
   ud.pointer.info=cs;
   set(udh,'UserData',ud);
   i_firecb(ud);
else
   lvl=(invcode(ud.model,lvls{factnum}(:),factnum))';
end
set(ud.lvledt,'String',prettify(lvl));
return

function i_method(~,~,udh,val)
ud=get(udh,'UserData');
% switch enable status of bits
sc=xregGui.SystemColorsDbl;
if val~=ud.rbgvalue
   switch val
   case 1
      set(ud.rbg(2),'Value',0);
      set(ud.lvledt,'Enable','off','BackgroundColor',sc.CTRL_BACK);
      set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','on');
      set([ud.minedt;ud.maxedt],'Enable','on','BackgroundColor',[1 1 1]);
      set(ud.nlvledt,'Enable','on');
      % reset levels edit box using min/max/nlevels
      i_nlevels(ud.nlvledt,[],udh);
   case 2
      set(ud.rbg(1),'Value',0);
      set([ud.mintxt;ud.maxtxt;ud.nlvltxt],'Enable','off');
      set([ud.minedt;ud.maxedt],'Enable','off','BackgroundColor',sc.CTRL_BACK);
      set(ud.nlvledt,'Enable','off');
      set(ud.lvledt,'Enable','on','BackgroundColor',[1 1 1]); 
   end
   ud.rbgvalue=val;
   set(udh,'UserData',ud);
else
   set(ud.rbg(val),'Value',1);
end
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