diff m-toolbox/classes/@LTPDAworkbench/rebuildLibrary.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/@LTPDAworkbench/rebuildLibrary.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,219 @@
+% REBUILDLIBRARY rebuilds the library on the workbench by processing the
+% ltpda_versions cell-array.
+% 
+% CALL:  wb.rebuildLibrary
+% 
+% M Hewitson 11-10-08
+% 
+% $Id: rebuildLibrary.m,v 1.17 2011/04/28 13:26:26 hewitson Exp $
+% 
+function varargout = rebuildLibrary(varargin)
+  % setup library
+  lib = mpipeline.jltpda.LTPDAlibrary('LTPDA');
+  % Get current verbose level
+  prefs =  getappdata(0, 'LTPDApreferences');
+  vl    = double(prefs.getDisplayPrefs.getDisplayVerboseLevel);  
+  prefs.getDisplayPrefs.setDisplayVerboseLevel(java.lang.Integer(-1));
+  % Add each user class
+  ucls = utils.helper.ltpda_userclasses;
+  
+  % Add any user-class subclasses from extension modules
+  searchPaths = prefs.getExtensionsPrefs.getSearchPaths;
+  for kk=0:searchPaths.size-1
+    % path to the new classes
+    path = fullfile(char(searchPaths.get(kk)), 'classes');
+    % get a list of class directories
+    classdirs = utils.prog.dirscan(path, '@.*');
+    for jj=1:numel(classdirs)
+      parts = regexp(classdirs{jj}, '@', 'split');
+      cldir = parts{end};      
+      md = meta.class.fromName(cldir);
+      if utils.helper.isSubclassOf(md, 'ltpda_uo')
+        fprintf('+ adding user-object class %s from extension %s\n', md.Name, path);
+        ucls = [ucls {md.Name}];
+      end      
+    end
+  end
+    
+  cats = utils.const.categories.list;
+  cats = cats(~strcmp(cats, 'Internal'));
+  cats = cats(~strcmp(cats, 'GUI function'));
+  warning off
+  
+  %% Build the infrastructure first
+  for jj=1:numel(ucls)
+    clcat = mpipeline.jltpda.LTPDAcategory(ucls{jj});
+    lib.addCategory(clcat);
+  end
+  
+  % Now go through and add the contents
+  for jj=1:numel(ucls)
+    clcat = lib.getCategoryByName(ucls{jj});
+    disp(sprintf('** Building: %s', ucls{jj}));
+    % add each algorithm for this class/category
+    [clmethods, infos] = getPublicMethods(ucls{jj});
+    % add each method to its subcategory
+    for ll=1:numel(clmethods)
+      ii = infos(ll);
+      mthCategory = ii.mcategory;
+      cat = clcat.getCategoryByName(mthCategory);
+      if isempty(cat)
+        if ~strcmp(mthCategory, 'Internal') && ~strcmp(mthCategory, 'GUI function')
+          cat = mpipeline.jltpda.LTPDAcategory(mthCategory);
+          clcat.addSubCategory(cat);
+        end
+      end
+%       else
+      if ~isempty(cat)
+        disp(sprintf('  + adding method %s/%s to category %s', ucls{jj}, clmethods{ll}, char(cat.getName)))
+        a = LTPDAworkbench.minfo2algo(ii);
+        a.setParamsHTML(html(ii));
+        cat.addAlgorithm(a);
+      end
+    end
+  end
+  warning on
+  if nargin > 0
+    wb = varargin{1};
+    awtinvoke(wb.mp, 'setLibrary', lib);
+    awtinvoke(wb.mp, 'refreshLibraryTree');  
+  end
+  % set verbose level again
+  prefs.getDisplayPrefs.setDisplayVerboseLevel(java.lang.Integer(vl));
+  if nargout > 0
+    varargout{1} = lib;
+  end
+end
+
+
+function [mths, infos] = getPublicMethods(cl)
+  
+  disp(sprintf('   collecting methods for %s class...', cl));
+  mths = {};
+  
+  cms = eval(['?' cl]);
+  infos = [];
+  for ll=1:numel(cms.Methods)
+    
+    mt = cms.Methods{ll};
+    if  ~mt.Static                    && ...
+        ~mt.Hidden                    && ...
+        strcmpi(mt.Access, 'public')  && ...
+        ~strcmpi(cms.Methods{ll}.DefiningClass.Name, 'handle')
+      
+      % get category
+      try
+        cmd = sprintf('%s.getInfo(''%s'');', cl, mt.Name);
+        ii = eval(cmd);        
+%         disp(['    found method: ' mt.Name]);
+        mths = [mths {ii.mname}];
+        infos = [infos ii];
+      catch
+        warning('### could not get info about: %s', mt.Name);
+      end      
+    end
+    
+  end
+  
+  [mths,i,j] = unique(mths);
+  infos = infos(i);
+  
+  
+end
+
+% Make an html table of the minfo object suitable for display on the GUI
+% help pane.
+function txt = html(ii)
+  
+  txt = '';
+  % Table of the minfo object
+  txt = [txt sprintf('      <table cellspacing="0" class="body" cellpadding="2" border="1" width="60%%">\n')];
+  txt = [txt sprintf('        <thead>\n')];
+  txt = [txt sprintf('          <tr valign="top">\n')];
+  txt = [txt sprintf('            <th class="categorylist" colspan="2">Some information of the method %s/%s are listed below:</th>\n', ii.mclass, ii.mname)];
+  txt = [txt sprintf('          </tr>\n')];
+  txt = [txt sprintf('        </thead>\n')];
+  txt = [txt sprintf('        <tbody>\n')];
+  txt = [txt sprintf('          <tr valign="top">\n')];
+  txt = [txt sprintf('            <td width="25%%" bgcolor="#f3f4f5">Class name</td>\n')];
+  txt = [txt sprintf('            <td bgcolor="#f3f4f5">%s</td>\n', ii.mclass)];
+  txt = [txt sprintf('          </tr>\n')];
+  txt = [txt sprintf('          <tr valign="top">\n')];
+  txt = [txt sprintf('            <td width="25%%" bgcolor="#ffffff">Method name</td>\n')];
+  txt = [txt sprintf('            <td bgcolor="#ffffff">%s</td>\n', ii.mname)];
+  txt = [txt sprintf('          </tr>\n')];
+  txt = [txt sprintf('          <tr valign="top">\n')];
+  txt = [txt sprintf('            <td width="25%%" bgcolor="#f3f4f5">Category</td>\n')];
+  txt = [txt sprintf('            <td bgcolor="#f3f4f5">%s</td>\n', ii.mcategory)];
+  txt = [txt sprintf('          </tr>\n')];
+  txt = [txt sprintf('          <tr valign="top">\n')];
+  txt = [txt sprintf('            <td width="25%%" bgcolor="#ffffff">CVS Version</td>\n')];
+  txt = [txt sprintf('            <td bgcolor="#ffffff">%s</td>\n', ii.mversion)];
+  txt = [txt sprintf('          </tr>\n')];
+  txt = [txt sprintf('          <tr valign="top">\n')];
+  txt = [txt sprintf('            <td width="25%%" bgcolor="#f3f4f5">Min input args</td>\n')];
+  txt = [txt sprintf('            <td bgcolor="#f3f4f5">%d</td>\n', ii.argsmin)];
+  txt = [txt sprintf('          </tr>\n')];
+  txt = [txt sprintf('          <tr valign="top">\n')];
+  txt = [txt sprintf('            <td width="25%%" bgcolor="#ffffff">Max input args</td>\n')];
+  txt = [txt sprintf('            <td bgcolor="#ffffff">%d</td>\n', ii.argsmax)];
+  txt = [txt sprintf('          </tr>\n')];
+  txt = [txt sprintf('          <tr valign="top">\n')];
+  txt = [txt sprintf('            <td width="25%%" bgcolor="#f3f4f5">Min output args</td>\n')];
+  txt = [txt sprintf('            <td bgcolor="#f3f4f5">%d</td>\n', ii.outmin)];
+  txt = [txt sprintf('          </tr>\n')];
+  txt = [txt sprintf('          <tr valign="top">\n')];
+  txt = [txt sprintf('            <td width="25%%" bgcolor="#ffffff">Max output args</td>\n')];
+  txt = [txt sprintf('            <td bgcolor="#ffffff">%d</td>\n', ii.outmax)];
+  txt = [txt sprintf('          </tr>\n')];
+  txt = [txt sprintf('        </tbody>\n')];
+  txt = [txt sprintf('      </table>\n')];
+  
+  % Table of the sets
+  for ll=1:numel(ii.sets)
+    set = ii.sets{ll};
+    pl  = ii.plists(ll);
+    
+    txt = [txt sprintf('      <table cellspacing="0" class="body" cellpadding="4" summary="" width="100%%" border="2">\n')];
+    
+    txt = [txt sprintf('        <thead>\n')];
+    txt = [txt sprintf('        	<tr valign="top">\n')];
+    txt = [txt sprintf('        		<th bgcolor="#B9C6DD" colspan="4"><h3>%s</h3></th>\n',  set)];
+    txt = [txt sprintf('      	  </tr>\n')];
+    txt = [txt sprintf('        	<tr valign="top">\n')];
+    txt = [txt sprintf('      	  	<th width="15%%" bgcolor="#D7D7D7">Key</th>\n')];
+    txt = [txt sprintf('        		<th width="25%%" bgcolor="#D7D7D7">Default Value</th>\n')];
+    txt = [txt sprintf('        		<th bgcolor="#D7D7D7">Options</th>\n')];
+    txt = [txt sprintf('      	  	<th bgcolor="#D7D7D7">Description</th>\n')];
+    txt = [txt sprintf('        	</tr>\n')];
+    txt = [txt sprintf('        </thead>\n')];
+    
+    
+    txt = [txt sprintf('        <tbody>\n')];
+    for kk=1:pl.nparams
+      txt = [txt sprintf('          <tr valign="top">\n')];
+      txt = [txt sprintf('            <td width="15%%" bgcolor="#F2F2F2">%s</td>\n', pl.params(kk).key)];
+      ptxt = display(pl.params(kk));
+      txt = [txt sprintf('            <td width="25%%" bgcolor="#F2F2F2">%s</td>\n', strtrim(strrep(ptxt{3}, 'val:', '')))];
+      if numel(pl.params(kk).getOptions) > 1
+        opts = pl.params(kk).getOptions;
+        optlist ='<ul>';
+        for oo=1:numel(opts)
+          optlist = [optlist '<li><font color="#1111FF">' utils.helper.val2str(opts{oo}) '</font></li>'];
+        end
+        optlist = [optlist '</ul>'];        
+        txt = [txt sprintf('            <td bgcolor="#F2F2F2">%s</td>\n', optlist)];
+      else
+        txt = [txt sprintf('            <td bgcolor="#F2F2F2"><i>none</i></td>\n')];
+      end
+      txt = [txt sprintf('            <td bgcolor="#F2F2F2">%s</td>\n', char(strrep(pl.params(kk).desc, '\n', '<br></br>')))];
+      txt = [txt sprintf('          </tr>\n')];
+      
+    end
+    txt = [txt sprintf('        </tbody>\n')];
+    txt = [txt sprintf('      </table>\n')];
+
+  end
+end
+
+