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