source: aedes_headerbrowser.m @ 197

Last change on this file since 197 was 197, checked in by tjniskan, 7 years ago
  • The 2DSEQ file support in aedes_readbruker.m now uses the visu_pars header file to read the data instead of the depricated D3PROC file.
  • Added Bruker data support to aedes_headerbrowser.m

M aedes_readbruker.m
M aedes_headerbrowser.m
M aedes_revision.m

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

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