mev-4.0.01/source/org/tigr/microarray/mev/script/scriptGUI/ScriptXMLViewer.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  * ScriptXMLViewer.java
2 26 Feb 07 jari 7  *
2 26 Feb 07 jari 8  * Created on February 28, 2004, 4:37 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.scriptGUI;
2 26 Feb 07 jari 12
2 26 Feb 07 jari 13 import java.awt.AlphaComposite;
2 26 Feb 07 jari 14 import java.awt.Color;
2 26 Feb 07 jari 15 import java.awt.Composite;
2 26 Feb 07 jari 16 import java.awt.Dimension;
2 26 Feb 07 jari 17 import java.awt.Font;
2 26 Feb 07 jari 18 import java.awt.FontMetrics;
2 26 Feb 07 jari 19 import java.awt.Graphics;
2 26 Feb 07 jari 20 import java.awt.Graphics2D;
2 26 Feb 07 jari 21 import java.awt.GridBagConstraints;
2 26 Feb 07 jari 22 import java.awt.GridBagLayout;
2 26 Feb 07 jari 23 import java.awt.Insets;
2 26 Feb 07 jari 24 import java.awt.event.ActionEvent;
2 26 Feb 07 jari 25 import java.awt.event.ActionListener;
2 26 Feb 07 jari 26 import java.awt.event.KeyEvent;
2 26 Feb 07 jari 27 import java.awt.event.KeyListener;
2 26 Feb 07 jari 28 import java.awt.event.MouseAdapter;
2 26 Feb 07 jari 29 import java.awt.event.MouseEvent;
2 26 Feb 07 jari 30 import java.io.BufferedReader;
2 26 Feb 07 jari 31 import java.io.BufferedWriter;
2 26 Feb 07 jari 32 import java.io.File;
2 26 Feb 07 jari 33 import java.io.FileReader;
2 26 Feb 07 jari 34 import java.io.FileWriter;
2 26 Feb 07 jari 35 import java.io.IOException;
2 26 Feb 07 jari 36 import java.util.Hashtable;
2 26 Feb 07 jari 37 import java.util.StringTokenizer;
2 26 Feb 07 jari 38 import java.util.Vector;
2 26 Feb 07 jari 39
2 26 Feb 07 jari 40 import javax.swing.BorderFactory;
2 26 Feb 07 jari 41 import javax.swing.DefaultListModel;
2 26 Feb 07 jari 42 import javax.swing.Icon;
2 26 Feb 07 jari 43 import javax.swing.JComponent;
2 26 Feb 07 jari 44 import javax.swing.JFileChooser;
2 26 Feb 07 jari 45 import javax.swing.JLabel;
2 26 Feb 07 jari 46 import javax.swing.JList;
2 26 Feb 07 jari 47 import javax.swing.JMenuItem;
2 26 Feb 07 jari 48 import javax.swing.JOptionPane;
2 26 Feb 07 jari 49 import javax.swing.JPanel;
2 26 Feb 07 jari 50 import javax.swing.JPopupMenu;
2 26 Feb 07 jari 51 import javax.swing.JTextArea;
2 26 Feb 07 jari 52 import javax.swing.ListCellRenderer;
2 26 Feb 07 jari 53 import javax.swing.text.BadLocationException;
2 26 Feb 07 jari 54
2 26 Feb 07 jari 55 import org.tigr.microarray.mev.TMEV;
2 26 Feb 07 jari 56 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 57 import org.tigr.microarray.mev.cluster.gui.impl.GUIFactory;
2 26 Feb 07 jari 58 import org.tigr.microarray.mev.cluster.gui.impl.ViewerAdapter;
2 26 Feb 07 jari 59 import org.tigr.microarray.mev.script.ScriptDocument;
2 26 Feb 07 jari 60 import org.tigr.microarray.mev.script.ScriptManager;
2 26 Feb 07 jari 61 import org.tigr.microarray.mev.script.event.ScriptDocumentEvent;
2 26 Feb 07 jari 62 import org.tigr.microarray.mev.script.event.ScriptEventListener;
2 26 Feb 07 jari 63 import org.tigr.microarray.mev.script.util.AlgorithmNode;
2 26 Feb 07 jari 64
2 26 Feb 07 jari 65 /** ScriptXMLViewer renders the <CODE>Script</CODE> as a text editor in
2 26 Feb 07 jari 66  * xml text form.  The viewer is mostly just a viewer but lines with key:value
2 26 Feb 07 jari 67  * pairs can be edited.
2 26 Feb 07 jari 68  * @author braisted
2 26 Feb 07 jari 69  */
2 26 Feb 07 jari 70 public class ScriptXMLViewer extends ViewerAdapter {
2 26 Feb 07 jari 71     
2 26 Feb 07 jari 72     /** ScriptDoucment to be rendered
2 26 Feb 07 jari 73      */    
2 26 Feb 07 jari 74     private ScriptDocument doc;
2 26 Feb 07 jari 75     /** ScriptManager to act as a info exchange conduit.
2 26 Feb 07 jari 76      *
2 26 Feb 07 jari 77      */    
2 26 Feb 07 jari 78     private ScriptManager manager;
2 26 Feb 07 jari 79     
2 26 Feb 07 jari 80     /** Main viewer component.
2 26 Feb 07 jari 81      */    
2 26 Feb 07 jari 82     private JTextArea pane;
2 26 Feb 07 jari 83     private HighlightPanel highlightPanel;
2 26 Feb 07 jari 84     /** Panel to display line numbers.
2 26 Feb 07 jari 85      */    
2 26 Feb 07 jari 86     private LineNumberPanel numPanel;
2 26 Feb 07 jari 87     private JPopupMenu popup;
2 26 Feb 07 jari 88     private Font vFont;
2 26 Feb 07 jari 89     int numLines;
2 26 Feb 07 jari 90     int prevNumLines;
2 26 Feb 07 jari 91     
2 26 Feb 07 jari 92     private boolean editOnly;
2 26 Feb 07 jari 93     private File scriptFile;
2 26 Feb 07 jari 94     private IFramework framework;
2 26 Feb 07 jari 95     
2 26 Feb 07 jari 96     
2 26 Feb 07 jari 97     /** Creates a new instance of ScriptXMLViewer
2 26 Feb 07 jari 98      * @param manager
2 26 Feb 07 jari 99      */
2 26 Feb 07 jari 100     public ScriptXMLViewer(ScriptManager manager) {
2 26 Feb 07 jari 101         this.manager = manager;
2 26 Feb 07 jari 102         editOnly = false;
2 26 Feb 07 jari 103         PaneListener listener = new PaneListener();
2 26 Feb 07 jari 104         pane = new JTextArea();
2 26 Feb 07 jari 105         pane.setEditable(false);
2 26 Feb 07 jari 106         
2 26 Feb 07 jari 107         pane.setSelectedTextColor(Color.red);
2 26 Feb 07 jari 108         pane.setSelectionColor(Color.blue);
2 26 Feb 07 jari 109         
2 26 Feb 07 jari 110         pane.setOpaque(false);
2 26 Feb 07 jari 111         //pane.set
2 26 Feb 07 jari 112         pane.setMargin(new Insets(0,10,5,10));
2 26 Feb 07 jari 113         vFont = new Font("Monospaced", Font.PLAIN, 12);
2 26 Feb 07 jari 114         pane.setFont(vFont);
2 26 Feb 07 jari 115         numPanel = new LineNumberPanel();
2 26 Feb 07 jari 116         numPanel.addMouseListener(listener);
2 26 Feb 07 jari 117         
2 26 Feb 07 jari 118         highlightPanel = new HighlightPanel();
2 26 Feb 07 jari 119         highlightPanel.setLayout(new GridBagLayout());
2 26 Feb 07 jari 120         
2 26 Feb 07 jari 121         highlightPanel.add(pane, new GridBagConstraints(0,0,1,1,1,1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0));
2 26 Feb 07 jari 122         
2 26 Feb 07 jari 123         pane.addMouseListener(listener);
2 26 Feb 07 jari 124         
2 26 Feb 07 jari 125         popup = createPopupMenu(new MenuListener());
2 26 Feb 07 jari 126         updateSize();
2 26 Feb 07 jari 127     }
2 26 Feb 07 jari 128     
2 26 Feb 07 jari 129     /** Creates a new ScriptXMLViewer
2 26 Feb 07 jari 130      * @param Doc ScriptDocument to render
2 26 Feb 07 jari 131      * @param manager
2 26 Feb 07 jari 132      */    
2 26 Feb 07 jari 133     public ScriptXMLViewer(ScriptDocument Doc, ScriptManager manager) {
2 26 Feb 07 jari 134         doc = Doc;
2 26 Feb 07 jari 135         this.manager = manager;
2 26 Feb 07 jari 136         doc.addDocumentListener(new ScriptListener());
2 26 Feb 07 jari 137         editOnly = false;
2 26 Feb 07 jari 138         
2 26 Feb 07 jari 139         pane = new JTextArea();
2 26 Feb 07 jari 140         pane.setText(doc.toString());
2 26 Feb 07 jari 141         pane.setEditable(false);
2 26 Feb 07 jari 142         pane.setLineWrap(false);        
2 26 Feb 07 jari 143         pane.setSelectionColor(new Color(120,160,210));        
2 26 Feb 07 jari 144         pane.setOpaque(false);
2 26 Feb 07 jari 145         pane.setMargin(new Insets(0,0,5,10));
2 26 Feb 07 jari 146         vFont = new Font("Monospaced", Font.PLAIN, 12);
2 26 Feb 07 jari 147         pane.setFont(vFont);
2 26 Feb 07 jari 148         
2 26 Feb 07 jari 149         numPanel = new LineNumberPanel();
2 26 Feb 07 jari 150         
2 26 Feb 07 jari 151         highlightPanel = new HighlightPanel();
2 26 Feb 07 jari 152         highlightPanel.setLayout(new GridBagLayout());        
2 26 Feb 07 jari 153         highlightPanel.add(pane, new GridBagConstraints(0,0,1,1,1,1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0));
2 26 Feb 07 jari 154         
2 26 Feb 07 jari 155         pane.addMouseListener(new PaneListener());
2 26 Feb 07 jari 156         popup = createPopupMenu(new MenuListener());
2 26 Feb 07 jari 157         updateSize();
2 26 Feb 07 jari 158     }
2 26 Feb 07 jari 159     
2 26 Feb 07 jari 160     
2 26 Feb 07 jari 161     /** Constructs a ScriptXMLViewer from reading the File object
2 26 Feb 07 jari 162      * @param inputFile  */    
2 26 Feb 07 jari 163     public ScriptXMLViewer(File inputFile) {
2 26 Feb 07 jari 164         this.editOnly = true;
2 26 Feb 07 jari 165         scriptFile = inputFile;
2 26 Feb 07 jari 166         
2 26 Feb 07 jari 167         pane = new JTextArea();
2 26 Feb 07 jari 168         
2 26 Feb 07 jari 169         String text;        
2 26 Feb 07 jari 170         try {
2 26 Feb 07 jari 171             text = readScript(inputFile);
2 26 Feb 07 jari 172             pane.setText(text);
2 26 Feb 07 jari 173         } catch (IOException e) {
2 26 Feb 07 jari 174             pane.setText(" ");
2 26 Feb 07 jari 175         }
2 26 Feb 07 jari 176         
2 26 Feb 07 jari 177         pane.setCaretPosition(0);
2 26 Feb 07 jari 178         pane.setLineWrap(false);        
2 26 Feb 07 jari 179         pane.setSelectionColor(new Color(120,160,210));        
2 26 Feb 07 jari 180         pane.setOpaque(false);
2 26 Feb 07 jari 181         pane.setMargin(new Insets(0,0,5,10));
2 26 Feb 07 jari 182         vFont = new Font("Monospaced", Font.PLAIN, 12);
2 26 Feb 07 jari 183         pane.setFont(vFont);
2 26 Feb 07 jari 184         
2 26 Feb 07 jari 185         numPanel = new LineNumberPanel();
2 26 Feb 07 jari 186         numPanel.setHeight(pane.getLineCount());
2 26 Feb 07 jari 187         
2 26 Feb 07 jari 188         highlightPanel = new HighlightPanel();
2 26 Feb 07 jari 189         highlightPanel.setLayout(new GridBagLayout());        
2 26 Feb 07 jari 190         highlightPanel.add(pane, new GridBagConstraints(0,0,1,1,1,1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0));
2 26 Feb 07 jari 191         
2 26 Feb 07 jari 192         pane.addKeyListener(new PaneEditorListener());
2 26 Feb 07 jari 193         pane.addMouseListener(new PaneListener());
2 26 Feb 07 jari 194         popup = createPopupMenu(new MenuListener());
2 26 Feb 07 jari 195         updateSize();
2 26 Feb 07 jari 196     }
2 26 Feb 07 jari 197     
2 26 Feb 07 jari 198     
2 26 Feb 07 jari 199     /** Sets the script document to render
2 26 Feb 07 jari 200      * @param Doc  */    
2 26 Feb 07 jari 201     public void setDoc(ScriptDocument Doc) {
2 26 Feb 07 jari 202         doc = Doc;
2 26 Feb 07 jari 203         doc.addDocumentListener(new ScriptListener());
2 26 Feb 07 jari 204         updateSize();
2 26 Feb 07 jari 205     }
2 26 Feb 07 jari 206     
2 26 Feb 07 jari 207     /** Handles update during selection for viewing.
2 26 Feb 07 jari 208      */    
2 26 Feb 07 jari 209     public void onSelected(IFramework framework) {
2 26 Feb 07 jari 210         this.framework = framework;
2 26 Feb 07 jari 211         this.doc.updateScript();
2 26 Feb 07 jari 212         this.numPanel.clearSelection();
2 26 Feb 07 jari 213         updateSize();
2 26 Feb 07 jari 214     }
2 26 Feb 07 jari 215     
2 26 Feb 07 jari 216     private void updateSize() {
2 26 Feb 07 jari 217         if(doc == null)
2 26 Feb 07 jari 218             return;
2 26 Feb 07 jari 219         pane.setText(doc.toString());
2 26 Feb 07 jari 220         String text = " ";
2 26 Feb 07 jari 221         try{
2 26 Feb 07 jari 222             text = pane.getDocument().getText(0, pane.getDocument().getLength());
2 26 Feb 07 jari 223         }catch (Exception e){ }
2 26 Feb 07 jari 224         prevNumLines = numLines;
2 26 Feb 07 jari 225         numLines = pane.getLineCount();
2 26 Feb 07 jari 226         numPanel.setHeight(numLines);
2 26 Feb 07 jari 227         prevNumLines = numLines;
2 26 Feb 07 jari 228         pane.setCaretPosition(0);
2 26 Feb 07 jari 229     }
2 26 Feb 07 jari 230     
2 26 Feb 07 jari 231     /** Extract the text of the viewer
2 26 Feb 07 jari 232      * @return  */    
2 26 Feb 07 jari 233     public String getText() {
2 26 Feb 07 jari 234         return pane.getText();
2 26 Feb 07 jari 235     }
2 26 Feb 07 jari 236     
2 26 Feb 07 jari 237     /** Calls an update of the viewer such as on document changed.
2 26 Feb 07 jari 238      */    
2 26 Feb 07 jari 239     public void update() {
2 26 Feb 07 jari 240         updateSize();
2 26 Feb 07 jari 241     }
2 26 Feb 07 jari 242     
2 26 Feb 07 jari 243     /** Returns the content component for viewing
2 26 Feb 07 jari 244      */    
2 26 Feb 07 jari 245     public JComponent getContentComponent() {
2 26 Feb 07 jari 246         return highlightPanel;
2 26 Feb 07 jari 247     }
2 26 Feb 07 jari 248     
2 26 Feb 07 jari 249     /** returns the row header component form viewing.
2 26 Feb 07 jari 250      */    
2 26 Feb 07 jari 251     public JComponent getRowHeaderComponent() {
2 26 Feb 07 jari 252         return numPanel;
2 26 Feb 07 jari 253     }
2 26 Feb 07 jari 254     
2 26 Feb 07 jari 255     /** Highlights a particular algorithm range.
2 26 Feb 07 jari 256      */    
2 26 Feb 07 jari 257     public void highlightAlgorithmNode(AlgorithmNode node) {        
2 26 Feb 07 jari 258         String algName = node.getAlgorithmName();
2 26 Feb 07 jari 259         String algID = String.valueOf(node.getID());
2 26 Feb 07 jari 260         String dataRef = String.valueOf(node.getDataNodeRef());
2 26 Feb 07 jari 261         
2 26 Feb 07 jari 262         int startLine = getAlgMatch(algName, algID, dataRef);
2 26 Feb 07 jari 263         //highlight line on down
2 26 Feb 07 jari 264         int lineCount = pane.getLineCount();
2 26 Feb 07 jari 265         String endString;
2 26 Feb 07 jari 266         int end, start, endLine = -1;
2 26 Feb 07 jari 267         for(int i = startLine; i < lineCount; i++) {            
2 26 Feb 07 jari 268             try {
2 26 Feb 07 jari 269                 start = this.pane.getLineStartOffset(i);
2 26 Feb 07 jari 270                 end = this.pane.getLineEndOffset(i);
2 26 Feb 07 jari 271                 endString = this.pane.getText(start, end-start);
2 26 Feb 07 jari 272             } catch (BadLocationException ble) { 
2 26 Feb 07 jari 273                 return; 
2 26 Feb 07 jari 274             }
2 26 Feb 07 jari 275             
2 26 Feb 07 jari 276             if(endString.indexOf("/algorithm") != -1) {
2 26 Feb 07 jari 277                 endLine = i+1;
2 26 Feb 07 jari 278                 break;
2 26 Feb 07 jari 279             }
2 26 Feb 07 jari 280         }
2 26 Feb 07 jari 281         if(endLine > startLine) {
2 26 Feb 07 jari 282             mark(startLine, endLine);
2 26 Feb 07 jari 283         }
2 26 Feb 07 jari 284     }
2 26 Feb 07 jari 285     
2 26 Feb 07 jari 286     
2 26 Feb 07 jari 287     private int getAlgMatch(String algName, String algID, String dataRef) {
2 26 Feb 07 jari 288         int lineCount = this.pane.getLineCount();
2 26 Feb 07 jari 289         javax.swing.text.Document doc = this.pane.getDocument();
2 26 Feb 07 jari 290         String line, newLine;
2 26 Feb 07 jari 291         int keyIndex;
2 26 Feb 07 jari 292         int start, end;
2 26 Feb 07 jari 293         StringTokenizer stok;
2 26 Feb 07 jari 294         Vector indices = new Vector();
2 26 Feb 07 jari 295         boolean match = false;
2 26 Feb 07 jari 296         for(int i = 0; i < lineCount; i++) {
2 26 Feb 07 jari 297             try {
2 26 Feb 07 jari 298                 start = this.pane.getLineStartOffset(i);
2 26 Feb 07 jari 299                 end = this.pane.getLineEndOffset(i);
2 26 Feb 07 jari 300                 line = this.pane.getText(start, end-start);
2 26 Feb 07 jari 301             } catch (BadLocationException ble) { return -1; }
2 26 Feb 07 jari 302             match = false;
2 26 Feb 07 jari 303             if(line.indexOf(algName) != -1 && line.indexOf("algorithm")!=-1){
2 26 Feb 07 jari 304                 match = true;
2 26 Feb 07 jari 305                 keyIndex = line.indexOf("alg_id");
2 26 Feb 07 jari 306                 newLine = line.substring(keyIndex, line.length()-1);
2 26 Feb 07 jari 307                 stok = new StringTokenizer(newLine, "\"");
2 26 Feb 07 jari 308                 if(stok.hasMoreTokens())
2 26 Feb 07 jari 309                     stok.nextToken();
2 26 Feb 07 jari 310                 if(stok.hasMoreTokens())
2 26 Feb 07 jari 311                     newLine = stok.nextToken();
2 26 Feb 07 jari 312                 if(newLine.equals(algID))
2 26 Feb 07 jari 313                     match = true;
2 26 Feb 07 jari 314                 else
2 26 Feb 07 jari 315                     match = false;
2 26 Feb 07 jari 316                 if(match) {
2 26 Feb 07 jari 317                     keyIndex = line.indexOf("data_ref");
2 26 Feb 07 jari 318                     newLine = line.substring(keyIndex, line.length()-1);
2 26 Feb 07 jari 319                     stok = new StringTokenizer(newLine, "\"");
2 26 Feb 07 jari 320                     if(stok.hasMoreTokens())
2 26 Feb 07 jari 321                         stok.nextToken();
2 26 Feb 07 jari 322                     if(stok.hasMoreTokens())
2 26 Feb 07 jari 323                         newLine = stok.nextToken();
2 26 Feb 07 jari 324                     if(newLine.equals(dataRef))
2 26 Feb 07 jari 325                         match = true;
2 26 Feb 07 jari 326                     else
2 26 Feb 07 jari 327                         match = false;
2 26 Feb 07 jari 328                 }
2 26 Feb 07 jari 329             }
2 26 Feb 07 jari 330             if(match)
2 26 Feb 07 jari 331                 return i;
2 26 Feb 07 jari 332         }
2 26 Feb 07 jari 333         return -1;
2 26 Feb 07 jari 334     }
2 26 Feb 07 jari 335     
2 26 Feb 07 jari 336     private void mark(int start, int end) {
2 26 Feb 07 jari 337         highlightPanel.setSelection(start, end);
2 26 Feb 07 jari 338         highlightPanel.repaint();
2 26 Feb 07 jari 339         if(end>start)
2 26 Feb 07 jari 340             setEnableMenuItem("Clear Overlay", true);
2 26 Feb 07 jari 341         else
2 26 Feb 07 jari 342             setEnableMenuItem("Clear Overlay", false);
2 26 Feb 07 jari 343     }
2 26 Feb 07 jari 344     
2 26 Feb 07 jari 345     private JPopupMenu createPopupMenu(MenuListener listener) {
2 26 Feb 07 jari 346         JPopupMenu menu = new JPopupMenu();
2 26 Feb 07 jari 347         if(!editOnly) {
2 26 Feb 07 jari 348             menu.add(createItem("Edit", "edit-cmd", "Enabled when parameter key/value or algorithm is selected", listener, false));
2 26 Feb 07 jari 349             menu.addSeparator();
2 26 Feb 07 jari 350             menu.add(createItem("Clear Overlay", "clear-overlay-cmd", "Clears the algorithm overlay area if present", listener, false));
2 26 Feb 07 jari 351           //  menu.add(createItem("Mark Algorithm", "mark-algorithm-cmd", "Overlay shading if present", listener, true));
2 26 Feb 07 jari 352             menu.addSeparator();
2 26 Feb 07 jari 353         }
2 26 Feb 07 jari 354         menu.add(createItem("Save Script", "save-cmd", "Save script to file", listener, true));
2 26 Feb 07 jari 355         return menu;
2 26 Feb 07 jari 356     }
2 26 Feb 07 jari 357     
2 26 Feb 07 jari 358     private JMenuItem createItem(String title, String cmd, String tip, MenuListener listener, boolean enabled) {
2 26 Feb 07 jari 359         JMenuItem item = new JMenuItem(title);
2 26 Feb 07 jari 360         item.setEnabled(enabled);
2 26 Feb 07 jari 361         item.setFocusPainted(false);
2 26 Feb 07 jari 362         //item.setToolTipText(tip);
2 26 Feb 07 jari 363         item.setActionCommand(cmd);
2 26 Feb 07 jari 364         item.addActionListener(listener);
2 26 Feb 07 jari 365         return item;
2 26 Feb 07 jari 366     }
2 26 Feb 07 jari 367     
2 26 Feb 07 jari 368     private void setEnableMenuItem(String title, boolean enable) {
2 26 Feb 07 jari 369         int cnt = popup.getComponentCount();
2 26 Feb 07 jari 370         Object item;
2 26 Feb 07 jari 371         for(int i = 0; i < cnt; i++) {
2 26 Feb 07 jari 372             item = popup.getComponent(i);
2 26 Feb 07 jari 373             if(item instanceof JMenuItem) {
2 26 Feb 07 jari 374                 if( ((JMenuItem)item).getText().equals(title)) {
2 26 Feb 07 jari 375                     ((JMenuItem)item).setEnabled(enable);
2 26 Feb 07 jari 376                     break;
2 26 Feb 07 jari 377                 }
2 26 Feb 07 jari 378             }
2 26 Feb 07 jari 379         }
2 26 Feb 07 jari 380     }
2 26 Feb 07 jari 381     
2 26 Feb 07 jari 382     
2 26 Feb 07 jari 383     private String readScript(File file) throws IOException {
2 26 Feb 07 jari 384         BufferedReader bfr = new BufferedReader( new FileReader(file) );
2 26 Feb 07 jari 385         String text = new String();
2 26 Feb 07 jari 386         String line = new String();
2 26 Feb 07 jari 387         while( (line = bfr.readLine()) != null)
2 26 Feb 07 jari 388             text += line+"\n";
2 26 Feb 07 jari 389         return text;
2 26 Feb 07 jari 390     }
2 26 Feb 07 jari 391     
2 26 Feb 07 jari 392     
2 26 Feb 07 jari 393     private void saveScript() {
2 26 Feb 07 jari 394         JFileChooser chooser;
2 26 Feb 07 jari 395         if(scriptFile != null) {
2 26 Feb 07 jari 396             chooser = new JFileChooser(scriptFile.getPath());
2 26 Feb 07 jari 397         } else {
2 26 Feb 07 jari 398             chooser = new JFileChooser(TMEV.getFile("/data/scripts/"));
2 26 Feb 07 jari 399         }
2 26 Feb 07 jari 400         
2 26 Feb 07 jari 401         if(chooser.showSaveDialog(new JPanel()) == JFileChooser.APPROVE_OPTION) {
2 26 Feb 07 jari 402             try {
2 26 Feb 07 jari 403                 writeScript(chooser.getSelectedFile());
2 26 Feb 07 jari 404             } catch (IOException ioe) {
2 26 Feb 07 jari 405                 JOptionPane.showMessageDialog(pane, "An error occured while saving the script to file", "Save Error", JOptionPane.WARNING_MESSAGE);
2 26 Feb 07 jari 406             }
2 26 Feb 07 jari 407         }
2 26 Feb 07 jari 408     }
2 26 Feb 07 jari 409     
2 26 Feb 07 jari 410     
2 26 Feb 07 jari 411     private void writeScript(File file) throws IOException {
2 26 Feb 07 jari 412         BufferedWriter bfr = new BufferedWriter( new FileWriter(file));
2 26 Feb 07 jari 413         bfr.write(pane.getText());
2 26 Feb 07 jari 414         bfr.flush();
2 26 Feb 07 jari 415         bfr.close();
2 26 Feb 07 jari 416     }
2 26 Feb 07 jari 417     
2 26 Feb 07 jari 418     
2 26 Feb 07 jari 419     private Hashtable getAlgorithmAttributes(int cursorLoc) {
2 26 Feb 07 jari 420         String text = pane.getText(); int index;
2 26 Feb 07 jari 421         text = text.substring(0, cursorLoc);
2 26 Feb 07 jari 422         cursorLoc = text.lastIndexOf("algorithm");
2 26 Feb 07 jari 423         Hashtable hash = null;
2 26 Feb 07 jari 424         if(cursorLoc > -1) {
2 26 Feb 07 jari 425             text = text.substring(cursorLoc);
2 26 Feb 07 jari 426             index = text.indexOf(">");
2 26 Feb 07 jari 427             if(index != -1) {
2 26 Feb 07 jari 428                 text  = text.substring(0, index);
2 26 Feb 07 jari 429                 hash = getAlgorithmAttributes(text);
2 26 Feb 07 jari 430             }
2 26 Feb 07 jari 431         }
2 26 Feb 07 jari 432         return hash;
2 26 Feb 07 jari 433     }
2 26 Feb 07 jari 434     
2 26 Feb 07 jari 435     private Hashtable getAlgorithmAttributes(String text) {
2 26 Feb 07 jari 436         
2 26 Feb 07 jari 437         StringTokenizer stok = new StringTokenizer(text, "\"");
2 26 Feb 07 jari 438         String tok;
2 26 Feb 07 jari 439         Hashtable hash = new Hashtable();
2 26 Feb 07 jari 440         while(stok.hasMoreTokens()) {
2 26 Feb 07 jari 441             tok = stok.nextToken();
2 26 Feb 07 jari 442             if(tok.indexOf("alg_id")!=-1) {
2 26 Feb 07 jari 443                 hash.put("alg_id", stok.hasMoreTokens() ? stok.nextToken():" ");
2 26 Feb 07 jari 444             } else if (tok.indexOf("alg_name") != -1) {
2 26 Feb 07 jari 445                 hash.put("alg_name", stok.hasMoreTokens() ? stok.nextToken():" ");
2 26 Feb 07 jari 446             } else if (tok.indexOf("input_data_ref") != -1) {
2 26 Feb 07 jari 447                 hash.put("input_data_ref", stok.hasMoreTokens() ? stok.nextToken():" ");
2 26 Feb 07 jari 448             } else if (tok.indexOf("alg_type") != -1) {
2 26 Feb 07 jari 449                 hash.put("alg_type", stok.hasMoreTokens() ? stok.nextToken():" ");
2 26 Feb 07 jari 450             }
2 26 Feb 07 jari 451         }
2 26 Feb 07 jari 452         return hash;
2 26 Feb 07 jari 453     }
2 26 Feb 07 jari 454     
2 26 Feb 07 jari 455     public class PaneEditorListener implements KeyListener {
2 26 Feb 07 jari 456         
2 26 Feb 07 jari 457         public void keyPressed(KeyEvent keyEvent) {
2 26 Feb 07 jari 458             if(keyEvent.getKeyChar() == '\n') {
2 26 Feb 07 jari 459                 numPanel.setHeight(pane.getLineCount());
2 26 Feb 07 jari 460             }
2 26 Feb 07 jari 461             
2 26 Feb 07 jari 462         }
2 26 Feb 07 jari 463         
2 26 Feb 07 jari 464         public void keyReleased(KeyEvent keyEvent) {
2 26 Feb 07 jari 465             if(keyEvent.getKeyChar() == '\n') {
2 26 Feb 07 jari 466                 numPanel.setHeight(pane.getLineCount());
2 26 Feb 07 jari 467             }
2 26 Feb 07 jari 468         }
2 26 Feb 07 jari 469         
2 26 Feb 07 jari 470         public void keyTyped(KeyEvent keyEvent) {
2 26 Feb 07 jari 471             if(keyEvent.getKeyChar() == '\n') {
2 26 Feb 07 jari 472                 numPanel.setHeight(pane.getLineCount());
2 26 Feb 07 jari 473             }
2 26 Feb 07 jari 474         }
2 26 Feb 07 jari 475         
2 26 Feb 07 jari 476     }
2 26 Feb 07 jari 477     
2 26 Feb 07 jari 478     
2 26 Feb 07 jari 479     public class PaneListener extends MouseAdapter {
2 26 Feb 07 jari 480         int start, end;
2 26 Feb 07 jari 481         String text;
2 26 Feb 07 jari 482         
2 26 Feb 07 jari 483         public void mouseClicked(MouseEvent me) {
2 26 Feb 07 jari 484             if(me.getModifiers() == MouseEvent.BUTTON1_MASK) {
2 26 Feb 07 jari 485                 if(!editOnly) {
2 26 Feb 07 jari 486                     numPanel.list.clearSelection();
2 26 Feb 07 jari 487                     pane.getHighlighter().removeAllHighlights();
2 26 Feb 07 jari 488                 }
2 26 Feb 07 jari 489             } else if( me.isPopupTrigger() ) {
2 26 Feb 07 jari 490                 start = pane.getSelectionStart();
2 26 Feb 07 jari 491                 end = pane.getSelectionEnd();
2 26 Feb 07 jari 492                 
2 26 Feb 07 jari 493                 if(end > start) {
2 26 Feb 07 jari 494                     text = pane.getSelectedText();
2 26 Feb 07 jari 495                     setEnableMenuItem("Edit", (text.indexOf("value") != -1));
2 26 Feb 07 jari 496                 } else {
2 26 Feb 07 jari 497                     setEnableMenuItem("Edit", false);
2 26 Feb 07 jari 498                 }
2 26 Feb 07 jari 499                 setEnableMenuItem("Clear Overlay", highlightPanel.haveOverlay());
2 26 Feb 07 jari 500                 popup.show(pane, me.getX(), me.getY());
2 26 Feb 07 jari 501             }
2 26 Feb 07 jari 502         }
2 26 Feb 07 jari 503         
2 26 Feb 07 jari 504         public void mouseReleased(MouseEvent me) {
2 26 Feb 07 jari 505             if(me.getModifiers() == MouseEvent.BUTTON1_MASK) {
2 26 Feb 07 jari 506                 if(!editOnly) {
2 26 Feb 07 jari 507                     numPanel.list.clearSelection();
2 26 Feb 07 jari 508                     pane.getHighlighter().removeAllHighlights();
2 26 Feb 07 jari 509                 }
2 26 Feb 07 jari 510             } else if( me.isPopupTrigger() ) {
2 26 Feb 07 jari 511                 start = pane.getSelectionStart();
2 26 Feb 07 jari 512                 end = pane.getSelectionEnd();
2 26 Feb 07 jari 513                 
2 26 Feb 07 jari 514                 if(end > start) {
2 26 Feb 07 jari 515                     text = pane.getSelectedText();
2 26 Feb 07 jari 516                     setEnableMenuItem("Edit", (text.indexOf("value") != -1));
2 26 Feb 07 jari 517                 } else {
2 26 Feb 07 jari 518                     setEnableMenuItem("Edit", false);
2 26 Feb 07 jari 519                 }
2 26 Feb 07 jari 520                 setEnableMenuItem("Clear Overlay", highlightPanel.haveOverlay());
2 26 Feb 07 jari 521                 popup.show(pane, me.getX(), me.getY());
2 26 Feb 07 jari 522             }
2 26 Feb 07 jari 523         }
2 26 Feb 07 jari 524         
2 26 Feb 07 jari 525
2 26 Feb 07 jari 526         public void mousePressed(MouseEvent me) {
2 26 Feb 07 jari 527             if(me.getModifiers() == MouseEvent.BUTTON1_MASK) {
2 26 Feb 07 jari 528                 if(!editOnly) {
2 26 Feb 07 jari 529                     numPanel.list.clearSelection();
2 26 Feb 07 jari 530                     pane.getHighlighter().removeAllHighlights();
2 26 Feb 07 jari 531                 }
2 26 Feb 07 jari 532             } else if( me.isPopupTrigger() ) {
2 26 Feb 07 jari 533                 start = pane.getSelectionStart();
2 26 Feb 07 jari 534                 end = pane.getSelectionEnd();
2 26 Feb 07 jari 535                 
2 26 Feb 07 jari 536                 if(end > start) {
2 26 Feb 07 jari 537                     text = pane.getSelectedText();
2 26 Feb 07 jari 538                     setEnableMenuItem("Edit", (text.indexOf("value") != -1));
2 26 Feb 07 jari 539                 } else {
2 26 Feb 07 jari 540                     setEnableMenuItem("Edit", false);
2 26 Feb 07 jari 541                 }
2 26 Feb 07 jari 542                 setEnableMenuItem("Clear Overlay", highlightPanel.haveOverlay());
2 26 Feb 07 jari 543                 popup.show(pane, me.getX(), me.getY());
2 26 Feb 07 jari 544             }
2 26 Feb 07 jari 545         }
2 26 Feb 07 jari 546         
2 26 Feb 07 jari 547     }
2 26 Feb 07 jari 548     
2 26 Feb 07 jari 549     private class MenuListener implements ActionListener {
2 26 Feb 07 jari 550         
2 26 Feb 07 jari 551         
2 26 Feb 07 jari 552         public void actionPerformed(ActionEvent ae) {
2 26 Feb 07 jari 553             String cmd = ae.getActionCommand();
2 26 Feb 07 jari 554             if(cmd.equals("edit-cmd")) {
2 26 Feb 07 jari 555                 String text = pane.getSelectedText();
2 26 Feb 07 jari 556                 if(text == null)
2 26 Feb 07 jari 557                     return;
2 26 Feb 07 jari 558                 int start = pane.getSelectionStart();
2 26 Feb 07 jari 559                 
2 26 Feb 07 jari 560                 String newText = new String(text);
2 26 Feb 07 jari 561                 Hashtable attributes  = getAlgorithmAttributes(start);
2 26 Feb 07 jari 562                 String algName = (String)(attributes.get("alg_name"));
2 26 Feb 07 jari 563                 ScriptValueChangeDialog dialog = new ScriptValueChangeDialog(newText, algName, manager);
2 26 Feb 07 jari 564                 if(dialog.showModal() == JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 565                     newText = dialog.getLine();
2 26 Feb 07 jari 566
2 26 Feb 07 jari 567                     String value = dialog.getValue();
2 26 Feb 07 jari 568                     if(value != null) {
2 26 Feb 07 jari 569                         if(doc.modifyParameter(attributes, dialog.getLine(), dialog.getValue())) {
2 26 Feb 07 jari 570                             doc.updateScript();
2 26 Feb 07 jari 571                             pane.setText(doc.toString());
2 26 Feb 07 jari 572                             pane.setCaretPosition(start);
2 26 Feb 07 jari 573                         } else {
2 26 Feb 07 jari 574
2 26 Feb 07 jari 575                         }
2 26 Feb 07 jari 576                     }
2 26 Feb 07 jari 577                     try {
2 26 Feb 07 jari 578                         pane.getHighlighter().addHighlight(start, start+newText.length(), new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(new Color(120,160,210)));
2 26 Feb 07 jari 579                     } catch (BadLocationException ble) { }
2 26 Feb 07 jari 580                     
2 26 Feb 07 jari 581                     pane.select(start, start+newText.length());
2 26 Feb 07 jari 582                     
2 26 Feb 07 jari 583                 }
2 26 Feb 07 jari 584             } else if(cmd.equals("clear-overlay-cmd")) {
2 26 Feb 07 jari 585                 mark(-1,-1);
2 26 Feb 07 jari 586             } else if(cmd.equals("mark-algorithm-cmd")) {
2 26 Feb 07 jari 587                 
2 26 Feb 07 jari 588             } else if(cmd.equals("save-cmd")) {
2 26 Feb 07 jari 589                 saveScript();
2 26 Feb 07 jari 590             }
2 26 Feb 07 jari 591         }
2 26 Feb 07 jari 592         
2 26 Feb 07 jari 593     }
2 26 Feb 07 jari 594     
2 26 Feb 07 jari 595     
2 26 Feb 07 jari 596     public class LineNumberPanel extends JPanel {
2 26 Feb 07 jari 597         
2 26 Feb 07 jari 598         boolean newHeight = false;
2 26 Feb 07 jari 599         JList list;
2 26 Feb 07 jari 600         DefaultListModel model;
2 26 Feb 07 jari 601         int lineHeight;
2 26 Feb 07 jari 602         
2 26 Feb 07 jari 603         public LineNumberPanel() {
2 26 Feb 07 jari 604             super(new GridBagLayout());
2 26 Feb 07 jari 605             list = new JList();
2 26 Feb 07 jari 606             list.setAlignmentX(JList.RIGHT_ALIGNMENT);
2 26 Feb 07 jari 607             
2 26 Feb 07 jari 608             model = new DefaultListModel();
2 26 Feb 07 jari 609             list.setModel(model);
2 26 Feb 07 jari 610             list.setCellRenderer(new NumberPanelCellRenderer());
2 26 Feb 07 jari 611             
2 26 Feb 07 jari 612             list.setForeground(Color.red);
2 26 Feb 07 jari 613             list.setFont(vFont);
2 26 Feb 07 jari 614             setFont(vFont);
2 26 Feb 07 jari 615             list.setBackground(Color.lightGray);
2 26 Feb 07 jari 616             list.setVisibleRowCount(0);
2 26 Feb 07 jari 617             list.setVisible(true);
2 26 Feb 07 jari 618             
2 26 Feb 07 jari 619             FontMetrics fm = pane.getFontMetrics(pane.getFont());
2 26 Feb 07 jari 620             list.setFixedCellHeight(fm.getHeight());
2 26 Feb 07 jari 621             lineHeight = list.getFixedCellHeight();
2 26 Feb 07 jari 622             setPreferredSize(new Dimension(10,10));
2 26 Feb 07 jari 623             add(list, new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0));
2 26 Feb 07 jari 624             if(!editOnly) {
2 26 Feb 07 jari 625                 list.addMouseListener(new LineNumberListener());
2 26 Feb 07 jari 626                 this.addMouseListener(new LineNumberListener());
2 26 Feb 07 jari 627             }
2 26 Feb 07 jari 628         }
2 26 Feb 07 jari 629         
2 26 Feb 07 jari 630         public void setHeight(int h) {
2 26 Feb 07 jari 631             boolean bigger = false;
2 26 Feb 07 jari 632             newHeight = true;
2 26 Feb 07 jari 633             
2 26 Feb 07 jari 634             if(h > model.size()+1) {
2 26 Feb 07 jari 635                 bigger = true;
2 26 Feb 07 jari 636                 JLabel label;
2 26 Feb 07 jari 637                 newHeight = true;
2 26 Feb 07 jari 638                 for(int i = model.size()+1; i < h; i++) {
2 26 Feb 07 jari 639                     label = new JLabel(String.valueOf(i));
2 26 Feb 07 jari 640                     label.setFont(vFont);
2 26 Feb 07 jari 641                     label.setBorder(BorderFactory.createEmptyBorder(0,3,0,3));
2 26 Feb 07 jari 642                     label.setHorizontalAlignment(JLabel.RIGHT);
2 26 Feb 07 jari 643                     label.setHorizontalTextPosition(JLabel.RIGHT);
2 26 Feb 07 jari 644                     model.addElement(label);
2 26 Feb 07 jari 645                 }
2 26 Feb 07 jari 646             }
2 26 Feb 07 jari 647             list.setVisibleRowCount(h);
2 26 Feb 07 jari 648         }
2 26 Feb 07 jari 649         
2 26 Feb 07 jari 650         public void clearSelection() {
2 26 Feb 07 jari 651             list.clearSelection();
2 26 Feb 07 jari 652         }
2 26 Feb 07 jari 653         
2 26 Feb 07 jari 654         public void paint(Graphics g) {
2 26 Feb 07 jari 655             
2 26 Feb 07 jari 656             super.paint(g);
2 26 Feb 07 jari 657             
2 26 Feb 07 jari 658             if(newHeight) {
2 26 Feb 07 jari 659                 newHeight = false;
2 26 Feb 07 jari 660                 
2 26 Feb 07 jari 661                 
2 26 Feb 07 jari 662                 // String s = (String)model.elementAt(model.size()-1);
2 26 Feb 07 jari 663                 
2 26 Feb 07 jari 664                 String s = ((JLabel)(model.elementAt(model.size()-1))).getText();
2 26 Feb 07 jari 665                 int space = 8;
2 26 Feb 07 jari 666                 
2 26 Feb 07 jari 667                 
2 26 Feb 07 jari 668                 if(g != null) {
2 26 Feb 07 jari 669                     FontMetrics metrics = g.getFontMetrics();
2 26 Feb 07 jari 670                     metrics.stringWidth(s);
2 26 Feb 07 jari 671                     list.setSize(metrics.stringWidth(s)+space, pane.getHeight());
2 26 Feb 07 jari 672                     list.setPreferredSize(new Dimension(metrics.stringWidth(s)+space, pane.getHeight()));
2 26 Feb 07 jari 673                     setSize(metrics.stringWidth(s)+space, pane.getHeight());
2 26 Feb 07 jari 674                     setPreferredSize(new Dimension(metrics.stringWidth(s)+space, pane.getHeight()));
2 26 Feb 07 jari 675                 }
2 26 Feb 07 jari 676             }
2 26 Feb 07 jari 677         }
2 26 Feb 07 jari 678         
2 26 Feb 07 jari 679         public class NumberPanelCellRenderer implements ListCellRenderer {
2 26 Feb 07 jari 680             
2 26 Feb 07 jari 681             Icon selIcon;
2 26 Feb 07 jari 682             JLabel selectedLabel;
2 26 Feb 07 jari 683             
2 26 Feb 07 jari 684             public NumberPanelCellRenderer() {
2 26 Feb 07 jari 685                 selIcon = GUIFactory.getIcon("TreeBallLeaf.gif");
2 26 Feb 07 jari 686                 selectedLabel = new JLabel(selIcon);
2 26 Feb 07 jari 687                 selectedLabel.setBackground(Color.gray);
2 26 Feb 07 jari 688                 selectedLabel.setOpaque(true);
2 26 Feb 07 jari 689                 selectedLabel.setBorder(BorderFactory.createEmptyBorder(0,3,0,3));
2 26 Feb 07 jari 690                 selectedLabel.setIconTextGap(0);
2 26 Feb 07 jari 691                 selectedLabel.setHorizontalAlignment(JLabel.RIGHT);
2 26 Feb 07 jari 692                 selectedLabel.setHorizontalTextPosition(JLabel.RIGHT);
2 26 Feb 07 jari 693             }
2 26 Feb 07 jari 694             
2 26 Feb 07 jari 695             public java.awt.Component getListCellRendererComponent(javax.swing.JList jList, Object obj, int param, boolean selected, boolean param4) {
2 26 Feb 07 jari 696                 if(selected && !editOnly)
2 26 Feb 07 jari 697                     return selectedLabel;
2 26 Feb 07 jari 698                 return  (JLabel)obj;
2 26 Feb 07 jari 699             }
2 26 Feb 07 jari 700             
2 26 Feb 07 jari 701         }
2 26 Feb 07 jari 702         
2 26 Feb 07 jari 703         public class LineNumberListener extends MouseAdapter {
2 26 Feb 07 jari 704             public void mouseClicked(MouseEvent me) {
2 26 Feb 07 jari 705                 int [] indices = list.getSelectedIndices();
2 26 Feb 07 jari 706                 int curStart, curEnd;
2 26 Feb 07 jari 707                 if(indices != null){
2 26 Feb 07 jari 708                     try {
2 26 Feb 07 jari 709                         curStart = pane.getLineStartOffset(indices[0]);
2 26 Feb 07 jari 710                         curEnd = pane.getLineEndOffset(indices[indices.length-1]);
2 26 Feb 07 jari 711                         pane.getHighlighter().removeAllHighlights();
2 26 Feb 07 jari 712                         pane.getHighlighter().addHighlight(curStart, curEnd, new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(new Color(120,160,210)));
2 26 Feb 07 jari 713                         
2 26 Feb 07 jari 714                     } catch (BadLocationException ble) { return; }
2 26 Feb 07 jari 715                     pane.select(curStart, curEnd);
2 26 Feb 07 jari 716                     pane.repaint();
2 26 Feb 07 jari 717                 }
2 26 Feb 07 jari 718             }
2 26 Feb 07 jari 719             
2 26 Feb 07 jari 720             public void mouseReleased(MouseEvent me) {
2 26 Feb 07 jari 721                 int [] indices = list.getSelectedIndices();
2 26 Feb 07 jari 722                 int curStart, curEnd;
2 26 Feb 07 jari 723                 if(indices != null){
2 26 Feb 07 jari 724                     try {
2 26 Feb 07 jari 725                         curStart = pane.getLineStartOffset(indices[0]);
2 26 Feb 07 jari 726                         curEnd = pane.getLineEndOffset(indices[indices.length-1]);
2 26 Feb 07 jari 727                         pane.getHighlighter().removeAllHighlights();
2 26 Feb 07 jari 728                         pane.getHighlighter().addHighlight(curStart, curEnd, new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(new Color(120,160,210)));
2 26 Feb 07 jari 729                         
2 26 Feb 07 jari 730                     } catch (BadLocationException ble) { return; }
2 26 Feb 07 jari 731                     pane.select(curStart, curEnd);
2 26 Feb 07 jari 732                     pane.repaint();
2 26 Feb 07 jari 733                 }
2 26 Feb 07 jari 734             }
2 26 Feb 07 jari 735             
2 26 Feb 07 jari 736             
2 26 Feb 07 jari 737             
2 26 Feb 07 jari 738         }
2 26 Feb 07 jari 739     }
2 26 Feb 07 jari 740     
2 26 Feb 07 jari 741     
2 26 Feb 07 jari 742     
2 26 Feb 07 jari 743     public class HighlightPanel extends JPanel {
2 26 Feb 07 jari 744         int start, end, top, bottom;
2 26 Feb 07 jari 745         boolean algOverlay;
2 26 Feb 07 jari 746         
2 26 Feb 07 jari 747         public HighlightPanel() {
2 26 Feb 07 jari 748             super();
2 26 Feb 07 jari 749             super.setBackground(Color.white);
2 26 Feb 07 jari 750             setBackground(Color.white);
2 26 Feb 07 jari 751             algOverlay = false;
2 26 Feb 07 jari 752             start = end = -1;
2 26 Feb 07 jari 753         }
2 26 Feb 07 jari 754         
2 26 Feb 07 jari 755         public void setSelection(int s, int e) {
2 26 Feb 07 jari 756             start = s;
2 26 Feb 07 jari 757             end = e;
2 26 Feb 07 jari 758             algOverlay = e>s;
2 26 Feb 07 jari 759         }
2 26 Feb 07 jari 760         
2 26 Feb 07 jari 761         public boolean haveOverlay() {
2 26 Feb 07 jari 762             return algOverlay;
2 26 Feb 07 jari 763         }
2 26 Feb 07 jari 764         
2 26 Feb 07 jari 765         public void paint(Graphics g) {
2 26 Feb 07 jari 766             super.paint(g);
2 26 Feb 07 jari 767             if(start > 0) {
2 26 Feb 07 jari 768                 Color color = g.getColor();
2 26 Feb 07 jari 769                 Graphics2D g2 = (Graphics2D)g;
2 26 Feb 07 jari 770                 Composite composite = g2.getComposite();
2 26 Feb 07 jari 771                 g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f));
2 26 Feb 07 jari 772                 g.setColor(Color.green);
2 26 Feb 07 jari 773                 g.fillRect(0, start*numPanel.lineHeight, getWidth(), (end-start)*numPanel.lineHeight);
2 26 Feb 07 jari 774                 g.setColor(color);
2 26 Feb 07 jari 775                 g2.setComposite(composite);
2 26 Feb 07 jari 776             }
2 26 Feb 07 jari 777         }
2 26 Feb 07 jari 778     }
2 26 Feb 07 jari 779     
2 26 Feb 07 jari 780     public class ScriptListener implements ScriptEventListener {
2 26 Feb 07 jari 781         
2 26 Feb 07 jari 782         public void documentChanged(ScriptDocumentEvent event) {
2 26 Feb 07 jari 783             updateSize();
2 26 Feb 07 jari 784         }
2 26 Feb 07 jari 785         
2 26 Feb 07 jari 786     }
2 26 Feb 07 jari 787     
2 26 Feb 07 jari 788 }