source: aedes_headerbrowser.m

Last change on this file was 213, checked in by tjniskan, 2 years ago
  • Fixed Aedes for Handle Graphics version 2 (HG2).

M aedes.m
M aedes_createmosaic.m
M aedes_export_gui.m
M aedes_gui_defaults.m
M aedes_headerbrowser.m
M aedes_helpabout.m
M aedes_inputdlg.m
M aedes_juigetfiles.m
M aedes_readfidprefs.m
M aedes_resviewer.m
M aedes_revision.m

File size: 32.4 KB
Line 
1function aedes_headerbrowser(inStruct)
2% AEDES_HEADERBROWSER - Browse and search file header information or any
3%                       Matlab structure
4%   
5%
6% Synopsis:
7%       aedes_headerbrowser(DATA) % Open the file format specific header
8%
9%       aedes_headerbrowser(STRUCT) % Browse a generic Matlab structure
10%
11% Description:
12%       
13%
14% Examples:
15%
16% See also:
17%       AEDES, AEDES_READPROCPAR, AEDES_READ_NIFTI
18
19% This function is a part of Aedes - A graphical tool for analyzing
20% medical images
21%
22% Copyright (C) 2006 Juha-Pekka Niskanen <Juha-Pekka.Niskanen@uku.fi>
23%
24% Department of Physics, Department of Neurobiology
25% University of Kuopio, FINLAND
26%
27% This program may be used under the terms of the GNU General Public
28% License version 2.0 as published by the Free Software Foundation
29% and appearing in the file LICENSE.TXT included in the packaging of
30% this program.
31%
32% This program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
33% WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
34
35% Public variables
36H = [];    % Handles structure
37Dat = [];  % Internal data structure
38
39% Do some error checking
40if nargin < 1
41  error('Invalid number of input arguments!')
42end
43
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.bruker_reco = {};
57        Dat.FavList.bruker_raw = {};
58  Dat.FavList.genheader = {};
59  Dat.FavList.generic = {};
60end
61
62% Check if input is a Aedes data structure
63if isfield(inStruct,'HDR') && isfield(inStruct,'FTDATA')
64  if isfield(inStruct,'DataFormat')
65    if any(strcmpi(inStruct.DataFormat,{'NIfTI(1)','NIfTI(2)','Analyze75'}))
66      % NIfTI and Analyze75 files
67      Dat.HeaderFileName = [inStruct.HDR.fpath,inStruct.HDR.fname];
68      Dat.FileFormatName = 'NIfTI/Analyze';
69      try
70        Dat.FavouriteList = Dat.FavList.nifti;
71      catch
72        Dat.FavList.nifti = {};
73        Dat.FavouriteList = Dat.FavList.nifti;
74      end
75      inStruct=inStruct.HDR.FileHeader;
76     
77    elseif strcmpi(inStruct.DataFormat,'VNMR')
78      % Varian VNMR files
79      Dat.HeaderFileName = [inStruct.HDR.fpath,'procpar'];
80      Dat.FileFormatName = 'VNMR Procpar';
81      try
82        Dat.FavouriteList = Dat.FavList.vnmr;
83      catch
84        Dat.FavList.vnmr = {};
85        Dat.FavouriteList = Dat.FavList.vnmr;
86      end
87      inStruct=inStruct.PROCPAR;
88     
89    elseif strcmpi(inStruct.DataFormat,'DCM')
90      % DICOM files
91      Dat.HeaderFileName = [inStruct.HDR.fpath,inStruct.HDR.fname];
92      Dat.FileFormatName = 'DICOM';
93      try
94        Dat.FavouriteList = Dat.FavList.dcm;
95      catch
96        Dat.FavList.dcm = {};
97        Dat.FavouriteList = Dat.FavList.dcm;
98      end
99      inStruct=inStruct.HDR.FileHeader;
100     
101                elseif strcmpi(inStruct.DataFormat,'bruker_reco')
102                        % Bruker 2DSEQ files
103                        Dat.HeaderFileName = [inStruct.HDR.fpath,inStruct.HDR.fname];
104                        Dat.FileFormatName = 'Bruker 2DSEQ';
105                        try
106                                Dat.FavouriteList = Dat.FavList.bruker_reco;
107                        catch
108                                Dat.FavList.bruker_reco = {};
109                                Dat.FavouriteList = Dat.FavList.bruker_reco;
110                        end
111                        inStruct=inStruct.HDR.FileHeader;
112                       
113                elseif strcmpi(inStruct.DataFormat,'bruker_raw')
114                        % Bruker Raw FID files
115                        Dat.HeaderFileName = [inStruct.HDR.fpath,inStruct.HDR.fname];
116                        Dat.FileFormatName = 'Bruker FID';
117                        try
118                                Dat.FavouriteList = Dat.FavList.bruker_raw;
119                        catch
120                                Dat.FavList.bruker_raw = {};
121                                Dat.FavouriteList = Dat.FavList.bruker_raw;
122                        end
123                        inStruct=inStruct.HDR.FileHeader;
124                       
125    else
126      % Generic header
127      Dat.HeaderFileName = [inStruct.HDR.fpath,inStruct.HDR.fname];
128      Dat.FileFormatName = 'generic header';
129      try
130        Dat.FavouriteList = Dat.FavList.genheader;
131      catch
132        Dat.FavList.genheader = {};
133        Dat.FavouriteList = Dat.FavList.genheader;
134      end
135      inStruct=inStruct.HDR.FileHeader;
136     
137    end
138  else
139    % Generic header
140    inStruct=inStruct.HDR.FileHeader;
141    Dat.FileFormatName = 'generic header';
142    try
143      Dat.FavouriteList = Dat.FavList.genheader;
144    catch
145      Dat.FavList.genheader = {};
146      Dat.FavouriteList = Dat.FavList.genheader;
147    end
148    Dat.HeaderFileName = [inStruct.HDR.fpath,inStruct.HDR.fname];
149  end
150else
151  % Generic Matlab structure
152  Dat.HeaderFileName = '';
153  Dat.FileFormatName = 'generic structure';
154  try
155    Dat.FavouriteList = Dat.FavList.generic;
156  catch
157    Dat.FavList.generic = {};
158    Dat.FavouriteList = Dat.FavList.generic;
159  end
160end
161
162% Initialize the cell array for uitable
163Dat.FullTable = {};
164Dat.StructMaxDepth = 10; % Limit recursion to something reasonable...
165Dat.FieldSeparator = '\';
166Dat.TableFavSeparator = '<html><b>=============</b></html>';
167Dat.SelectedCells = [];
168
169% Draw main GUI
170[H,Dat]=l_DrawGui(Dat);
171l_ParseHeaderStructure(inStruct,'',0);
172Dat.DataTable = Dat.FullTable;
173l_SearchParams([],[]);
174
175% Update Data Table
176l_UpdateDataTable([],[]);
177
178% Get java handle to the table for Matlab R2007a and older
179if Dat.MatlabVersion<=7.05
180  drawnow, pause(0.01) % Force refresh
181 
182  % Set Table to non-editable
183  set(H.DataTable,'Editable',false)
184 
185  % Get java handle
186  H.DataTableJavaHandle = handle(H.DataTable.getTable,'callbackproperties');
187 
188  % Set KeyPressedCallback
189  set(H.DataTableJavaHandle.KeyPressedCallback,@l_KeyPressFcn)
190end
191
192% Set initial focus to search editbox
193drawnow
194uicontrol(H.SearchEdit);
195
196% For debuging
197%assignin('base','H',H) % debug
198
199%% ------------------------------------------
200  function [H,Dat]=l_DrawGui(Dat)
201
202    % Load default font and colors
203    Dat.GD=aedes_gui_defaults;
204   
205    % Get Matlab version
206    Dat.MatlabVersion = aedes_getmatlabversion;
207
208    fig_w = 600;
209    fig_h = 700;
210                fig_location = aedes_dialoglocation([fig_w,fig_h]);
211                fig_pos = [fig_location(1) fig_location(2) fig_w fig_h];
212               
213    % Main Figure ----------------------------
214    H.Fig = figure('Units','Pixel', ...
215      'position',fig_pos,...
216      'Name',['File Header Browser - ',Dat.FileFormatName], ...
217      'Numbertitle','off', ...
218      'Tag','header_browser_fig', ...
219      'Color',Dat.GD.col.mainfig, ...
220      'Toolbar','none', ...
221      'Menubar','none', ...
222      'DockControls','off',...
223      'renderer','painters',...
224      'resize','off',...
225      'Handlevisibility','off',...
226      'KeyPressFcn',@l_KeyPressFcn,...
227      'CloseReq',@l_CloseFig);
228    if ~Dat.GD.HG2graphics
229                        set(H.Fig,'DoubleBuffer','on')
230                end
231    % File name
232    fname_txh = 0;
233    if ~isempty(Dat.HeaderFileName)
234      fname_txh = 70;
235      H.FileNameUipanel = uipanel('parent',H.Fig,...
236        'units','pixel',...
237        'position',[10 fig_h-fname_txh fig_w-20 fname_txh-10],...
238        'title','File Name',...
239        'backgroundcolor',Dat.GD.col.mainfig);
240     
241      tmp_pos=get(H.FileNameUipanel,'position');
242      H.FileNameText = uicontrol('parent',H.FileNameUipanel,...
243        'style','text',...
244        'string',Dat.HeaderFileName,...
245        'units','pixel',...
246        'position',[10 5 tmp_pos(3)-20 fname_txh-35],...
247        'horizontalalign','left',...
248        'backgroundcolor',Dat.GD.col.mainfig);
249    end
250   
251    % Search uipanel ----------------------
252    up_height = 80;
253    H.SearchUipanel = uipanel('parent',H.Fig,...
254      'units','pixel',...
255      'position',[10 fig_h-up_height-10-fname_txh fig_w-20 up_height],...
256      'title','Search Options',...
257      'backgroundcolor',Dat.GD.col.mainfig);
258
259    % Search text
260    pos=get(H.SearchUipanel,'position');
261    %H.SearchText = uicontrol('parent',H.SearchUipanel,...
262    %  'style','text',...
263    %  'string','Parameter:',...
264    %  'units','pixel',...
265    %  'position',[10 pos(4)-45 100 19],...
266    %  'horizontalalign','left',...
267    %  'backgroundcolor',Dat.GD.col.mainfig);
268    try
269      val=getpref('Aedes','HeaderBrowserSearchWhere');
270    catch
271      val=1;
272    end
273    H.SearchWherePopup = uicontrol('parent',H.SearchUipanel,...
274      'style','popup',...
275      'string',{'Parameter',...
276      'Value'},...
277      'units','pixel',...
278      'position',[10 pos(4)-45 100 22],...
279      'value',val,...
280      'tag','',...
281      'backgroundcolor',Dat.GD.col.popup,...
282      'callback',@l_SearchParams,...
283      'KeyPressFcn',@l_KeyPressFcn);
284   
285    % Search type popupmenu
286    try
287      val = getpref('Aedes','HeaderBrowserSearchHow');
288    catch
289      val = 1;
290    end
291    tmp_pos = get(H.SearchWherePopup,'position');
292    %tmp_pos = get(H.SearchText,'position');
293    H.SearchHowPopup = uicontrol('parent',H.SearchUipanel,...
294      'style','popup',...
295      'string',{'contains...',...
296      'is exactly...','begins with...',...
297      'ends with...',...
298      'matches regexp...'},...
299      'units','pixel',...
300      'position',[tmp_pos(1)+tmp_pos(3)+5 tmp_pos(2) ...
301      150 22],...
302      'value',val,...
303      'tag','',...
304      'backgroundcolor',Dat.GD.col.popup,...
305      'callback',@l_SearchParams,...
306      'KeyPressFcn',@l_KeyPressFcn);
307
308    % Search editbox
309    tmp_pos = get(H.SearchHowPopup,'position');
310    H.SearchEdit = uicontrol('parent',H.SearchUipanel,...
311      'style','edit',...
312      'units','pixel',...
313      'position',[tmp_pos(1)+tmp_pos(3)+5 tmp_pos(2) pos(3)-tmp_pos(1)-tmp_pos(3)-15 tmp_pos(4)],...
314      'Callback',@l_SearchParams,...
315      'backgroundcolor',Dat.GD.col.edit,...
316      'KeyPressFcn',@l_SearchParams);
317   
318    % Case sensitive
319    try
320      val = getpref('Aedes','HeaderBrowserCaseSensitivity');
321    catch
322      val = 1;
323    end
324    tmp_pos = get(H.SearchEdit,'position');
325    H.SearchCaseSens = uicontrol('parent',H.SearchUipanel,...
326      'style','checkbox',...
327      'units','pixel',...
328      'string','Case sensitive',...
329      'position',[tmp_pos(1) tmp_pos(2)-25 tmp_pos(3) tmp_pos(4)],...
330      'Callback',@l_SearchParams,...
331      'value',val,...
332      'backgroundcolor',Dat.GD.col.mainfig,...
333      'KeyPressFcn',@l_KeyPressFcn);
334   
335    % --------------------------------------
336    % Favourite params list
337    favup_height = 150;
338    tmp_pos = get(H.SearchUipanel,'position');
339    H.FavUipanel = uipanel('parent',H.Fig,...
340      'units','pixel',...
341      'position',[10 fig_h-up_height-favup_height-fname_txh-15 fig_w-20 favup_height],...
342      'title',['Favourite parameters for ',Dat.FileFormatName],...
343      'backgroundcolor',Dat.GD.col.mainfig);
344   
345    tmp_pos = get(H.FavUipanel,'position');
346    InfoTx = {['The parameter names entered here will be searched ',...
347      'automatically. The matching parameters are placed on top of the parameter list ',...
348      'in boldface. This automatic search is case sensitive and only returns exact matches.']};
349    H.FavInfoText = uicontrol('parent',H.FavUipanel,...
350      'style','text',...
351      'units','pixel',...
352      'string','',...
353      'position',[10 10 250 120],...
354      'horizontalalign','left',...
355      'fontsize',10,...
356      'backgroundcolor',[0.85 0.85 0.85]);%Dat.GD.col.mainfig);
357    InfoTx=textwrap(H.FavInfoText,InfoTx);
358    set(H.FavInfoText,'string',InfoTx)
359   
360    tmp_pos = get(H.FavInfoText,'position');
361    H.FavAdd = uicontrol('parent',H.FavUipanel,...
362      'style','pushbutton',...
363      'units','pixels',...
364      'position',[tmp_pos(1)+tmp_pos(3)+5 ...
365      tmp_pos(2)+tmp_pos(4)-25 70 25],...
366      'String','Add',...
367      'callback',{@l_AddFavourite,[]},...
368      'KeyPressFcn',@l_KeyPressFcn);
369   
370    H.FavRem = uicontrol('parent',H.FavUipanel,...
371      'style','pushbutton',...
372      'units','pixels',...
373      'position',[tmp_pos(1)+tmp_pos(3)+5 ...
374      tmp_pos(2)+tmp_pos(4)-2*25-5 70 25],...
375      'String','Remove',...
376      'callback',@l_RemFavourite,...
377      'KeyPressFcn',@l_KeyPressFcn);
378   
379    tmp_pos = get(H.FavInfoText,'position');
380    H.FavListBox = uicontrol('parent',H.FavUipanel,...
381      'style','listbox',...
382      'units','pixels',...
383      'min',1,...
384      'max',3,...
385      'position',[tmp_pos(1)+tmp_pos(3)+80 ...
386      tmp_pos(2) fig_w-30-tmp_pos(3)-90 tmp_pos(4)],...
387      'String',Dat.FavouriteList,...
388      'value',[],...
389      'backgroundcolor','w',...
390      'KeyPressFcn',@l_KeyPressFcn);
391   
392    % Close & Export to workspace btns -------
393    tmp_pos = get(H.FavUipanel,'position');
394    btn_w = (fig_w-20-2*5)/3;
395    %btn_w = 200;
396    btn_h = 25;
397    H.ExportBtn = uicontrol('parent',H.Fig,...
398      'style','pushbutton',...
399      'units','pixels',...
400      'position',[tmp_pos(1) ...
401      tmp_pos(2)-btn_h-5 btn_w btn_h],...
402      'string','Export to workspace',...
403      'callback',@l_ExportToWorkspace,...
404      'KeyPressFcn',@l_KeyPressFcn);
405   
406    %btn_w = 200;
407    btn_h = 25;
408    H.AddParamsToFavBtn = uicontrol('parent',H.Fig,...
409      'style','pushbutton',...
410      'units','pixels',...
411      'position',[tmp_pos(1)+btn_w+5 tmp_pos(2)-btn_h-5 btn_w btn_h],...
412      'string','Add to favourites',...
413      'enable','off',...
414      'callback',@l_AddToFavBtnCallback,...
415      'KeyPressFcn',@l_KeyPressFcn);
416    if Dat.MatlabVersion<=7.05
417      % With Matlab R2007b and older this has to be handled differently
418      set(H.AddParamsToFavBtn,'enable','on');
419    end
420   
421    %btn_w = 200;
422    btn_h = 25;
423    H.CloseBtn = uicontrol('parent',H.Fig,...
424      'style','pushbutton',...
425      'units','pixels',...
426      'position',[tmp_pos(1)+tmp_pos(3)-btn_w ...
427      tmp_pos(2)-btn_h-5 btn_w btn_h],...
428      'string','Close',...
429      'callback',@l_CloseFig,...
430      'KeyPressFcn',@l_KeyPressFcn);
431   
432    % Data Table -----------------------------
433    pos=get(H.FavUipanel,'position');
434    if Dat.MatlabVersion>=7.06
435      H.DataTable = uitable('Parent',H.Fig,...
436        'Data',{'loading...','loading...'},...
437        'units','pixel',...
438        'position',[10 10 fig_w-20 pos(2)-20-btn_h-5],...
439        'KeyPressFcn',@l_KeyPressFcn,...
440        'CellSelectionCallback',@l_DataTableCellSelectionFcn,...
441        'ColumnFormat',{'char','char'},...
442        'ColumnWidth',{280,280},...
443        'RowName',[],...
444        'ColumnName',{'Parameter','Value(s)'});
445    else
446      H.DataTable = uitable('Parent',H.Fig,...
447        'position',[10 10 fig_w-20 pos(2)-20-btn_h-5],...
448        'Data',{'loading...','loading...'},...
449        'ColumnWidth',265,...
450        'ColumnNames',{'Parameter','Value(s)'});
451    end
452   
453    % If other header browser windows are currently open, the figure name
454    % has to be unique for finding the correct javaFrame.
455    figs=findall(0,'tag','header_browser_fig');
456    if length(figs)>1
457      set(H.Fig,'Name',['File Header Browser - ',Dat.FileFormatName,' (',num2str(H.Fig),')']);
458      drawnow,pause(0.02);
459    end
460    H.SearchEditJavaHandle=l_GetEditboxJavaHandle(H.Fig);
461    if isempty(H.SearchEditJavaHandle)
462      % Fall back to basic matlab code -> no search as you type... :-(
463      Dat.SearchEditUseJava = false;
464      set(H.SearchEdit,'KeyPressFcn','')
465    else
466      Dat.SearchEditUseJava = true;
467    end
468    set(H.Fig,'Name',['File Header Browser - ',Dat.FileFormatName]); % Set Figure name back to original...
469   
470  end
471
472  function l_ParseHeaderStructure(inStruct,parent,level)
473    % This subfunction goes throught the input structure recursively and
474    % constructs the n-by-2 cell array for the uitable.
475   
476    % Get fieldnames
477    fldnames = fieldnames(inStruct);
478    fldnames = sort(fldnames);
479   
480    % Loop over the field names
481    for ii=1:length(fldnames)
482      cVal = inStruct.(fldnames{ii});
483     
484      % Structures
485      if isstruct(cVal)
486        if level>=Dat.StructMaxDepth
487          % Don't go beyond the StructMaxDepth level
488          Dat.FullTable{end,2} = regexprep(regexprep(mat2str(size(cVal)),'\s','x'),'\]$',' struct]');
489        else
490          % Recursively go through the next level
491          if isempty(parent) % First level
492            l_ParseHeaderStructure(cVal,fldnames{ii},level+1);
493          else
494            l_ParseHeaderStructure(cVal,[parent,Dat.FieldSeparator,fldnames{ii}],level+1);
495          end
496        end
497      else
498        if isempty(parent)
499          Dat.FullTable{end+1,1} = fldnames{ii};
500        else
501          Dat.FullTable{end+1,1} = [parent,Dat.FieldSeparator,fldnames{ii}];
502        end
503       
504        % Numeric values
505        if isnumeric(cVal)
506          if ndims(cVal)<=2 %|| any(size(cVal)==1)
507            Dat.FullTable{end,2} = mat2str(cVal);
508          else
509            Dat.FullTable{end,2} = regexprep(regexprep(mat2str(size(cVal)),'\s','x'),'\]$',' matrix]');
510          end
511         
512          % Logical arrays
513        elseif islogical(cVal)
514          if ndims(cVal)<=2 || any(size(cVal)==1)
515            Dat.FullTable{end,2} = num2str(cVal);
516          else
517            Dat.FullTable{end,2} = regexprep(regexprep(mat2str(size(cVal)),'\s','x'),'\]$',' logical]');
518          end
519         
520          % Character strings
521        elseif ischar(cVal)
522          Dat.FullTable{end,2} = ['''',cVal,''''];
523         
524          % Cell arrays
525        elseif iscell(cVal)
526          str = '{';
527          for kk=1:length(cVal)
528            if kk==1
529              sep='';
530            else
531              sep=', ';
532            end
533            if ischar(cVal{kk})
534              str = [str,sep,'''',cVal{kk},''''];
535            elseif isnumeric(cVal{kk}) || islogical(cVal{kk})
536              if ~all(size(cVal{kk})==1)
537                tmp_str = regexprep(regexprep(mat2str(size(cVal{kk})),'\s','x'),'\]$',' matrix]');
538                str = [str,sep,tmp_str];
539              else
540                str = [str,sep,mat2str(cVal{kk})];
541              end
542            elseif iscell(cVal{kk})
543              % Don't handle cell arrays inside cell arrays
544              tmp_str = regexprep(regexprep(mat2str(size(cVal{kk})),'\s','x'),'\]$',' cell array]');
545              str = [str,sep,tmp_str];
546            elseif isstruct(cVal{kk})
547              % Don't handle structures inside cell arrays
548              tmp_str = regexprep(regexprep(mat2str(size(cVal{kk})),'\s','x'),'\]$',' struct]');
549              str = [str,sep,tmp_str];
550            else
551              tmp_str = regexprep(regexprep(mat2str(size(cVal{kk})),'\s','x'),'\]$',[' ',class(cVal{kk}),']']);
552              str = [str,sep,tmp_str];
553            end
554          end
555          str(end+1) = '}';
556          Dat.FullTable{end,2} = str;
557         
558          % Unsupported class/object
559        else
560          tmp_str = regexprep(regexprep(mat2str(size(cVal)),'\s','x'),'\]$',[' ',class(cVal),']']);
561          Dat.FullTable{end,2} = tmp_str;
562        end
563      end
564    end
565   
566    % Put favourites on top
567    %Dat.DataTable = l_PutFavouritesOnTop(Dat.FullTable);
568   
569  end
570
571%% ---------------------------------------------
572  function l_SearchParams(fh,evd)
573
574    if ~isempty(evd) && isfield(evd,'Key') && ...
575        strcmpi(evd.Key,'escape')
576      l_KeyPressFcn(fh,evd);
577      return
578    end
579   
580    % Get the search string
581    if Dat.SearchEditUseJava
582      drawnow
583      SearchStr = get(H.SearchEditJavaHandle,'Text');
584    else
585      SearchStr = get(H.SearchEdit,'string');
586    end
587   
588    % Get case sensitivity
589    CaseSens = get(H.SearchCaseSens,'value');
590    if CaseSens==0
591      RegExpOpt = 'ignorecase';
592    else
593      RegExpOpt = 'matchcase';
594    end
595   
596    % Search from parameters or values...?
597    col_ind=get(H.SearchWherePopup,'value');
598   
599    if isempty(SearchStr)
600      % If the search string is empty, show full table
601      Dat.DataTable = l_PutFavouritesOnTop(Dat.FullTable);
602    else
603      OrigSearchStr = SearchStr;
604     
605      % Escape the regexp special characters
606      SearchStr=regexptranslate('escape',SearchStr);
607     
608      if col_ind==1
609        SearchStr=strrep(SearchStr,' ','|');
610      end
611      switch get(H.SearchHowPopup,'value')
612        case 1
613          % Search contains
614          RegExpStr = SearchStr;
615        case 2
616          % Search is exactly
617          SearchStr=regexprep(SearchStr,'\|','\$\|\^');
618          RegExpStr = ['^',SearchStr,'$'];
619        case 3
620          % Search begins with
621          SearchStr=regexprep(SearchStr,'\|','\|\^');
622          RegExpStr = ['^',SearchStr];
623        case 4
624          % Search ends with
625          SearchStr=regexprep(SearchStr,'\|','\$\|');
626          RegExpStr = [SearchStr,'$'];
627        case 5
628          % Search matches regexp
629          RegExpStr = OrigSearchStr;
630          SearchStr = OrigSearchStr;
631      end
632     
633      % Regexp the full table parameters
634      ind=find(~cellfun('isempty',regexp(Dat.FullTable(:,col_ind),RegExpStr,RegExpOpt)));
635     
636      % Update DataTable
637      if isempty(ind)
638        if Dat.MatlabVersion>=7.06
639          Dat.DataTable = {'<html><b>No matches!</b></html>',''};
640          %set(H.SearchEdit,'string',['<html><font color="red">',SearchStr,'</font></html>']);
641        else
642          Dat.DataTable = {'<html><b>No matches!</b></html>','<html><b>No matches!</b></html>';...
643            '=============','============='};
644        end
645      else
646        Dat.DataTable = Dat.FullTable(ind,:);
647        Dat.DataTable(:,col_ind)=regexprep(Dat.DataTable(:,col_ind),['(',SearchStr,')'],['<b>$1</b>'],RegExpOpt);
648        Dat.DataTable(:,col_ind)=regexprep(Dat.DataTable(:,col_ind),'(^.*$)','<html>$1</html>',RegExpOpt);
649      end
650    end
651
652    % Update Data Table
653    l_UpdateDataTable([],[])
654   
655   
656   
657  end
658
659%% ---------------------------------------------
660  function l_UpdateDataTable(fh,evd)
661   
662    if Dat.MatlabVersion>=7.06
663      set(H.DataTable,'Data',Dat.DataTable)
664    else
665      if size(Dat.DataTable,1)==1
666        Dat.DataTable(end+1,:)={Dat.TableFavSeparator,Dat.TableFavSeparator};
667      end
668      set(H.DataTable,'Data',Dat.DataTable)
669    end
670   
671  end
672
673%% ---------------------------------------------
674  function l_AddFavourite(h,evd,param)
675   
676    if isempty(param)
677      % Prompt for a favourite search string
678      resp = aedes_inputdlg('Search text to be added:');
679      if isempty(resp) || isempty(resp{1})
680        return
681      end
682      param = resp;
683    end
684   
685    params_added = 0;
686    for ii=1:length(param)
687     
688      % Check if parameter is separator
689      if strcmp(param{ii},Dat.TableFavSeparator)
690        continue
691      end
692     
693      % Check if the parameter is already in favourites
694      if any(strcmp(param{ii},Dat.FavouriteList))
695        % Parameter already in the favourite list
696        %if ~isempty(h) && h==H.FavAdd
697          % Put the favourite on top of the list, if already exists
698          ind = find(strcmp(param{ii},Dat.FavouriteList));
699          inds = [ind setdiff(1:length(Dat.FavouriteList),ind)];
700          Dat.FavouriteList = Dat.FavouriteList(inds);
701          params_added = params_added + 1;
702        %else
703          % Add search string to list
704          %Dat.FavouriteList{end+1} = param{ii};
705          %params_added = params_added + 1;
706        %  continue
707        %end
708      else
709        % Add search string to list
710        Dat.FavouriteList{end+1} = param{ii};
711        params_added = params_added + 1;
712      end
713    end
714   
715    if params_added>0
716      set(H.FavListBox,'string',Dat.FavouriteList,...
717        'value',[]);
718   
719      % Run search
720      l_SearchParams([],[]);
721    end
722   
723  end
724
725%% ---------------------------------------------
726  function l_AddToFavBtnCallback(h,evd)
727   
728    % Matlab R2008a onwards...
729    if Dat.MatlabVersion>=7.06
730      if isempty(Dat.SelectedCells)
731        % This should not happen, but return immediately if it does...
732        return
733      end
734     
735      ind = find(Dat.SelectedCells(:,2)==1);
736      if isempty(ind)
737        return
738      end
739     
740      % Get index to favourites separator
741      ind=Dat.SelectedCells(ind,1);
742      sep_ind=find(strcmp(Dat.TableFavSeparator,Dat.DataTable(:,1)));
743     
744      % Remove separator from the list
745      if ~isempty(sep_ind)
746        ind=setdiff(ind,sep_ind);
747        if isempty(ind)
748          return
749        end
750      end
751      %if ~isempty(sep_ind)
752      %  ind(ind<=sep_ind)=[];
753      %  if isempty(ind)
754      %    return
755      %  end
756      %end
757    else
758      % Matlab R2007a and older
759      selCols = H.DataTableJavaHandle.SelectedColumns;
760      selRows = H.DataTableJavaHandle.SelectedRows;
761     
762      if any(selCols==0)
763        ind = selRows+1;
764      else
765        return
766      end
767     
768      % Get index to favourites separator
769      sep_ind=find(strcmp(Dat.TableFavSeparator,Dat.DataTable(:,1)));
770     
771      % Remove separator from the list
772      if ~isempty(sep_ind)
773        ind=setdiff(ind,sep_ind);
774        if isempty(ind)
775          return
776        end
777      end
778    end
779   
780    % Get the parameters to be added
781    params=Dat.DataTable(ind,1);
782   
783    % Remove html tags from the strings
784    params=regexprep(params,'<html>|</html>|<b>|</b>','');
785   
786    % Add to favourites
787    l_AddFavourite([],[],params);
788   
789  end
790
791%% ---------------------------------------------
792  function l_RemFavourite(fh,evd)
793   
794    % Get selected indices
795    ind = get(H.FavListBox,'value');
796    if isempty(ind)
797      return
798    end
799   
800    % Ask for confirmation
801    resp = questdlg('Remove selected favourites?',...
802      'Remove favourites','Yes','No','No');
803    if strcmpi(resp,'No')
804      return
805    end
806    Dat.FavouriteList(ind)=[];
807    set(H.FavListBox,'string',Dat.FavouriteList,...
808      'value',[]);
809   
810    % Run search to update changes
811    l_SearchParams([],[]);
812   
813  end
814
815
816%% ---------------------------------------------
817  function TableOut = l_PutFavouritesOnTop(TableIn)
818   
819    FavouriteList = Dat.FavouriteList;%get(H.FavListBox,'string');
820   
821    % Put favourite list matches on top of the search list and bold face
822    ind = [];
823    for ii=1:length(FavouriteList)
824      SearchStr = regexptranslate('escape',FavouriteList{ii});
825      tmp_ind=find(~cellfun('isempty',regexp(TableIn(:,1),['^',SearchStr,'$'])));
826      if ~isempty(tmp_ind)
827        ind = [ind tmp_ind];
828      end
829      if isempty(tmp_ind)
830        % If favourite is not found, color it red in the listbox
831        ListboxStr=get(H.FavListBox,'string');
832        ListboxStr = regexprep(ListboxStr,['(^',SearchStr,'$)'],...
833          '<html><font color="red"><b>$1 (not found)</b></font></html>');
834        set(H.FavListBox,'string',ListboxStr)
835      end
836    end
837    if ~isempty(ind)
838      ind2 = setdiff(1:size(TableIn,1),ind);
839      tmpFavList = TableIn(ind,:);
840      tmpFavList(:,1)=regexprep(tmpFavList(:,1),'(.*)',...
841        '<html><b>$1</b></html>');
842      TableOut = cat(1,...
843        tmpFavList,...
844        {Dat.TableFavSeparator,Dat.TableFavSeparator},...
845        TableIn(ind2,:));
846    else
847      TableOut = TableIn;
848    end
849  end
850
851%% --------------------------------------
852  function l_ExportToWorkspace(fh,evd)
853   
854    varname = 'header_struct';
855    assignin('base',varname,inStruct);
856    msgstr = sprintf('Structure exported to variable "%s".',varname);
857   
858    % Print notification to workspace
859    fprintf(1,['AEDES_HEADERBROWSER: ',msgstr,'\n']);
860   
861    % Nag with a dialog...
862    helpdlg(msgstr,'Structure exported!')
863   
864  end
865
866%% --------------------------------------------
867  function l_KeyPressFcn(fh,evd)
868   
869    % Call l_CloseFig if ESC is pressed
870    if ~isempty(evd) && isfield(evd,'Key') && ...
871        strcmpi(evd.Key,'escape')
872      l_CloseFig([],[])
873     
874    elseif ~isempty(evd) && ~isempty(evd.Modifier)
875      if ( strcmpi(evd.Modifier{1},'control') && strcmpi(evd.Key,'l') ) || ...
876          ( strcmpi(evd.Modifier{1},'alt') && strcmpi(evd.Key,'d') )
877        % Change focus to the search editbox
878        % using CTRL-L or ALT-D
879        uicontrol(H.SearchEdit);
880      end
881    end
882   
883  end
884
885%% ---------------------------------------------
886  function l_DataTableCellSelectionFcn(h,evd)
887
888    if isfield(evd,'Indices')
889      Dat.SelectedCells = evd.Indices;
890      if isempty(Dat.SelectedCells)
891        set(H.AddParamsToFavBtn,'enable','off');
892      else
893        set(H.AddParamsToFavBtn,'enable','on');
894      end
895    else
896      Dat.SelectedCells = [];
897      set(H.AddParamsToFavBtn,'enable','off');
898    end
899   
900  end
901%% --------------------------------------------
902  function l_CloseFig(fh,evd)
903   
904    % Try to save preferences to disk before exiting
905    try
906      CaseSens = get(H.SearchCaseSens,'value');
907      setpref('Aedes','HeaderBrowserCaseSensitivity',CaseSens);
908     
909      valhow = get(H.SearchHowPopup,'value');
910      setpref('Aedes','HeaderBrowserSearchHow',valhow);
911     
912      valwhere = get(H.SearchWherePopup,'value');
913      setpref('Aedes','HeaderBrowserSearchWhere',valwhere);
914     
915      % Update the corresponding FavList
916      if strcmp(Dat.FileFormatName,'NIfTI/Analyze')
917        Dat.FavList.nifti = Dat.FavouriteList;
918      elseif strcmp(Dat.FileFormatName,'VNMR Procpar')
919        Dat.FavList.vnmr = Dat.FavouriteList;
920      elseif strcmp(Dat.FileFormatName,'DICOM')
921        Dat.FavList.dcm = Dat.FavouriteList;
922      elseif strcmp(Dat.FileFormatName,'generic header')
923        Dat.FavList.genheader = Dat.FavouriteList;
924                        elseif strcmp(Dat.FileFormatName,'generic structure')
925        Dat.FavList.generic = Dat.FavouriteList;
926      end
927      setpref('Aedes','HeaderBrowserFavList',Dat.FavList);
928    catch
929      disp('Warning: Could not save AEDES_HEADERBROWSER preferences!');
930    end
931    delete(H.Fig);
932   
933  end
934
935%% -----------------------------------------------
936  function jhEditBox=l_GetEditboxJavaHandle(hFig)
937    % Parts of this code are originally written by Yair Altman, whose
938    % wizardry in Java programming in Matlab has been of great help in many
939    % occasions. Please see http://undocumentedmatlab.com and the
940    % comp.soft-sys.matlab news group for further information. The
941    % following license notice is for findjobj.m (by Yair Altman, available
942    % in the Matlab File Exchange,
943    % http://www.mathworks.com/matlabcentral/fileexchange/14317) from which
944    % I have used code snippets in this subfunction.
945    %
946    %
947    % Copyright (c) 2009, Yair Altman All rights reserved.
948    %
949    % Redistribution and use in source and binary forms, with or without
950    % modification, are permitted provided that the following conditions
951    % are met:
952    %
953    %   * Redistributions of source code must retain the above copyright
954    %     notice, this list of conditions and the following disclaimer.
955    %   * Redistributions in binary form must reproduce the above copyright
956    %     notice, this list of conditions and the following disclaimer in
957    %     the documentation and/or other materials provided with the
958    %     distribution
959    %
960    % THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
961    % "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
962    % LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
963    % A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
964    % OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
965    % SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
966    % LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
967    % DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
968    % THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
969    % (INCLUDING NEGLIGENCE OR OTHERWISE) RISING IN ANY WAY OUT OF THE USE
970    % OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
971   
972    % Ensure that objects have been drawn
973    drawnow;
974    pause(0.01);
975   
976    % Get figure's root pane
977     try
978       figName = get(hFig,'Name');
979       mde = com.mathworks.mde.desk.MLDesktop.getInstance;
980       jFigPanel = mde.getClient(figName);
981       jRootPane = jFigPanel;
982       jRootPane = jFigPanel.getRootPane;
983     catch
984       try
985         warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame');  % R2008b compatibility
986         jFrame = get(hFig,'JavaFrame');
987         jFigPanel = get(jFrame,'FigurePanelContainer');
988         jRootPane = jFigPanel;
989         jRootPane = jFigPanel.getComponent(0).getRootPane;
990       catch
991         % Never mind
992       end
993     end
994     try
995      % If invalid RootPane - try another method...
996      warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame');  % R2008b compatibility
997      jFrame = get(hFig,'JavaFrame');
998      jAxisComponent = get(jFrame,'AxisComponent');
999      jRootPane = jAxisComponent.getParent.getParent.getRootPane;
1000     catch
1001      % Never mind
1002     end
1003     %jRootPane=handle(jRootPane,'callbackproperties');
1004     
1005     % Find java handle to Search editbox recursively
1006     Dat.javaHandleFound = false;
1007     jhEditBox=l_FindJavaHandle(jRootPane);
1008  end
1009
1010% Recursion function for finding java handle for search editbox
1011  function jhout=l_FindJavaHandle(jhin)
1012    jhout = handle([]);
1013    jhin=handle(jhin,'callbackproperties');
1014   
1015    if ~isempty(regexp(char(jhin.toString),'EditTextPeer\$hgTextField'))
1016      jhout = jhin;
1017      Dat.javaHandleFound=true;
1018      return;
1019    else
1020      try
1021        compCount = jhin.getComponentCount;
1022        for ii=0:compCount-1
1023          childComp = jhin.getComponent(ii);
1024          if ~Dat.javaHandleFound
1025            jhout=l_FindJavaHandle(childComp);
1026          else
1027            break;
1028          end
1029        end
1030      catch
1031        % Nothing to do here...
1032      end
1033    end
1034   
1035  end
1036     
1037
1038end
1039
1040 
Note: See TracBrowser for help on using the repository browser.

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