// // NotePanel.java // /* OME Metadata Editor application for exploration and editing of OME-XML and OME-TIFF metadata. Copyright (C) 2006-@year@ Christopher Peterson. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package loci.ome.editor; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.util.Hashtable; import java.util.Vector; import javax.swing.DefaultListModel; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.border.EmptyBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import ome.xml.DOMUtil; import org.openmicroscopy.xml.CustomAttributesNode; import org.w3c.dom.Element; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; /** * A panel that has a JList to display note names, and a JTextArea to display * the content of the note. Also has buttons for adding and deleting notes. * * <dl><dt><b>Source code:</b></dt> * <dd><a href="http://trac.openmicroscopy.org.uk/ome/browser/bioformats.git/components/legacy/ome-editor/src/loci/ome/editor/NotePanel.java">Trac</a>, * <a href="http://git.openmicroscopy.org/?p=bioformats.git;a=blob;f=components/legacy/ome-editor/src/loci/ome/editor/NotePanel.java;hb=HEAD">Gitweb</a></dd></dl> * * @author Christopher Peterson crpeterson2 at wisc.edu */ public class NotePanel extends JPanel implements ListSelectionListener { // -- Constants -- /** The color of this component's background. */ public static final Color BACK_COLOR = new Color(175,175,175); /** An icon that signifies that notes are present. */ public static final ImageIcon NOTES_BULLET = MetadataPane.createImageIcon("Icons/bullet-green.gif", "An icon signifying that notes are present."); /** An icon that signifies that no notes are present. */ public static final ImageIcon NO_NOTES_BULLET = MetadataPane.createImageIcon("Icons/bullet-red.gif", "An icon signifying that no notes are present."); /** The TablePanel that this NotePanel is a part of. */ MetadataPane.TablePanel tableP; /** The JList SubClass that holds the note names. */ public ClickableList noteList; /** The JTextArea that holds a note's content. */ public JTextArea textArea; /** The list and textarea's name labels. */ public JLabel nameLabel,noteLabel; /** * Construct a NotePanel given the parent TablePanel. * @param tp The TablePanel that this NotePanel is a part of. */ public NotePanel(MetadataPane.TablePanel tp) { super(); tableP = tp; setBorder(new EmptyBorder(5,5,5,5)); setBackground(BACK_COLOR); boolean editable = tableP.isEditable(); Vector noteEleList = getNoteElements(); DefaultListModel thisModel = new DefaultListModel(); noteList = new ClickableList(thisModel,this); noteList.addListSelectionListener(this); if (noteEleList != null) { for (int i = 0;i<noteEleList.size();i++) { Element e = (Element) noteEleList.get(i); thisModel.addElement(e.getAttribute("Name")); } } // buggy... // if (thisModel.getSize() > 0) noteList.setSelectedIndex(0); JScrollPane jScroll = new JScrollPane(noteList); jScroll.setPreferredSize(new Dimension(150,100)); textArea = new JTextArea(); if (!editable) textArea.setEditable(false); textArea.setLineWrap(true); textArea.setWrapStyleWord(true); textArea.getDocument().addDocumentListener(noteList); JScrollPane jNoteScroll = new JScrollPane(textArea); jNoteScroll.setPreferredSize(new Dimension(450,100)); jNoteScroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); FormLayout layout = new FormLayout( "pref, 5dlu, pref, 5dlu, pref:grow:right, 5dlu, pref", "pref,2dlu,pref"); setLayout(layout); CellConstraints cc = new CellConstraints(); if (thisModel.size() == 0) nameLabel = new JLabel("Name", NO_NOTES_BULLET, JLabel.LEFT); else nameLabel = new JLabel("Name", NOTES_BULLET, JLabel.LEFT); noteLabel = new JLabel("Notes", NO_NOTES_BULLET, JLabel.LEFT); Font thisFont = nameLabel.getFont(); thisFont = new Font(thisFont.getFontName(), Font.BOLD,thisFont.getSize()); nameLabel.setFont(thisFont); thisFont = noteLabel.getFont(); thisFont = new Font(thisFont.getFontName(), Font.BOLD,thisFont.getSize()); noteLabel.setFont(thisFont); JButton addBTN = new JButton("New Note"); // addBTN.setPreferredSize(new Dimension(120,17)); addBTN.setActionCommand("add"); addBTN.addActionListener(noteList); addBTN.setToolTipText("Add a new note to the \"Name\" list."); addBTN.setForeground(MetadataPane.ADD_COLOR); addBTN.setOpaque(false); if (!editable) addBTN.setEnabled(false); JButton delBTN = new JButton("Delete Note"); // delBTN.setPreferredSize(new Dimension(120,17)); delBTN.setActionCommand("remove"); delBTN.addActionListener(noteList); delBTN.setToolTipText("Delete the note selected in the \"Name\" list."); delBTN.setForeground(MetadataPane.DELETE_COLOR); delBTN.setOpaque(false); if (!editable) delBTN.setEnabled(false); add(nameLabel, cc.xy(1,1, "left,center")); add(noteLabel, cc.xy(3,1, "left,center")); add(addBTN, cc.xy(5,1, "right,center")); add(delBTN, cc.xy(7,1, "right,center")); add(jScroll, cc.xy(1,3, "fill,center")); add(jNoteScroll, cc.xyw(3,3,5, "fill,center")); setBackground(BACK_COLOR); setVisible(false); if (noteEleList != null) setVisible(true); } /** * Get the DOM Elements of all notes for this NotePanel's * TablePanel's OMEXMLNode. * @return A vector of all note-type elements for this NotePanel. */ public Vector getNoteElements() { if (tableP.tPanel.oNode == null || tableP.oNode == null) return null; Vector results = new Vector(); CustomAttributesNode caNode = null; Element currentCA = DOMUtil.getChildElement("CustomAttributes", tableP.tPanel.oNode.getDOMElement()); if (currentCA != null) caNode = new CustomAttributesNode(currentCA); if (caNode == null) return null; Vector eleList = DOMUtil.getChildElements( tableP.el.getAttribute("XMLName") + "Annotation", caNode.getDOMElement()); if (eleList == null || eleList.size() == 0) return null; for (int i = 0;i<eleList.size();i++) { Element anEle = (Element) eleList.get(i); String id = tableP.oNode.getAttribute("ID"); if (anEle.getAttribute("NoteFor").equals(id)) results.add(anEle); } return results; } /** * Get a Hashtable of notenames and values for this NotePanel. * @return A Hashtable with keys of the notes' names and values * associated with that note name. */ public Hashtable getNoteHash() { Hashtable results = new Hashtable(); Vector noteV = getNoteElements(); if (noteV != null) { for (int i = 0;i< noteV.size();i++) { Element ele = (Element) noteV.get(i); String key = ele.getAttribute("Name"); String value = ele.getAttribute("Value"); results.put(key,value); } } return results; } /** Get the number of notes associated with this NotePanel. */ public int getNumNotes() { Vector thisVector = getNoteElements(); if (thisVector == null) return 0; else return thisVector.size(); } /** * Toggle the icon for the "Name" JLabel. * @param hasElements Does the list have note names in it? */ public void setNameLabel(boolean hasElements) { if (hasElements) nameLabel.setIcon(NOTES_BULLET); else nameLabel.setIcon(NO_NOTES_BULLET); } /** * Toggle the icon for the "Notes" JLabel. * @param hasElements Does the textarea have note names in it? */ public void setNotesLabel(boolean hasElements) { if (hasElements) noteLabel.setIcon(NOTES_BULLET); else noteLabel.setIcon(NO_NOTES_BULLET); } /** * Handles changes in the JList such as selection of a * different name or what have you. */ public void valueChanged(ListSelectionEvent e) { String thisName = (String) noteList.getSelectedValue(); if ( thisName != null ) { Element currentCA = DOMUtil.getChildElement("CustomAttributes", tableP.tPanel.oNode.getDOMElement()); Vector childList = DOMUtil.getChildElements( tableP.el.getAttribute("XMLName") + "Annotation", currentCA); Element childEle = null; for (int i = 0;i<childList.size();i++) { Element thisEle = (Element) childList.get(i); if (thisEle.getAttribute("Name").equals(thisName)) childEle = thisEle; } if (childEle != null && childEle.getAttribute("Value") != null) { textArea.setText(childEle.getAttribute("Value")); } } else textArea.setText(""); } }