diff m-toolbox/test/command_list/cmdlist.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/test/command_list/cmdlist.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,411 @@
+function cmdlist
+
+% A simple test GUI for generating a command list
+%
+% Explore the idea to generate a command list - each command has
+% configurable inputs and outputs
+%
+
+
+%% Some initial setup
+versions = {};
+ltpda_versions;
+
+Gproperties.Gcol    = [240 240 240]/255;
+Gproperties.Gwidth  = 800;
+Gproperties.Gheight = 600;
+Gproperties.Gborder = 10;
+fontsize = getappdata(0, 'ltpda_repo_gui_fontsize');
+
+Gproperties.Screen   = get(0,'screensize');
+Gproperties.Gposition = [150 ...
+  150 ...
+  Gproperties.Gwidth...
+  Gproperties.Gheight];
+
+%  Initialize and hide the GUI as it is being constructed.
+mainfig = figure('Name', 'Script Builder',...
+  'NumberTitle', 'off',...
+  'Visible','off',...
+  'Position',Gproperties.Gposition,...
+  'Color', Gproperties.Gcol,...
+  'Toolbar', 'none',...
+  'Resize', 'off',...
+  'ToolBar',      'none',           ...
+  'NextPlot',     'new',            ...
+  'HandleVisibility', 'callback', ...
+  'MenuBar', 'none',...
+  'Tag', 'ltpdaCmdList');
+
+setappdata(mainfig, 'commands', {});
+
+% Add command table to JScrollPane
+
+data    = {};
+cnames = {'output', 'command', 'inputs'};
+columnformat = {'char', 'char', 'char'};
+columneditable =  [true false false];
+
+cmdtbl = uitable('Parent', mainfig,...
+  'Units','normalized', ...
+  'BackgroundColor',  [1 1 0.6; 1 1 1], ...
+  'RowStriping', 'on', ...
+  'ColumnName', cnames, ...
+  'Fontsize', 14, ...
+  'Data', data, ...
+  'ColumnEditable', columneditable, ...
+  'ColumnFormat', columnformat, ...
+  'CellEditCallback', @cellChanged,...
+  'CellSelectionCallback', {@cellEdit, mainfig},...
+  'ButtonDownFcn', {@tblClick, mainfig},...
+  'Tag', 'commandTable', ...
+  'Position', [0.05 0.2 0.5 0.7]...
+  );
+
+get(cmdtbl)
+
+setappdata(mainfig, 'cmdTable', cmdtbl);
+
+cmenu = uicontextmenu('Parent', mainfig, 'Callback', {@setContext, mainfig});
+% Define the line and associate it with the context menu
+set(cmdtbl, 'UIContextMenu', cmenu);
+
+
+
+
+% Add button
+h = uicontrol(mainfig, 'Style', 'pushbutton', ...
+  'String', 'Add',...
+  'Units','normalized', ...
+  'Position', [0.05 0.1 0.1 0.05],...
+  'Callback', {@addCommand, mainfig});
+
+% Build button
+h = uicontrol(mainfig, 'Style', 'pushbutton', ...
+  'String', 'Build',...
+  'Units','normalized', ...
+  'Position', [0.15 0.1 0.1 0.05],...
+  'Callback', {@buildCommand, mainfig});
+
+% Command panel
+hpnl = uipanel(mainfig, ...
+  'BackgroundColor', Gproperties.Gcol, ...
+  'Position', [0.6 0.2 0.35 0.7]);
+
+setappdata(mainfig, 'epanel', hpnl);
+
+% data   = {'a2', 'ao', 'a1', 'E';...
+%           'a3', 'ltpda_pwelch', 'a2', 'E';...
+%           };
+
+% Make the GUI visible.
+set(mainfig,'Visible','on')
+
+  function editCell(varargin)
+    
+    myh = varargin{1};
+    mainfig = findobj('Tag', 'ltpdaCmdList');    
+    scells = getappdata(mainfig, 'selectedCells');    
+    cmds = getappdata(mainfig, 'commands');
+    tbl = getappdata(mainfig, 'cmdTable');
+    
+    cols = unique(scells(:,2));
+    edt  = get(tbl, 'ColumnEditable');
+    edt(cols) = true;
+    set(tbl, 'ColumnEditable', edt)
+    
+  end
+
+  function setContext(varargin)
+
+
+    cmenu   = varargin{1};
+    mainfig = varargin{3};
+
+    delete(get(cmenu, 'Children'));
+
+    scells = getappdata(mainfig, 'selectedCells');
+    
+    if ~isempty(scells)
+      % commands
+      if all(scells(:,2)==2)
+        buildCommandsMenu(cmenu)
+      else
+        % inputs
+        buildInputsMenu(cmenu)
+      end
+    end % end of isempty
+    item1 = uimenu(cmenu, 'Label', 'edit', 'Callback', @editCell);
+
+  end
+
+  function buildInputsMenu(cmenu)
+    
+    mainfig = findobj('Tag', 'ltpdaCmdList');    
+    scells = getappdata(mainfig, 'selectedCells');
+    cmds = getappdata(mainfig, 'commands');
+    
+    % get the outputs of all other lines above
+    mc = min(scells(:,1))-1;
+    if mc > 0
+      outs = [];
+      for k=1:mc
+        cmds(k,1)
+        if ~isempty(cmds{k,1})
+          outs = [outs cmds(k,1)];
+        end
+      end
+      outs = unique(outs);
+
+      % Build menu
+      for k=1:length(outs)
+        o = outs{k};
+        sitem1 = uimenu(cmenu, 'Label', o, 'Callback', @cmcallback);
+      end
+    end    
+  end
+
+
+  function buildCommandsMenu(cmenu)
+
+    % Define the context menu items
+
+    sitem1 = uimenu(cmenu, 'Label', 'classes');
+    sitem2 = uimenu(cmenu, 'Label', 'other');
+
+    % Classes sub items
+    classes = ltpda_user_classes;
+    for j=1:length(classes)
+      cl = classes{j};
+      ss = uimenu(sitem1, 'Label', cl);
+
+      % Collect categories
+      ms = methods(cl);
+      cats = {};
+      for k=1:length(ms)
+        m = ms{k};
+        if ~strcmp(m, 'Contents')
+          ct = unique(versions(find(strcmp(versions(:,2), m)), 9));
+          if ~isempty(ct) && ~any(strcmp(ct, 'Internal'))
+            cats = [cats; ct];
+          end
+        end
+      end % end categories loop
+      cats = squeeze(unique(cats));
+
+      % add categories
+      for k=1:length(cats)
+        if isempty(cats{k})
+          c = 'unknown';
+        else
+          c = cats{k};
+          sss = uimenu(ss, 'Label', c);
+        end
+
+        % Add methods
+        thisClass = versions(strcmp(versions(:,10), cl), :);
+        ms = thisClass(strcmp(thisClass(:, 9), c),2);
+        for l=1:length(ms)
+          m = ms{l};
+          ssss = uimenu(sss, 'Label', m, 'Callback', @cmcallback);
+        end
+
+      end
+    end % end classes loop
+    
+    % Other commands
+    otherCommands = versions(strcmp(versions(:,10), 'None'),:);
+
+    % category list
+    cats = unique(otherCommands(:,9));    
+    for j=1:length(cats)
+      ct = cats{j};
+      if ~strcmp(ct, 'Internal')
+        if isempty(ct)
+          ct = 'unknown';
+        end
+        sss = uimenu(sitem2, 'Label', ct);
+
+        % Functions
+        if strcmp(ct, 'unknown')
+          cfs = otherCommands(strcmp(otherCommands(:,9), ''),2);
+        else
+          cfs = otherCommands(strcmp(otherCommands(:,9), ct),2);
+        end
+        for k=1:length(cfs)
+          cf = cfs{k};
+          ssss = uimenu(sss, 'Label', cf, 'Callback', @cmcallback);
+        end
+
+      end
+
+    end    
+  end
+
+  function cmcallback(varargin)
+
+    myh = varargin{1};    
+    fcn = get(myh, 'Label');
+    
+    mainfig = findobj('Tag', 'ltpdaCmdList');    
+    scells = getappdata(mainfig, 'selectedCells');    
+    cmds = getappdata(mainfig, 'commands');
+    
+    for j=1:size(scells,1)
+      
+      row = scells(j,1);
+      col = scells(j,2);
+      
+      cmds(row,col) = {fcn};
+      
+    end
+    
+    setappdata(mainfig, 'commands', cmds);
+    setTable(mainfig);
+    
+  end
+
+
+  function tblClick(varargin)
+
+    myh     = varargin{1};
+    cinfo   = varargin{2};
+    mainfig = varargin{3};
+
+
+
+
+  end
+
+  function optCellSelect(varargin)
+
+    myh     = varargin{1};
+    cinfo   = varargin{2};
+    mainfig = varargin{3};
+
+
+    % get cell text
+    idx = cinfo.Indices;
+    row = idx(1);
+    col = idx(2);
+    d = get(myh, 'Data');
+    cval = d{row,col};
+
+
+  end
+
+  function buildCommand(varargin)
+    
+    mainfig = varargin{3};
+    
+    cmds = getappdata(mainfig, 'commands');
+    
+    fname = [tempname '.m'];
+    % get tmp filename
+    fd = fopen(fname, 'w+');
+    fprintf(fd, 'clear all; \n');
+    
+    for j=1:size(cmds,1)
+      
+      cm = cmds(j,:);   
+      
+      if ~isempty(cm{2})
+        if isempty(cm{1})
+          cmd = sprintf('%s(%s)', cm{2}, cm{3})
+        else
+          cmd = sprintf('%s = %s(%s)', cm{1}, cm{2}, cm{3})
+        end
+        fprintf(fd, '%s\n', cmd);
+      end
+    end
+    fclose(fd);
+    cmd = sprintf('run(''%s'')', fname)
+    evalin('base', cmd)
+    
+    delete(fname)
+    
+  end
+
+  function addCommand(varargin)
+
+    mainfig = varargin{end};
+
+    cmds = getappdata(mainfig, 'commands');
+    outs = getOutputs(cmds);
+    cmd  = {'', '', ''};
+
+    cmds = [cmds; cmd];
+
+    setappdata(mainfig, 'commands', cmds);
+
+    setTable(mainfig);
+
+  end
+
+  function setTable(mainfig)
+
+    cmds = getappdata(mainfig, 'commands');
+    tbl  = findobj(mainfig, 'Tag', 'commandTable');
+    outs = getOutputs(cmds);
+
+    set(tbl, 'Data', cmds);
+
+  end
+
+  function cellChanged(varargin)
+
+    tbl = varargin{1};
+    edata = varargin{2};
+    mainfig = get(tbl, 'Parent');
+    cmds = getappdata(mainfig, 'commands');
+
+    row = edata.Indices(1);
+    col = edata.Indices(2);
+    cmds{row,col} = edata.NewData;
+    setappdata(mainfig, 'commands', cmds);
+
+    setTable(mainfig)
+
+    edt = get(tbl, 'ColumnEditable');
+    edt(col) = false;
+    set(tbl, 'ColumnEditable', edt);
+    
+
+  end
+
+  function o = getOutputs(commands)
+
+    o = {};
+
+
+
+    % Go through each command and get outputs
+    for j=1:size(commands,1)
+      os = commands{j,1};
+      a = strrep(strrep(regexp(os, ',', 'split'), '[', ''), ']', '');
+      o = [o a];
+    end
+
+    if isempty(o)
+      o = {''};
+    end
+
+
+  end
+
+  function cellEdit(varargin)
+
+    myh = varargin{1};
+    edata = varargin{2};
+    mainfig = varargin{end};
+
+    tbl = getappdata(mainfig, 'optTable');
+
+    setappdata(mainfig, 'selectedCells', edata.Indices);
+
+    %     buildOptions(tbl);
+
+  end
+
+end
+