mev-4.0.01/source/org/tigr/microarray/mev/script/util/ScriptTree.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2004, The Institute for Genomic Research (TIGR).
2 26 Feb 07 jari 3 All rights reserved.
2 26 Feb 07 jari 4  */
2 26 Feb 07 jari 5 /*
2 26 Feb 07 jari 6  * ScriptTree.java
2 26 Feb 07 jari 7  *
2 26 Feb 07 jari 8  * Created on February 28, 2004, 5:16 PM
2 26 Feb 07 jari 9  */
2 26 Feb 07 jari 10
2 26 Feb 07 jari 11 package org.tigr.microarray.mev.script.util;
2 26 Feb 07 jari 12
2 26 Feb 07 jari 13 import java.awt.Color;
2 26 Feb 07 jari 14 import java.util.Enumeration;
2 26 Feb 07 jari 15 import java.util.Hashtable;
2 26 Feb 07 jari 16 import java.util.Vector;
2 26 Feb 07 jari 17
2 26 Feb 07 jari 18 import javax.swing.BorderFactory;
2 26 Feb 07 jari 19 import javax.swing.JTree;
2 26 Feb 07 jari 20 import javax.swing.plaf.basic.BasicTreeUI;
2 26 Feb 07 jari 21 import javax.swing.tree.DefaultMutableTreeNode;
2 26 Feb 07 jari 22 import javax.swing.tree.DefaultTreeModel;
2 26 Feb 07 jari 23 import javax.swing.tree.TreeNode;
2 26 Feb 07 jari 24 import javax.swing.tree.TreePath;
2 26 Feb 07 jari 25
2 26 Feb 07 jari 26 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 27 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 28 import org.tigr.microarray.mev.script.ScriptDocument;
2 26 Feb 07 jari 29 import org.tigr.microarray.mev.script.ScriptManager;
2 26 Feb 07 jari 30 import org.tigr.microarray.mev.script.scriptGUI.ScriptTreeRenderer;
2 26 Feb 07 jari 31 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 32 import org.w3c.dom.Document;
2 26 Feb 07 jari 33 import org.w3c.dom.Element;
2 26 Feb 07 jari 34 import org.w3c.dom.NodeList;
2 26 Feb 07 jari 35
2 26 Feb 07 jari 36 /** The script tree is a data structure for script parameter organization.
2 26 Feb 07 jari 37  * It extends JTree and is used as a graphical aid to view xml scripts.
2 26 Feb 07 jari 38  * The main function is to encapsulate nodes with parameters to help in
2 26 Feb 07 jari 39  * script execution.
2 26 Feb 07 jari 40  * @author braisted
2 26 Feb 07 jari 41  */
2 26 Feb 07 jari 42 public class ScriptTree extends JTree {
2 26 Feb 07 jari 43     
2 26 Feb 07 jari 44     
2 26 Feb 07 jari 45     /** <CODE>ScriptDocument</CODE> to emulate
2 26 Feb 07 jari 46      */
2 26 Feb 07 jari 47     private ScriptDocument document;
2 26 Feb 07 jari 48     /** script manager, for script management control and mev communication
2 26 Feb 07 jari 49      */
2 26 Feb 07 jari 50     private ScriptManager manager;
2 26 Feb 07 jari 51     /** <CODE>ScriptTreeRenderer</CODE> to represent the tree
2 26 Feb 07 jari 52      */
2 26 Feb 07 jari 53     private ScriptTreeRenderer renderer;
2 26 Feb 07 jari 54     /** Data root
2 26 Feb 07 jari 55      */
2 26 Feb 07 jari 56     private DataNode primaryDataRoot;
2 26 Feb 07 jari 57     /** Data node hash table
2 26 Feb 07 jari 58      */
2 26 Feb 07 jari 59     private Hashtable dataNodeHash;
2 26 Feb 07 jari 60     
2 26 Feb 07 jari 61     private boolean resetWidth = true;
2 26 Feb 07 jari 62     
2 26 Feb 07 jari 63     /** Creates a new instance of ScriptTree
2 26 Feb 07 jari 64      * @param doc script document to emulate
2 26 Feb 07 jari 65      * @param manager script manager
2 26 Feb 07 jari 66      */
2 26 Feb 07 jari 67     public ScriptTree(ScriptDocument doc, ScriptManager manager) {
2 26 Feb 07 jari 68         super();
2 26 Feb 07 jari 69         this.renderer = new ScriptTreeRenderer();
2 26 Feb 07 jari 70         super.setCellRenderer(this.renderer);
2 26 Feb 07 jari 71         super.setForeground(Color.black);
2 26 Feb 07 jari 72         super.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
2 26 Feb 07 jari 73         
2 26 Feb 07 jari 74         BasicTreeUI basicTreeUI = (BasicTreeUI) getUI();
2 26 Feb 07 jari 75         basicTreeUI.setRightChildIndent(50);
2 26 Feb 07 jari 76         super.putClientProperty("JTree.lineStyle", "Angled");
2 26 Feb 07 jari 77         
2 26 Feb 07 jari 78         this.document = doc;
2 26 Feb 07 jari 79         this.manager = manager;
2 26 Feb 07 jari 80         
2 26 Feb 07 jari 81         dataNodeHash = new Hashtable();
2 26 Feb 07 jari 82         constructTree(document.getDocument());
2 26 Feb 07 jari 83         scrollAllToVisible();
2 26 Feb 07 jari 84     }
2 26 Feb 07 jari 85     
2 26 Feb 07 jari 86     public ScriptTree(ScriptTree tree) {
2 26 Feb 07 jari 87         super();
2 26 Feb 07 jari 88         this.renderer = new ScriptTreeRenderer();
2 26 Feb 07 jari 89         super.setCellRenderer(this.renderer);
2 26 Feb 07 jari 90         super.setForeground(Color.black);
2 26 Feb 07 jari 91         super.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
2 26 Feb 07 jari 92         
2 26 Feb 07 jari 93         BasicTreeUI basicTreeUI = (BasicTreeUI) getUI();
2 26 Feb 07 jari 94         basicTreeUI.setRightChildIndent(50);
2 26 Feb 07 jari 95         super.putClientProperty("JTree.lineStyle", "Angled");
2 26 Feb 07 jari 96         
2 26 Feb 07 jari 97         //this.document = tree.getDocument();
2 26 Feb 07 jari 98         //replace this with a document copy.
2 26 Feb 07 jari 99         this.document = new ScriptDocument(tree.getDocument());
2 26 Feb 07 jari 100         
2 26 Feb 07 jari 101         this.manager = tree.getScriptManager();
2 26 Feb 07 jari 102         
2 26 Feb 07 jari 103         this.dataNodeHash = new Hashtable();
2 26 Feb 07 jari 104         constructTree(document.getDocument());
2 26 Feb 07 jari 105         scrollAllToVisible();
2 26 Feb 07 jari 106     }
2 26 Feb 07 jari 107     
2 26 Feb 07 jari 108     /** returns the script document
2 26 Feb 07 jari 109      */
2 26 Feb 07 jari 110     public ScriptDocument getDocument() {
2 26 Feb 07 jari 111         return document;
2 26 Feb 07 jari 112     }
2 26 Feb 07 jari 113     
2 26 Feb 07 jari 114     /** Returns the script manager
2 26 Feb 07 jari 115      */
2 26 Feb 07 jari 116     public ScriptManager getScriptManager() {
2 26 Feb 07 jari 117         return this.manager;
2 26 Feb 07 jari 118     }
2 26 Feb 07 jari 119     
2 26 Feb 07 jari 120     /** Returns the script tree renderer for this tree
2 26 Feb 07 jari 121      */
2 26 Feb 07 jari 122     public ScriptTreeRenderer getScriptTreeRenderer() {
2 26 Feb 07 jari 123         return this.renderer;
2 26 Feb 07 jari 124     }
2 26 Feb 07 jari 125     
2 26 Feb 07 jari 126     public void highlightAlgSet(DataNode algSetRoot) {
2 26 Feb 07 jari 127         renderer.highlightAlgSet(algSetRoot);
2 26 Feb 07 jari 128     }
2 26 Feb 07 jari 129     
2 26 Feb 07 jari 130     public void clearHighlights() {
2 26 Feb 07 jari 131         renderer.clearHighlights();
2 26 Feb 07 jari 132     }
2 26 Feb 07 jari 133     
2 26 Feb 07 jari 134     public DataNode getPrimaryDataRoot() {
2 26 Feb 07 jari 135         return this.primaryDataRoot;
2 26 Feb 07 jari 136     }
2 26 Feb 07 jari 137     
2 26 Feb 07 jari 138     
2 26 Feb 07 jari 139     /** Builds the tree from the document
2 26 Feb 07 jari 140      * @param doc document to emulate
2 26 Feb 07 jari 141      */
2 26 Feb 07 jari 142     private void constructTree(Document doc) {
2 26 Feb 07 jari 143         Element root = doc.getDocumentElement();
2 26 Feb 07 jari 144         
2 26 Feb 07 jari 145         NodeList primaryData = doc.getElementsByTagName("primary_data");
2 26 Feb 07 jari 146         Element primaryDataElement;
2 26 Feb 07 jari 147         
2 26 Feb 07 jari 148         if(primaryData != null) {
2 26 Feb 07 jari 149             primaryDataElement = (Element)primaryData.item(0);
2 26 Feb 07 jari 150             primaryDataRoot = new DataNode(Integer.parseInt(primaryDataElement.getAttribute("id")), "Primary Data", "primary-data", primaryDataElement.getAttribute("type"));
2 26 Feb 07 jari 151             ((DefaultTreeModel)getModel()).setRoot(primaryDataRoot);
2 26 Feb 07 jari 152             dataNodeHash.put(primaryDataElement.getAttribute("id"), primaryDataRoot);
2 26 Feb 07 jari 153         }
2 26 Feb 07 jari 154         
2 26 Feb 07 jari 155         NodeList algSetList = doc.getElementsByTagName("alg_set");
2 26 Feb 07 jari 156         int numberOfSets = algSetList.getLength();
2 26 Feb 07 jari 157         
2 26 Feb 07 jari 158         //add all alg sets in order of id until all are added
2 26 Feb 07 jari 159         //numbering need not be continuous
2 26 Feb 07 jari 160         
2 26 Feb 07 jari 161         Element currAlgSet;
2 26 Feb 07 jari 162         int index = 0;
2 26 Feb 07 jari 163         int addedSets = 0;
2 26 Feb 07 jari 164         while(addedSets < numberOfSets && index < 100){
2 26 Feb 07 jari 165             //Retrieve Algorithm Sets in order by alg_set_id
2 26 Feb 07 jari 166             currAlgSet = getAlgSet(algSetList, index);
2 26 Feb 07 jari 167             index++;
2 26 Feb 07 jari 168             if(currAlgSet != null) {
2 26 Feb 07 jari 169                 addAlgSet(currAlgSet);
2 26 Feb 07 jari 170                 addedSets++;
2 26 Feb 07 jari 171             }
2 26 Feb 07 jari 172         }
2 26 Feb 07 jari 173     }
2 26 Feb 07 jari 174     
2 26 Feb 07 jari 175     
2 26 Feb 07 jari 176     /** Adds an algorithm set given the root element
2 26 Feb 07 jari 177      * @param algSet <CODE>AlgorithmSet</CODE> to add
2 26 Feb 07 jari 178      * @return
2 26 Feb 07 jari 179      */
2 26 Feb 07 jari 180     private boolean addAlgSet(Element algSet) {
2 26 Feb 07 jari 181         NodeList algList = algSet.getElementsByTagName("algorithm");
2 26 Feb 07 jari 182         Element currAlgorithm;
2 26 Feb 07 jari 183         int listLength = algList.getLength();
2 26 Feb 07 jari 184         int addCnt = 0;
2 26 Feb 07 jari 185         int index = 0;
2 26 Feb 07 jari 186         while(addCnt < listLength && index < 100) {
2 26 Feb 07 jari 187             currAlgorithm = getAlgorithmElement(algList, index);
2 26 Feb 07 jari 188             index++;
2 26 Feb 07 jari 189             if(currAlgorithm != null) {
2 26 Feb 07 jari 190                 addAlgorithm(currAlgorithm, algSet.getAttribute("input_data_ref"));
2 26 Feb 07 jari 191                 addCnt++;
2 26 Feb 07 jari 192             }
2 26 Feb 07 jari 193         }
2 26 Feb 07 jari 194         return true;
2 26 Feb 07 jari 195     }
2 26 Feb 07 jari 196     
2 26 Feb 07 jari 197     
2 26 Feb 07 jari 198     /** Adds an algorithm to the tree
2 26 Feb 07 jari 199      * @param algorithmElement Algorithm root element
2 26 Feb 07 jari 200      * @param dataRef data reference
2 26 Feb 07 jari 201      * @return
2 26 Feb 07 jari 202      */
2 26 Feb 07 jari 203     private boolean addAlgorithm(Element algorithmElement, String dataRef) {
2 26 Feb 07 jari 204         int alg_id, alg_name, input_data_ref;
2 26 Feb 07 jari 205         String name = algorithmElement.getAttribute("alg_name");
2 26 Feb 07 jari 206         String  alg_type = algorithmElement.getAttribute("alg_type");
2 26 Feb 07 jari 207         
2 26 Feb 07 jari 208         try {
2 26 Feb 07 jari 209             alg_id = Integer.parseInt(algorithmElement.getAttribute("alg_id"));
2 26 Feb 07 jari 210             input_data_ref = Integer.parseInt(algorithmElement.getAttribute("input_data_ref"));
2 26 Feb 07 jari 211         } catch (NumberFormatException nfe) {
2 26 Feb 07 jari 212             nfe.printStackTrace();
2 26 Feb 07 jari 213             return false;
2 26 Feb 07 jari 214         }
2 26 Feb 07 jari 215         
2 26 Feb 07 jari 216         //Make algorithm node
2 26 Feb 07 jari 217         AlgorithmNode algNode = new AlgorithmNode(name, alg_id, input_data_ref, alg_type);
2 26 Feb 07 jari 218         
2 26 Feb 07 jari 219         //Make AlgorithmData and set into algorithm node
2 26 Feb 07 jari 220         AlgorithmData data = constructAlgorithmData(algorithmElement);
2 26 Feb 07 jari 221         algNode.setAlgorithmData(data);
2 26 Feb 07 jari 222         
2 26 Feb 07 jari 223         //append output nodes to algorithm nodes, push data nodes into hash
2 26 Feb 07 jari 224         appendOutputNodes(algNode, algorithmElement);
2 26 Feb 07 jari 225         
2 26 Feb 07 jari 226         appendAlgorithmNode(algNode, dataRef);
2 26 Feb 07 jari 227         
2 26 Feb 07 jari 228         return true;
2 26 Feb 07 jari 229     }
2 26 Feb 07 jari 230     
2 26 Feb 07 jari 231     /** Adds and algorithm node and input data reference
2 26 Feb 07 jari 232      * @param node
2 26 Feb 07 jari 233      * @param inputDataRef
2 26 Feb 07 jari 234      */
2 26 Feb 07 jari 235     private void appendAlgorithmNode(AlgorithmNode node, String inputDataRef) {
2 26 Feb 07 jari 236         DataNode dataNode = (DataNode)dataNodeHash.get(inputDataRef);
2 26 Feb 07 jari 237         if(dataNode != null) {
2 26 Feb 07 jari 238             DefaultTreeModel model = (DefaultTreeModel)getModel();
2 26 Feb 07 jari 239             model.insertNodeInto(node, dataNode, dataNode.getChildCount());
2 26 Feb 07 jari 240         } else {
2 26 Feb 07 jari 241             System.out.println("null data node can't append");
2 26 Feb 07 jari 242         }
2 26 Feb 07 jari 243     }
2 26 Feb 07 jari 244     
2 26 Feb 07 jari 245     /** Returns the algorithm set given a node list, and an <CODE>AlgorithmSet</CODE> ID.
2 26 Feb 07 jari 246      * @param setList
2 26 Feb 07 jari 247      * @param id
2 26 Feb 07 jari 248      * @return
2 26 Feb 07 jari 249      */
2 26 Feb 07 jari 250     private Element getAlgSet(NodeList setList, int id) {
2 26 Feb 07 jari 251         Element currElement;
2 26 Feb 07 jari 252         for(int i = 0; i < setList.getLength(); i++) {
2 26 Feb 07 jari 253             if(((Element)setList.item(i)).getAttribute("set_id").equals(String.valueOf(id)))
2 26 Feb 07 jari 254                 return (Element)setList.item(i);
2 26 Feb 07 jari 255         }
2 26 Feb 07 jari 256         return null;
2 26 Feb 07 jari 257     }
2 26 Feb 07 jari 258     
2 26 Feb 07 jari 259     /** Returns an algorithm element given a node list and an algorithm id.
2 26 Feb 07 jari 260      * @param setList
2 26 Feb 07 jari 261      * @param id
2 26 Feb 07 jari 262      * @return
2 26 Feb 07 jari 263      */
2 26 Feb 07 jari 264     private Element getAlgorithmElement(NodeList setList, int id) {
2 26 Feb 07 jari 265         Element currElement;
2 26 Feb 07 jari 266         for(int i = 0; i < setList.getLength(); i++) {
2 26 Feb 07 jari 267             if(((Element)setList.item(i)).getAttribute("alg_id").equals(String.valueOf(id)))
2 26 Feb 07 jari 268                 return (Element)setList.item(i);
2 26 Feb 07 jari 269         }
2 26 Feb 07 jari 270         return null;
2 26 Feb 07 jari 271     }
2 26 Feb 07 jari 272     
2 26 Feb 07 jari 273     /** Returns all algorithm sets in the script tree
2 26 Feb 07 jari 274      * and associated document.
2 26 Feb 07 jari 275      * @return  */
2 26 Feb 07 jari 276     public AlgorithmSet [] getAlgorithmSets() {
2 26 Feb 07 jari 277         
2 26 Feb 07 jari 278         AlgorithmSet set;
2 26 Feb 07 jari 279         DataNode root = (DataNode)(this.getModel().getRoot());
2 26 Feb 07 jari 280         Experiment experiment = manager.getCurrentExperiment();
2 26 Feb 07 jari 281         
2 26 Feb 07 jari 282         //Algorithm Set collection
2 26 Feb 07 jari 283         Vector algSets = new Vector();
2 26 Feb 07 jari 284         Enumeration _enum = root.breadthFirstEnumeration();
2 26 Feb 07 jari 285         ScriptNode node, childNode;
2 26 Feb 07 jari 286         while(_enum.hasMoreElements()) {
2 26 Feb 07 jari 287             node = (ScriptNode)_enum.nextElement();
2 26 Feb 07 jari 288             
2 26 Feb 07 jari 289             //if it's a data node with children (algs) make an alg set
2 26 Feb 07 jari 290             if(node instanceof DataNode && !node.isLeaf()) {
2 26 Feb 07 jari 291                 set = new AlgorithmSet();
2 26 Feb 07 jari 292                 if(node.getParent() == null)
2 26 Feb 07 jari 293                     set.setExperiment(experiment);
2 26 Feb 07 jari 294                 set.setDataNode((DataNode)node);
2 26 Feb 07 jari 295                 for(int i = 0; i < node.getChildCount(); i++) {
2 26 Feb 07 jari 296                     childNode = (ScriptNode)node.getChildAt(i);
2 26 Feb 07 jari 297                     if(childNode instanceof AlgorithmNode) {
2 26 Feb 07 jari 298                         set.addAlgorithmNode((AlgorithmNode)childNode);
2 26 Feb 07 jari 299                     }
2 26 Feb 07 jari 300                 }
2 26 Feb 07 jari 301                 algSets.add(set);
2 26 Feb 07 jari 302             }
2 26 Feb 07 jari 303         }
2 26 Feb 07 jari 304         
2 26 Feb 07 jari 305         AlgorithmSet [] sets = new AlgorithmSet[algSets.size()];
2 26 Feb 07 jari 306         for(int i = 0; i < sets.length ; i++) {
2 26 Feb 07 jari 307             sets[i] = ((AlgorithmSet)(algSets.elementAt(i)));
2 26 Feb 07 jari 308             
2 26 Feb 07 jari 309         }
2 26 Feb 07 jari 310         
2 26 Feb 07 jari 311         return sets;
2 26 Feb 07 jari 312     }
2 26 Feb 07 jari 313     
2 26 Feb 07 jari 314     public DataNode getDataNodeNamed(String name) {
2 26 Feb 07 jari 315        DataNode root = (DataNode)(this.getModel().getRoot());
2 26 Feb 07 jari 316        Enumeration _enum = root.breadthFirstEnumeration();
2 26 Feb 07 jari 317        boolean found = false;
2 26 Feb 07 jari 318        ScriptNode node = null;
2 26 Feb 07 jari 319        while(!found && _enum.hasMoreElements()) {
2 26 Feb 07 jari 320            node = (ScriptNode)_enum.nextElement();
2 26 Feb 07 jari 321 //           if(! (node instanceof DataNode))
2 26 Feb 07 jari 322   //             continue;
2 26 Feb 07 jari 323            
2 26 Feb 07 jari 324            if(node.toString().equals(name))
2 26 Feb 07 jari 325                found = true;
2 26 Feb 07 jari 326        }
2 26 Feb 07 jari 327        return (DataNode)node;
2 26 Feb 07 jari 328     }
2 26 Feb 07 jari 329     
2 26 Feb 07 jari 330     
2 26 Feb 07 jari 331     /** Construct Algorithm Data from an algorithm element
2 26 Feb 07 jari 332      * @param algElement Algorithm element to supply params
2 26 Feb 07 jari 333      * @return
2 26 Feb 07 jari 334      */
2 26 Feb 07 jari 335     private AlgorithmData constructAlgorithmData(Element algElement) {
2 26 Feb 07 jari 336         AlgorithmData data = new AlgorithmData();
2 26 Feb 07 jari 337         
2 26 Feb 07 jari 338         // parameter list
2 26 Feb 07 jari 339         NodeList list = algElement.getElementsByTagName("plist");
2 26 Feb 07 jari 340         if(list != null && list.getLength() > 0)
2 26 Feb 07 jari 341             appendParameters(data, (Element)list.item(0));
2 26 Feb 07 jari 342         
2 26 Feb 07 jari 343         // matrices and arrays
2 26 Feb 07 jari 344         list = algElement.getElementsByTagName("mlist");
2 26 Feb 07 jari 345         if(list != null && list.getLength() > 0)
2 26 Feb 07 jari 346             appendMatrices(data, (Element)list.item(0));
2 26 Feb 07 jari 347         
2 26 Feb 07 jari 348         return data;
2 26 Feb 07 jari 349     }
2 26 Feb 07 jari 350     
2 26 Feb 07 jari 351     /** appends parameters in AlgorithmData
2 26 Feb 07 jari 352      * @param data Algorithm data
2 26 Feb 07 jari 353      * @param plist parameter list element
2 26 Feb 07 jari 354      */
2 26 Feb 07 jari 355     private void appendParameters(AlgorithmData data, Element plist) {
2 26 Feb 07 jari 356         NodeList parameters = plist.getElementsByTagName("param");
2 26 Feb 07 jari 357         Element currParam;
2 26 Feb 07 jari 358         String key;
2 26 Feb 07 jari 359         String value;
2 26 Feb 07 jari 360         
2 26 Feb 07 jari 361         for(int i = 0; i < parameters.getLength(); i++) {
2 26 Feb 07 jari 362             currParam = (Element)parameters.item(i);
2 26 Feb 07 jari 363             key = currParam.getAttribute("key");
2 26 Feb 07 jari 364             value = currParam.getAttribute("value");
2 26 Feb 07 jari 365             data.addParam(key, value);
2 26 Feb 07 jari 366         }
2 26 Feb 07 jari 367     }
2 26 Feb 07 jari 368     
2 26 Feb 07 jari 369     /** Appends a matrix to the AlgorithmData object.
2 26 Feb 07 jari 370      * @param data AlgorithmData with parameters
2 26 Feb 07 jari 371      * @param mlist matrix list to be added to the AlgorithmData
2 26 Feb 07 jari 372      */
2 26 Feb 07 jari 373     private void appendMatrices(AlgorithmData data, Element mlist) {
2 26 Feb 07 jari 374         NodeList matrices = mlist.getElementsByTagName("matrix");
2 26 Feb 07 jari 375         
2 26 Feb 07 jari 376         for(int i = 0; i < matrices.getLength(); i++) {
2 26 Feb 07 jari 377             addMatrix(data, (Element)matrices.item(i));
2 26 Feb 07 jari 378         }
2 26 Feb 07 jari 379     }
2 26 Feb 07 jari 380     
2 26 Feb 07 jari 381     /** Adds a matrix to the AlgorithmData object.
2 26 Feb 07 jari 382      * @param data receiver AlgorithmData
2 26 Feb 07 jari 383      * @param matrixElement Matrix element.
2 26 Feb 07 jari 384      */
2 26 Feb 07 jari 385     private void addMatrix(AlgorithmData data, Element matrixElement) {
2 26 Feb 07 jari 386         String name = matrixElement.getAttribute("name");
2 26 Feb 07 jari 387         String type = matrixElement.getAttribute("type");
2 26 Feb 07 jari 388         String row_dim = matrixElement.getAttribute("row_dim");
2 26 Feb 07 jari 389         String col_dim = matrixElement.getAttribute("col_dim");
2 26 Feb 07 jari 390         int row_dim_int, col_dim_int;
2 26 Feb 07 jari 391         try {
2 26 Feb 07 jari 392             row_dim_int = Integer.parseInt(row_dim);
2 26 Feb 07 jari 393             col_dim_int = Integer.parseInt(col_dim);
2 26 Feb 07 jari 394         } catch (NumberFormatException nfe) {
2 26 Feb 07 jari 395             nfe.printStackTrace();
2 26 Feb 07 jari 396             return;
2 26 Feb 07 jari 397         }
2 26 Feb 07 jari 398         
2 26 Feb 07 jari 399         NodeList elements = matrixElement.getElementsByTagName("element");
2 26 Feb 07 jari 400         int n = elements.getLength();
2 26 Feb 07 jari 401         Element element;
2 26 Feb 07 jari 402         
2 26 Feb 07 jari 403         if(type.equalsIgnoreCase("int-array")) {
2 26 Feb 07 jari 404             
2 26 Feb 07 jari 405             int [] values = new int [n];
2 26 Feb 07 jari 406             for(int i = 0; i < n ; i++) {
2 26 Feb 07 jari 407                 element = (Element)elements.item(i);
2 26 Feb 07 jari 408                 values[Integer.parseInt(element.getAttribute("row"))] = Integer.parseInt(element.getAttribute("value"));
2 26 Feb 07 jari 409             }
2 26 Feb 07 jari 410             
2 26 Feb 07 jari 411             data.addIntArray(name, values);
2 26 Feb 07 jari 412             
2 26 Feb 07 jari 413         } else if(type.equalsIgnoreCase("FloatMatrix")) {
2 26 Feb 07 jari 414             FloatMatrix fm = new FloatMatrix(row_dim_int, col_dim_int);
2 26 Feb 07 jari 415             float value;
2 26 Feb 07 jari 416             int x, y;
2 26 Feb 07 jari 417             if(n == row_dim_int*col_dim_int) {
2 26 Feb 07 jari 418                 for(int i = 0; i < n; i++) {
2 26 Feb 07 jari 419                     element = (Element)elements.item(i);
2 26 Feb 07 jari 420                     x = Integer.parseInt(element.getAttribute("row"));
2 26 Feb 07 jari 421                     y = Integer.parseInt(element.getAttribute("col"));
2 26 Feb 07 jari 422                     value = Float.parseFloat(element.getAttribute("value"));
2 26 Feb 07 jari 423                     fm.set(x, y, value);
2 26 Feb 07 jari 424                 }
2 26 Feb 07 jari 425                 data.addMatrix(name, fm);
2 26 Feb 07 jari 426             }
2 26 Feb 07 jari 427         } else if(type.equalsIgnoreCase("String-array")) {
2 26 Feb 07 jari 428             String [] values = new String[n];
2 26 Feb 07 jari 429             for(int i = 0; i < n ; i++) {
2 26 Feb 07 jari 430                 element = (Element)elements.item(i);
2 26 Feb 07 jari 431                 values[Integer.parseInt(element.getAttribute("row"))] = element.getAttribute("value");
2 26 Feb 07 jari 432             }
2 26 Feb 07 jari 433             
2 26 Feb 07 jari 434             data.addStringArray(name, values);
2 26 Feb 07 jari 435         }
2 26 Feb 07 jari 436         
2 26 Feb 07 jari 437     }
2 26 Feb 07 jari 438     
2 26 Feb 07 jari 439     /** Append ouput nodes to the algorithm data.
2 26 Feb 07 jari 440      */
2 26 Feb 07 jari 441     private void appendOutputNodes(AlgorithmNode node, Element algElement) {
2 26 Feb 07 jari 442         
2 26 Feb 07 jari 443         NodeList list = algElement.getElementsByTagName("output_data");
2 26 Feb 07 jari 444         
2 26 Feb 07 jari 445         if(list == null || list.getLength() < 1)
2 26 Feb 07 jari 446             return;
2 26 Feb 07 jari 447         
2 26 Feb 07 jari 448         Element outputElement = (Element)list.item(0);
2 26 Feb 07 jari 449         String output_class = outputElement.getAttribute("output_class");
2 26 Feb 07 jari 450         list = outputElement.getElementsByTagName("data_node");
2 26 Feb 07 jari 451         
2 26 Feb 07 jari 452         DataNode dataNode;
2 26 Feb 07 jari 453         int dataID;
2 26 Feb 07 jari 454         String dataType;
2 26 Feb 07 jari 455         String name;
2 26 Feb 07 jari 456         
2 26 Feb 07 jari 457         for(int i = 0; i < list.getLength(); i++) {
2 26 Feb 07 jari 458             outputElement = (Element)list.item(i);
2 26 Feb 07 jari 459             dataID = Integer.parseInt(outputElement.getAttribute("data_node_id"));
2 26 Feb 07 jari 460             dataNode = new DataNode(dataID, outputElement.getAttribute("name"), output_class);
2 26 Feb 07 jari 461             dataNodeHash.put(String.valueOf(dataID), dataNode);
2 26 Feb 07 jari 462             node.add(dataNode);
2 26 Feb 07 jari 463         }
2 26 Feb 07 jari 464         
2 26 Feb 07 jari 465     }
2 26 Feb 07 jari 466     
2 26 Feb 07 jari 467     
2 26 Feb 07 jari 468     /** sets the data root
2 26 Feb 07 jari 469      * @param node
2 26 Feb 07 jari 470      * @return  */
2 26 Feb 07 jari 471     public boolean setDataRoot(DataNode node) {
2 26 Feb 07 jari 472         DefaultTreeModel model = (DefaultTreeModel)getModel();
2 26 Feb 07 jari 473         model.setRoot(node);
2 26 Feb 07 jari 474         return true;
2 26 Feb 07 jari 475     }
2 26 Feb 07 jari 476     
2 26 Feb 07 jari 477     
2 26 Feb 07 jari 478     /** Returns the selected tree node.
2 26 Feb 07 jari 479      */
2 26 Feb 07 jari 480     public ScriptNode getSelectedNode() {
2 26 Feb 07 jari 481         TreePath path =  this.getSelectionPath();
2 26 Feb 07 jari 482         if(path == null)
2 26 Feb 07 jari 483             return null;
2 26 Feb 07 jari 484         ScriptNode node = (ScriptNode)path.getLastPathComponent();
2 26 Feb 07 jari 485         return node;
2 26 Feb 07 jari 486     }
2 26 Feb 07 jari 487     
2 26 Feb 07 jari 488     /** opens the tree
2 26 Feb 07 jari 489      */
2 26 Feb 07 jari 490     public void scrollAllToVisible() {
2 26 Feb 07 jari 491         DefaultTreeModel model = (DefaultTreeModel)this.getModel();
2 26 Feb 07 jari 492         DefaultMutableTreeNode node = (DefaultMutableTreeNode)model.getRoot();
2 26 Feb 07 jari 493         Enumeration _enum = node.depthFirstEnumeration();
2 26 Feb 07 jari 494         TreeNode [] visPath;
2 26 Feb 07 jari 495         TreePath path;
2 26 Feb 07 jari 496         while(_enum.hasMoreElements()) {
2 26 Feb 07 jari 497             node = (DefaultMutableTreeNode)_enum.nextElement();
2 26 Feb 07 jari 498             if(node.isLeaf()) {
2 26 Feb 07 jari 499                 visPath = node.getPath();
2 26 Feb 07 jari 500                 path = new TreePath(visPath);
2 26 Feb 07 jari 501                 this.scrollPathToVisible(path);
2 26 Feb 07 jari 502             }
2 26 Feb 07 jari 503         }
2 26 Feb 07 jari 504     }
2 26 Feb 07 jari 505     
2 26 Feb 07 jari 506     /** public void addNewAlgorithmToDataNode(DataNode parentNode) {
2 26 Feb 07 jari 507      * String outputClass = parentNode.getDataOutputClass();
2 26 Feb 07 jari 508      * manager.getAlgorithm(parentNode, this);
2 26 Feb 07 jari 509      * //this will run in a thread in the manager then new data will be set into tree
2 26 Feb 07 jari 510      * //using setAlgorithm
2 26 Feb 07 jari 511      * }
2 26 Feb 07 jari 512      * @param parentNode <CODE>DataNode</CODE> to receive the new <CODE>AlgorithmNode</CODE>
2 26 Feb 07 jari 513      */
2 26 Feb 07 jari 514     
2 26 Feb 07 jari 515     public void addNewAlgorithmToDataNode(DataNode parentNode) {
2 26 Feb 07 jari 516         String outputClass = parentNode.getDataOutputClass();
2 26 Feb 07 jari 517         AlgorithmData data = manager.getAlgorithm(outputClass);
2 26 Feb 07 jari 518         if(data != null) {
2 26 Feb 07 jari 519             if(document.appendAlgorithm(data, parentNode.getID())) {
2 26 Feb 07 jari 520                 try {
2 26 Feb 07 jari 521                     updateTree();
2 26 Feb 07 jari 522                     scrollAllToVisible();
2 26 Feb 07 jari 523                 } catch (Exception e) {e.printStackTrace(); }
2 26 Feb 07 jari 524             } else {
2 26 Feb 07 jari 525                 System.out.println("doc base didn't append");
2 26 Feb 07 jari 526             }
2 26 Feb 07 jari 527         }
2 26 Feb 07 jari 528     }
2 26 Feb 07 jari 529     
2 26 Feb 07 jari 530     
2 26 Feb 07 jari 531     /** Adds an <CODE>AlgorithmNode</CODE> to a <CODE>DataNode</CODE>
2 26 Feb 07 jari 532      * @param data data to add
2 26 Feb 07 jari 533      * @param parentNode parent node to accept algorithm
2 26 Feb 07 jari 534      */
2 26 Feb 07 jari 535     private void setAlgorithm(AlgorithmData data, DataNode parentNode){
2 26 Feb 07 jari 536         synchronized (this) {
2 26 Feb 07 jari 537             if(data != null) {
2 26 Feb 07 jari 538                 if(document.appendAlgorithm(data, parentNode.getID())) {
2 26 Feb 07 jari 539                     try {
2 26 Feb 07 jari 540                         updateTree();
2 26 Feb 07 jari 541                         scrollAllToVisible();
2 26 Feb 07 jari 542                         this.validate();
2 26 Feb 07 jari 543                         this.validateTree();
2 26 Feb 07 jari 544                     } catch (Exception e) {e.printStackTrace(); }
2 26 Feb 07 jari 545                 } else {
2 26 Feb 07 jari 546                     System.out.println("doc base didn't append");
2 26 Feb 07 jari 547                 }
2 26 Feb 07 jari 548             }
2 26 Feb 07 jari 549         }
2 26 Feb 07 jari 550     }
2 26 Feb 07 jari 551     
2 26 Feb 07 jari 552     
2 26 Feb 07 jari 553     /**
2 26 Feb 07 jari 554      * The class to allow run loading process in a separate thread.
2 26 Feb 07 jari 555      */
2 26 Feb 07 jari 556     private class Builder implements Runnable {
2 26 Feb 07 jari 557         /** parent node (data node)
2 26 Feb 07 jari 558          */
2 26 Feb 07 jari 559         DataNode parentNode;
2 26 Feb 07 jari 560         /** parameter collection
2 26 Feb 07 jari 561          */
2 26 Feb 07 jari 562         AlgorithmData data;
2 26 Feb 07 jari 563         /** Constructs a Builder instance.
2 26 Feb 07 jari 564          * @param p data node
2 26 Feb 07 jari 565          * @param d algorithm data
2 26 Feb 07 jari 566          */
2 26 Feb 07 jari 567         public Builder(DataNode p, AlgorithmData d) {
2 26 Feb 07 jari 568             parentNode = p;
2 26 Feb 07 jari 569             data = d;
2 26 Feb 07 jari 570         }
2 26 Feb 07 jari 571         
2 26 Feb 07 jari 572         /** Run method kicks off algorithm addition.
2 26 Feb 07 jari 573          */
2 26 Feb 07 jari 574         public void run() {
2 26 Feb 07 jari 575             if(document.appendAlgorithm(data, parentNode.getID())) {
2 26 Feb 07 jari 576                 try {
2 26 Feb 07 jari 577                     updateTree();
2 26 Feb 07 jari 578                     scrollAllToVisible();
2 26 Feb 07 jari 579                     repaint();
2 26 Feb 07 jari 580                 } catch (Exception e) {e.printStackTrace(); }
2 26 Feb 07 jari 581             } else {
2 26 Feb 07 jari 582                 System.out.println("doc base didn't append");
2 26 Feb 07 jari 583             }
2 26 Feb 07 jari 584         }
2 26 Feb 07 jari 585     }
2 26 Feb 07 jari 586     
2 26 Feb 07 jari 587     /** Refreshes tree to reflect ScriptDocument changes.
2 26 Feb 07 jari 588      */
2 26 Feb 07 jari 589     public void updateTree() {
2 26 Feb 07 jari 590         ((DefaultTreeModel)this.getModel()).setRoot(null);
2 26 Feb 07 jari 591         this.constructTree(document.getDocument());
2 26 Feb 07 jari 592         
2 26 Feb 07 jari 593         // resetWidth = true;
2 26 Feb 07 jari 594         
2 26 Feb 07 jari 595         this.scrollAllToVisible();
2 26 Feb 07 jari 596     }
2 26 Feb 07 jari 597     
2 26 Feb 07 jari 598     
2 26 Feb 07 jari 599     /** Removes algorithm from ther tree.
2 26 Feb 07 jari 600      * @param node Node to remove
2 26 Feb 07 jari 601      */
2 26 Feb 07 jari 602     public void removeAlgorithm(AlgorithmNode node) {
2 26 Feb 07 jari 603         this.document.removeAlgorithm(node);
2 26 Feb 07 jari 604     }
2 26 Feb 07 jari 605     
2 26 Feb 07 jari 606     /*
2 26 Feb 07 jari 607     private void writeObject(java.io.ObjectOutputStream oos) throws java.io.IOException {
2 26 Feb 07 jari 608                 
2 26 Feb 07 jari 609         oos.writeObject(document);
2 26 Feb 07 jari 610         //writeObject(manager);
2 26 Feb 07 jari 611        // oos.writeObject(renderer);
2 26 Feb 07 jari 612         oos.writeObject(primaryDataRoot);
2 26 Feb 07 jari 613         oos.writeObject(dataNodeHash);
2 26 Feb 07 jari 614         oos.writeBoolean(resetWidth);
2 26 Feb 07 jari 615     }
2 26 Feb 07 jari 616     
2 26 Feb 07 jari 617     
2 26 Feb 07 jari 618     
2 26 Feb 07 jari 619     private void readObject(java.io.ObjectInputStream ois) throws java.io.IOException, ClassNotFoundException {
2 26 Feb 07 jari 620           BasicTreeUI ui = (BasicTreeUI)getUI();     
2 26 Feb 07 jari 621             if(ui != null) {
2 26 Feb 07 jari 622                 ui.setRightChildIndent(50);
2 26 Feb 07 jari 623             } else
2 26 Feb 07 jari 624                 System.out.println("null UI in ScriptTree");
2 26 Feb 07 jari 625         
2 26 Feb 07 jari 626         this.document = (ScriptDocument)ois.readObject();
2 26 Feb 07 jari 627         //this.renderer = (ScriptTreeRenderer)ois.readObject();
2 26 Feb 07 jari 628         this.renderer = new ScriptTreeRenderer();
2 26 Feb 07 jari 629         super.setCellRenderer(this.renderer);
2 26 Feb 07 jari 630         this.primaryDataRoot = (DataNode)ois.readObject();
2 26 Feb 07 jari 631         this.dataNodeHash = (Hashtable)ois.readObject();
2 26 Feb 07 jari 632         this.resetWidth = ois.readBoolean();
2 26 Feb 07 jari 633         
2 26 Feb 07 jari 634         super.setForeground(Color.black);
2 26 Feb 07 jari 635         super.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
2 26 Feb 07 jari 636    
2 26 Feb 07 jari 637             super.putClientProperty("JTree.lineStyle", "Angled");
2 26 Feb 07 jari 638         
2 26 Feb 07 jari 639         constructTree(document.getDocument());
2 26 Feb 07 jari 640         scrollAllToVisible();
2 26 Feb 07 jari 641     }
2 26 Feb 07 jari 642      **/
2 26 Feb 07 jari 643     
2 26 Feb 07 jari 644 }