/* * Jalview - A Sequence Alignment Editor and Viewer * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package jalview.gui; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.swing.*; import jalview.datamodel.*; public class AnnotationLabels extends JPanel implements MouseListener, MouseMotionListener, ActionListener { static String ADDNEW = "Add New Row"; static String HIDE = "Hide This Row"; static String DELETE = "Delete This Row"; static String SHOWALL = "Show All Hidden Rows"; static String OUTPUT_TEXT = "Show Values In Textbox"; boolean active = false; Image image; AlignmentPanel ap; boolean resizing = false; int oldY; int mouseX; int selectedRow = 0; int scrollOffset = 0; public AnnotationLabels(AlignmentPanel ap) { this.ap = ap; java.net.URL url = getClass().getResource("/images/idwidth.gif"); Image temp = null; if (url != null) { temp = java.awt.Toolkit.getDefaultToolkit().createImage(url); } try { MediaTracker mt = new MediaTracker(this); mt.addImage(temp, 0); mt.waitForID(0); } catch (Exception ex) { } BufferedImage bi = new BufferedImage(temp.getHeight(this), temp.getWidth(this), BufferedImage.TYPE_INT_RGB); Graphics2D g = (Graphics2D) bi.getGraphics(); g.rotate(Math.toRadians(90)); g.drawImage(temp, 0, -bi.getWidth(this), this); image = (Image) bi; addMouseListener(this); addMouseMotionListener(this); } public void setScrollOffset(int y) { scrollOffset = y; repaint(); } public void actionPerformed(ActionEvent evt) { AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation(); if (evt.getActionCommand().equals(ADDNEW)) { String label = JOptionPane.showInputDialog(this, "Label for annotation"); if (label == null) { label = ""; } ap.av.alignment.addAnnotation(new AlignmentAnnotation(label, "New description", new Annotation[ap.av.alignment.getWidth()])); } else if (evt.getActionCommand().equals(HIDE)) { aa[selectedRow].visible = false; if (aa[selectedRow].label.equals("Conservation")) { ap.av.showConservation = false; } if (aa[selectedRow].label.equals("Quality")) { ap.av.showQuality = false; } if (aa[selectedRow].label.equals("Consensus")) { ap.av.showIdentity = false; } } else if (evt.getActionCommand().equals(DELETE)) { ap.av.alignment.deleteAnnotation(aa[selectedRow]); } else if (evt.getActionCommand().equals(SHOWALL)) { for (int i = 0; i < aa.length; i++) { aa[i].visible = true; } } else if (evt.getActionCommand().equals(OUTPUT_TEXT)) { CutAndPasteTransfer cap = new CutAndPasteTransfer(); Desktop.addInternalFrame(cap, ap.alignFrame.getTitle() + " - " + aa[selectedRow].label, 500, 100); cap.setText(aa[selectedRow].toString()); } ap.annotationPanel.adjustPanelHeight(); ap.repaint(); } public void mousePressed(MouseEvent evt) { int y = evt.getY() - scrollOffset; AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation(); if ( (aa == null) || (aa.length == 0)) { JPopupMenu pop = new JPopupMenu("Annotations"); JMenuItem item = new JMenuItem(ADDNEW); item.addActionListener(this); pop.add(item); pop.show(this, evt.getX(), evt.getY()); return; } int height = 0; for (int i = 0; i < aa.length; i++) { if (!aa[i].visible) { continue; } height += aa[i].height; if (y < height) { selectedRow = i; break; } } JPopupMenu pop = new JPopupMenu("Annotations"); JMenuItem item = new JMenuItem(ADDNEW); item.addActionListener(this); pop.add(item); item = new JMenuItem(HIDE); item.addActionListener(this); pop.add(item); item = new JMenuItem(DELETE); item.addActionListener(this); pop.add(item); item = new JMenuItem(SHOWALL); item.addActionListener(this); pop.add(item); item = new JMenuItem(OUTPUT_TEXT); item.addActionListener(this); pop.add(item); pop.show(this, evt.getX(), evt.getY()); oldY = evt.getY(); } public void mouseReleased(MouseEvent evt) { active = false; repaint(); } public void mouseEntered(MouseEvent evt) { active = true; repaint(); } public void mouseExited(MouseEvent evt) { active = false; repaint(); } public void mouseDragged(MouseEvent evt) { active = true; Dimension d = ap.annotationScroller.getPreferredSize(); int dif = evt.getY() - oldY; dif /= ap.av.charHeight; dif *= ap.av.charHeight; if ( (d.height - dif) > 20) { ap.annotationScroller.setPreferredSize(new Dimension(d.width, d.height - dif)); d = ap.annotationSpaceFillerHolder.getPreferredSize(); ap.annotationSpaceFillerHolder.setPreferredSize(new Dimension( d.width, d.height - dif)); ap.repaint(); } ap.addNotify(); } public void mouseMoved(MouseEvent evt) { } public void mouseClicked(MouseEvent evt) { } public void paintComponent(Graphics g1) { Graphics2D g = (Graphics2D) g1; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); drawComponent(g); } public void drawComponent(Graphics2D g) { FontMetrics fm = g.getFontMetrics(g.getFont()); g.setColor(Color.white); g.fillRect(0, 0, getWidth(), getHeight()); g.translate(0, scrollOffset); g.setColor(Color.black); AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation(); int y = g.getFont().getSize(); int x = 0; if (aa != null) { for (int i = 0; i < aa.length; i++) { if (!aa[i].visible) { continue; } x = getWidth() - fm.stringWidth(aa[i].label) - 3; if (aa[i].isGraph) { y += (aa[i].height / 3); } g.drawString(aa[i].label, x, y); if (aa[i].isGraph) { y += ( (2 * aa[i].height) / 3); } else { y += aa[i].height; } } } if (active) { if (image != null) { g.drawImage(image, 2, 0, this); } } if ( (aa == null) || (aa.length < 1)) { g.drawString("Right click", 2, 8); g.drawString("to add annotation", 2, 18); } } }