Code covered by the BSD License  

Highlights from
table_dialog

image thumbnail
from table_dialog by fhz
Script for table input

table_dialog(Tdata,Theader,Title,Mode)
% 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

Contact us