www.gusucode.com > mbcview 工具箱matlab源码程序 > mbcview/@cgdatasetnode/AssignDlg.m
function varargout = AssignDlg(D,action,varargin) %#ok<INUSL> %ASSIGNDLG assign variables dialog % varargout = AssignDlg(D,action,varargin) % % Most of the dialog is created in cgdatasetnode.DrawDlg % % See also cgdatasetnode.creategui, cgdatasetnode.DrawDlg % Copyright 2000-2014 The MathWorks, Inc. and Ford Global Technologies, Inc. if nargin>1 && ischar(action) switch lower(action) case 'get_callbacks' varargout{1} = i_GetCallbacks; case 'createpage' [varargout{1:2}] = createPage(varargin{:}); end else cb = i_GetCallbacks; varargout = {action cb}; end %----------------------------------------------------------------------- function cb = i_GetCallbacks %----------------------------------------------------------------------- cb = []; cb.Show = @i_Show; cb.View = @i_View; cb.Setup = @i_Setup; cb.Enable = @i_Enable; %----------------------------------------------------------------------- function [d,lyt] = i_Setup(d) %----------------------------------------------------------------------- d.AssignDlg.Advanced = 0; lyt = []; return function [d,newview]=createPage(d) cb = i_GetCallbacks; % -------- data page newview = struct('ID','assigndlg',... 'icon','assignbut.bmp',... 'tooltip','Assign Data Columns',... 'label','&Assign...',... 'enablestatus',cb.Enable,... 'dialog',1,... 'card','dlg',... 'drawcb',cb.Setup,... 'view',cb.View,... 'show',cb.Show); %----------------------------------------------------------------------- function en = i_Enable(op) %----------------------------------------------------------------------- d = pr_GetViewData; en = any(isImported(op)); % Need to also check that there are expressions in the project if ~isfield(d.Exprs, 'Eptrs') || isempty(d.Exprs.Eptrs) en = 0; end %----------------------------------------------------------------------- function d = i_Show(d) %----------------------------------------------------------------------- set(d.Dlg.Lyt,'Visible','off'); el = get(d.Dlg.MainLyt,'elements'); rows = get(d.Dlg.MainLyt,'rowsizes'); el{3} = d.Dlg.Checks; rows(3) = 60;rows(1) = 35; set(d.Dlg.MainLyt,'elements',el,... 'rowsizes',rows); page = d.ViewInfo(d.currentviewinfo); d.Dlg.LeftList.SelectionCallback = page.tpclick; d.Dlg.RightList.SelectionCallback = page.bmclick; if d.Dlg.Wizard set(d.Dlg.Figure,'Name','Data Set Import Wizard'); set(d.Dlg.ButtonCard, 'currentcard', 2); set(d.Dlg.Back, 'Enable','on','Callback',@cb_Back); set(d.Dlg.Next, 'Enable','on','String','Finish','Callback',@cb_Finish); else d.Dlg.tmp = d.pD.info; set(d.Dlg.Figure,'Name','Data Set Assign'); set(d.Dlg.ButtonCard, 'currentcard', 1); set(d.Dlg.OK, 'Callback',@cb_Finish); end % store any internal pointers in case they need to be restored later pInternal = getInternalPtrs(d.Dlg.tmp); if ~isempty(pInternal) d.Dlg.pInternal = {pInternal,infoarray(pInternal)}; else d.Dlg.pInternal = []; end set(d.Dlg.Cancel, 'Enable','on','Callback',@cb_Cancel); set(d.Dlg.Check1,'Callback',@cb_Units,... 'Value',d.CheckUnits,... 'String','Check units'); set(d.Dlg.Check2,'Callback',@cb_Advanced,... 'Value',d.AssignDlg.Advanced,... 'String','Show all expressions'); %%%%%%% RESET THIS LINE WHEN UNITS REINSTALLED ..... %set(d.Dlg.Checks,'elements',{d.Dlg.Check1 d.Dlg.Check2 [] []}); %%%%%%% ..... AND DELETE THIS ONE set(d.Dlg.Checks,'elements',{[] d.Dlg.Check2 [] []}); xregGui.iconuicontrol(d.Dlg.TopButton,... 'ImageFile',cgrespath('assign.bmp'),... 'TransparentColor',[255 255 255],... 'ToolTipString','Assign Data Column to Project Expression',... 'Enable','on',... 'Callback',@cb_Assign, ... 'Tag', 'AssignButton'); xregGui.iconuicontrol(d.Dlg.BottomButton,... 'imagefile',cgrespath('unassign.bmp'),... 'transparentcolor',[255 255 255],... 'enable','on',... 'tooltip','Unassign Project Expression',... 'callback',@cb_Unassign, ... 'Tag', 'UnassignButton'); set(d.Dlg.InfoText, 'String', sprintf('%s\n%s', ... 'Match data columns in right list to project expressions in left list.', ... 'Note: Unassigned columns will be treated as output data.')); set(d.Dlg.MsgPane,'String',''); ind = d.Exprs.FilterIndex{5}; tmp = cgoppoint(d.Exprs.ptrs(ind)); tmp = CheckGroup(tmp); d.AssignDlg.DDindex = ind; d.AssignDlg.DDgroup = zeros(1,length(d.Exprs.ptrs)); d.AssignDlg.DDgroup(d.AssignDlg.DDindex) = get(tmp,'group'); d.AssignDlg.LeftIndex = []; d.AssignDlg.RightIndex = []; set(d.Dlg.Lyt,'Visible','on'); set(d.Dlg.Figure,'Visible','on', 'CloseRequestFcn',@cb_Cancel, 'WindowStyle', 'modal'); %----------------------------------------------------------------------- function d = i_View(d) %----------------------------------------------------------------------- d = i_RefreshProjectList(d); d = i_RefreshColumnList(d); %----------------------------------------------------------------------- function d = i_Message(d,mess) %----------------------------------------------------------------------- set(d.Dlg.MsgPane,'String',mess); %------------------------------------------------------------------ function fstr = i_prettycell(namec) %------------------------------------------------------------------ fstr = ''; for i = 1:length(namec) fstr = [fstr namec{i} ', ']; %#ok<AGROW> end fstr = fstr(1:end-2); %----------------------------------------------------------------------- function cb_Finish(varargin) %----------------------------------------------------------------------- % Finish up d = pr_GetViewData; set(d.Dlg.Figure,'Visible','off'); [~,~,ig_i] = getFactorTypes(d.Dlg.tmp); if d.Dlg.DeleteExcluded d.Dlg.tmp = removefactor(d.Dlg.tmp,ig_i); end d.Dlg.tmp = eval_fill(d.Dlg.tmp); % Check names [d.Dlg.tmp,changed_i,oldnames,newnames] = CheckNames(d.Dlg.tmp,project(d.nd)); if ~isempty(changed_i) mess = {'Data columns have names which already exist in project.'}; if length(changed_i)<5 mess = [mess {'Changing names of following columns:'}]; for i = 1:length(changed_i) mess = [mess {[oldnames{i} ' to ' newnames{i}]}]; %#ok<AGROW> end else mess = [mess {'Changing column names.'}]; end uiwait(msgbox(mess,... 'Data Set Viewer','help','modal')); end in_i = find(isAssigned(d.Dlg.tmp)); out_i = find(isDataOnly(d.Dlg.tmp)); d.Dlg.tmp = set(d.Dlg.tmp,out_i,'factor_type','output'); d.Dlg.tmp = set(d.Dlg.tmp,in_i,'factor_type','input'); d.Dlg.pInternal = []; % Copy all the changes we've made d.pD.info = d.Dlg.tmp; d.Exprs.recalc = [0 1 1 0]; d = pr_ChangeView(d,d.OldViewID); % If data has just been imported then update the data set name - ensure unique if d.Dlg.Wizard c = cgbrowser; CGP = project(d.nd); myname = getname(d.pD.info); d.pD.info = d.pD.setname(''); myname = uniquename(CGP, myname); d.pD.info = setname(d.pD.info, myname); c.doDrawTree(address(d.nd), 'update'); c.doDrawText; end d.Dlg.Wizard = 0; pr_SetViewData(d); %----------------------------------------------------------------------- function cb_Back(varargin) %----------------------------------------------------------------------- % Go back to import view d = pr_GetViewData; d = pr_ChangeView(d,'importdlg'); pr_SetViewData(d); %----------------------------------------------------------------------- function cb_Cancel(varargin) %----------------------------------------------------------------------- % Go back to where we were before % (Been working on a temp copy of the dataset, so don't need to do % anything to restore old cgoppoint). However, internal pointers in the % dataset may have been removed (e.g. error expressions d = pr_GetViewData; if isfield(d,'nd') && isvalid(address(d.nd)) if ~isempty(d.Dlg.pInternal) % fix any internal pointers in the original cgoppoint pOp = getdata(d.nd); pOp.info = fixInternalPtrs(pOp.info,d.Dlg.pInternal{:}); d.Dlg.pInternal = []; end d.Dlg.Wizard = 0; set(d.Dlg.Figure,'Visible','off'); d.Import.Success = 0; d = pr_ChangeView(d,d.OldViewID); pr_SetViewData(d); end %----------------------------------------------------------------------- function cb_Units(varargin) %----------------------------------------------------------------------- d = pr_GetViewData; d.CheckUnits = get(d.Dlg.Check1,'Value'); d = i_View(d); pr_SetViewData(d); %----------------------------------------------------------------------- function cb_Advanced(varargin) %----------------------------------------------------------------------- d = pr_GetViewData; d.AssignDlg.Advanced = get(d.Dlg.Check2,'Value'); d = i_View(d); pr_SetViewData(d); %----------------------------------------------------------------------- function cb_Assign(varargin) %----------------------------------------------------------------------- d = pr_GetViewData; indL = d.Dlg.LeftList.Selected; fact_i = d.Dlg.RightList.Selected; ptr = d.Exprs.ptrs(indL); factors = get(d.Dlg.tmp,'orig_name'); mess = ''; % both left and right lists must have selections err = ~(isscalar(indL) && isscalar(fact_i)); % Already assigned? Remove ptr from old factor assigned = isAssigned(d.Dlg.tmp,d.Exprs.ptrs); if ~err && assigned(indL) old_fact_i = getFactorIndex(d.Dlg.tmp,ptr); if old_fact_i~=fact_i % Unassign will remove any factors that are dependent on the % variable to be reassigned. Save the factors and readd them. oldfactors = get(d.Dlg.tmp, 'ptrlist'); d.Dlg.tmp = Unassign(d.Dlg.tmp,old_fact_i); mess = ['Assigning ' factors{fact_i} ' to ' d.Exprs.names{indL} ... '; unassigning data column ' factors{old_fact_i} '.']; else mess = [d.Exprs.names{indL} ' is already assigned to data column ' factors{old_fact_i}]; err = 1; end end % DD variable in group? Can only assign one thing - unassign other ones. gno = d.AssignDlg.DDgroup(indL); if ~err && gno allgroup_i = find(d.AssignDlg.DDgroup==gno); group_i = setdiff(allgroup_i,indL); f = find(assigned(group_i)); if ~isempty(f) old_fact_i = getFactorIndex(d.Dlg.tmp,d.Exprs.ptrs(group_i(f))); if old_fact_i ~= fact_i d.Dlg.tmp = Unassign(d.Dlg.tmp,old_fact_i); mess = ['Only one assignment permitted within group ' ... i_prettycell(d.Exprs.names(allgroup_i)) '.']; end end end if ~err d.Dlg.tmp = assign(d.Dlg.tmp,fact_i,ptr); if assigned(indL) newfactors = get(d.Dlg.tmp, 'ptrlist'); ptrsrem = setdiff(oldfactors, newfactors); if ~isnull(ptrsrem) % Only readd valid pointers isv = isvalid(ptrsrem); d.Dlg.tmp = AddExpr(d.Dlg.tmp, ptrsrem(isv)); end end end d = i_Message(d,mess); d = i_View(d); pr_SetViewData(d); %----------------------------------------------------------------------- function cb_Unassign(varargin) %----------------------------------------------------------------------- d = pr_GetViewData; indL = d.Dlg.LeftList.Selected; if isscalar(indL) ptr = d.Exprs.ptrs(indL); mess = ''; % Checks % Already assigned? Remove ptr from old factor assigned = isAssigned(d.Dlg.tmp,d.Exprs.ptrs); if assigned(indL) old_fact_i = getFactorIndex(d.Dlg.tmp,ptr); d.Dlg.tmp = Unassign(d.Dlg.tmp,old_fact_i); else mess = [d.Exprs.names{indL} ' is not assigned.']; end d = i_Message(d,mess); d = i_View(d); pr_SetViewData(d); end %----------------------------------------------------------------------- function d = i_RefreshProjectList(d) %----------------------------------------------------------------------- list = d.Dlg.LeftList; select_index = list.Selected; heads = {'Project' 'Units' 'Data Column'}; widths = [150 80 100 ]; if ~d.CheckUnits heads(2)=[]; widths(2)=[]; end list.MultiSelect = false; configureList(list,heads,widths,'Project Assignments'); [ListData,IconData,ind] = i_getLeftListData(d); refreshList(list,ListData,IconData,ind,select_index); function [ListData,IconData,ind] = i_getLeftListData(d) orig_names = get(d.Dlg.tmp,'orig_name'); if d.AssignDlg.Advanced ind = d.Exprs.FilterIndex{1}; else ind = d.AssignDlg.DDindex; end fact_i = getFactorIndex(d.Dlg.tmp,d.Exprs.ptrs(ind)); n = length(ind); ListData = cell(n,2+d.CheckUnits); IconData = cell(n,1); for i = 1:n ListData{i,1} = d.Exprs.names{ind(i)}; IconData{i,1} = d.Exprs.ptrs(ind(i)).iconfile; if d.CheckUnits ListData{i,2} = d.Exprs.unitchar{ind(i)}; end if fact_i(i) dsname = orig_names{fact_i(i)}; else dsname = ''; end if isempty(dsname) % Ensure dsname is a char and not a double matrix dsname = ''; end ListData{i,end}= dsname; end %----------------------------------------------------------------------- function d = i_RefreshColumnList(d) %----------------------------------------------------------------------- [ListData,IconData,ind] = i_getRightListData(d); list = d.Dlg.RightList; select_index = list.Selected; if d.CheckUnits heads = {'Name' 'Column' 'Units'}; widths = [150 80 80]; else heads = {'Name' 'Column'}; widths = [150 80 ]; end d.AssignDlg.RightIndex = 1; list.MultiSelect = false; configureList(list,heads, widths, 'Data Columns'); refreshList(d.Dlg.RightList,ListData,IconData,ind,select_index); function [ListData,IconData,ind] = i_getRightListData(d) orig_names = get(d.Dlg.tmp,'orig_name'); [~,~,isignored] = getIsFactorType(d.Dlg.tmp); dsonly = isDataOnly(d.Dlg.tmp); indstr = num2str((1:length(orig_names))'); assigned = isAssigned(d.Dlg.tmp); ptrlist = get(d.Dlg.tmp,'ptrlist'); n = length(orig_names); ind = 1:n; DoDisplay = false(n,1); if d.CheckUnits ListData = cell(n,3); else ListData = cell(n,2); end IconData = cell(n,1); for i = 1:length(orig_names) if ~isignored(i) && dsonly(i) DoDisplay(i)=true; if assigned(i) f = find(d.Exprs.ptrs==ptrlist(i)); if length(f)==1 icon = d.Exprs.tpiconfiles{f}; else icon = ''; end else icon = ''; end ListData(i,1:2)= {orig_names{i},indstr(i,:)}; IconData{i} = icon; if d.CheckUnits units = getunits(d.Dlg.tmp,i); if ~isempty(units) ListData{i,3} = char(units); end end end end ListData = ListData(DoDisplay,:); IconData = IconData(DoDisplay); ind = ind(DoDisplay);