Changeset 146


Ignore:
Timestamp:
Oct 18, 2010, 11:09:40 AM (9 years ago)
Author:
tjniskan
Message:
  • Renamed aedes_viewprocpar.m to aedes_headerbrowser.m, since it's now

a more generic file header viewer. The favourite parameters are also
file format dependent. Aedes_headerbrowser should work in Matlab R2007b and
newer. Keyboard shortcuts don't work in Matlab R2007b if the uitable
has focus. Might work with older Matlab versions too, but I haven't
tried.

  • Added a shortcut to aedes_headerbrowser.m in Aedes menubar

View->File Header. Keyboard shortcut CTRL-H can also be used to launch
the aedes_headerbrowser.m.

  • Fixed a small bug in aedes_data_read.m. The file header information

from DICOM files was placed in a wrong field in Aedes DATA-structure.

D aedes_viewprocpar.m
M aedes_data_read.m
M aedes.m
A + aedes_headerbrowser.m
M aedes_revision.m

Files:
3 edited
1 moved

Legend:

Unmodified
Added
Removed
  • aedes.m

    r142 r146  
    462462% View axes ticks and grid
    463463H.UIVIEW_GRID = uimenu(view_h,'Label','Show Grid',...
    464                               'callback',{@l_ViewAxesUnits,'pixel'},...
    465                               'separator','on',...
    466                               'checked','off');
     464  'callback',{@l_ViewAxesUnits,'pixel'},...
     465  'separator','on',...
     466  'checked','off');
     467
     468% View Header in aedes_headerbrowser
     469H.viewheader_h = uimenu(view_h,'Label','File Header',...
     470  'callback',@l_LaunchHeaderBrowser,...
     471  'enable','on','Accelerator','H',...
     472  'separator','on');
    467473
    468474% Show Info text background
     
    539545                 'enable','on');
    540546vnmredit_h = uimenu(tools_h,'Label','Edit VNMR defaults', ...
    541                    'callback','aedes_readfidprefs',...
    542                    'enable','on');
    543 resview_h = uimenu(tools_h,'Label','Results Viewer', ...
    544                    'callback','aedes_resviewer',...
    545                    'enable','on',...
    546                    'separator','on');
     547  'callback','aedes_readfidprefs',...
     548  'enable','on');
     549resview_h = uimenu(tools_h,'Label','Results Viewer', ...  'callback','aedes_resviewer',...
     550  'enable','on',...
     551  'separator','on');
    547552update_h = uimenu(tools_h,'Label','Check for updates', ...
    548553  'callback',@l_CheckUpdates,...
     
    19361941H.UICH_ENABLED(end+1)=roi_tools_h;
    19371942H.UICH_ENABLED(end+1)=closefile_h;
     1943%H.UICH_ENABLED(end+1)=H.viewprocpar_h;
    19381944H.UICH_ENABLED(end+1)=H.UIOVERLAY;
    19391945H.UICH_ENABLED(end+1)=H.UIPUSH_SAVE;
     
    33473353set(H.UICH_ENABLED,'enable','on')
    33483354
     3355% Disable "View VNMR Procpar" for non-VNMR data
     3356%if ~isfield(DATA{1},'PROCPAR') || isempty(DATA{1}.PROCPAR)
     3357%  set(H.viewprocpar_h,'enable','off')
     3358%end
     3359
    33493360% If data is mixed type, disable rotate and image stack buttons
    33503361if ~Dat.isDataMixed
     
    1050610517end % function l_ExecutePlugin(h,
    1050710518
     10519%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     10520% Launch Header Browser
     10521%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     10522  function l_LaunchHeaderBrowser(fh,evd)
     10523   %try
     10524    if ( isfield(DATA{Dat.DataInd},'PROCPAR') && ~isempty(DATA{Dat.DataInd}.PROCPAR) ) || ...
     10525        ( isfield(DATA{Dat.DataInd},'HDR') && ~isempty(DATA{Dat.DataInd}.HDR) )
     10526      aedes_headerbrowser(DATA{Dat.DataInd});
     10527    else
     10528      errordlg('Cannot open file header browser. File header not found!','File Header Not Found!','modal');
     10529    end
     10530    %catch
     10531    %  aedes_errordump(lasterror);
     10532    %end
     10533  end
     10534
    1050810535function l_PrintLicense(h,evd)
    1050910536
     
    1051110538  fprintf(1,'* Aedes - A graphical tool for analyzing medical images\n');
    1051210539  fprintf(1,'*\n')
    10513   fprintf(1,'* Copyright (C) 2006 Juha-Pekka Niskanen <Juha-Pekka.Niskanen@uku.fi>\n');
     10540  fprintf(1,'* Copyright (C) 2006 Juha-Pekka Niskanen <Juha-Pekka.Niskanen@uef.fi>\n');
    1051410541  fprintf(1,'*\n')
    1051510542  fprintf(1,'* Department of Physics, Department of Neurobiology\n');
    10516   fprintf(1,'* University of Kuopio, FINLAND\n');
     10543  fprintf(1,'* University of Eastern Finland, FINLAND\n');
    1051710544  fprintf(1,'*\n')
    1051810545  fprintf(1,'* This program may be used under the terms of the GNU General Public\n');
  • aedes_data_read.m

    r138 r146  
    439439  try
    440440    hdr = dicominfo(filename);
    441     DATA.HDR=hdr;
     441    DATA.HDR.FileHeader=hdr;
    442442    DATA.HDR.fname = f_name;
    443443    DATA.HDR.fpath = f_path;
  • aedes_headerbrowser.m

    r145 r146  
    1 function aedes_viewprocpar(procpar)
    2 % AEDES_VIEWPROCPAR - VNMR Procpar-file viewer
     1function aedes_headerbrowser(inStruct)
     2% AEDES_HEADERBROWSER - Browse and search file header information or any
     3%                       Matlab structure
    34%   
    45%
    5 % Synopsis:
    6 %       aedes_viewprocpar(procpar)
     6% Synopsis:
     7%       aedes_headerbrowser(DATA) % Open the file format specific header
     8%
     9%       aedes_headerbrowser(STRUCT) % Browse a generic Matlab structure
    710%
    811% Description:
     12%       
    913%
    1014% Examples:
    1115%
    1216% See also:
    13 %       AEDES
     17%       AEDES, AEDES_READPROCPAR, AEDES_READ_NIFTI
    1418
    1519% This function is a part of Aedes - A graphical tool for analyzing
     
    3337Dat = [];  % Internal data structure
    3438
    35 
    3639% Do some error checking
    3740if nargin ~= 1
     
    3942end
    4043
     44% Check that the input argument is structure
     45if ~isstruct(inStruct)
     46  error('Input argument must be structure!')
     47end
     48
     49% Get the saved Favourite list
     50try
     51  Dat.FavList = getpref('Aedes','HeaderBrowserFavList');
     52catch
     53  Dat.FavList.nifti = {};
     54  Dat.FavList.vnmr = {};
     55  Dat.FavList.dcm = {};
     56  Dat.FavList.genheader = {};
     57  Dat.FavList.generic = {};
     58end
     59
    4160% Check if input is a Aedes data structure
    42 if isfield(procpar,'PROCPAR') && isfield(procpar,'FTDATA') && ...
    43     isfield(procpar,'HDR')
    44   ProcparFileName = [procpar.HDR.fpath,'procpar'];
    45   procpar = procpar.PROCPAR;
     61if isfield(inStruct,'HDR') && isfield(inStruct,'FTDATA')
     62  if isfield(inStruct,'DataFormat')
     63    if any(strcmpi(inStruct.DataFormat,{'NIfTI(1)','NIfTI(2)','Analyze75'}))
     64      % NIfTI and Analyze75 files
     65      Dat.HeaderFileName = [inStruct.HDR.fpath,inStruct.HDR.fname];
     66      Dat.FileFormatName = 'NIfTI/Analyze';
     67      try
     68        Dat.FavouriteList = Dat.FavList.nifti;
     69      catch
     70        Dat.FavList.nifti = {}
     71        Dat.FavouriteList = Dat.FavList.nifti;
     72      end
     73      inStruct=inStruct.HDR.FileHeader;
     74     
     75    elseif strcmpi(inStruct.DataFormat,'VNMR')
     76      % Varian VNMR files
     77      Dat.HeaderFileName = [inStruct.HDR.fpath,'procpar'];
     78      Dat.FileFormatName = 'VNMR Procpar';
     79      try
     80        Dat.FavouriteList = Dat.FavList.vnmr;
     81      catch
     82        Dat.FavList.vnmr = {}
     83        Dat.FavouriteList = Dat.FavList.vnmr;
     84      end
     85      inStruct=inStruct.PROCPAR;
     86     
     87    elseif strcmpi(inStruct.DataFormat,'DCM')
     88      % DICOM files
     89      Dat.HeaderFileName = [inStruct.HDR.fpath,inStruct.HDR.fname];
     90      Dat.FileFormatName = 'DICOM';
     91      try
     92        Dat.FavouriteList = Dat.FavList.dcm;
     93      catch
     94        Dat.FavList.dcm = {}
     95        Dat.FavouriteList = Dat.FavList.dcm;
     96      end
     97      inStruct=inStruct.HDR.FileHeader;
     98     
     99    else
     100      % Generic header
     101      Dat.HeaderFileName = [inStruct.HDR.fpath,inStruct.HDR.fname];
     102      Dat.FileFormatName = 'generic header';
     103      try
     104        Dat.FavouriteList = Dat.FavList.genheader;
     105      catch
     106        Dat.FavList.genheader = {}
     107        Dat.FavouriteList = Dat.FavList.genheader;
     108      end
     109      inStruct=inStruct.HDR.FileHeader;
     110     
     111    end
     112  else
     113    % Generic header
     114    inStruct=inStruct.HDR.FileHeader;
     115    Dat.FileFormatName = 'generic header';
     116    try
     117      Dat.FavouriteList = Dat.FavList.genheader;
     118    catch
     119      Dat.FavList.genheader = {}
     120      Dat.FavouriteList = Dat.FavList.genheader;
     121    end
     122    Dat.HeaderFileName = [inStruct.HDR.fpath,inStruct.HDR.fname];
     123  end
    46124else
    47   ProcparFileName = '';
     125  % Generic Matlab structure
     126  Dat.HeaderFileName = '';
     127  Dat.FileFormatName = 'generic structure';
     128  try
     129    Dat.FavouriteList = Dat.FavList.generic;
     130  catch
     131    Dat.FavList.generic = {}
     132    Dat.FavouriteList = Dat.FavList.generic;
     133  end
    48134end
    49135
    50 if ~isstruct(procpar) || ~isfield(procpar,'console')
    51   error('Input argument is not a valid Varian PROCPAR structure!')
    52 end
     136% Initialize the cell array for uitable
     137Dat.FullTable = {};
     138Dat.StructMaxDepth = 10; % Limit recursion to something reasonable...
     139Dat.FieldSeparator = '\';
     140Dat.TableFavSeparator = '<html><b>=============</b></html>';
     141Dat.SelectedCells = [];
    53142
    54143% Draw main GUI
    55 [H,Dat]=l_DrawGui();
    56 
    57 % Default favourites
    58 %FavouriteList = {};
    59 %FavouriteList = {'tr','te','kakka','lpe','lro'};
    60 %set(H.FavListBox,'string',FavouriteList);
    61 
    62 % Parse PROCPAR structure
    63 l_ParseProcparStructure(procpar)
     144[H,Dat]=l_DrawGui(Dat);
     145l_ParseHeaderStructure(inStruct,'',0);
     146Dat.DataTable = Dat.FullTable;
     147l_SearchParams([],[]);
    64148
    65149% Update Data Table
     
    69153uicontrol(H.SearchEdit);
    70154
    71   function [H,Dat]=l_DrawGui()
     155% Get java handle to the table for Matlab R2007a and older
     156if Dat.MatlabVersion<=7.05
     157  drawnow, pause(0.01) % Force refresh
     158 
     159  % Set Table to non-editable
     160  set(H.DataTable,'Editable',false)
     161 
     162  % Get java handle
     163  H.DataTableJavaHandle = handle(H.DataTable.getTable,'callbackproperties');
     164 
     165  % Set KeyPressedCallback
     166  set(H.DataTableJavaHandle.KeyPressedCallback,@l_KeyPressFcn)
     167end
     168assignin('base','H',H) % debug
     169
     170%% ------------------------------------------
     171  function [H,Dat]=l_DrawGui(Dat)
    72172
    73173    % Load default font and colors
     
    85185   
    86186    % Main Figure ----------------------------
    87     H.fh = figure('Units','Pixel', ...
     187    H.Fig = figure('Units','Pixel', ...
    88188      'position',fig_pos,...
    89       'Name','VNMR PROCPAR Viewer', ...
     189      'Name',['File Header Browser - ',Dat.FileFormatName], ...
    90190      'Numbertitle','off', ...
    91       'Tag','procpar_viewer_fig', ...
     191      'Tag','header_browser_fig', ...
    92192      'Color',Dat.GD.col.mainfig, ...
    93193      'Toolbar','none', ...
     
    98198      'resize','off',...
    99199      'Handlevisibility','off',...
    100       'KeyPressFcn',@l_EscapeCloseFig,...
     200      'KeyPressFcn',@l_KeyPressFcn,...
    101201      'CloseReq',@l_CloseFig);
    102202   
    103203    % File name
    104204    fname_txh = 0;
    105     if ~isempty(ProcparFileName)
     205    if ~isempty(Dat.HeaderFileName)
    106206      fname_txh = 70;
    107       H.FileNameUipanel = uipanel('parent',H.fh,...
     207      H.FileNameUipanel = uipanel('parent',H.Fig,...
    108208        'units','pixel',...
    109209        'position',[10 fig_h-fname_txh fig_w-20 fname_txh-10],...
     
    114214      H.FileNameText = uicontrol('parent',H.FileNameUipanel,...
    115215        'style','text',...
    116         'string',ProcparFileName,...
     216        'string',Dat.HeaderFileName,...
    117217        'units','pixel',...
    118218        'position',[10 5 tmp_pos(3)-20 fname_txh-35],...
     
    123223    % Search uipanel ----------------------
    124224    up_height = 80;
    125     H.SearchUipanel = uipanel('parent',H.fh,...
     225    H.SearchUipanel = uipanel('parent',H.Fig,...
    126226      'units','pixel',...
    127227      'position',[10 fig_h-up_height-10-fname_txh fig_w-20 up_height],...
     
    131231    % Search text
    132232    pos=get(H.SearchUipanel,'position');
    133     H.SearchText = uicontrol('parent',H.SearchUipanel,...
    134       'style','text',...
    135       'string','Parameter:',...
     233    %H.SearchText = uicontrol('parent',H.SearchUipanel,...
     234    %  'style','text',...
     235    %  'string','Parameter:',...
     236    %  'units','pixel',...
     237    %  'position',[10 pos(4)-45 100 19],...
     238    %  'horizontalalign','left',...
     239    %  'backgroundcolor',Dat.GD.col.mainfig);
     240    try
     241      val=getpref('Aedes','HeaderBrowserSearchWhere');
     242    catch
     243      val=1;
     244    end
     245    H.SearchWherePopup = uicontrol('parent',H.SearchUipanel,...
     246      'style','popup',...
     247      'string',{'Parameter',...
     248      'Value'},...
    136249      'units','pixel',...
    137       'position',[10 pos(4)-45 100 19],...
    138       'horizontalalign','left',...
    139       'backgroundcolor',Dat.GD.col.mainfig);
    140 
     250      'position',[10 pos(4)-45 100 22],...
     251      'value',val,...
     252      'tag','',...
     253      'backgroundcolor',Dat.GD.col.popup,...
     254      'callback',@l_SearchParams,...
     255      'KeyPressFcn',@l_KeyPressFcn);
     256   
    141257    % Search type popupmenu
    142258    try
    143       val = getpref('Aedes','ViewProcparSearchHow');
     259      val = getpref('Aedes','HeaderBrowserSearchHow');
    144260    catch
    145261      val = 1;
    146262    end
    147     tmp_pos = get(H.SearchText,'position');
     263    tmp_pos = get(H.SearchWherePopup,'position');
     264    %tmp_pos = get(H.SearchText,'position');
    148265    H.SearchHowPopup = uicontrol('parent',H.SearchUipanel,...
    149266      'style','popup',...
    150267      'string',{'contains...',...
    151268      'is exactly...','begins with...',...
    152       'ends with...'},...
     269      'ends with...',...
     270      'matches regexp...'},...
    153271      'units','pixel',...
    154272      'position',[tmp_pos(1)+tmp_pos(3)+5 tmp_pos(2) ...
     
    158276      'backgroundcolor',Dat.GD.col.popup,...
    159277      'callback',@l_SearchParams,...
    160       'KeyPressFcn',@l_EscapeCloseFig);
     278      'KeyPressFcn',@l_KeyPressFcn);
    161279
    162280    % Search editbox
     
    170288      'KeyPressFcn',@l_SearchParams);
    171289   
    172     % If other procpar viewer windows are currently open, the figure name
    173     % has to be unique for finding the correct javaFrame.
    174     figs=findall(0,'tag','procpar_viewer_fig');
    175     if length(figs)>1
    176       set(H.fh,'Name',['VNMR PROCPAR Viewer (',num2str(H.fh),')']);
    177       drawnow,pause(0.02);
    178     end
    179     H.jh=l_GetEditboxJavaHandle(H.fh);
    180     if isempty(H.jh)
    181       % Fall back to basic matlab code -> no search as you type... :-(
    182       Dat.SearchEditUseJava = false;
    183       set(H.SearchEdit,'KeyPressFcn','')
    184     else
    185       Dat.SearchEditUseJava = true;
    186     end
    187     set(H.fh,'Name','VNMR PROCPAR Viewer'); % Set Figure name back to original...
    188    
    189    
    190290    % Case sensitive
    191291    try
    192       val = getpref('Aedes','ViewProcparCaseSensitivity');
     292      val = getpref('Aedes','HeaderBrowserCaseSensitivity');
    193293    catch
    194294      val = 1;
     
    203303      'value',val,...
    204304      'backgroundcolor',Dat.GD.col.mainfig,...
    205       'KeyPressFcn',@l_EscapeCloseFig);
     305      'KeyPressFcn',@l_KeyPressFcn);
    206306   
    207307    % --------------------------------------
     
    209309    favup_height = 150;
    210310    tmp_pos = get(H.SearchUipanel,'position');
    211     H.FavUipanel = uipanel('parent',H.fh,...
     311    H.FavUipanel = uipanel('parent',H.Fig,...
    212312      'units','pixel',...
    213313      'position',[10 fig_h-up_height-favup_height-fname_txh-15 fig_w-20 favup_height],...
    214       'title','Favourite parameters',...
     314      'title',['Favourite parameters for ',Dat.FileFormatName],...
    215315      'backgroundcolor',Dat.GD.col.mainfig);
    216316   
     
    237337      tmp_pos(2)+tmp_pos(4)-25 70 25],...
    238338      'String','Add',...
    239       'callback',@l_AddFavourite,...
    240       'KeyPressFcn',@l_EscapeCloseFig);
     339      'callback',{@l_AddFavourite,[]},...
     340      'KeyPressFcn',@l_KeyPressFcn);
    241341   
    242342    H.FavRem = uicontrol('parent',H.FavUipanel,...
     
    247347      'String','Remove',...
    248348      'callback',@l_RemFavourite,...
    249       'KeyPressFcn',@l_EscapeCloseFig);
    250    
    251     try
    252       Dat.FavouriteList = getpref('Aedes','ViewProcparFavourites');
    253     catch
    254       Dat.FavouriteList = {''};
    255     end
     349      'KeyPressFcn',@l_KeyPressFcn);
     350   
    256351    tmp_pos = get(H.FavInfoText,'position');
    257352    H.FavListBox = uicontrol('parent',H.FavUipanel,...
     
    265360      'value',[],...
    266361      'backgroundcolor','w',...
    267       'KeyPressFcn',@l_EscapeCloseFig);
     362      'KeyPressFcn',@l_KeyPressFcn);
    268363   
    269364    % Close & Export to workspace btns -------
    270365    tmp_pos = get(H.FavUipanel,'position');
    271     btn_w = 200;
     366    btn_w = (fig_w-20-2*5)/3;
     367    %btn_w = 200;
    272368    btn_h = 25;
    273     H.ExportBtn = uicontrol('parent',H.fh,...
     369    H.ExportBtn = uicontrol('parent',H.Fig,...
    274370      'style','pushbutton',...
    275371      'units','pixels',...
     
    278374      'string','Export to workspace',...
    279375      'callback',@l_ExportToWorkspace,...
    280       'KeyPressFcn',@l_EscapeCloseFig);
    281    
    282     btn_w = 200;
     376      'KeyPressFcn',@l_KeyPressFcn);
     377   
     378    %btn_w = 200;
    283379    btn_h = 25;
    284     H.CloseBtn = uicontrol('parent',H.fh,...
     380    H.AddParamsToFavBtn = uicontrol('parent',H.Fig,...
     381      'style','pushbutton',...
     382      'units','pixels',...
     383      'position',[tmp_pos(1)+btn_w+5 tmp_pos(2)-btn_h-5 btn_w btn_h],...
     384      'string','Add to favourites',...
     385      'enable','off',...
     386      'callback',@l_AddToFavBtnCallback,...
     387      'KeyPressFcn',@l_KeyPressFcn);
     388    if Dat.MatlabVersion<=7.05
     389      % With Matlab R2007b and older this has to be handled differently
     390      set(H.AddParamsToFavBtn,'enable','on');
     391    end
     392   
     393    %btn_w = 200;
     394    btn_h = 25;
     395    H.CloseBtn = uicontrol('parent',H.Fig,...
    285396      'style','pushbutton',...
    286397      'units','pixels',...
     
    289400      'string','Close',...
    290401      'callback',@l_CloseFig,...
    291       'KeyPressFcn',@l_EscapeCloseFig);
     402      'KeyPressFcn',@l_KeyPressFcn);
    292403   
    293404    % Data Table -----------------------------
    294405    pos=get(H.FavUipanel,'position');
    295406    if Dat.MatlabVersion>=7.06
    296       H.restable = uitable('Parent',H.fh,...
     407      H.DataTable = uitable('Parent',H.Fig,...
     408        'Data',{'loading...','loading...'},...
    297409        'units','pixel',...
    298410        'position',[10 10 fig_w-20 pos(2)-20-btn_h-5],...
    299         'KeyPressFcn',@l_EscapeCloseFig);
     411        'KeyPressFcn',@l_KeyPressFcn,...
     412        'CellSelectionCallback',@l_DataTableCellSelectionFcn,...
     413        'ColumnFormat',{'char','char'},...
     414        'ColumnWidth',{280,280},...
     415        'RowName',[],...
     416        'ColumnName',{'Parameter','Value(s)'});
    300417    else
    301       H.restable = uitable('Parent',H.fh,...
     418      H.DataTable = uitable('Parent',H.Fig,...
    302419        'position',[10 10 fig_w-20 pos(2)-20-btn_h-5],...
    303420        'Data',{'loading...','loading...'},...
    304         'ColumnWidth',250,...
     421        'ColumnWidth',265,...
    305422        'ColumnNames',{'Parameter','Value(s)'});
    306423    end
    307   end
    308 
    309 %% --------------------------------------------------------
    310   function l_ParseProcparStructure(procpar)
    311 
    312     %% Read procpar and construct a cell array
    313     DataTable = {};
    314     fldnames=fieldnames(procpar);
    315     fldnames=sort(fldnames);
     424   
     425    % If other header browser windows are currently open, the figure name
     426    % has to be unique for finding the correct javaFrame.
     427    figs=findall(0,'tag','header_browser_fig');
     428    if length(figs)>1
     429      set(H.Fig,'Name',['File Header Browser - ',Dat.FileFormatName,' (',num2str(H.Fig),')']);
     430      drawnow,pause(0.02);
     431    end
     432    H.SearchEditJavaHandle=l_GetEditboxJavaHandle(H.Fig);
     433    if isempty(H.SearchEditJavaHandle)
     434      % Fall back to basic matlab code -> no search as you type... :-(
     435      Dat.SearchEditUseJava = false;
     436      set(H.SearchEdit,'KeyPressFcn','')
     437    else
     438      Dat.SearchEditUseJava = true;
     439    end
     440    set(H.Fig,'Name',['File Header Browser - ',Dat.FileFormatName]); % Set Figure name back to original...
     441   
     442  end
     443
     444  function l_ParseHeaderStructure(inStruct,parent,level)
     445    % This subfunction goes throught the input structure recursively and
     446    % constructs the n-by-2 cell array for the uitable.
     447   
     448    % Get fieldnames
     449    fldnames = fieldnames(inStruct);
     450    fldnames = sort(fldnames);
     451   
     452    % Loop over the field names
    316453    for ii=1:length(fldnames)
    317       DataTable{end+1,1}=fldnames{ii};
    318       val=procpar.(fldnames{ii});
    319       if length(val)>1
    320         if iscell(val)
    321           if strcmpi(fldnames{ii},'array')
    322             if iscell(val{1})
    323               str='(';
    324               for jj=1:length(val{1})
    325                 val{1}{jj}=strrep(val{1}{jj},'''','''''');
    326                 str = [str,', ''',val{1}{jj},''''];
    327               end
    328               str=[str,')'];
    329               DataTable{end,2}=str;
    330             else
    331               for jj=1:length(val)
    332                 val{jj}=strrep(val{jj},'''','''''');
    333                 str = [str,', ''',val{jj},''''];
    334               end
    335               DataTable{end,2}=str;
    336             end
     454      cVal = inStruct.(fldnames{ii});
     455     
     456      % Structures
     457      if isstruct(cVal)
     458        if level>=Dat.StructMaxDepth
     459          % Don't go beyond the StructMaxDepth level
     460          Dat.FullTable{end,2} = regexprep(regexprep(mat2str(size(cVal)),'\s','x'),'\]$',' struct]');
     461        else
     462          % Recursively go through the next level
     463          if isempty(parent) % First level
     464            l_ParseHeaderStructure(cVal,fldnames{ii},level+1);
    337465          else
    338             DataTable{end,2}=val{1};
     466            l_ParseHeaderStructure(cVal,[parent,Dat.FieldSeparator,fldnames{ii}],level+1);
    339467          end
    340         else
    341           str='[ ';
    342           for ii=1:length(val)
    343             str=[str,' ',num2str(val(ii)),' '];
    344           end
    345           str=[str,' ]'];
    346           DataTable{end,2}=str;
    347468        end
    348469      else
    349         if iscell(val)
    350           DataTable{end,2}=val{1};
     470        if isempty(parent)
     471          Dat.FullTable{end+1,1} = fldnames{ii};
    351472        else
    352           DataTable{end,2}=val;
     473          Dat.FullTable{end+1,1} = [parent,Dat.FieldSeparator,fldnames{ii}];
    353474        end
    354       end
    355     end
    356 
    357     % Save the full table
    358     Dat.FullTable = DataTable;
    359 
     475       
     476        % Numeric values
     477        if isnumeric(cVal)
     478          if ndims(cVal)<=2 || any(size(cVal)==1)
     479            Dat.FullTable{end,2} = mat2str(cVal);
     480          else
     481            Dat.FullTable{end,2} = regexprep(regexprep(mat2str(size(cVal)),'\s','x'),'\]$',' matrix]');
     482          end
     483         
     484          % Logical arrays
     485        elseif islogical(cVal)
     486          if ndims(cVal)<=2 || any(size(cVal)==1)
     487            Dat.FullTable{end,2} = num2str(cVal);
     488          else
     489            Dat.FullTable{end,2} = regexprep(regexprep(mat2str(size(cVal)),'\s','x'),'\]$',' logical]');
     490          end
     491         
     492          % Character strings
     493        elseif ischar(cVal)
     494          Dat.FullTable{end,2} = ['''',cVal,''''];
     495         
     496          % Cell arrays
     497        elseif iscell(cVal)
     498          str = '{';
     499          for kk=1:length(cVal)
     500            if kk==1
     501              sep='';
     502            else
     503              sep=', ';
     504            end
     505            if ischar(cVal{kk})
     506              str = [str,sep,'''',cVal{kk},''''];
     507            elseif isnumeric(cVal{kk}) || islogical(cVal{kk})
     508              if ndims(cVal{kk})>1
     509                tmp_str = regexprep(regexprep(mat2str(size(cVal{kk})),'\s','x'),'\]$',' matrix]');
     510                str = [str,sep,tmp_str];
     511              else
     512                str = [str,sep,mat2str(cVal{kk})];
     513              end
     514            elseif iscell(cVal{kk})
     515              % Don't handle cell arrays inside cell arrays
     516              tmp_str = regexprep(regexprep(mat2str(size(cVal{kk})),'\s','x'),'\]$',' cell array]');
     517              str = [str,sep,tmp_str];
     518            elseif isstruct(cVal{kk})
     519              % Don't handle structures inside cell arrays
     520              tmp_str = regexprep(regexprep(mat2str(size(cVal{kk})),'\s','x'),'\]$',' struct]');
     521              str = [str,sep,tmp_str];
     522            else
     523              tmp_str = regexprep(regexprep(mat2str(size(cVal{kk})),'\s','x'),'\]$',[' ',class(cVal{kk}),']']);
     524              str = [str,sep,tmp_str];
     525            end
     526          end
     527          str(end+1) = '}';
     528          Dat.FullTable{end,2} = str;
     529         
     530          % Unsupported class/object
     531        else
     532          tmp_str = regexprep(regexprep(mat2str(size(cVal)),'\s','x'),'\]$',[' ',class(cVal),']']);
     533          Dat.FullTable{end,2} = tmp_str;
     534        end
     535      end
     536    end
     537   
    360538    % Put favourites on top
    361     Dat.DataTable = l_PutFavouritesOnTop(Dat.FullTable);
    362 
     539    %Dat.DataTable = l_PutFavouritesOnTop(Dat.FullTable);
     540   
    363541  end
    364542
     
    368546    if ~isempty(evd) && isfield(evd,'Key') && ...
    369547        strcmpi(evd.Key,'escape')
    370       l_EscapeCloseFig(fh,evd);
     548      l_KeyPressFcn(fh,evd);
    371549      return
    372550    end
     
    374552    % Get the search string
    375553    if Dat.SearchEditUseJava
    376       SearchStr = get(H.jh,'Text');
     554      drawnow
     555      SearchStr = get(H.SearchEditJavaHandle,'Text');
    377556    else
    378557      SearchStr = get(H.SearchEdit,'string');
     
    387566    end
    388567   
     568    % Search from parameters or values...?
     569    col_ind=get(H.SearchWherePopup,'value');
     570   
    389571    if isempty(SearchStr)
    390572      % If the search string is empty, show full table
    391573      Dat.DataTable = l_PutFavouritesOnTop(Dat.FullTable);
    392574    else
     575      OrigSearchStr = SearchStr;
     576     
     577      % Escape the regexp special characters
     578      SearchStr=regexptranslate('escape',SearchStr);
     579     
     580      if col_ind==1
     581        SearchStr=strrep(SearchStr,' ','|');
     582      end
    393583      switch get(H.SearchHowPopup,'value')
    394584        case 1
     
    397587        case 2
    398588          % Search is exactly
     589          SearchStr=regexprep(SearchStr,'\|','\$\|\^');
    399590          RegExpStr = ['^',SearchStr,'$'];
    400591        case 3
    401592          % Search begins with
     593          SearchStr=regexprep(SearchStr,'\|','\|\^');
    402594          RegExpStr = ['^',SearchStr];
    403595        case 4
    404596          % Search ends with
     597          SearchStr=regexprep(SearchStr,'\|','\$\|');
    405598          RegExpStr = [SearchStr,'$'];
     599        case 5
     600          % Search matches regexp
     601          RegExpStr = OrigSearchStr;
     602          SearchStr = OrigSearchStr;
    406603      end
    407604     
    408605      % Regexp the full table parameters
    409       ind=find(~cellfun('isempty',regexp(Dat.FullTable(:,1),RegExpStr,RegExpOpt)));
     606      ind=find(~cellfun('isempty',regexp(Dat.FullTable(:,col_ind),RegExpStr,RegExpOpt)));
    410607     
    411608      % Update DataTable
     
    420617      else
    421618        Dat.DataTable = Dat.FullTable(ind,:);
    422         Dat.DataTable(:,1)=regexprep(Dat.DataTable(:,1),['(',SearchStr,')'],['<b>$1</b>'],RegExpOpt);
    423         Dat.DataTable(:,1)=regexprep(Dat.DataTable(:,1),'(^.*$)','<html>$1</html>',RegExpOpt);
     619        Dat.DataTable(:,col_ind)=regexprep(Dat.DataTable(:,col_ind),['(',SearchStr,')'],['<b>$1</b>'],RegExpOpt);
     620        Dat.DataTable(:,col_ind)=regexprep(Dat.DataTable(:,col_ind),'(^.*$)','<html>$1</html>',RegExpOpt);
    424621      end
    425622    end
     
    428625    l_UpdateDataTable([],[])
    429626   
     627   
     628   
    430629  end
    431630
     
    434633   
    435634    if Dat.MatlabVersion>=7.06
    436       set(H.restable,'Data',Dat.DataTable,...
    437         'ColumnFormat',{'char','char'},...
    438         'ColumnWidth',{200,350},...
    439         'RowName',[],...
    440         'ColumnName',{'Parameter','Value(s)'})
     635      set(H.DataTable,'Data',Dat.DataTable)
    441636    else
    442       set(H.restable,'Data',Dat.DataTable)
     637      if size(Dat.DataTable,1)==1
     638        Dat.DataTable(end+1,:)={Dat.TableFavSeparator,Dat.TableFavSeparator};
     639      end
     640      set(H.DataTable,'Data',Dat.DataTable)
    443641    end
    444642   
     
    446644
    447645%% ---------------------------------------------
    448   function l_AddFavourite(fh,evd)
    449    
    450     % Prompt for a favourite search string
    451     resp = aedes_inputdlg('Search text to be added:');
    452     if isempty(resp) || isempty(resp{1})
    453       return
    454     end
    455    
    456     % Add search string to list
    457     Dat.FavouriteList{end+1} = resp{1};
    458 %     ListBoxStr = get(H.FavListBox,'string');
    459 %     ListBoxStr{end+1} = resp{1};
    460     set(H.FavListBox,'string',Dat.FavouriteList,...
    461       'value',[]);
    462    
    463     % Run search
    464     l_SearchParams([],[]);
     646  function l_AddFavourite(h,evd,param)
     647   
     648    if isempty(param)
     649      % Prompt for a favourite search string
     650      resp = aedes_inputdlg('Search text to be added:');
     651      if isempty(resp) || isempty(resp{1})
     652        return
     653      end
     654      param = resp;
     655    end
     656   
     657    params_added = 0;
     658    for ii=1:length(param)
     659     
     660      % Check if parameter is separator
     661      if strcmp(param{ii},Dat.TableFavSeparator)
     662        continue
     663      end
     664     
     665      % Check if the parameter is already in favourites
     666      if any(strcmp(param{ii},Dat.FavouriteList))
     667        % Parameter already in the favourite list
     668        %if ~isempty(h) && h==H.FavAdd
     669          % Put the favourite on top of the list, if already exists
     670          ind = find(strcmp(param{ii},Dat.FavouriteList));
     671          inds = [ind setdiff(1:length(Dat.FavouriteList),ind)];
     672          Dat.FavouriteList = Dat.FavouriteList(inds);
     673          params_added = params_added + 1;
     674        %else
     675          % Add search string to list
     676          %Dat.FavouriteList{end+1} = param{ii};
     677          %params_added = params_added + 1;
     678        %  continue
     679        %end
     680      else
     681        % Add search string to list
     682        Dat.FavouriteList{end+1} = param{ii};
     683        params_added = params_added + 1;
     684      end
     685    end
     686   
     687    if params_added>0
     688      set(H.FavListBox,'string',Dat.FavouriteList,...
     689        'value',[]);
     690   
     691      % Run search
     692      l_SearchParams([],[]);
     693    end
     694   
     695  end
     696
     697%% ---------------------------------------------
     698  function l_AddToFavBtnCallback(h,evd)
     699   
     700    % Matlab R2008a onwards...
     701    if Dat.MatlabVersion>=7.06
     702      if isempty(Dat.SelectedCells)
     703        % This should not happen, but return immediately if it does...
     704        return
     705      end
     706     
     707      ind = find(Dat.SelectedCells(:,2)==1);
     708      if isempty(ind)
     709        return
     710      end
     711     
     712      % Get index to favourites separator
     713      ind=Dat.SelectedCells(ind,1);
     714      sep_ind=find(strcmp(Dat.TableFavSeparator,Dat.DataTable(:,1)));
     715     
     716      % Remove separator from the list
     717      if ~isempty(sep_ind)
     718        ind=setdiff(ind,sep_ind);
     719        if isempty(ind)
     720          return
     721        end
     722      end
     723      %if ~isempty(sep_ind)
     724      %  ind(ind<=sep_ind)=[];
     725      %  if isempty(ind)
     726      %    return
     727      %  end
     728      %end
     729    else
     730      % Matlab R2007a and older
     731      selCols = H.DataTableJavaHandle.SelectedColumns;
     732      selRows = H.DataTableJavaHandle.SelectedRows;
     733     
     734      if any(selCols==0)
     735        ind = selRows+1;
     736      else
     737        return
     738      end
     739     
     740      % Get index to favourites separator
     741      sep_ind=find(strcmp(Dat.TableFavSeparator,Dat.DataTable(:,1)));
     742     
     743      % Remove separator from the list
     744      if ~isempty(sep_ind)
     745        ind=setdiff(ind,sep_ind);
     746        if isempty(ind)
     747          return
     748        end
     749      end
     750    end
     751   
     752    % Get the parameters to be added
     753    params=Dat.DataTable(ind,1);
     754   
     755    % Remove html tags from the strings
     756    params=regexprep(params,'<html>|</html>|<b>|</b>','');
     757   
     758    % Add to favourites
     759    l_AddFavourite([],[],params);
    465760   
    466761  end
     
    482777    end
    483778    Dat.FavouriteList(ind)=[];
    484 %     ListBoxStr = get(H.FavListBox,'string');
    485 %     ListBoxStr(ind)=[];
    486779    set(H.FavListBox,'string',Dat.FavouriteList,...
    487780      'value',[]);
    488781   
    489    
    490782    % Run search to update changes
    491783    l_SearchParams([],[]);
     
    497789  function TableOut = l_PutFavouritesOnTop(TableIn)
    498790   
    499     FavouriteList = get(H.FavListBox,'string');
     791    FavouriteList = Dat.FavouriteList;%get(H.FavListBox,'string');
    500792   
    501793    % Put favourite list matches on top of the search list and bold face
    502794    ind = [];
    503795    for ii=1:length(FavouriteList)
    504       tmp_ind=find(~cellfun('isempty',regexp(TableIn(:,1),['^',FavouriteList{ii},'$'])));
    505       ind = [ind tmp_ind];
     796      SearchStr = regexptranslate('escape',FavouriteList{ii});
     797      tmp_ind=find(~cellfun('isempty',regexp(TableIn(:,1),['^',SearchStr,'$'])));
     798      if ~isempty(tmp_ind)
     799        ind = [ind tmp_ind];
     800      end
    506801      if isempty(tmp_ind)
    507802        % If favourite is not found, color it red in the listbox
    508803        ListboxStr=get(H.FavListBox,'string');
    509         ListboxStr = regexprep(ListboxStr,['(^',FavouriteList{ii},'$)'],...
     804        ListboxStr = regexprep(ListboxStr,['(^',SearchStr,'$)'],...
    510805          '<html><font color="red"><b>$1 (not found)</b></font></html>');
    511806        set(H.FavListBox,'string',ListboxStr)
     
    514809    if ~isempty(ind)
    515810      ind2 = setdiff(1:size(TableIn,1),ind);
    516       FavList = TableIn(ind,:);
    517       FavList(:,1)=regexprep(FavList(:,1),'(\w+)',...
     811      tmpFavList = TableIn(ind,:);
     812      tmpFavList(:,1)=regexprep(tmpFavList(:,1),'(.*)',...
    518813        '<html><b>$1</b></html>');
    519814      TableOut = cat(1,...
    520         FavList,...
    521         {'<html><b>============</b></html>','<html><b>============</b></html>'},...
     815        tmpFavList,...
     816        {Dat.TableFavSeparator,Dat.TableFavSeparator},...
    522817        TableIn(ind2,:));
    523818    else
     
    529824  function l_ExportToWorkspace(fh,evd)
    530825   
    531     assignin('base','procpar',procpar);
    532     msgstr = sprintf('PROCPAR exported to variable "%s".','procpar');
     826    varname = 'header_struct';
     827    assignin('base',varname,inStruct);
     828    msgstr = sprintf('Structure exported to variable "%s".',varname);
    533829   
    534830    % Print notification to workspace
    535     fprintf(1,['AEDES_VIEWPROCPAR: ',msgstr,'\n']);
     831    fprintf(1,['AEDES_HEADERBROWSER: ',msgstr,'\n']);
    536832   
    537833    % Nag with a dialog...
    538     helpdlg(msgstr,'PROCPAR exported!')
     834    helpdlg(msgstr,'Structure exported!')
    539835   
    540836  end
    541837
    542838%% --------------------------------------------
    543   function l_EscapeCloseFig(fh,evd)
     839  function l_KeyPressFcn(fh,evd)
    544840   
    545841    % Call l_CloseFig if ESC is pressed
     
    547843        strcmpi(evd.Key,'escape')
    548844      l_CloseFig([],[])
    549     end
    550    
    551   end
    552 
     845     
     846    elseif ~isempty(evd) && ~isempty(evd.Modifier)
     847      if ( strcmpi(evd.Modifier{1},'control') && strcmpi(evd.Key,'l') ) || ...
     848          ( strcmpi(evd.Modifier{1},'alt') && strcmpi(evd.Key,'d') )
     849        % Change focus to the search editbox
     850        % using CTRL-L or ALT-D
     851        uicontrol(H.SearchEdit);
     852      end
     853    end
     854   
     855  end
     856
     857%% ---------------------------------------------
     858  function l_DataTableCellSelectionFcn(h,evd)
     859
     860    if isfield(evd,'Indices')
     861      Dat.SelectedCells = evd.Indices;
     862      if isempty(Dat.SelectedCells)
     863        set(H.AddParamsToFavBtn,'enable','off');
     864      else
     865        set(H.AddParamsToFavBtn,'enable','on');
     866      end
     867    else
     868      Dat.SelectedCells = [];
     869      set(H.AddParamsToFavBtn,'enable','off');
     870    end
     871   
     872  end
    553873%% --------------------------------------------
    554874  function l_CloseFig(fh,evd)
     
    557877    try
    558878      CaseSens = get(H.SearchCaseSens,'value');
    559       setpref('Aedes','ViewProcparCaseSensitivity',CaseSens);
    560      
    561       val = get(H.SearchHowPopup,'value');
    562       setpref('Aedes','ViewProcparSearchHow',val);
    563      
    564       setpref('Aedes','ViewProcparFavourites',Dat.FavouriteList);
     879      setpref('Aedes','HeaderBrowserCaseSensitivity',CaseSens);
     880     
     881      valhow = get(H.SearchHowPopup,'value');
     882      setpref('Aedes','HeaderBrowserSearchHow',valhow);
     883     
     884      valwhere = get(H.SearchWherePopup,'value');
     885      setpref('Aedes','HeaderBrowserSearchWhere',valwhere);
     886     
     887      % Update the corresponding FavList
     888      if strcmp(Dat.FileFormatName,'NIfTI/Analyze')
     889        Dat.FavList.nifti = Dat.FavouriteList;
     890      elseif strcmp(Dat.FileFormatName,'VNMR Procpar')
     891        Dat.FavList.vnmr = Dat.FavouriteList;
     892      elseif strcmp(Dat.FileFormatName,'DICOM')
     893        Dat.FavList.dcm = Dat.FavouriteList;
     894      elseif strcmp(Dat.FileFormatName,'generic header')
     895        Dat.FavList.genheader = Dat.FavouriteList;
     896      else strcmp(Dat.FileFormatName,'generic structure')
     897        Dat.FavList.generic = Dat.FavouriteList;
     898      end
     899      setpref('Aedes','HeaderBrowserFavList',Dat.FavList);
    565900    catch
    566       disp('Warning: Could not save AEDES_VIEWPROCPAR preferences!');
    567     end
    568     delete(H.fh)
     901      disp('Warning: Could not save AEDES_HEADERBROWSER preferences!');
     902    end
     903    delete(H.Fig)
    569904   
    570905  end
     
    607942    % OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    608943   
    609     % Allocate handle
    610     jhEditBox = handle([]);
    611    
    612944    % Ensure that objects have been drawn
    613945    drawnow;
  • aedes_revision.m

    r145 r146  
    9393% bash-script every time it is called so that this file "aedes_revision.m" is
    9494% always in the list of committed files. DO NOT EDIT THE NEXT LINE!!!
    95 % - SVN Hook -
     95% - Svn Hook -
Note: See TracChangeset for help on using the changeset viewer.

Powered by Trac 1.0.9.Copyright © Juha-Pekka Niskanen 2008