Mercurial > hg > ltpda
diff m-toolbox/classes/@repogui/cb_treegui.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/classes/@repogui/cb_treegui.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,335 @@ +% TREEGUI for exploring objects in memory +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: TREEGUI builds a tree visual structure to explore objects in +% memory; this is an optimized version of the ltpda_explorer +% tree object to explore inside structs, and it's meant to be +% implemented into the repoGUI. +% +% CALL: treegui; +% +% VERSION: $Id: cb_treegui.m,v 1.3 2009/07/29 16:19:38 nicola Exp $ +% +% HISTORY: 15-02-09 N Tateo +% 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 tree = cb_treegui(varargin) + + prefs = getappdata(0, 'LTPDApreferences'); + fontsize = prefs.repository.fontsize; + + tree_name = 'Workspace'; + obj_value = {}; + obj_name = {}; + +% % if nargin==0 +% % Define figure +% fig_name = 'Variables in workspace'; +% fig_position = [150 150 400 600]; +% fig = figure('NumberTitle','off', 'Toolbar','none', 'name',fig_name, 'Color','w', 'ToolBar','none',... +% 'NextPlot','new', 'MenuBar','none', 'Position',fig_position); +% treeSize = [.01 .07 .98 .92]; +% % else fig = gcf; treeSize = varargin{1}; +% % end + + fig = gcf; + treeSize = [0.025 1-2*0.025-0.55 0.3 0.5]; + + + % Read the objects from the 'base' workspace + + ws_vars = evalin('base','whos'); + + % Only ltpda_user_classes and common structs are shown: + accepted_classes = [utils.helper.ltpda_userclasses(), 'struct']; + for ii=numel(ws_vars):-1:1 + if ~ismember(ws_vars(ii).class,accepted_classes) + ws_vars(ii)=[]; + end + end + clear accepted_classes + + for ii=1:length(ws_vars) + + obj = evalin('base', ws_vars(ii).name); + + if numel(obj) == 1 + obj_value{end+1} = obj; + obj_name{end+1} = ws_vars(ii).name; + + else + % the ao in the workspace is a vector + [n,m] = size(obj); + if n == 1 || m == 1 + for jj=1:length(obj) + obj_value{end+1} = obj(jj); + obj_name{end+1} = [ws_vars(ii).name '(' num2str(jj) ')']; + end + elseif n > 1 && m > 1 + % the ao in the workspace is a matrix + for gg = 1:n + for hh = 1:m + obj_value{end+1} = obj(gg,hh); + obj_name{end+1} = [ws_vars(ii).name '(' num2str(gg) ',' num2str(hh) ')']; + end + end + + else + error ('### This should not happen: not scalar, nor vector, nor matrix?'); + end + + end + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Define the tree % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + root = uitreenode('v0', tree_name, tree_name, [], false); + tree = uitree('v0',fig, 'Root',root, 'ExpandFcn', @myExpfcn4); + set(tree, 'Units', 'normalized') + set(tree,'MultipleSelectionEnabled',1) + drawnow; + set(tree, 'position', treeSize); + set(tree, 'NodeWillExpandCallback', @nodeWillExpand_cb4); %, ... + %'NodeSelectedCallback', @nodeSelected_cb4); + + % assignin('base','tree',tree) + tmp = tree.FigureComponent; + cell_Data = cell(3,1); + + + cell_Data{1} = obj_value; + cell_Data{2} = root.getRoot; + cell_Data{3} = obj_name; + set(tmp, 'UserData', cell_Data); + + nodeWillExpand_cb4(tree,[],root); + myExpfcn4(tree); + +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function nodes = myExpfcn4(tree,varargin) + + tmp = tree.FigureComponent; + S = get(tmp, 'UserData'); + s = S{1}; + cNode = S{2}; + [val, cNode] = getcNodevalue(cNode, s); + ltpda_user_classes = utils.helper.ltpda_userclasses(); + + if numel(val)==1 && utils.helper.isobject(val) + newVal = struct(); + allfields = fieldnames(val); + for kk=numel(allfields):-1:1 + if ismember(allfields{kk},ltpda_user_classes), newVal.(allfields{kk}) = val.(allfields{kk}); end + end + val = newVal; + clear newVal + end + [n,m] = size(val); + count = 0; + + %%% Vector or Matrix + if m>1 || n>1 + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%% Vector + if m==1 || n==1 + L = length(val); + + for J = 1:L + count = count + 1; + cNode = S{2}; + + iconpath = setIconPath(val{J}); + if ismember(class(val{J}),ltpda_user_classes), isLeaf = 1; + else isLeaf = 0; + end + +% disp('--- Running vector') + 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, isLeaf); + end + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%% Matrix + else + for ii=1:n + for jj=1:m + count = count + 1; + cNode = S{2}; +% disp('--- Running matrix') + iconpath = setIconPath(val{ii,jj}); + if ismember(class(val{ii,jj}),ltpda_user_classes), isLeaf = 1; + else isLeaf = 0; + end + fname = [cNode.getValue '(' num2str(ii) ',' num2str(jj) ')']; + nodes(count) = uitreenode('v0',fname, fname, iconpath, isLeaf); + 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; +% disp('--- Running else') + x = val.(fnames{i}); + if iscell(x), x = x{1}; end + + if isstruct(x), isLeaf = 0; + else isLeaf = 1; + end + iconpath = setIconPath(x); + nodes(count) = uitreenode('v0',fnames{i}, fnames{i}, iconpath, isLeaf); + + end + end + + if (count == 0) + nodes = []; + end +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function cNode = nodeWillExpand_cb4(tree,ev,varargin) + if isempty(ev) && nargin ==3 + cNode = varargin{1}.getRoot; + else + cNode = ev.getCurrentNode; + end + tmp = tree.FigureComponent; + cell_Data = get(tmp, 'UserData'); + cell_Data{2} = cNode; + set(tmp, 'UserData', cell_Data); + +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function [val, displayed, cNode] = getcNodevalue(cNode, s) + +% disp('------- Running getcNodevalue ') + 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('################'); + 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 = val.(field); + end + end + else + displayed = cNode.getValue; + if iscell(val) && numel(val) == 1 + val = val{1}; + else + end + return; + end +end + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function iconpath = setIconPath(val) + % Set the path to the *.gif files + % This is 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]; + + if isa(val, 'ao') + iconpath =[pth,'analysis_object.gif']; + elseif isa(val, 'tsdata') + iconpath =[pth,'ts_data.gif']; + elseif isa(val, 'fsdata') + iconpath =[pth,'fs_data.gif']; + elseif isa(val, 'xydata') + iconpath =[pth,'xy_data.gif']; + elseif isa(val, 'cdata') + iconpath =[pth,'c_data.gif']; + elseif isa(val, 'plist') + iconpath =[pth,'plist.gif']; + elseif isstruct(val) + iconpath =[pth,'obj_icon.gif']; + else + iconpath =[pth,'unknown_icon.gif']; + end + +end + +