Changeset 1290


Ignore:
Timestamp:
08/17/06 20:49:21 (14 years ago)
Author:
chris
Message:

VariableTextEditor (NEW):
1) an abstract super class for the TextComponent editors
for table cells. Takes care of most of the listening.

VariableTextAreaEditor (NEW):
1) extends VariableTextEditor for TextAreas
2) changes the stopping of editing to happen only
if the textarea loses focus, instead of when the mouse
leaves the textarea's bounds. much better this way.

VariableTextFieldEditor (NEW):
1) extends VariableTextEditor for TextFields

VariableComboEditor:
1) got rid of all the textfield/textarea junk which is
now in seperate classes, as specified above. Now this
class only handles the comboboxes

ClickableTable.java:
1) override of getCellEditor method... by doing it this
way we segment the various types of editing components
we wish to use and the code is much more elegant/
readable

MetadataNotebook:
1) fixed bug with "New" menuitem that it failed to ask
if you wanted to make a new file without saving the
previous one when changes were made

MetadataPane:
1) changes resulting from the migration to seperate
CellEditor classes
2) .ome files are now searched for the first pixel image
just like .tiff are... this is kind of hacky code

Location:
trunk/loci/ome/notebook
Files:
3 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/ome/notebook/ClickableTable.java

    r1268 r1290  
    8282//same tagname on a given level of the node tree 
    8383  private boolean isDuplicate; 
     84   
     85//the TableCellRenderers for this ClickableTable 
     86  protected TableCellRenderer labelR,textR,comboR,gotoR; 
     87   
     88  protected TableCellEditor labelE,textE,comboE,gotoE; 
    8489 
    8590  // -- ClickableTable Constructors -- 
    8691 
    87   public ClickableTable(TableModel model, MetadataPane.TablePanel tablePanel) { 
     92  public ClickableTable(TableModel model, MetadataPane.TablePanel tablePanel, 
     93    VariableComboEditor vcEdit) 
     94  { 
    8895    super(model); 
    8996     
     97    labelR = new DefaultTableCellRenderer(); 
     98    comboR = new VariableComboRenderer(); 
     99    textR = new VariableTextAreaRenderer(); 
     100    gotoR = new GotoRenderer(); 
     101     
     102    labelE = new VariableTextFieldEditor(tablePanel); 
     103    vcEdit.refTable = this; 
     104    comboE = vcEdit; 
     105    textE = new VariableTextAreaEditor(tablePanel); 
     106    gotoE = new GotoEditor(tablePanel); 
     107 
    90108    addMouseListener(this); 
    91109 
     
    159177    return tip; 
    160178  } 
     179   
     180  public String getCellType(int row, int column) { 
     181    TableModel tModel = getModel(); 
     182   
     183    Vector fullList = DOMUtil.getChildElements("OMEAttribute",tp.el); 
     184    Element templateE = null; 
     185    for (int i = 0;i<fullList.size();i++) { 
     186      Element thisE = (Element) fullList.get(i); 
     187      String nameAttr = thisE.getAttribute("XMLName"); 
     188      if(thisE.hasAttribute("Name")) nameAttr = thisE.getAttribute("Name"); 
     189      if(nameAttr.equals((String) tModel.getValueAt(row, 0))) templateE = thisE;       
     190    } 
     191     
     192    String cellType = null; 
     193     
     194    if(templateE.hasAttribute("Type")) cellType = templateE.getAttribute("Type"); 
     195     
     196    return cellType; 
     197        } 
     198   
     199  public TableCellRenderer getCellRenderer(int row, int column) {                          
     200    if (column == 1) { 
     201      String cellType = getCellType(row,column); 
     202     
     203            if(cellType != null) {  
     204                    if(cellType.equals("Ref")) { 
     205                      return comboR; 
     206                    } 
     207                    else if(cellType.equals("Desc")) { 
     208                      return textR; 
     209                    } 
     210                    else { 
     211                      return labelR; 
     212                    }  
     213            } 
     214            else { 
     215              return labelR; 
     216            } 
     217          } 
     218          else if (column == 2) { 
     219            return gotoR; 
     220          } 
     221          else return labelR; 
     222        } 
     223         
     224        public TableCellEditor getCellEditor(int row, int column) { 
     225          if (column == 1) { 
     226      String cellType = getCellType(row,column); 
     227     
     228            if(cellType != null) {  
     229                    if(cellType.equals("Ref")) { 
     230                      return comboE; 
     231                    } 
     232                    else if(cellType.equals("Desc")) { 
     233                      return textE; 
     234                    } 
     235                    else { 
     236                      return labelE; 
     237                    }  
     238            } 
     239            else { 
     240              return labelE; 
     241            } 
     242          } 
     243          else if (column == 2) { 
     244            return gotoE; 
     245          } 
     246          else return labelE; 
     247        } 
    161248 
    162249   
  • trunk/loci/ome/notebook/MetadataNotebook.java

    r1268 r1290  
    226226  public void actionPerformed(ActionEvent e) { 
    227227    String cmd = e.getActionCommand(); 
    228     if ("new".equals(cmd)) { 
    229       setTitle("OME Metadata Notebook"); 
    230       currentFile = null; 
    231       metadata.setupTabs(); 
     228    if ("new".equals(cmd)) {       
     229      if (metadata.getState()) { 
     230        Object[] options = {"Yes, do it!", 
     231                    "No thanks."}; 
     232                                int n = JOptionPane.showOptionDialog(this, 
     233                            "Are you sure you want to create\n" + 
     234                            "a new file without saving your\n" + 
     235                            "changes to the current file?", 
     236                            "Current File Not Saved", 
     237                            JOptionPane.YES_NO_OPTION, 
     238                            JOptionPane.QUESTION_MESSAGE, 
     239                            null,     //don't use a custom Icon 
     240                            options,  //the titles of buttons 
     241                            options[0]); //default button title 
     242                          if (n == JOptionPane.YES_OPTION) { 
     243                                        setTitle("OME Metadata Notebook"); 
     244          currentFile = null; 
     245          metadata.setupTabs(); 
     246                          } 
     247      } 
     248      else { 
     249              setTitle("OME Metadata Notebook"); 
     250              currentFile = null; 
     251              metadata.setupTabs(); 
     252      } 
    232253    } 
    233254    if ("open".equals(cmd)) { 
  • trunk/loci/ome/notebook/MetadataPane.java

    r1278 r1290  
    319319                                setOMEXML(ome); 
    320320      } 
     321      else if (file.getPath().endsWith(".ome")) { 
     322                // TIFF file 
     323        originalTIFF = null; 
     324         
     325        OMENode ome = null; 
     326               
     327              try { 
     328                      ImageReader reader = new ImageReader(); 
     329                                        OMEXMLMetadataStore ms = new OMEXMLMetadataStore(); 
     330                                        reader.setMetadataStore(ms);  // tells reader to write metadata as it's being parsed to an OMENode (DOM in memory) 
     331                                        String id = file.getPath(); 
     332                                         
     333                                  img = reader.openImage(id, 0); // gets first image from the file 
     334                                        int width = 50, height = 50; 
     335                                        thumb = ImageTools.scale(img, width, height); 
     336                                        ome = (OMENode) ms.getRoot(); 
     337                                } 
     338                                catch (Exception exc) { 
     339                                  exc.printStackTrace(); 
     340                                } 
     341                                 
     342        String s = new String(header).trim(); 
     343        if (s.startsWith("<?xml") || s.startsWith("<OME")) { 
     344          // raw OME-XML 
     345          byte[] data = new byte[(int) file.length()]; 
     346          System.arraycopy(header, 0, data, 0, 8); 
     347          in.readFully(data, 8, data.length - 8); 
     348          in.close(); 
     349          setOMEXML(new String(data)); 
     350        } 
     351        else return false; 
     352//                              setOMEXML(ome); 
     353      } 
    321354      else { 
    322355        originalTIFF = null; 
     
    336369       
    337370      currentFile = file; 
     371      in.close(); 
    338372      return true; 
    339373    } 
     
    10571091    private JButton noteButton; 
    10581092    protected Vector attrList, refList; 
    1059     protected TableCellRenderer labelR,textR,comboR,gotoR; 
    10601093 
    10611094    public TablePanel(Element e, TabPanel tp, OMEXMLNode on) { 
    1062       labelR = new DefaultTableCellRenderer(); 
    1063       comboR = new VariableComboRenderer(); 
    1064       textR = new VariableTextAreaRenderer(); 
    1065       gotoR = new GotoRenderer(); 
    1066  
    10671095      isTopLevel = false; 
    10681096       
     
    11601188      }; 
    11611189       
    1162       table = new ClickableTable(myTableModel, this) { 
    1163         public TableCellRenderer getCellRenderer(int row, int column) {                    
    1164           if (column == 1) { 
    1165                                     TableModel tModel = table.getModel(); 
    1166                                    
    1167                                     Vector fullList = DOMUtil.getChildElements("OMEAttribute",el); 
    1168                                     Element templateE = null; 
    1169                                     for (int i = 0;i<fullList.size();i++) { 
    1170                                       Element thisE = (Element) fullList.get(i); 
    1171                                       String nameAttr = thisE.getAttribute("XMLName"); 
    1172                                       if(thisE.hasAttribute("Name")) nameAttr = thisE.getAttribute("Name"); 
    1173                                       if(nameAttr.equals((String) tModel.getValueAt(row, 0))) templateE = thisE;       
    1174                                     } 
    1175                                      
    1176                                     String cellType = null; 
    1177                                      
    1178                                     if(templateE.hasAttribute("Type")) cellType = templateE.getAttribute("Type");      
    1179                  
    1180                                     if(cellType != null) {  
    1181                                             if(cellType.equals("Ref")) { 
    1182                                               return comboR; 
    1183                                             } 
    1184                                             else if(cellType.equals("Desc")) { 
    1185                                               return textR; 
    1186                                             } 
    1187                                             else { 
    1188                                               return labelR; 
    1189                                             }  
    1190                                     } 
    1191                                     else { 
    1192                                       return labelR; 
    1193                                     } 
    1194                                   } 
    1195                                   else if (column == 2) { 
    1196                                     return gotoR; 
    1197                                   } 
    1198                                   else return labelR; 
    1199                   } 
    1200                         }; 
     1190      VariableComboEditor vcEdit = new VariableComboEditor(panelsWithID, 
     1191          addItems, this, internalDefs); 
     1192       
     1193      table = new ClickableTable(myTableModel, this, vcEdit); 
    12011194//      table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF ); 
    12021195      table.getColumnModel().getColumn(0).setPreferredWidth(125); 
     
    13551348        } 
    13561349 
     1350/* 
    13571351        refColumn.setCellEditor(new VariableComboEditor(panelsWithID, 
    13581352          addItems, this, internalDefs)); 
    13591353        TableColumn gotoColumn = table.getColumnModel().getColumn(2); 
    13601354        gotoColumn.setCellEditor(new GotoEditor(this)); 
     1355*/ 
    13611356      } 
    13621357    } 
  • trunk/loci/ome/notebook/VariableComboEditor.java

    r1268 r1290  
    4343import java.awt.event.MouseEvent; 
    4444 
    45 import javax.swing.event.DocumentListener; 
    46 import javax.swing.event.DocumentEvent; 
    47  
    4845import java.util.Hashtable; 
    4946import java.util.Vector; 
     
    5350import org.w3c.dom.Element; 
    5451 
    55 /** 
    56  * A class that allows a table to have comboboxes 
    57  * that have different selections depending on the row 
    58  * specified, e.g. a row with "Group" that's a reference 
    59  * should only have LSID selections that are also Groups 
    60  * 
    61  * also, non-ref cells are given a JTextField editor 
    62  * 
    63  * this class handles all of the actual editting of the 
    64  * XML Node tree as well 
    65  * 
    66  * @author Christopher Peterson crpeterson2 at wisc.edu 
    67  */ 
    6852public class VariableComboEditor extends AbstractCellEditor 
    6953  implements TableCellEditor, ActionListener,  
    70   DocumentListener, FocusListener, MouseListener 
     54  FocusListener, MouseListener 
    7155{ 
    7256 
     
    8670  //holds the current combobox needed when the cell is clicked 
    8771  private JRowBox box; 
    88    
    89   //holds the current label needed when a non-ref cell is clicked 
    90   private JTextField text; 
    9172 
    9273  //holds the table of references this cell editor is for 
    93   private JTable refTable; 
     74  protected JTable refTable; 
    9475   
    9576  //holds internal reference data found in the ome-xml file 
     
    120101    addPanels = AddP; 
    121102    tableP = tp; 
     103    refTable = tp.table; 
    122104    oNode = tp.oNode; 
    123105    box = new JRowBox(-1); 
    124     text = new JTextField(); 
    125106    iDefs = internalDefs; 
    126107  } 
     
    154135    boolean isSelected, int row, int column) 
    155136  { 
    156     refTable = table; 
    157137    TableModel tModel = table.getModel(); 
    158138   
    159     Vector fullList = DOMUtil.getChildElements("OMEAttribute",tableP.el); 
    160     Element templateE = null; 
    161     for (int i = 0;i<fullList.size();i++) { 
    162       Element thisE = (Element) fullList.get(i); 
    163       String nameAttr = thisE.getAttribute("XMLName"); 
    164       if(thisE.hasAttribute("Name")) nameAttr = thisE.getAttribute("Name"); 
    165       if(nameAttr.equals((String) tModel.getValueAt(row, 0))) templateE = thisE;       
    166     } 
     139    //use parameters to get information about the cell being edited 
     140    JRowBox thisBox = new JRowBox(row); 
     141    thisBox.addFocusListener(this); 
    167142     
    168     String cellType = null; 
    169     if(templateE.hasAttribute("Type")) cellType = templateE.getAttribute("Type"); 
    170      
    171     if (cellType == null) { 
    172       JTextField thisText = new JTextField(new RowDoc(row), (String) value, 1); 
    173       thisText.setEditable(true); 
    174       thisText.getDocument().addDocumentListener(this); 
    175       thisText.addFocusListener(this); 
    176       thisText.addMouseListener(this); 
    177       return thisText; 
    178     } 
    179     else { 
    180       if (cellType.equals("Ref")) { 
    181         //use parameters to get information about the cell being edited 
    182                     JRowBox thisBox = new JRowBox(row); 
    183                     thisBox.addFocusListener(this); 
    184                      
    185                     //tagname of the node associated with this table 
    186                     String eleName = oNode.getDOMElement().getTagName(); 
    187                     //name of the attribute being edited 
    188                     String attrName = (String) tModel.getValueAt(row, 0); 
    189                     //get the sub-hashtable for the key associated with this tablepanel's 
    190                     //OMEXMLNode... check internal defs first, then external defs 
    191                     Hashtable subHash = (Hashtable) iDefs.get(eleName); 
    192                     if (subHash == null) subHash = (Hashtable) REF_HASH.get(eleName); 
    193                     if (subHash != null) { 
    194                       //get the string representation of the type this attribute should 
    195                       //refer to 
    196                       String type = (String) subHash.get(attrName); 
    197                       if (type != null) { 
    198                         //check the list of internal references for nodes of the 
    199                         //type that we just found 
    200                         for(int i = 0;i<idPanels.size();i++) { 
    201                           MetadataPane.TablePanel tp = 
    202                             (MetadataPane.TablePanel) idPanels.get(i); 
    203                           String tpClass = tp.oNode.getClass().getName(); 
    204                           boolean isCorrectType = 
    205                             tpClass.equals("org.openmicroscopy.xml.st." + type + "Node"); 
    206                           //if the node is of the right type, add it to the combobox 
    207                           if (isCorrectType) thisBox.addItem(tp.name); 
    208                         } 
    209                  
    210                          //check the list of external references for references of 
    211                          //the appropriate type 
    212                         for(int i = 0;i<addPanels.size();i++) { 
    213                           String thisExID = (String) addPanels.get(i); 
    214                           if (thisExID.indexOf(":" + type + ":") >= 0) { 
    215                             //add this external reference to the combobox 
    216                             thisBox.addItem(thisExID); 
    217                           } 
    218                         } 
    219                       } 
    220                       //if no type is found for this attribute, add all internal/external 
    221                       //reference options to the combobox 
    222                       else addAll(thisBox); 
    223                     } 
    224                     //if no attributes are found for this element, add all references  
    225                     else addAll(thisBox); 
    226                  
    227                     //listen to changes in this combobox 
    228                     thisBox.addActionListener(this); 
    229                                 //set the initial item in the combobox based on the parameter "value" 
    230                     thisBox.setSelectedItem(value); 
    231                  
    232                     return thisBox; 
     143    //tagname of the node associated with this table 
     144    String eleName = oNode.getDOMElement().getTagName(); 
     145    //name of the attribute being edited 
     146    String attrName = (String) tModel.getValueAt(row, 0); 
     147    //get the sub-hashtable for the key associated with this tablepanel's 
     148    //OMEXMLNode... check internal defs first, then external defs 
     149    Hashtable subHash = (Hashtable) iDefs.get(eleName); 
     150    if (subHash == null) subHash = (Hashtable) REF_HASH.get(eleName); 
     151    if (subHash != null) { 
     152      //get the string representation of the type this attribute should 
     153      //refer to 
     154      String type = (String) subHash.get(attrName); 
     155      if (type != null) { 
     156        //check the list of internal references for nodes of the 
     157        //type that we just found 
     158        for(int i = 0;i<idPanels.size();i++) { 
     159          MetadataPane.TablePanel tp = 
     160            (MetadataPane.TablePanel) idPanels.get(i); 
     161          String tpClass = tp.oNode.getClass().getName(); 
     162          boolean isCorrectType = 
     163            tpClass.equals("org.openmicroscopy.xml.st." + type + "Node"); 
     164          //if the node is of the right type, add it to the combobox 
     165          if (isCorrectType) thisBox.addItem(tp.name); 
     166        } 
     167 
     168         //check the list of external references for references of 
     169         //the appropriate type 
     170        for(int i = 0;i<addPanels.size();i++) { 
     171          String thisExID = (String) addPanels.get(i); 
     172          if (thisExID.indexOf(":" + type + ":") >= 0) { 
     173            //add this external reference to the combobox 
     174            thisBox.addItem(thisExID); 
     175          } 
     176        } 
    233177      } 
    234       else if (cellType.equals("Desc")) { 
    235         table.setRowHeight(row, table.getRowHeight() * 4); 
    236                                 JTextArea thisText = new JTextArea(new RowDoc(row), (String) value, 1, 4); 
    237                                 thisText.setLineWrap(true); 
    238         thisText.setWrapStyleWord(true); 
    239               thisText.setEditable(true); 
    240               thisText.getDocument().addDocumentListener(this); 
    241               thisText.addFocusListener(this); 
    242               thisText.addMouseListener(this); 
    243               JScrollPane jScr = new JScrollPane(thisText); 
    244 //        jScr.setSize(jScr.getSize().width,jScr.getSize().height * 4);  
    245               return jScr; 
    246       } 
    247       else return null; 
    248     } 
    249    } 
    250     
    251    public void setNode(int row, String value) { 
    252      TableModel tModel = refTable.getModel(); 
    253      String attrName = (String) tModel.getValueAt(row, 0); 
    254      if (value == null || value.equals("") ) { 
    255        if(oNode.getDOMElement().hasAttribute(attrName))  
    256          oNode.getDOMElement().removeAttribute(attrName); 
    257      } 
    258      else { 
    259              if (attrName.endsWith("CharData") ) { 
    260                DOMUtil.setCharacterData(value, oNode.getDOMElement()); 
    261              } 
    262              else oNode.setAttribute(attrName, value); 
    263      } 
    264    } 
     178      //if no type is found for this attribute, add all internal/external 
     179      //reference options to the combobox 
     180      else addAll(thisBox); 
     181    } 
     182    //if no attributes are found for this element, add all references  
     183    else addAll(thisBox); 
     184 
     185    //listen to changes in this combobox 
     186    thisBox.addActionListener(this); 
     187                //set the initial item in the combobox based on the parameter "value" 
     188    thisBox.setSelectedItem(value); 
     189 
     190    return thisBox; 
     191  } 
    265192 
    266193// -- EventListener API -- 
    267194 
    268   //okay I know this gets ugly, but I didn't code tables to be this way! 
    269195  public void actionPerformed(ActionEvent e) { 
    270196    if( e.getSource() instanceof JRowBox) { 
     
    318244      fireEditingStopped(); 
    319245    } 
    320     if (e.getSource() instanceof JTextField) { 
    321       text = (JTextField) e.getSource(); 
    322       try { 
    323         result = text.getDocument().getText(0,  
    324           text.getDocument().getLength()); 
    325       } 
    326       catch (Exception exc) {System.out.println(exc);} 
    327       System.out.println("Text Action: " + result); 
    328       fireEditingStopped(); 
    329     } 
    330   } 
    331    
    332   public void insertUpdate(DocumentEvent e) { 
    333     try { 
    334       result = e.getDocument().getText(0,  
    335         e.getDocument().getLength()); 
    336     } 
    337     catch (Exception exc) {System.out.println(exc);} 
    338     RowDoc rd = (RowDoc) e.getDocument(); 
    339     setNode(rd.row, result); 
    340     tableP.callStateChanged(true); 
    341   } 
    342    
    343   public void removeUpdate(DocumentEvent e) { 
    344     try { 
    345       result = e.getDocument().getText(0,  
    346         e.getDocument().getLength()); 
    347     } 
    348     catch (Exception exc) {System.out.println(exc);} 
    349     RowDoc rd = (RowDoc) e.getDocument(); 
    350     setNode(rd.row, result); 
    351     tableP.callStateChanged(true); 
    352   } 
    353    
    354   public void changedUpdate(DocumentEvent e) { 
    355     try { 
    356       result = e.getDocument().getText(0,  
    357         e.getDocument().getLength()); 
    358     } 
    359     catch (Exception exc) {System.out.println(exc);} 
    360     RowDoc rd = (RowDoc) e.getDocument(); 
    361     setNode(rd.row, result); 
    362     tableP.callStateChanged(true); 
    363246  } 
    364247   
    365248  public void focusGained(FocusEvent e) { 
    366     if (e.getSource() instanceof JTextField) { 
    367       JTextField field = (JTextField) e.getSource(); 
    368       try { 
    369         result = field.getDocument().getText(0,  
    370           field.getDocument().getLength()); 
    371       } 
    372       catch (Exception exc) {System.out.println(exc);} 
    373     } 
    374     else if (e.getSource() instanceof JRowBox) { 
     249    if (e.getSource() instanceof JRowBox) { 
    375250      JRowBox thisBox = (JRowBox) e.getSource(); 
    376251      result = (String) thisBox.getSelectedItem(); 
    377252    } 
    378     else if (e.getSource() instanceof JTextArea) { 
    379       JTextArea field = (JTextArea) e.getSource(); 
    380       try { 
    381         result = field.getDocument().getText(0,  
    382           field.getDocument().getLength()); 
    383       } 
    384       catch (Exception exc) {System.out.println(exc);} 
    385     } 
    386   } 
    387    
    388   public void focusLost(FocusEvent e) { 
    389  
    390   } 
     253  } 
     254   
     255  public void focusLost(FocusEvent e) {} 
    391256 
    392257  public void mousePressed(MouseEvent e) { 
    393           if (e.getSource() instanceof JTextField && 
    394       e.getButton() == MouseEvent.BUTTON1) 
    395     { 
    396                   JTextField field = (JTextField) e.getSource(); 
    397                   try { 
    398                     result = field.getDocument().getText(0,  
    399                       field.getDocument().getLength()); 
    400                   } 
    401                   catch (Exception exc) {System.out.println(exc);} 
    402           } 
    403258          if (e.getSource() instanceof JRowBox && 
    404259    e.getButton() == MouseEvent.BUTTON1) { 
     
    406261      result = (String) thisBox.getSelectedItem(); 
    407262          } 
    408           else if (e.getSource() instanceof JTextArea && 
    409             e.getButton() == MouseEvent.BUTTON1)  
    410           { 
    411       JTextArea field = (JTextArea) e.getSource(); 
    412       try { 
    413         result = field.getDocument().getText(0,  
    414           field.getDocument().getLength()); 
    415       } 
    416       catch (Exception exc) {System.out.println(exc);} 
    417     } 
    418263        } 
    419264         
     
    421266  public void mouseClicked(MouseEvent e) {} 
    422267  public void mouseEntered(MouseEvent e) {} 
    423   public void mouseExited(MouseEvent e) { 
    424     if (e.getSource() instanceof JTextArea) { 
    425       JTextArea jta = (JTextArea) e.getSource(); 
    426       RowDoc rd = (RowDoc) jta.getDocument(); 
    427       refTable.setRowHeight(rd.row, refTable.getRowHeight()); 
    428       fireEditingStopped(); 
    429     } 
    430   } 
     268  public void mouseExited(MouseEvent e) {} 
    431269   
    432270// -- Helper Classes -- 
     
    442280    } 
    443281  } 
    444    
    445   //very simple extension of Document (text) that simply adds an int 
    446   //field to designate which row this Document edits 
    447   public class RowDoc extends DefaultStyledDocument { 
    448     public int row; 
    449  
    450     public RowDoc (int r) { 
    451       super(); 
    452       row = r; 
    453     } 
    454   } 
    455282} 
Note: See TracChangeset for help on using the changeset viewer.