diff m-toolbox/m/gui/ao_browser/ltpda_explorer.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/m/gui/ao_browser/ltpda_explorer.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,873 @@
+% LTPDA_EXPLORER for exploring analysis objects and plotting/displaying their fields
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION: LTPDA_EXPLORER for exploring analysis objects and plotting/displaying
+%              their fields. It is possible to browse througth the history tree
+%              to see only a part of this tree. If the user will use the plot
+%              function the plot will be printed in a new figure.
+%
+% CALL:    ltpda_explorer;              % Read the ao's from the'base' workspace
+%          ltpda_explorer(ao);
+%          ltpda_explorer(ao_vector);
+%          ltpda_explorer(ao_matrix);
+%
+%
+% VERSION: $Id: ltpda_explorer.m,v 1.13 2011/05/10 04:50:58 hewitson Exp $
+%
+% HISTORY: 10-06-07 Diepholz
+%             Creation
+%
+% NOTE:      The idea and the core source code are taken from:
+%            Hassan Lahdili (hassan.lahdili@crc.ca)
+%            Communications Research Centre (CRC) | Advanced Audio Systems (AAS)
+%            www.crc.ca | www.crc.ca/aas
+%            Ottawa. Canada
+%            CRC Advanced Audio Systems - Ottawa 16/02/2005 2004-2005
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function ltpda_explorer(varargin)
+
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %        Define the Positions         %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+  % figure position
+  % FIG_X   = .150;
+  % FIG_Y   = .150;
+  % FIG_dX  = .700;
+  % FIG_dY = .600;
+
+  FONT_SIZE = 13;
+
+  FIG_X   = 150;
+  FIG_Y   = 150;
+  FIG_dX  = 700;
+  FIG_dY = 600;
+
+
+  % tree position
+  TREE_X  = .000;
+  TREE_Y  = .000;
+  TREE_dX = .350;
+  TREE_dY = 1.000;
+
+  % plot field position
+  PLOT_X  = .45;
+  PLOT_Y  = .15;
+  PLOT_dX = .5;
+  PLOT_dY = .7;
+
+  % display field position
+  DISP_X  = TREE_X;
+  DISP_Y  = .750;
+  DISP_dX = TREE_dX;
+  DISP_dY = 1-DISP_Y;
+
+  % explorer name position
+  EXPL_NAME_dX = .370;
+  EXPL_NAME_dY = .045;
+  EXPL_NAME_X  = PLOT_X+(PLOT_dX-EXPL_NAME_dX)/2;
+  EXPL_NAME_Y  = .030;
+  % EXPL_NAME_Y  = .065;
+
+  % info fields position
+  N_INFOS = 3;
+
+  INFO_X  = PLOT_X;
+  INFO_Y  = .915;
+  INFO_dX = PLOT_dX / N_INFOS;
+  INFO_dY = .06;
+
+  BG_COLOR = [.925 .914 .847];
+
+  MAX_HIST_DEPTH = 4;
+
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %           Check the input           %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+  tree_name = 'objects';
+  obj       = [];
+  obj_value = {};
+  obj_name  = {};
+
+  % Read the objects from the 'base' workspace
+
+  if nargin == 0
+    ws_vars   = evalin('base','whos');
+
+  elseif nargin == 1
+    tmp       = varargin{1};
+
+    if iscell(tmp)
+      ws_vars = [];
+      for jj = 1:length(tmp)
+        ws_vars(jj).name  = [inputname(1) '{' num2str(jj) '}'];
+        ws_vars(jj).class = class(tmp{jj});
+        ws_vars(jj).obj   = tmp{jj};
+      end
+      
+    elseif numel(tmp)>1
+       ws_vars = [];
+       for jj=1:numel(tmp)
+          ws_vars(jj).name  = [inputname(1) '(' num2str(jj) ')'];
+          ws_vars(jj).class = class(tmp(jj));
+          ws_vars(jj).obj   = tmp(jj);
+       end
+      
+    else
+      ws_vars      = whos('tmp');
+      ws_vars.name = inputname(1);
+      ws_vars.obj  = tmp;
+    end
+
+  else
+    error ('##########');
+  end
+  
+
+  for mm=1:length(ws_vars)
+
+    if nargin == 0
+      obj = evalin('base', ws_vars(mm).name);
+    elseif nargin == 1
+      obj = ws_vars(mm).obj;
+    else
+      error('#####');
+    end
+
+    if utils.helper.isobject(obj)
+
+      % the object in the workspace is a single value
+      if numel(obj) == 1
+        obj_value{end+1} = obj;
+        obj_name{end+1}  = [ws_vars(mm).class ':' ws_vars(mm).name];
+      else
+
+        [n,m] = size(obj);
+
+        % the ao in the workspace is a vector
+        if n == 1 || m == 1
+
+          for jj=1:length(obj)
+            obj_value{end+1} = obj(jj);
+            obj_name{end+1}  = [ws_vars(mm).class ':' ws_vars(mm).name '(' num2str(jj) ')'];
+          end
+
+          % the ao in the workspace is a matrix
+        elseif n > 1 && m > 1
+
+          for gg = 1:n
+            for hh = 1:m
+              obj_value{end+1} = obj(gg,hh);
+              obj_name{end+1}  = [ws_vars(mm).class ':' ws_vars(mm).name '(' num2str(gg) ',' num2str(hh) ')'];
+            end
+          end
+
+        else
+          error ('### this should not happen.');
+        end
+
+      end
+
+    end
+  end
+
+
+  fig_name = 'Exploring objects';
+
+  % Define figure
+  fig = figure('NextPlot',    'add',            ...
+    'NumberTitle', 'off',            ...
+    'Toolbar',     'none',           ...
+    'name',         fig_name,        ...
+    'Color',        BG_COLOR,        ...
+    'ToolBar',      'none',           ...
+    'NextPlot',     'new',            ...
+    'MenuBar',      'none',...
+    'Position',    [FIG_X  FIG_Y     ...
+    FIG_dX FIG_dY]);
+
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %           Define the tree           %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+  root = uitreenode('v0', tree_name, tree_name, [], false);
+  tree = uitree('v0',  fig, 'Root',root, 'ExpandFcn', @myExpfcn4);
+  set(tree, 'Units', 'normalized')
+  drawnow;
+  set(tree, 'position', [TREE_X TREE_Y TREE_dX TREE_dY]); %,   ...
+	set(tree, 'NodeWillExpandCallback', @nodeWillExpand_cb4, ...
+    'NodeSelectedCallback',   @nodeSelected_cb4);
+
+  tmp = tree.FigureComponent;
+  cell_Data = cell(3,1);
+
+  % cell_Data{1} = varargin{:};
+  cell_Data{1} = obj_value;
+  cell_Data{3} = obj_name;
+
+  warning('off','MATLAB:hg:JavaSetHGProperty');
+  set(tmp, 'UserData', cell_Data);
+  warning('on','MATLAB:hg:JavaSetHGProperty');
+  
+  % Define the plot field
+  haxes = axes('Units',   'normalized',       ...
+    'Position', [PLOT_X  PLOT_Y    ...
+    PLOT_dX PLOT_dY], ...
+    'Box',     'on',               ...
+    'XTick',    [],                ...
+    'YTick',    []);
+
+  box  off;
+  axis off;
+
+  % Define the info fields 'name'
+  txt1 = uicontrol('String',          '',                 ...
+    'Units',           'normalized',       ...
+    'Style',           'Edit',             ...
+    'FontSize',          FONT_SIZE,        ...
+    'Position',         [INFO_X  INFO_Y    ...
+    INFO_dX INFO_dY], ...
+    'BackgroundColor',   BG_COLOR);
+  % Define the info fields 'size'
+  txt2 = uicontrol('String',         '',                          ...
+    'Units',          'normalized',                ...
+    'Style',          'Edit',                      ...
+    'FontSize',         FONT_SIZE,                 ...
+    'Position',        [(INFO_X+INFO_dX) INFO_Y    ...
+    INFO_dX          INFO_dY],...
+    'BackgroundColor',   BG_COLOR);
+  % Define the info fields 'class'
+  txt3 = uicontrol('String',         '',                          ...
+    'Units',          'normalized',                ...
+    'Style',          'Edit',                      ...
+    'FontSize',         FONT_SIZE,                 ...
+    'Position',        [(INFO_X+2*INFO_dX) INFO_Y  ...
+    INFO_dX          INFO_dY],...
+    'BackgroundColor',   BG_COLOR);
+  % Define the info fields 'value'
+  txt4 = uicontrol('String',         '',                          ...
+    'Units',          'normalized',                ...
+    'Style',          'Edit',                      ...
+    'FontSize',         FONT_SIZE,                 ...
+    'Position',        [  INFO_X  (INFO_Y-INFO_dY) ...
+    3*INFO_dX  INFO_dY],       ...
+    'BackgroundColor',   BG_COLOR);
+
+  % Define the info fields 'value'
+  txt5 = uicontrol('String',          '',                  ...
+    'Units',           'normalized',        ...
+    'Style',           'listbox',           ...
+    'Visible',         'off',               ...
+    'Fontsize',         8,                  ...
+    'FontSize',         FONT_SIZE,          ...
+    'Position',        [DISP_X   DISP_Y     ...
+    DISP_dX  DISP_dY],  ...
+    'BackgroundColor',  BG_COLOR);
+
+
+
+  % Define the decription of the info fields
+  col1 = uicontrol('String',         'Name',                   ...
+    'Units',          'normalized',             ...
+    'Style',          'Text',                   ...
+    'FontSize',         FONT_SIZE,              ...
+    'Position',        [INFO_X  (INFO_Y+INFO_dY)...
+    INFO_dX  INFO_dY],      ...
+    'BackgroundColor',  BG_COLOR);
+  col2 = uicontrol('String',         'Size',                            ...
+    'Units',          'normalized',                      ...
+    'Style',          'Text',                            ...
+    'FontSize',         FONT_SIZE,                       ...
+    'Position',        [(INFO_X+INFO_dX) (INFO_Y+INFO_dY)...
+    INFO_dX          INFO_dY],      ...
+    'BackgroundColor',   BG_COLOR);
+  col3 = uicontrol('String',         'Class',                             ...
+    'Units',          'normalized',                        ...
+    'Style',          'Text',                              ...
+    'FontSize',          FONT_SIZE,                        ...
+    'Position',        [(INFO_X+2*INFO_dX) (INFO_Y+INFO_dY)...
+    INFO_dX            INFO_dY],      ...
+    'BackgroundColor',   BG_COLOR);
+
+  % Define the name of the explorer
+  expl_name = uicontrol('String',         'LTPDA Object explorer',  ...
+    'Units',          'normalized',                ...
+    'Style',          'text',                      ...
+    'Position',        [EXPL_NAME_X-.05  EXPL_NAME_Y   ...
+    EXPL_NAME_dX+.1 EXPL_NAME_dY],...
+    'ForeGroundColor', [0.2 0.4 1],                ...
+    'BackGroundColor', BG_COLOR,                   ...
+    'FontSize',         18,                        ...
+    'FontWeight',     'bold',                      ...
+    'FontAngle',      'italic');
+
+  tree_menu  = uicontextmenu();
+  tree_menu1 = uimenu(tree_menu, 'Label',   'Plot', ...
+    'Callback', @f_tree_menu1);
+  tree_menu2 = uimenu(tree_menu, 'Label',   'Display', ...
+    'Callback', @f_tree_menu2);
+
+  disp_menu  = uicontextmenu;
+  disp_menu1 = uimenu(disp_menu, 'Label',   'close', ...
+    'Callback', @f_disp_menu1);
+
+  warning('off','MATLAB:hg:JavaSetHGProperty');
+  set(tree.Tree, 'MousePressedCallback', @mouse_cb);
+  set(tree.Tree, 'UIContextMenu', tree_menu);
+  set(tree.Tree, 'Font', javax.swing.plaf.FontUIResource('Dialog', 0, FONT_SIZE))
+  warning('on','MATLAB:hg:JavaSetHGProperty');
+
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  % Mouse Pressed Handler
+  function mouse_cb(h, ev)
+    if ev.getModifiers()== ev.META_MASK
+      % Workaround to set the y position
+      % Workaround to set the x position
+      vis = get(get(ev, 'Component'), 'VisibleRect');
+      x_width  = get(get(ev, 'Component'), 'Width');
+      y_height = get(get(ev, 'Component'), 'Height');
+
+      new_x =  ev.getX-vis(1);
+      new_y = -ev.getY+y_height-(y_height-vis(4));
+      set(tree_menu, 'Position',  [new_x new_y], ...
+        'Visible',  'on');
+    end
+
+  end
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  function f_disp_menu1(h, ev)
+    set(txt5, 'Visible', 'off')
+    set(tree, 'position', [TREE_X  TREE_Y    ...
+      TREE_dX TREE_dY])
+  end
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  function f_tree_menu1(h,ev)
+    plotselected_cb;
+  end
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  function f_tree_menu2(h,ev)
+    displayselected_cb;
+  end
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  function plotselected_cb(h, ev)
+
+    tmp =  tree.FigureComponent;
+    S = get(tmp, 'UserData');
+    s = S{1};
+    cNode = S{2};
+    [val, plotted, cNode] = getcNodevalue(cNode, s);
+
+    cla(haxes)
+    box off;
+    axis off;
+
+    %%%%%   Plot history object   %%%%%
+    if (isa(val,'history'))
+      if length(val) == 1
+        figure;
+        plot(val);
+        ii = strfind(plotted, 'inhists');
+        title(haxes, sprintf('History-Level: %d', length(ii)+1))
+      else
+        na = text(0.5,0.5,'Select the left or right branch.');
+        set(na, 'HorizontalAlignment', 'center', ...
+          'Color',               'r',      ...
+          'FontWeight',          'bold',   ...
+          'EdgeColor',           'k',      ...
+          'BackgroundColor',     'w',      ...
+          'Fontsize',             10,      ...
+          'Margin',               5);
+      end
+
+      %%%%%   Plot data object   %%%%%
+    elseif isa(val,'fsdata') || isa(val,'tsdata') || ...
+        isa(val,'xydata') || isa(val,'cdata')
+      aoin = getcNodevalue(S{2}.getParent, s);
+      iplot(aoin)
+
+      %%%%%   Plot the AO object   %%%%%
+    elseif isa(val, 'ao')
+      iplot(val)
+
+      %%%%%   Plot mfir and miir object   %%%%%
+    elseif isa(val, 'mfir') || isa(val, 'miir')
+      resp(val)
+
+      %%%%%   Plot pzmodel object   %%%%%
+    elseif isa(val, 'pzmodel')
+      resp(val)
+
+      %%%%%   Is the parent node == 'data' so plot data   %%%%%
+    else
+
+      cNode  = S{2};
+
+      if cNode.getLevel >= 1
+        obj = getcNodevalue(S{2}.getParent, s);
+        
+        if isa(obj, 'ltpda_data')
+          aoin = getcNodevalue(S{2}.getParent.getParent, s);
+          iplot(aoin);
+        elseif isa(obj, 'ao')
+          iplot(obj);
+        end
+      end
+
+    end
+
+  end
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  function displayselected_cb(h, ev)
+    tmp =  tree.FigureComponent;
+    S = get(tmp, 'UserData');
+    s = S{1};
+    cNode = S{2};
+    [val, displayed, cNode] = getcNodevalue(cNode, s);
+
+    text1 = '';
+    if isobject(val)
+      text1 = display(val);
+    else
+      disp(val)
+    end
+
+    % some sisplay outputs contains '\n' <-> char(10)
+    % text can not display this character so replace it with '   '
+    text1 = strrep(text1, char(10), '  ');
+
+    set(tree, 'position', [TREE_X  TREE_Y      ...
+      TREE_dX TREE_dY-DISP_dY]);
+    set(txt5, 'string', text1);
+    set(txt5, 'Visible', 'on');
+    set(txt5, 'UIContextMenu', disp_menu);
+  end
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+  function cNode = nodeSelected_cb4(tree,ev)
+    cNode = ev.getCurrentNode;
+    tmp = tree.FigureComponent;
+    warning('off','MATLAB:hg:JavaSetHGProperty');
+    cell_Data = get(tmp, 'UserData');
+    warning('on','MATLAB:hg:JavaSetHGProperty');
+    cell_Data{2} = cNode;
+    s = cell_Data{1};
+    val = s;
+    plotted = cNode.getValue;
+    selected = plotted;
+    [val, plotted, cNode] = getcNodevalue(cNode, val);
+    set(txt1, 'string', selected)
+    set(txt2, 'string', strcat(num2str(size(val,1)),'x',num2str(size(val,2))) )
+    set(txt3, 'string', class(val))
+
+    str = ' ';
+    c_str = {};
+    cla(haxes)
+    axesSize = get(haxes,'Position');
+    axesSize = axesSize + [-.07 -.05 .09 0.05];
+    plotPanel = findobj(gcf,'Tag','plotPanel');
+    if isempty(plotPanel), plotPanel = uipanel('Position',axesSize,'Tag','plotPanel','BorderType','none','BackgroundColor',[.925 .914 .847]); end
+    delete(get(plotPanel,'Children'))
+    box off;
+    axis off;
+
+    if ~isempty(val)
+
+      if isnumeric(val)
+        % normalize the vector
+        si = size(val);
+        if si(1) > si(2)
+          val = val.';
+        else
+          val = val;
+        end
+        if size(val,1) == 1 || size(val,2) == 1
+          if length(val) > 3
+            str = strcat(num2str(val(1:3)), '  ...');
+          else
+            str = num2str(val);
+          end
+        else
+          str = 'Matrix';
+        end
+
+      elseif ischar(val)
+        str = val;
+
+      elseif islogical(val)
+        if val
+          str = 'true';
+        else
+          str = 'false';
+        end
+
+      elseif isobject(val)
+        if isa(val, 'ao')
+          str = 'Analysis Object';
+          if ~isa(val.data, 'cdata')
+            iplot(val,plist('Figure',plotPanel));
+          else
+            iplot(val,plist('Figure',plotPanel));
+          end
+        elseif isa(val, 'cdata')
+          str = 'C-Data Object';
+          aoin = getcNodevalue(ev.getCurrentNode.getParent, s);
+        elseif isa(val, 'fsdata')
+          str = 'Frequency-Series Object';
+          aoin = getcNodevalue(ev.getCurrentNode.getParent, s);
+          iplot(aoin,plist('Figure',plotPanel));
+        elseif isa(val, 'tsdata')
+          str = 'Time-Series Object';
+          aoin = getcNodevalue(ev.getCurrentNode.getParent, s);
+          iplot(aoin,plist('Figure',plotPanel));
+        elseif isa(val, 'xydata')
+          str = 'X-Y Data Object';
+          aoin = getcNodevalue(ev.getCurrentNode.getParent, s);
+          iplot(aoin,plist('Figure',plotPanel));
+        elseif isa(val, 'xyzdata')
+          str = 'X-Y-Z Data Object';
+        elseif isa(val, 'history')
+          str = 'History Object';
+          if length(val) == 1
+            pl = plist(param('stop_option', MAX_HIST_DEPTH));
+            plot(haxes, val, pl);
+            ii = strfind(plotted, 'inhists');
+            title(haxes, sprintf('History-Level: %d', length(ii)+1))
+          else
+            c_str{1} = 'Select the left or right branch.';
+          end
+
+        elseif isa(val, 'param')
+          if length(val) == 1
+            str   = char(val);
+            c_str = split_by_comma(str);
+          else
+            for ii = 1:length(val)
+              str = char(val(ii));
+              c_str1 = split_by_comma(str, '- ');
+              c_str(end+1:end+length(c_str1)) = c_str1;
+            end
+          end
+          str = 'Parameter Object';
+
+        elseif isa(val, 'plist')
+          if numel(val) > 1
+            c_str{1} = 'select a plist';
+          else
+            for ii=1:length(val.params)
+
+              str = char(val.params(ii));
+              c_str1 = split_by_comma(str, '- ');
+              c_str(end+1:end+length(c_str1)) = strrep(c_str1, '_', '\_');
+            end
+          end
+          str = 'Parameter List Object';
+
+        elseif isa(val, 'mfir')
+          str = 'FIR Filter Object';
+        elseif isa(val, 'miir')
+          str = 'IIR Filter Object';
+        elseif isa(val, 'provenance')
+          str = 'Provenance Object';
+        elseif isa(val, 'pzmodel')
+          str = 'Pole Zero Object';
+        elseif isa(val, 'specwin')
+          str = 'Spectral Window Object';
+        elseif isa(val, 'pz')
+          str = 'Pole/Zero Object';
+        elseif isa(val, 'time')
+          str = 'Time Object';
+        elseif isa(val, 'timespan')
+          str = 'Time span Object';
+        elseif isa(val, 'ssm')
+          str = 'statespace model Object';
+        elseif isa(val, 'unit')
+          str = 'Unit Object';
+        elseif isa(val, 'minfo')
+          str = 'Method info Object';
+        else
+          cl  = class(val);
+          str = sprintf('%s%s Object', upper(cl(1)), lower(cl(2:end)));
+        end
+
+      elseif iscell(val)
+        for i = 1:min(length(val),3)
+          if ischar(val{i})
+            str = strcat(str, val{i});
+          elseif isnumeric(val)
+            str = strcat(str, num2str(val{i}));
+          end
+          if i < min(length(val),3)
+            str = strcat(str, ',');
+          end
+        end
+        if length(val) > 3
+          str = strcat(str,'...');
+        end
+
+      end
+
+      if ~isempty(c_str)
+        c_str = strtrim(c_str);
+        na = text(0.5,0.5,c_str);
+        txt_extent = get(na, 'Extent');
+        set(na, 'Position',            [0.5-txt_extent(3)/2, 0.5], ...
+          'HorizontalAlignment', 'left', ...
+          'Color',               'k',    ...
+          'FontWeight',          'bold', ...
+          'EdgeColor',           'k',    ...
+          'BackgroundColor',     'w',    ...
+          'Fontsize',            10,     ...
+          'Margin',              5);
+      end
+
+    else % ~isempty(val)
+      str = 'The field is empty';
+    end
+    set(txt4, 'string', str)
+    warning('off','MATLAB:hg:JavaSetHGProperty');
+    set(tmp, 'UserData', cell_Data);
+    warning('on','MATLAB:hg:JavaSetHGProperty');
+  end
+
+
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+function nodes = myExpfcn4(tree,value)
+
+  tmp = tree.FigureComponent;
+  warning('off','MATLAB:hg:JavaSetHGProperty');
+  S = get(tmp, 'UserData');
+  warning('on','MATLAB:hg:JavaSetHGProperty');
+  s = S{1};
+  cNode = S{2};
+  [val, cNode] = getcNodevalue(cNode, s);
+
+  % Set the path to the *.gif files
+  % This tis the current path of this function + 'exp_struct_icons'
+  pth = '';
+  eval (sprintf('pth = which(''%s'');',mfilename))
+  index = find(pth==filesep, 1, 'last');
+  pth = pth(1:index);
+  pth = [pth 'exp_struct_icons' filesep];
+
+  [n,m] = size(val);
+  count = 0;
+
+  %%% Vector or Matrix
+  if m>1 || n>1
+
+    if isa(val, 'ao')
+      iconpath =[pth,'analysis_object.gif'];
+    else
+      iconpath =[pth,'struct_icon.gif'];
+    end
+
+    %%% Vector
+    if m==1 || n==1
+      L = length(val);
+
+      for J = 1:L
+        count = count + 1;
+        cNode = S{2};
+
+        level = cNode.getLevel;
+        fname = strcat(cNode.getValue, '(', num2str(J),')');
+
+        if level==0 && ~isempty(S{3}) && numel(S{3}) == numel(S{1})
+          node_str = S{3}(J);
+        else
+          node_str = fname;
+        end
+
+        nodes(count) =  uitreenode('v0',fname, node_str, iconpath, 0);
+      end
+      %%% Matrix
+    else
+
+      for ii=1:n
+        for jj=1:m
+          count = count + 1;
+          cNode = S{2};
+          fname = [cNode.getValue '(' num2str(ii) ',' num2str(jj) ')'];
+          nodes(count) =  uitreenode('v0',fname, fname, iconpath, 0);
+        end
+      end
+
+    end
+    %%% Struct, Object or single value
+  else
+    %%%
+    val = val;
+    if ~isempty(val)
+      fnames = fieldnames(val);
+    else
+      fnames = {};
+    end
+
+    for i=1:length(fnames)
+      count = count + 1;
+      x = getfield(val,fnames{i});
+
+      if isa(x, 'ao')
+        iconpath =[pth,'analysis_object.gif'];
+      elseif isa(x, 'tsdata')
+        iconpath =[pth,'ts_data.gif'];
+      elseif isa(x, 'fsdata')
+        iconpath =[pth,'fs_data.gif'];
+      elseif isa(x, 'xydata')
+        iconpath =[pth,'xy_data.gif'];
+      elseif isa(x, 'cdata')
+        iconpath =[pth,'c_data.gif'];
+      elseif isa(x, 'history')
+        iconpath =[pth,'history.gif'];
+      elseif isa(x, 'plist')
+        iconpath =[pth,'plist.gif'];
+
+      elseif isstruct(x)
+        if length(x) > 1
+          iconpath =[pth,'structarray_icon.gif'];
+        else
+          iconpath =[pth,'struct_icon.gif'];
+        end
+      elseif isnumeric(x)
+        iconpath =[pth,'double_icon.gif'];
+      elseif iscell(x)
+        iconpath =[pth,'cell_icon.gif'];
+      elseif ischar(x)
+        iconpath =[pth,'char_icon.gif'];
+      elseif islogical(x)
+        iconpath =[pth,'logic_icon.gif'];
+      elseif isobject(x)
+        iconpath =[pth,'obj_icon.gif'];
+      else
+        iconpath =[pth,'unknown_icon.gif'];
+      end
+
+      if isstruct(x) || isobject(x)
+        isLeaf = 0;
+      else
+        isLeaf = 1;
+      end
+
+      nodes(count) = uitreenode('v0',fnames{i}, fnames{i}, iconpath, isLeaf);
+    end
+  end
+
+  if (count == 0)
+    nodes = [];
+  end
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function cNode = nodeWillExpand_cb4(tree,ev)
+  cNode = ev.getCurrentNode;
+  tmp = tree.FigureComponent;
+  warning('off','MATLAB:hg:JavaSetHGProperty');
+  cell_Data = get(tmp, 'UserData');
+  cell_Data{2} = cNode;
+  set(tmp, 'UserData', cell_Data);
+  warning('on','MATLAB:hg:JavaSetHGProperty');
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+function [val, displayed, cNode] = getcNodevalue(cNode, s)
+
+  fields = {};
+  while cNode.getLevel ~=0
+    fields = [fields; cNode.getValue];
+    c = findstr(cNode.getValue, '(');
+    if ~isempty(c) && cNode.getLevel ~=0
+      cNode = cNode.getParent;
+    end
+
+    if  cNode.getLevel ==0, break; end
+    cNode = cNode.getParent;
+  end
+
+  val = s;
+
+  if ~isempty(fields)
+    L=length(fields);
+    displayed = fields{L};
+    % create the variable: displayed
+    for j = L-1:-1:1
+      displayed = strcat(displayed, '.', fields{j});
+    end
+
+    for i = L:-1:1
+      field = fields{i};
+      von = findstr(field,'(');
+      bis = findstr(field,')');
+      if ~isempty(von)
+
+        idx = field(von+1:bis-1);
+        field = field(1:von-1);
+        if (strcmp(field, cNode.getValue))
+          cmd = sprintf('val = val(%s);',idx);
+          eval(cmd);
+          if iscell(val) && numel(val) == 1
+            val = val{1};
+          else
+            error('################ MAch mich neu');
+          end
+        else
+          cmd = sprintf('val = getfield(val, field, {%s});',idx);
+          eval(cmd);
+          if iscell(val) && numel(val) == 1
+            val = val{1};
+          end
+
+        end
+
+      else
+        if iscell(val) && numel(val) == 1
+          val = val{1};
+        elseif numel(val) ~= 1
+          error('################ MAch mich neu');
+        end
+        val = getfield(val, field);
+      end
+    end
+  else
+    displayed = cNode.getValue;
+    if iscell(val) && numel(val) == 1
+      val = val{1};
+    else
+    end
+    return;
+  end
+end
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+function c_str = split_by_comma(str, pref)
+
+  if nargin < 2
+    pref = '';
+  end
+
+  c_str = {};
+  c_str{1} = str;
+  index    = find(str==',');
+  von      = 1;
+  for ii = 1:length(index)
+    bis = index(ii)-1;
+    c_str{ii} = [pref str(von:bis)];
+    von = bis + 2;
+  end
+  if ~isempty(index)
+    c_str{ii+1} = [pref str(von:end)];
+  end
+
+  c_str = strtrim(c_str);
+end