% Edit cellarray of mixed numerical and string content (same content per column)
%
% function Tdata = table_dialog(Tdata,Theader,Title,Mode)
% function Tdata = table_dialog(Tdata,Theader,Title)
% function Tdata = table_dialog(Tdata,Theader)
% function Tdata = table_dialog(Tdata)
%
% Tdata = numerical array OR cell array
% Theader = cellarray (size = 1 x size(Tdata,2)) with strings
% Title = string
% Mode = 0 = no adding of columns or rows allowed
% 1 = adding of rows allowed
% 2 = adding of rows and columns allowed
%
% Written by F. Hatz, Neurology Basel 2013
function Tdata = table_dialog(Tdata,Theader,Title,Mode)
if ~exist('Tdata','var')
disp(' no input')
return
end
if ~exist('Mode','var')
Mode = 2;
end
if ~exist('Title','var')
Title = 'Table';
end
if ~exist('Theader','var') & ~isempty(Tdata);
Theader = cellstr(num2str((1:size(Tdata,2))'));
end
if isempty(Tdata) & ~isempty(Theader)
Tdata = cell(1,size(Theader,2));
end
figT = figure;
posF = get(figT, 'position');
% find max length of cells (including Theader)
Cwidth = 0;
for i = 1:length(Theader)
len = length(Theader{i});
if(len > Cwidth)
Cwidth = len;
end
end
for i=1:size(Tdata,2)
% Iterate over each row
for j=1:size(Tdata,1);
if iscell(Tdata)
len = length(Tdata{j,i});
else
len = length(Tdata(j,i));
end
% Store in Cwidth only if len is max length
if(len > Cwidth)
Cwidth = len;
end
end
end
% Some calibration needed as ColumnWidth is in pixels
Cwidth = Cwidth*10;
if Cwidth < 70
Cwidth = 70;
elseif Cwidth > 120
Cwidth = 120;
end
numrows = size(Tdata,1)+1;
if numrows > 25
numrows = 25;
elseif numrows < 4
numrows = 4;
end
posF(3) = Cwidth*size(Tdata,2) + 70;
if posF(3) > 1500
posF(3) = 1500;
posF(1) = 70;
elseif posF(3) > 600
posF(1) = 150;
end
posF(4)=(numrows+1)*24+80;
if posF(4) > 800
posF(4) = 800;
posF(2) = 70;
elseif posF(4) > 600
posF(2) = 70;
end
FigColor=get(0,'DefaultUicontrolBackgroundcolor');
set(figT,'position',posF,'MenuBar','None','Name',Title,'NumberTitle','off','Color',FigColor);
m1 = uimenu(figT,'Label','File');
uimenu(m1,'Label','Store','Callback','uiresume;');
uimenu(m1,'Label','Import','Callback',@tabledialog_import);
uimenu(m1,'Label','Export','Callback',@tabledialog_export);
if length(Theader) == 3 & strcmp(Theader,{'name','active','reference'})
uimenu(m1,'Label','Import Montage','Callback', ...
['[~,table] = lab_read_montage;if ~isempty(table);' ...
'set(get(gcf,''UserData''),''Data'',table);end;']);
end
if size(Tdata,1) == size(Tdata,2)
uimenu(m1,'Label','Generate','Callback',@generate_matrix);
end
uimenu(m1,'Label','Close','Callback','close;','Separator','on');
m2 = uimenu(figT,'Label','Edit');
if Mode == 2
uimenu(m2,'Label','+ column','Callback',@tabledialog_column_add);
uimenu(m2,'Label','- column','Callback',@tabledialog_column_del);
end
if Mode > 0
uimenu(m2,'Label','+ row','Separator','on','Callback',@tabledialog_row_add);
uimenu(m2,'Label','- row','Callback',@tabledialog_row_del);
end
pos = posF;
pos(1) = 5;
pos(2) = 30;
pos(3) = pos(3) -10;
pos(4) = pos(4) -35;
ColumnFormat = {};
for i = 1:size(Tdata,2)
if iscell(Tdata)
if isnumeric(Tdata{1,i})
ColumnFormat = [ColumnFormat {'numeric'}];
elseif islogical(Tdata{1,i})
ColumnFormat = [ColumnFormat {'logical'}];
else
ColumnFormat = [ColumnFormat {'char'}];
end
elseif isnumeric(Tdata(1,i))
ColumnFormat = [ColumnFormat {'numeric'}];
elseif islogical(Tdata(1,i))
ColumnFormat = [ColumnFormat {'logical'}];
else
ColumnFormat = [ColumnFormat {[]}];
end
end
t = uitable('Data',Tdata,'ColumnName',Theader,'ColumnEdit',true(1,size(Tdata,2)), ...
'Position',pos,'ColumnWidth',{Cwidth},'ColumnFormat',ColumnFormat,'Units','Normalized');
tmp = get(t);
if tmp.Extent(3)>tmp.Position(3);
posF(4) = posF(4)+22;
end
if tmp.Extent(4)>tmp.Position(4);
posF(3) = posF(3)+22;
end
set(figT,'UserData',t,'Position',posF);
uicontrol('style', 'pushbutton', 'units', 'pixels','position', [65,5,30,20],...
'string','ok','fontsize',10,'Callback','uiresume;','TooltipString','ok');
uicontrol('style', 'pushbutton', 'units', 'pixels','position', [5,5,55,20], ...
'string','cancel','fontsize',10,'Callback','close;','TooltipString','cancel');
uiwait;
try %#ok<TRYNC>
Tdata = get(t,'Data');
close(figT);
end
% ----------------------------------------
% start support scripts table_dialog
function tabledialog_import(~,~)
[filename,filepath] = uigetfile('*.xls;*.xlsx','Select xls-file');
if filename == 0;return;end;
if filename == 0;
table = [];
elseif ispc;
[~,~,table] = xlsread(fullfile(filepath,filename));
else;
[~,~,table] = xlsread(fullfile(filepath,filename),1,'','basic');
end;
if isempty(table);return;end;
answer = questdlg('First line is titles?','Title settings','Yes','No','No');
if strcmp(answer,'No');
titles = cellstr(num2str((1:size(table,2))'));
else;
titles = table(1,:)';
table = table(2:end,:);
end;
t2=get(gcf,'UserData');
Ttmp=get(t2);
Ttmp.ColumnWidth=Ttmp.ColumnWidth(1);
if Ttmp.ColumnWidth{1} < 70;Ttmp.ColumnWidth{1}=70;end;
Ttmp.ColumnFormat={};
for nCol = 1:size(table,2);
if isnumeric(table{1,nCol});
Ttmp.ColumnFormat = [Ttmp.ColumnFormat {'numeric'}];
elseif islogical(table{1,nCol});
Ttmp.ColumnFormat = [Ttmp.ColumnFormat {'logical'}];
else;
Ttmp.ColumnFormat = [Ttmp.ColumnFormat {'char'}];
end;
end;
set(t2,'Data',table,'ColumnEdit',true(1,size(table,2)),'ColumnName',titles,'ColumnWidth',Ttmp.ColumnWidth,'ColumnFormat',Ttmp.ColumnFormat);
Ttmp=get(t2);
Ttmp2=get(gcf,'Position');
Ttmp2(3)=Ttmp2(3)*Ttmp.Extent(3)/Ttmp.Position(3);
Ttmp2(4)=Ttmp2(4)*Ttmp.Extent(4)/Ttmp.Position(4);
if Ttmp2(3)>1500;Ttmp2(3)=1500;Ttmp2(4)=Ttmp2(4)+22;end;
if Ttmp2(4)<150;Ttmp2(4)=150;elseif Ttmp2(4)>800;Ttmp2(4)=800;Ttmp2(2)=70;Ttmp2(3)=Ttmp2(3)+22;end;
set(gcf,'Position',Ttmp2);
end
function tabledialog_export(~,~)
Ttmp=get(get(gcf,'UserData'));
[filename,filepath] = uiputfile('.xls','File to store');
if filename == 0;return;end;
if ~iscell(Ttmp.Data);
xlsout = cat(1,Ttmp.ColumnName',num2cell(Ttmp.Data));
else;
xlsout = cat(1,Ttmp.ColumnName',Ttmp.Data);
end;
if exist(fullfile(filepath,filename),'file');
delete(fullfile(filepath,filename));
end;
if exist('xlwrite')
xlwrite(fullfile(filepath,filename),xlsout);
else
xlswrite(fullfile(filepath,filename),xlsout);
end
end
function tabledialog_column_add(~,~)
t2=get(gcf,'UserData');
Ttmp=get(t2);
if isnumeric(Ttmp.Data);
Ttmp.Data(1,end+1)=[];
elseif strcmp(Ttmp.ColumnFormat{end},'numeric');
Ttmp.Data(:,end+1)=repmat({[]},size(Ttmp.Data,1),1);
elseif strcmp(Ttmp.ColumnFormat{end},'logical');
Ttmp.Data(:,end+1)=num2cell(false(size(Ttmp.Data,1),1));
else;
Ttmp.Data(:,end+1)=repmat({' '},size(Ttmp.Data,1),1);
end;
Ttmp.ColumnName{end+1,1}='new';
Ttmp.ColumnWidth=Ttmp.ColumnWidth(1);
if Ttmp.ColumnWidth{1} < 70;Ttmp.ColumnWidth{1}=70;end;
Ttmp.ColumnFormat=[Ttmp.ColumnFormat Ttmp.ColumnFormat(end)];
set(t2,'Data',Ttmp.Data,'ColumnName',Ttmp.ColumnName,'ColumnEdit',true(1,size(Ttmp.Data,2)),'ColumnWidth',Ttmp.ColumnWidth,'ColumnFormat',Ttmp.ColumnFormat);
Ttmp=get(t2);
Ttmp2=get(gcf,'Position');
Ttmp2(3)=Ttmp2(3)*Ttmp.Extent(3)/Ttmp.Position(3);
Ttmp2(4)=Ttmp2(4)*Ttmp.Extent(4)/Ttmp.Position(4);
if Ttmp2(3)>1500;Ttmp2(3)=1500;Ttmp2(4)=Ttmp2(4)+22;end;
if Ttmp2(4)<150;Ttmp2(4)=150;elseif Ttmp2(4)>800;Ttmp2(4)=800;Ttmp2(2)=70;Ttmp2(3)=Ttmp2(3)+22;end;
set(gcf,'Position',Ttmp2);
end
function tabledialog_column_del(~,~)
t2=get(gcf,'UserData');
Tmp=get(t2);
Tmp.Data=Tmp.Data(:,1:end-1);
Tmp.ColumnName=Tmp.ColumnName(1:end-1);
Tmp.ColumnWidth=Tmp.ColumnWidth(1);
if Tmp.ColumnWidth{1}<70;Tmp.ColumnWidth{1}=70;end;
set(t2,'Data',Tmp.Data,'ColumnFormat',Tmp.ColumnFormat,'ColumnName',Tmp.ColumnName,'ColumnEdit',true(1,size(Tmp.Data,2)),'ColumnWidth',Tmp.ColumnWidth);
Tmp=get(t2);
Tmp2=get(gcf,'Position');
Tmp2(3)=Tmp2(3)*Tmp.Extent(3)/Tmp.Position(3);
Tmp2(4)=Tmp2(4)*Tmp.Extent(4)/Tmp.Position(4);
if Tmp2(3)>1500;Tmp2(3)=1500;Tmp2(4)=Tmp2(4)+22;end;
if Tmp2(4)<150;Tmp2(4)=150;elseif Tmp2(4)>800;Tmp2(4)=800;Tmp2(2)=70;Tmp2(3)=Tmp2(3)+22;end;
set(gcf,'Position',Tmp2);
end
function tabledialog_row_add(~,~)
t2=get(gcf,'UserData');
Ttmp=get(t2);
nRow=size(Ttmp.Data,1)+1;
for nCol=1:size(Ttmp.Data,2);
if isnumeric(Ttmp.Data);
Ttmp.Data(nRow,nCol)=0;
elseif strcmp(Ttmp.ColumnFormat{nCol},'numeric');
Ttmp.Data{nRow,nCol}=[];
elseif strcmp(Ttmp.ColumnFormat{nCol},'logical');
Ttmp.Data{nRow,nCol}=false;
else;
Ttmp.Data{nRow,nCol}=' ';
end;
end;
set(t2,'Data',Ttmp.Data);
Ttmp=get(t2);
Ttmp2=get(gcf,'Position');
Ttmp2(3)=Ttmp2(3)*Ttmp.Extent(3)/Ttmp.Position(3);
Ttmp2(4)=Ttmp2(4)*Ttmp.Extent(4)/Ttmp.Position(4);
if Ttmp2(3)>1500;Ttmp2(3)=1500;Ttmp2(4)=Ttmp2(4)+22;end;
if Ttmp2(4)<150;Ttmp2(4)=150;elseif Ttmp2(4)>800;Ttmp2(4)=800;Ttmp2(2)=70;Ttmp2(3)=Ttmp2(3)+22;end;
set(gcf,'Position',Ttmp2);
end
function tabledialog_row_del(~,~)
t2=get(gcf,'UserData');
Tmp=get(t2);
Tmp.Data=Tmp.Data(1:end-1,:);
set(t2,'Data',Tmp.Data);
Tmp=get(t2);
Tmp2=get(gcf,'Position');
Tmp2(3)=Tmp2(3)*Tmp.Extent(3)/Tmp.Position(3);
Tmp2(4)=Tmp2(4)*Tmp.Extent(4)/Tmp.Position(4);
if Tmp2(3)>1500;Tmp2(3)=1500;Tmp2(4)=Tmp2(4)+22;end;
if Tmp2(4)<150;Tmp2(4)=150;elseif Tmp2(4)>800;Tmp2(4)=800;Tmp2(2)=70;Tmp2(3)=Tmp2(3)+22;end;
set(gcf,'Position',Tmp2);
end
function generate_matrix(~,~)
Thandle = get(gcf,'UserData');
matrix = get(Thandle,'Data');
matrix = lab_generate_matrix(size(matrix,2));
set(t,'Data',matrix);
end
% end support scripts table_dialog
% --------------------------------
end