Changeset 1253


Ignore:
Timestamp:
08/15/06 20:31:38 (14 years ago)
Author:
chris
Message:

MetadataNotebook:
1) saveFile method now just calls the MetadataPane
method of the save name for simplicity

MetadataPane:
1) made the QuickSave button color change when the
file has been edited
2) added support for TIFF files preserving image
3) added support for displaying TIFF images
4) added code for new renderer

Template.xml:
1) minor change, one description element needed to
have Type="Desc"

TextBullet.GIF:
1) an icon to signify that the cell will be editted
by a textarea instead of a textfield

VariableComboRenderer.java (NEW):
1) renders the variable editor cells more appropriately
e.g. ComboBoxes now appear as ComboBoxes with the little
arrow designator even when they're not being edited.

Location:
trunk/loci/ome/notebook
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/ome/notebook

    • Property svn:ignore
      •  

        old new  
        11*.class 
        22*.tiff.xml 
         3*.tiff 
        34*.xsd 
        45*.ome 
  • trunk/loci/ome/notebook/ClickableList.java

    r1222 r1253  
    146146                                  Element stE = childE; 
    147147                                   
     148                                  //Get an upper-case representation of this new semantic type 
     149                                  //to use as a DBLocation 
     150                                  String DBPrefix = "LOCI." + 
     151                                  tableP.el.getAttribute("XMLName").toUpperCase() + "_ANNOTATION."; 
     152                                   
     153                                   
    148154                                  childE = DOMUtil.createChild(stE, "Element"); 
    149155                                  childE.setAttribute("Name", "Name"); 
    150                                   childE.setAttribute("DBLocation", ""); 
     156                                  childE.setAttribute("DBLocation", DBPrefix + "NAME"); 
    151157                                  childE.setAttribute("DataType", "string"); 
    152158                                   
    153159                                  childE = DOMUtil.createChild(stE, "Element"); 
    154160                                  childE.setAttribute("Name", "Value"); 
    155                                   childE.setAttribute("DBLocation", ""); 
     161                                  childE.setAttribute("DBLocation", DBPrefix + "VALUE"); 
    156162                                  childE.setAttribute("DataType", "string"); 
    157163                                   
    158164                                  childE = DOMUtil.createChild(stE, "Element"); 
    159165                                  childE.setAttribute("Name", "NoteFor"); 
    160                                   childE.setAttribute("DBLocation", ""); 
     166                                  childE.setAttribute("DBLocation", DBPrefix + "NOTE_FOR"); 
    161167                                  childE.setAttribute("DataType", "reference"); 
    162168                                  childE.setAttribute("RefersTo", tableP.el.getAttribute("XMLName")); 
  • trunk/loci/ome/notebook/MetadataNotebook.java

    r1226 r1253  
    183183  //saves to a file, sets title of frame to reflect the current file 
    184184  public void saveFile(File file) { 
    185     try { 
    186       //use the node tree in the MetadataPane to write flattened OMECA 
    187       //to a given file 
    188       metadata.getRoot().writeOME(file, true); 
    189       setTitle("OME Metadata Notebook - " + file); 
    190     } 
    191     catch (Exception e) { 
    192       //if all hell breaks loose, display an error dialog 
    193       JOptionPane.showMessageDialog(this, 
    194             "Sadly, the file you specified is either write-protected\n" + 
    195             "or in use by another program. Game over, man.", 
    196             "Unable to Write to Specified File", JOptionPane.ERROR_MESSAGE); 
    197       System.out.println("ERROR! Attempt failed to open file: " + file.getName() ); 
    198     } 
     185    metadata.saveFile(file); 
    199186  } 
    200187 
  • trunk/loci/ome/notebook/MetadataPane.java

    r1226 r1253  
    1 // 
    2 // MetadataPane.java 
    3 // 
    4  
    51package loci.ome.notebook; 
    62 
     
    117import javax.swing.*; 
    128import javax.swing.border.EmptyBorder; 
    13 import loci.formats.RandomAccessStream; 
    14 import loci.formats.TiffTools; 
    15 import loci.formats.ReflectedUniverse; 
     9import loci.formats.*; 
    1610import loci.formats.in.*; 
    1711import org.openmicroscopy.xml.*; 
    1812import org.w3c.dom.*; 
    1913import java.awt.event.*; 
     14import java.awt.image.BufferedImage; 
    2015import javax.swing.event.*; 
    2116import javax.swing.table.*; 
     
    2419import com.jgoodies.forms.layout.FormLayout; 
    2520 
    26 /** MetadataPane is a panel that displays OME-XML metadata. */ 
     21/** 
     22*   MetadataPane.java: 
     23*      MetadataPane is a panel that displays OME-XML metadata. 
     24*      Most of the gui code is in here. 
     25*                        If you want a panel instead of a window, instantiate this 
     26*    instead of MetadataNotebook. 
     27* 
     28*   Written by: Christopher Peterson <crpeterson2@wisc.edu> 
     29*/ 
     30 
    2731public class MetadataPane extends JPanel 
    2832  implements ActionListener, Runnable 
     
    7377  /** Hashtable containing internal semantic type defs in current file*/ 
    7478  public Hashtable internalDefs; 
    75    
     79 
     80  /** Signifies that the current file has 
     81  *   changed from the last saved version*/ 
    7682  public boolean hasChanged; 
    7783   
     84  /** If true, the save button should be display in each TabPanel*/ 
    7885  protected boolean addSave; 
    7986   
    80   protected File currentFile;  
     87  /** Holds the original file if it is of TIFF format*/ 
     88  protected File originalTIFF; 
     89   
     90  /** Holds the currently edited file, or null if none*/ 
     91  protected File currentFile; 
     92   
     93  /** Holds the first image of a tiff file*/ 
     94  public BufferedImage img, thumb; 
    8195 
    8296  // -- Fields - raw panel -- 
     
    119133    currentFile = null; 
    120134    addSave = save; 
     135    originalTIFF = null; 
     136    img = null; 
     137    thumb = null; 
    121138 
    122139    // -- Tabbed Pane Initialization -- 
     
    177194  public boolean getState() { return hasChanged; } 
    178195   
    179   public void stateChanged(boolean change) {hasChanged = change;}  
     196  public void stateChanged(boolean change) { 
     197    hasChanged = change; 
     198    for(int i = 0; i < tabPanelList.size();i++) { 
     199      TabPanel thisTab = (TabPanel) tabPanelList.get(i); 
     200      if(change) thisTab.saveButton.setForeground(ADD_COLOR); 
     201      else thisTab.saveButton.setForeground(TEXT_COLOR); 
     202    } 
     203  }  
    180204 
    181205  public OMENode getRoot() { return thisOmeNode; } 
     
    185209      //use the node tree in the MetadataPane to write flattened OMECA 
    186210      //to a given file 
    187       thisOmeNode.writeOME(file, true); 
    188       if (getTopLevelAncestor() instanceof MetadataNotebook) { 
    189         MetadataNotebook mdn = (MetadataNotebook) getTopLevelAncestor(); 
    190         mdn.setTitle("OME Metadata Notebook - " + file); 
     211      if(originalTIFF != null) { 
     212        String xml = thisOmeNode.writeOME(true); 
     213         
     214        if(originalTIFF == file) { 
     215          RandomAccessFile raf = new RandomAccessFile(file, "rw"); 
     216          TiffTools.overwriteIFDValue(raf, 0, TiffTools.IMAGE_DESCRIPTION, xml); 
     217          raf.close(); 
     218        } 
     219        else { 
     220          FileInputStream fis = new FileInputStream(originalTIFF); 
     221          FileOutputStream fos = new FileOutputStream(file); 
     222          int myByte = fis.read(); 
     223          while (myByte != -1) { 
     224            fos.write(myByte); 
     225            myByte = fis.read(); 
     226          } 
     227          fis.close(); 
     228          fos.close(); 
     229           
     230          RandomAccessFile raf = new RandomAccessFile(file, "rw"); 
     231          TiffTools.overwriteIFDValue(raf, 0, TiffTools.IMAGE_DESCRIPTION, xml); 
     232          raf.close(); 
     233        } 
     234      } 
     235      else { 
     236              thisOmeNode.writeOME(file, true); 
     237              if (getTopLevelAncestor() instanceof MetadataNotebook) { 
     238                MetadataNotebook mdn = (MetadataNotebook) getTopLevelAncestor(); 
     239                mdn.setTitle("OME Metadata Notebook - " + file); 
     240              } 
    191241      } 
    192242    } 
    193243    catch (Exception e) { 
    194244      //if all hell breaks loose, display an error dialog 
    195       JOptionPane.showMessageDialog(this, 
     245      JOptionPane.showMessageDialog(getTopLevelAncestor(), 
    196246            "Sadly, the file you specified is either write-protected\n" + 
    197247            "or in use by another program. Game over, man.", 
     
    205255   * to the given character string of XML. 
    206256   */ 
    207   public void setOMEXML(String xml) { 
     257  private void setOMEXML(String xml) { 
    208258    OMENode ome = null; 
    209259    try { ome = new OMENode(xml); } 
     
    227277      if (TiffTools.isValidHeader(header)) { 
    228278        // TIFF file 
    229         in.close(); 
    230         RandomAccessStream ras = new RandomAccessStream(file.getPath()); 
    231         Hashtable ifd = TiffTools.getFirstIFD(ras); 
    232         ras.close(); 
    233         if (ifd == null) return false; 
    234         Object value = TiffTools.getIFDValue(ifd, TiffTools.IMAGE_DESCRIPTION); 
    235         String xml = null; 
    236         if (value instanceof String) xml = (String) value; 
    237         else if (value instanceof String[]) { 
    238           String[] s = (String[]) value; 
    239           StringBuffer sb = new StringBuffer(); 
    240           for (int i=0; i<s.length; i++) sb.append(s[i]); 
    241           xml = sb.toString(); 
    242         } 
    243         if (xml == null) return false; 
    244         setOMEXML(xml); 
     279        originalTIFF = file; 
     280         
     281              OMENode ome = null; 
     282               
     283              try { 
     284                      ImageReader reader = new ImageReader(); 
     285                                        OMEXMLMetadataStore ms = new OMEXMLMetadataStore(); 
     286                                        reader.setMetadataStore(ms);  // tells reader to write metadata as it's being parsed to an OMENode (DOM in memory) 
     287                                        String id = file.getPath(); 
     288                                         
     289                                  img = reader.openImage(id, 0); // gets first image from the file 
     290                                        int width = 50, height = 50; 
     291                                        thumb = ImageTools.scale(img, width, height); 
     292                                        ome = (OMENode) ms.getRoot(); 
     293                                } 
     294                                catch (Exception exc) { 
     295                                  exc.printStackTrace(); 
     296                                } 
     297                         
     298                                setOMEXML(ome); 
    245299      } 
    246300      else { 
     301        originalTIFF = null; 
     302        img = null; 
     303        thumb = null; 
    247304        String s = new String(header).trim(); 
    248305        if (s.startsWith("<?xml") || s.startsWith("<OME")) { 
     
    256313        else return false; 
    257314      } 
     315       
    258316      currentFile = file; 
    259317      return true; 
     
    263321 
    264322  /** Sets the displayed OME-XML metadata. */ 
    265   public void setOMEXML(OMENode ome) { 
     323  private void setOMEXML(OMENode ome) { 
    266324    // test for document, then call the setup(OMENode ome) method 
    267325    Document doc = null; 
     
    269327    catch (Exception exc) { } 
    270328    if (doc != null) { 
     329      internalDefs = new Hashtable(); 
     330 
     331                        //time to parse internal semantic type defs in file 
     332                        //to handle appropriate reference types 
     333            Element thisRoot = ome.getDOMElement(); 
     334            NodeList nl = thisRoot.getChildNodes(); 
     335            for (int j = 0;j < nl.getLength();j++) { 
     336              Node node = nl.item(j); 
     337              if(node instanceof Element) { 
     338                Element someE = (Element) node; 
     339                if (someE.getTagName().equals("STD:SemanticTypeDefinitions")) { 
     340                  NodeList omeEleList = node.getChildNodes(); 
     341                  for(int k = 0;k < omeEleList.getLength();k++) { 
     342                    node = omeEleList.item(k); 
     343                    if(node instanceof Element) { 
     344                      Element omeEle = (Element) node; 
     345                      if (omeEle.getTagName().equals("SemanticType")) { 
     346                        NodeList omeAttrList = node.getChildNodes(); 
     347                        Hashtable thisHash = new Hashtable(10); 
     348                        for(int l = 0;l < omeAttrList.getLength();l++) { 
     349                          node = omeAttrList.item(l); 
     350                          if(node instanceof Element) { 
     351                            Element omeAttr = (Element) node; 
     352                            if (omeAttr.getTagName().equals("Element")) { 
     353                              if(omeAttr.hasAttribute("DataType")) { 
     354                                String dType = omeAttr.getAttribute("DataType"); 
     355                                if(dType.equals("reference")) { 
     356                                  String attrName = omeAttr.getAttribute("Name"); 
     357                                  String refType = omeAttr.getAttribute("RefersTo"); 
     358                                  thisHash.put(attrName,refType); 
     359                                } 
     360                              } 
     361                            } 
     362                          } 
     363                        } 
     364                        internalDefs.put(omeEle.getAttribute("Name"), thisHash); 
     365                      } 
     366                    } 
     367                  } 
     368                } 
     369              } 
     370            } 
     371     
    271372      thisOmeNode = ome; 
     373      stateChanged(false); 
    272374      setupTabs(ome); 
    273375    } 
     
    287389    addItems = new Vector(); 
    288390    tabPane.removeAll(); 
     391    currentFile = null; 
     392    originalTIFF = null; 
     393    img = null; 
     394    thumb = null; 
     395    internalDefs = new Hashtable(); 
    289396    try {thisOmeNode = new OMENode();} 
    290397    catch(Exception e) {e.printStackTrace();} 
     
    349456    panelsWithID = new Vector(); 
    350457    addItems = new Vector(); 
    351     internalDefs = new Hashtable(); 
    352  
    353                 //time to parse internal semantic type defs in file 
    354                 //to handle appropriate reference types 
    355     Element thisRoot = ome.getDOMElement(); 
    356     NodeList nl = thisRoot.getChildNodes(); 
    357     for (int j = 0;j < nl.getLength();j++) { 
    358       Node node = nl.item(j); 
    359       if(node instanceof Element) { 
    360         Element someE = (Element) node; 
    361         if (someE.getTagName().equals("STD:SemanticTypeDefinitions")) { 
    362           NodeList omeEleList = node.getChildNodes(); 
    363           for(int k = 0;k < omeEleList.getLength();k++) { 
    364             node = omeEleList.item(k); 
    365             if(node instanceof Element) { 
    366               Element omeEle = (Element) node; 
    367               if (omeEle.getTagName().equals("SemanticType")) { 
    368                 NodeList omeAttrList = node.getChildNodes(); 
    369                 Hashtable thisHash = new Hashtable(10); 
    370                 for(int l = 0;l < omeAttrList.getLength();l++) { 
    371                   node = omeAttrList.item(l); 
    372                   if(node instanceof Element) { 
    373                     Element omeAttr = (Element) node; 
    374                     if (omeAttr.getTagName().equals("Element")) { 
    375                       if(omeAttr.hasAttribute("DataType")) { 
    376                         String dType = omeAttr.getAttribute("DataType"); 
    377                         if(dType.equals("reference")) { 
    378                           String attrName = omeAttr.getAttribute("Name"); 
    379                           String refType = omeAttr.getAttribute("RefersTo"); 
    380                           thisHash.put(attrName,refType); 
    381                         } 
    382                       } 
    383                     } 
    384                   } 
    385                 } 
    386                 internalDefs.put(omeEle.getAttribute("Name"), thisHash); 
    387               } 
    388             } 
    389           } 
    390         } 
    391       } 
    392     } 
    393458 
    394459    //use the list acquired from Template.xml to form the initial tabs 
     
    504569      p.setEditor(); 
    505570    } 
    506      
    507     stateChanged(false); 
    508571  } 
    509572 
     
    529592      title.setForeground(new Color(255,255,255)); 
    530593       
    531       JButton saveButton = new JButton("Save"); 
    532       saveButton.setPreferredSize(new Dimension(70,17)); 
    533       saveButton.setActionCommand("save"); 
    534       saveButton.addActionListener(this); 
    535       saveButton.setOpaque(false); 
    536       saveButton.setForeground(TEXT_COLOR); 
    537       if(!addSave) saveButton.setVisible(false); 
     594      tp.saveButton = new JButton("QuickSave"); 
     595      tp.saveButton.setPreferredSize(new Dimension(100,17)); 
     596      tp.saveButton.setActionCommand("save"); 
     597      tp.saveButton.addActionListener(this); 
     598      tp.saveButton.setOpaque(false); 
     599      tp.saveButton.setForeground(TEXT_COLOR); 
     600      if(getState()) tp.saveButton.setForeground(ADD_COLOR); 
     601      if(!addSave) tp.saveButton.setVisible(false); 
    538602      
    539603      Color aColor = getBackground(); 
     
    562626       
    563627      build.add( title, cellC.xy(1, 2, "left,center")); 
    564       build.add( saveButton, cellC.xy(3, 2, "right,center")); 
     628      build.add( tp.saveButton, cellC.xy(3, 2, "right,center")); 
    565629      build.add( descrip, cellC.xyw(1, 4, 4, "fill,center")); 
    566630      titlePanel = build.getPanel(); 
     
    715779    String cmd = e.getActionCommand(); 
    716780    if (cmd.equals("save")) { 
    717       saveFile(currentFile); 
    718       stateChanged(false); 
     781      if(currentFile != null) { 
     782        saveFile(currentFile); 
     783        stateChanged(false); 
     784      } 
     785      else JOptionPane.showMessageDialog(getTopLevelAncestor(), 
     786            "There is no current file specified,\n" + 
     787            "so you cannot QuickSave.", 
     788            "No Current File Found", JOptionPane.ERROR_MESSAGE); 
    719789                } 
    720790  } 
     
    925995    protected OMENode ome; 
    926996    protected JPanel titlePanel; 
     997    protected JButton saveButton; 
    927998 
    928999    public TabPanel(Element el) { 
     
    9341005      titlePanel = null; 
    9351006      tabPanelList.add(this); 
     1007      saveButton = null; 
    9361008    } 
    9371009     
     
    9541026*/ 
    9551027  public class TablePanel extends JPanel 
    956     implements ActionListener 
     1028    implements ActionListener, MouseListener 
    9571029  { 
    9581030    public OMEXMLNode oNode; 
     
    10441116      noteButton.setForeground(TEXT_COLOR); 
    10451117       
     1118      JLabel imageLabel = null; 
     1119                if (name.endsWith("Pixels") || name.endsWith("Pixels (1)")) { 
     1120                                if(thumb != null) { 
     1121                imageLabel = new JLabel(new ImageIcon(thumb)); 
     1122                imageLabel.setToolTipText("The first image of these pixels." + 
     1123                  " Click for full sized image."); 
     1124                imageLabel.addMouseListener(this); 
     1125        } 
     1126      } 
     1127       
    10461128      DefaultTableModel myTableModel =  
    10471129        new DefaultTableModel(TREE_COLUMNS, 0) 
     
    10671149      myTableModel.setRowCount(attrList.size() + refList.size()); 
    10681150       
     1151      String clippedName = name; 
     1152      if (name.endsWith(")")) clippedName = name.substring(0,name.length() - 4); 
     1153       
    10691154      JButton addButton = new JButton("New Table"); 
    10701155      addButton.setPreferredSize(new Dimension(110,17)); 
    10711156      addButton.addActionListener(table); 
    10721157      addButton.setActionCommand("bigAdd"); 
    1073       addButton.setToolTipText("Create a new " + name + " table."); 
     1158      addButton.setToolTipText("Create a new " + clippedName + " table."); 
    10741159      if ( !isTopLevel && tPanel.oNode == null) addButton.setEnabled(false); 
    10751160      addButton.setForeground(ADD_COLOR); 
     
    10791164      delButton.addActionListener(table); 
    10801165      delButton.setActionCommand("bigRem"); 
    1081       delButton.setToolTipText("Delete this " + name + " table."); 
     1166      delButton.setToolTipText("Delete this " + clippedName + " table."); 
    10821167      if ( oNode == null) delButton.setVisible(false); 
    10831168      delButton.setForeground(DELETE_COLOR); 
     
    10881173       
    10891174      FormLayout layout = new FormLayout( 
    1090         "pref, 10dlu, pref, pref:grow:right, 5dlu, pref", 
     1175        "pref, 10dlu, pref, 10dlu, pref, pref:grow:right, 5dlu, pref", 
    10911176        "pref,2dlu,pref,pref,3dlu,pref,3dlu"); 
    10921177      setLayout(layout); 
     
    10951180        add(tableName, cc.xy(1,1)); 
    10961181                        add(noteButton, cc.xy(3,1, "left,center")); 
    1097                         add(addButton, cc.xyw(4,1,1, "right,center")); 
    1098                         add(delButton, cc.xyw(6,1,1, "right,center")); 
    1099                         add(tHead, cc.xyw(1,3,6, "fill, center")); 
    1100                         add(table, cc.xyw(1,4,6, "fill, center")); 
    1101       add(noteP, cc.xyw(1,6,6, "fill,center")); 
     1182                        if (imageLabel != null) 
     1183                        add(imageLabel, cc.xy(5,1, "center,top")); 
     1184                        add(addButton, cc.xy(6,1, "right,center")); 
     1185                        add(delButton, cc.xy(8,1, "right,center")); 
     1186                        add(tHead, cc.xyw(1,3,8, "fill, center")); 
     1187                        add(table, cc.xyw(1,4,8, "fill, center")); 
     1188      add(noteP, cc.xyw(1,6,8, "fill,center")); 
    11021189                         
    11031190                        if (oNode == null) { 
     
    11551242        } 
    11561243      } 
    1157  
     1244       
    11581245      if (refList.size() > 0) {       
    11591246        for (int i=0; i<refList.size(); i++) { 
     
    11741261        }  
    11751262      } 
     1263       
     1264      TableColumn refColumn = table.getColumnModel().getColumn(1); 
     1265      refColumn.setCellRenderer(new VariableComboRenderer(el)); 
    11761266    } 
    11771267 
     
    12721362        noteP.revalidate(); 
    12731363      } 
    1274     }   
     1364    } 
     1365     
     1366    public void mouseClicked(MouseEvent e) { 
     1367      if (e.getSource() instanceof JLabel) { 
     1368              JOptionPane.showMessageDialog(getTopLevelAncestor(), null, 
     1369                "(Full Sized) " + name, JOptionPane.PLAIN_MESSAGE, 
     1370                new ImageIcon(img)); 
     1371            } 
     1372    } 
     1373     
     1374    public void mousePressed(MouseEvent e) {} 
     1375          public void mouseReleased(MouseEvent e) {} 
     1376          public void mouseEntered(MouseEvent e) {} 
     1377          public void mouseExited(MouseEvent e) {} 
    12751378     
    12761379    public void callReRender() { 
  • trunk/loci/ome/notebook/Samples

    • Property svn:ignore
      •  

        old new  
        11*.tiff.xml 
         2*.tiff 
        23*.ome 
        34*.tmp 
  • trunk/loci/ome/notebook/Template.xml

    r1226 r1253  
    5252                <OMEAttribute XMLName="ID" Type="ID"/> 
    5353                <OMEAttribute XMLName="Type"  Description="The type of experiment this was."/> 
    54                 <OMEAttribute XMLName="Description" Description="A brief description of the experiment."/> 
     54                <OMEAttribute XMLName="Description" Description="A brief description of the experiment." Type="Desc"/> 
    5555                <OMEAttribute XMLName="Experimenter" Type="Ref" Description="Refers to the experimenter associated with this experiment."/> 
    5656        </OMEElement> 
Note: See TracChangeset for help on using the changeset viewer.