-/*
- * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
- * Copyright (C) $$Year-Rel$$ The Jalview Authors
- *
- * This file is part of Jalview.
- *
- * Jalview 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 3
- * of the License, or (at your option) any later version.
- *
- * Jalview 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 Jalview. If not, see <http://www.gnu.org/licenses/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-package jalview.appletgui;
-
-import jalview.datamodel.AlignmentAnnotation;
-import jalview.datamodel.Annotation;
-import jalview.renderer.AnnotationRenderer;
-import jalview.renderer.AwtRenderPanelI;
-import jalview.util.MessageManager;
-import jalview.util.Platform;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.Graphics;
-import java.awt.Image;
-import java.awt.MenuItem;
-import java.awt.Panel;
-import java.awt.PopupMenu;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.AdjustmentEvent;
-import java.awt.event.AdjustmentListener;
-import java.awt.event.InputEvent;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.MouseMotionListener;
-
-public class AnnotationPanel extends Panel implements AwtRenderPanelI,
- AdjustmentListener, ActionListener, MouseListener,
- MouseMotionListener
-{
- AlignViewport av;
-
- AlignmentPanel ap;
-
- int activeRow = -1;
-
- final String HELIX = "Helix";
-
- final String SHEET = "Sheet";
-
- /**
- * For RNA secondary structure "stems" aka helices
- */
- final String STEM = "RNA Helix";
-
- final String LABEL = "Label";
-
- final String REMOVE = "Remove Annotation";
-
- final String COLOUR = "Colour";
-
- final Color HELIX_COLOUR = Color.red.darker();
-
- final Color SHEET_COLOUR = Color.green.darker().darker();
-
- Image image;
-
- Graphics gg;
-
- FontMetrics fm;
-
- int imgWidth = 0;
-
- boolean fastPaint = false;
-
- // Used For mouse Dragging and resizing graphs
- int graphStretch = -1;
-
- int graphStretchY = -1;
-
- boolean mouseDragging = false;
-
- public static int GRAPH_HEIGHT = 40;
-
- boolean MAC = false;
-
- public final AnnotationRenderer renderer;
-
- public AnnotationPanel(AlignmentPanel ap)
- {
- MAC = Platform.isAMac();
- this.ap = ap;
- av = ap.av;
- setLayout(null);
- int height = adjustPanelHeight();
- ap.apvscroll.setValues(0, getSize().height, 0, height);
-
- addMouseMotionListener(this);
-
- addMouseListener(this);
-
- // ap.annotationScroller.getVAdjustable().addAdjustmentListener( this );
- renderer = new AnnotationRenderer();
- }
-
- public AnnotationPanel(AlignViewport av)
- {
- this.av = av;
- renderer = new AnnotationRenderer();
- }
-
- @Override
- public void adjustmentValueChanged(AdjustmentEvent evt)
- {
- }
-
- /**
- * DOCUMENT ME!
- *
- * @param evt
- * DOCUMENT ME!
- */
- @Override
- public void actionPerformed(ActionEvent evt)
- {
- AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();
- if (aa == null)
- {
- return;
- }
- Annotation[] anot = aa[activeRow].annotations;
-
- if (anot.length < av.getColumnSelection().getMax())
- {
- Annotation[] temp = new Annotation[av.getColumnSelection().getMax() + 2];
- System.arraycopy(anot, 0, temp, 0, anot.length);
- anot = temp;
- aa[activeRow].annotations = anot;
- }
-
- String label = "";
- if (av.getColumnSelection() != null
- && av.getColumnSelection().size() > 0
- && anot[av.getColumnSelection().getMin()] != null)
- {
- label = anot[av.getColumnSelection().getMin()].displayCharacter;
- }
-
- if (evt.getActionCommand().equals(REMOVE))
- {
- for (int i = 0; i < av.getColumnSelection().size(); i++)
- {
- anot[av.getColumnSelection().columnAt(i)] = null;
- }
- }
- else if (evt.getActionCommand().equals(LABEL))
- {
- label = enterLabel(label, "Enter Label");
-
- if (label == null)
- {
- return;
- }
-
- if ((label.length() > 0) && !aa[activeRow].hasText)
- {
- aa[activeRow].hasText = true;
- }
-
- for (int i = 0; i < av.getColumnSelection().size(); i++)
- {
- int index = av.getColumnSelection().columnAt(i);
-
- if (!av.getColumnSelection().isVisible(index))
- {
- continue;
- }
-
- if (anot[index] == null)
- {
- anot[index] = new Annotation(label, "", ' ', 0);
- }
-
- anot[index].displayCharacter = label;
- }
- }
- else if (evt.getActionCommand().equals(COLOUR))
- {
- UserDefinedColours udc = new UserDefinedColours(this, Color.black,
- ap.alignFrame);
-
- Color col = udc.getColor();
-
- for (int i = 0; i < av.getColumnSelection().size(); i++)
- {
- int index = av.getColumnSelection().columnAt(i);
-
- if (!av.getColumnSelection().isVisible(index))
- {
- continue;
- }
-
- if (anot[index] == null)
- {
- anot[index] = new Annotation("", "", ' ', 0);
- }
-
- anot[index].colour = col;
- }
- }
- else
- // HELIX OR SHEET
- {
- char type = 0;
- String symbol = "\u03B1";
-
- if (evt.getActionCommand().equals(HELIX))
- {
- type = 'H';
- }
- else if (evt.getActionCommand().equals(SHEET))
- {
- type = 'E';
- symbol = "\u03B2";
- }
-
- // Added by LML to color stems
- else if (evt.getActionCommand().equals(STEM))
- {
- type = 'S';
- symbol = "\u03C3";
- }
-
- if (!aa[activeRow].hasIcons)
- {
- aa[activeRow].hasIcons = true;
- }
-
- label = enterLabel(symbol, "Enter Label");
-
- if (label == null)
- {
- return;
- }
-
- if ((label.length() > 0) && !aa[activeRow].hasText)
- {
- aa[activeRow].hasText = true;
- if (evt.getActionCommand().equals(STEM))
- {
- aa[activeRow].showAllColLabels = true;
- }
- }
-
- for (int i = 0; i < av.getColumnSelection().size(); i++)
- {
- int index = av.getColumnSelection().columnAt(i);
-
- if (!av.getColumnSelection().isVisible(index))
- {
- continue;
- }
-
- if (anot[index] == null)
- {
- anot[index] = new Annotation(label, "", type, 0);
- }
-
- anot[index].secondaryStructure = type != 'S' ? type : label
- .length() == 0 ? ' ' : label.charAt(0);
- anot[index].displayCharacter = label;
- }
- }
-
- av.getAlignment().validateAnnotation(aa[activeRow]);
-
- ap.alignmentChanged();
- adjustPanelHeight();
- repaint();
-
- return;
- }
-
- String enterLabel(String text, String label)
- {
- EditNameDialog dialog = new EditNameDialog(text, null, label, null,
- ap.alignFrame, "Enter Label", 400, 200, true);
-
- if (dialog.accept)
- {
- return dialog.getName();
- }
- else
- {
- return null;
- }
- }
-
- @Override
- public void mousePressed(MouseEvent evt)
- {
- AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();
- if (aa == null)
- {
- return;
- }
-
- int height = -scrollOffset;
- activeRow = -1;
-
- for (int i = 0; i < aa.length; i++)
- {
- if (aa[i].visible)
- {
- height += aa[i].height;
- }
-
- if (evt.getY() < height)
- {
- if (aa[i].editable)
- {
- activeRow = i;
- }
- else if (aa[i].graph > 0)
- {
- // Stretch Graph
- graphStretch = i;
- graphStretchY = evt.getY();
- }
-
- break;
- }
- }
-
- if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK
- && activeRow != -1)
- {
- if (av.getColumnSelection() == null)
- {
- return;
- }
-
- PopupMenu pop = new PopupMenu(
- MessageManager.getString("label.structure_type"));
- MenuItem item;
- /*
- * Just display the needed structure options
- */
- if (av.getAlignment().isNucleotide() == true)
- {
- item = new MenuItem(STEM);
- item.addActionListener(this);
- pop.add(item);
- }
- else
- {
- item = new MenuItem(HELIX);
- item.addActionListener(this);
- pop.add(item);
- item = new MenuItem(SHEET);
- item.addActionListener(this);
- pop.add(item);
- }
- item = new MenuItem(LABEL);
- item.addActionListener(this);
- pop.add(item);
- item = new MenuItem(COLOUR);
- item.addActionListener(this);
- pop.add(item);
- item = new MenuItem(REMOVE);
- item.addActionListener(this);
- pop.add(item);
- ap.alignFrame.add(pop);
- pop.show(this, evt.getX(), evt.getY());
-
- return;
- }
-
- ap.scalePanel.mousePressed(evt);
- }
-
- @Override
- public void mouseReleased(MouseEvent evt)
- {
- graphStretch = -1;
- graphStretchY = -1;
- mouseDragging = false;
- if (needValidating)
- {
- ap.validate();
- needValidating = false;
- }
- ap.scalePanel.mouseReleased(evt);
- }
-
- @Override
- public void mouseClicked(MouseEvent evt)
- {
- }
-
- boolean needValidating = false;
-
- @Override
- public void mouseDragged(MouseEvent evt)
- {
- if (graphStretch > -1)
- {
- av.getAlignment().getAlignmentAnnotation()[graphStretch].graphHeight += graphStretchY
- - evt.getY();
- if (av.getAlignment().getAlignmentAnnotation()[graphStretch].graphHeight < 0)
- {
- av.getAlignment().getAlignmentAnnotation()[graphStretch].graphHeight = 0;
- }
- graphStretchY = evt.getY();
- av.calcPanelHeight();
- needValidating = true;
- ap.paintAlignment(true);
- }
- else
- {
- ap.scalePanel.mouseDragged(evt);
- }
- }
-
- @Override
- public void mouseMoved(MouseEvent evt)
- {
- AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();
- if (aa == null)
- {
- return;
- }
-
- int row = -1;
- int height = -scrollOffset;
- for (int i = 0; i < aa.length; i++)
- {
-
- if (aa[i].visible)
- {
- height += aa[i].height;
- }
-
- if (evt.getY() < height)
- {
- row = i;
- break;
- }
- }
-
- int res = evt.getX() / av.getCharWidth() + av.getStartRes();
-
- if (av.hasHiddenColumns())
- {
- res = av.getColumnSelection().adjustForHiddenColumns(res);
- }
-
- if (row > -1 && res < aa[row].annotations.length
- && aa[row].annotations[res] != null)
- {
- StringBuffer text = new StringBuffer("Sequence position " + (res + 1));
- if (aa[row].annotations[res].description != null)
- {
- text.append(" " + aa[row].annotations[res].description);
- }
- ap.alignFrame.statusBar.setText(text.toString());
- }
- }
-
- @Override
- public void mouseEntered(MouseEvent evt)
- {
- ap.scalePanel.mouseEntered(evt);
- }
-
- @Override
- public void mouseExited(MouseEvent evt)
- {
- ap.scalePanel.mouseExited(evt);
- }
-
- public int adjustPanelHeight()
- {
- return adjustPanelHeight(true);
- }
-
- public int adjustPanelHeight(boolean repaint)
- {
- int height = av.calcPanelHeight();
- this.setSize(new Dimension(getSize().width, height));
- if (repaint)
- {
- repaint();
- }
- return height;
- }
-
- /**
- * calculate the height for visible annotation, revalidating bounds where
- * necessary ABSTRACT GUI METHOD
- *
- * @return total height of annotation
- */
-
- public void addEditableColumn(int i)
- {
- if (activeRow == -1)
- {
- AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();
- if (aa == null)
- {
- return;
- }
-
- for (int j = 0; j < aa.length; j++)
- {
- if (aa[j].editable)
- {
- activeRow = j;
- break;
- }
- }
- }
- }
-
- @Override
- public void update(Graphics g)
- {
- paint(g);
- }
-
- @Override
- public void paint(Graphics g)
- {
- Dimension d = getSize();
- imgWidth = d.width;
- // (av.endRes - av.startRes + 1) * av.charWidth;
- if (imgWidth < 1 || d.height < 1)
- {
- return;
- }
- if (image == null || imgWidth != image.getWidth(this)
- || d.height != image.getHeight(this))
- {
- image = createImage(imgWidth, d.height);
- gg = image.getGraphics();
- gg.setFont(av.getFont());
- fm = gg.getFontMetrics();
- fastPaint = false;
- }
-
- if (fastPaint)
- {
- g.drawImage(image, 0, 0, this);
- fastPaint = false;
- return;
- }
-
- gg.setColor(Color.white);
- gg.fillRect(0, 0, getSize().width, getSize().height);
- drawComponent(gg, av.startRes, av.endRes + 1);
-
- g.drawImage(image, 0, 0, this);
- }
-
- public void fastPaint(int horizontal)
- {
- if (horizontal == 0
- || av.getAlignment().getAlignmentAnnotation() == null
- || av.getAlignment().getAlignmentAnnotation().length < 1)
- {
- repaint();
- return;
- }
-
- gg.copyArea(0, 0, imgWidth, getSize().height,
- -horizontal * av.getCharWidth(), 0);
- int sr = av.startRes, er = av.endRes + 1, transX = 0;
-
- if (horizontal > 0) // scrollbar pulled right, image to the left
- {
- transX = (er - sr - horizontal) * av.getCharWidth();
- sr = er - horizontal;
- }
- else if (horizontal < 0)
- {
- er = sr - horizontal;
- }
-
- gg.translate(transX, 0);
-
- drawComponent(gg, sr, er);
-
- gg.translate(-transX, 0);
-
- fastPaint = true;
- repaint();
- }
-
- /**
- * DOCUMENT ME!
- *
- * @param g
- * DOCUMENT ME!
- * @param startRes
- * DOCUMENT ME!
- * @param endRes
- * DOCUMENT ME!
- */
- public void drawComponent(Graphics g, int startRes, int endRes)
- {
- Font ofont = av.getFont();
- g.setFont(ofont);
-
- g.setColor(Color.white);
- g.fillRect(0, 0, (endRes - startRes) * av.getCharWidth(),
- getSize().height);
-
- if (fm == null)
- {
- fm = g.getFontMetrics();
- }
-
- if ((av.getAlignment().getAlignmentAnnotation() == null)
- || (av.getAlignment().getAlignmentAnnotation().length < 1))
- {
- g.setColor(Color.white);
- g.fillRect(0, 0, getSize().width, getSize().height);
- g.setColor(Color.black);
- if (av.validCharWidth)
- {
- g.drawString(MessageManager
- .getString("label.alignment_has_no_annotations"), 20, 15);
- }
-
- return;
- }
- g.translate(0, -scrollOffset);
- renderer.drawComponent(this, av, g, activeRow, startRes, endRes);
- g.translate(0, +scrollOffset);
- }
-
- int scrollOffset = 0;
-
- public void setScrollOffset(int value, boolean repaint)
- {
- scrollOffset = value;
- if (repaint)
- {
- repaint();
- }
- }
-
- @Override
- public FontMetrics getFontMetrics()
- {
- return fm;
- }
-
- @Override
- public Image getFadedImage()
- {
- return image;
- }
-
- @Override
- public int getFadedImageWidth()
- {
- return imgWidth;
- }
-
- private int[] bounds = new int[2];
-
- @Override
- public int[] getVisibleVRange()
- {
- if (ap != null && ap.alabels != null)
- {
- int sOffset = -ap.alabels.scrollOffset;
- int visHeight = sOffset + ap.annotationPanelHolder.getHeight();
- bounds[0] = sOffset;
- bounds[1] = visHeight;
- return bounds;
- }
- else
- {
- return null;
- }
- }
-}
+/*\r
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)\r
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors\r
+ * \r
+ * This file is part of Jalview.\r
+ * \r
+ * Jalview is free software: you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License \r
+ * as published by the Free Software Foundation, either version 3\r
+ * of the License, or (at your option) any later version.\r
+ * \r
+ * Jalview is distributed in the hope that it will be useful, but \r
+ * WITHOUT ANY WARRANTY; without even the implied warranty \r
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
+ * PURPOSE. See the GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.\r
+ * The Jalview Authors are detailed in the 'AUTHORS' file.\r
+ */\r
+package jalview.appletgui;\r
+\r
+import jalview.datamodel.AlignmentAnnotation;\r
+import jalview.datamodel.Annotation;\r
+import jalview.renderer.AnnotationRenderer;\r
+import jalview.renderer.AwtRenderPanelI;\r
+import jalview.util.MessageManager;\r
+import jalview.util.Platform;\r
+\r
+import java.awt.Color;\r
+import java.awt.Dimension;\r
+import java.awt.Font;\r
+import java.awt.FontMetrics;\r
+import java.awt.Graphics;\r
+import java.awt.Image;\r
+import java.awt.MenuItem;\r
+import java.awt.Panel;\r
+import java.awt.PopupMenu;\r
+import java.awt.event.ActionEvent;\r
+import java.awt.event.ActionListener;\r
+import java.awt.event.AdjustmentEvent;\r
+import java.awt.event.AdjustmentListener;\r
+import java.awt.event.InputEvent;\r
+import java.awt.event.MouseEvent;\r
+import java.awt.event.MouseListener;\r
+import java.awt.event.MouseMotionListener;\r
+\r
+public class AnnotationPanel extends Panel implements AwtRenderPanelI,\r
+ AdjustmentListener, ActionListener, MouseListener,\r
+ MouseMotionListener\r
+{\r
+ AlignViewport av;\r
+\r
+ AlignmentPanel ap;\r
+\r
+ int activeRow = -1;\r
+\r
+ final String HELIX = "Helix";\r
+\r
+ final String SHEET = "Sheet";\r
+\r
+ /**\r
+ * For RNA secondary structure "stems" aka helices\r
+ */\r
+ final String STEM = "RNA Helix";\r
+\r
+ final String LABEL = "Label";\r
+\r
+ final String REMOVE = "Remove Annotation";\r
+\r
+ final String COLOUR = "Colour";\r
+\r
+ final Color HELIX_COLOUR = Color.red.darker();\r
+\r
+ final Color SHEET_COLOUR = Color.green.darker().darker();\r
+\r
+ Image image;\r
+\r
+ Graphics gg;\r
+\r
+ FontMetrics fm;\r
+\r
+ int imgWidth = 0;\r
+\r
+ boolean fastPaint = false;\r
+\r
+ // Used For mouse Dragging and resizing graphs\r
+ int graphStretch = -1;\r
+\r
+ int graphStretchY = -1;\r
+\r
+ boolean mouseDragging = false;\r
+\r
+ public static int GRAPH_HEIGHT = 40;\r
+\r
+ boolean MAC = false;\r
+\r
+ public final AnnotationRenderer renderer;\r
+\r
+ public AnnotationPanel(AlignmentPanel ap)\r
+ {\r
+ MAC = Platform.isAMac();\r
+ this.ap = ap;\r
+ av = ap.av;\r
+ setLayout(null);\r
+ int height = adjustPanelHeight();\r
+ ap.apvscroll.setValues(0, getSize().height, 0, height);\r
+\r
+ addMouseMotionListener(this);\r
+\r
+ addMouseListener(this);\r
+\r
+ // ap.annotationScroller.getVAdjustable().addAdjustmentListener( this );\r
+ renderer = new AnnotationRenderer();\r
+ }\r
+\r
+ public AnnotationPanel(AlignViewport av)\r
+ {\r
+ this.av = av;\r
+ renderer = new AnnotationRenderer();\r
+ }\r
+\r
+ @Override\r
+ public void adjustmentValueChanged(AdjustmentEvent evt)\r
+ {\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ * \r
+ * @param evt\r
+ * DOCUMENT ME!\r
+ */\r
+ @Override\r
+ public void actionPerformed(ActionEvent evt)\r
+ {\r
+ AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();\r
+ if (aa == null)\r
+ {\r
+ return;\r
+ }\r
+ Annotation[] anot = aa[activeRow].annotations;\r
+\r
+ if (anot.length < av.getColumnSelection().getMax())\r
+ {\r
+ Annotation[] temp = new Annotation[av.getColumnSelection().getMax() + 2];\r
+ System.arraycopy(anot, 0, temp, 0, anot.length);\r
+ anot = temp;\r
+ aa[activeRow].annotations = anot;\r
+ }\r
+\r
+ String label = "";\r
+ if (av.getColumnSelection() != null\r
+ && av.getColumnSelection().size() > 0\r
+ && anot[av.getColumnSelection().getMin()] != null)\r
+ {\r
+ label = anot[av.getColumnSelection().getMin()].displayCharacter;\r
+ }\r
+\r
+ if (evt.getActionCommand().equals(REMOVE))\r
+ {\r
+ for (int i = 0; i < av.getColumnSelection().size(); i++)\r
+ {\r
+ anot[av.getColumnSelection().columnAt(i)] = null;\r
+ }\r
+ }\r
+ else if (evt.getActionCommand().equals(LABEL))\r
+ {\r
+ label = enterLabel(label, "Enter Label");\r
+\r
+ if (label == null)\r
+ {\r
+ return;\r
+ }\r
+\r
+ if ((label.length() > 0) && !aa[activeRow].hasText)\r
+ {\r
+ aa[activeRow].hasText = true;\r
+ }\r
+\r
+ for (int i = 0; i < av.getColumnSelection().size(); i++)\r
+ {\r
+ int index = av.getColumnSelection().columnAt(i);\r
+\r
+ if (!av.getColumnSelection().isVisible(index))\r
+ {\r
+ continue;\r
+ }\r
+\r
+ if (anot[index] == null)\r
+ {\r
+ anot[index] = new Annotation(label, "", ' ', 0);\r
+ }\r
+\r
+ anot[index].displayCharacter = label;\r
+ }\r
+ }\r
+ else if (evt.getActionCommand().equals(COLOUR))\r
+ {\r
+ UserDefinedColours udc = new UserDefinedColours(this, Color.black,\r
+ ap.alignFrame);\r
+\r
+ Color col = udc.getColor();\r
+\r
+ for (int i = 0; i < av.getColumnSelection().size(); i++)\r
+ {\r
+ int index = av.getColumnSelection().columnAt(i);\r
+\r
+ if (!av.getColumnSelection().isVisible(index))\r
+ {\r
+ continue;\r
+ }\r
+\r
+ if (anot[index] == null)\r
+ {\r
+ anot[index] = new Annotation("", "", ' ', 0);\r
+ }\r
+\r
+ anot[index].colour = col;\r
+ }\r
+ }\r
+ else\r
+ // HELIX OR SHEET\r
+ {\r
+ char type = 0;\r
+ String symbol = "\u03B1";\r
+\r
+ if (evt.getActionCommand().equals(HELIX))\r
+ {\r
+ type = 'H';\r
+ }\r
+ else if (evt.getActionCommand().equals(SHEET))\r
+ {\r
+ type = 'E';\r
+ symbol = "\u03B2";\r
+ }\r
+\r
+ // Added by LML to color stems\r
+ else if (evt.getActionCommand().equals(STEM))\r
+ {\r
+ type = 'S';\r
+ symbol = "\u03C3";\r
+ }\r
+\r
+ if (!aa[activeRow].hasIcons)\r
+ {\r
+ aa[activeRow].hasIcons = true;\r
+ }\r
+\r
+ label = enterLabel(symbol, "Enter Label");\r
+\r
+ if (label == null)\r
+ {\r
+ return;\r
+ }\r
+\r
+ if ((label.length() > 0) && !aa[activeRow].hasText)\r
+ {\r
+ aa[activeRow].hasText = true;\r
+ if (evt.getActionCommand().equals(STEM))\r
+ {\r
+ aa[activeRow].showAllColLabels = true;\r
+ }\r
+ }\r
+\r
+ for (int i = 0; i < av.getColumnSelection().size(); i++)\r
+ {\r
+ int index = av.getColumnSelection().columnAt(i);\r
+\r
+ if (!av.getColumnSelection().isVisible(index))\r
+ {\r
+ continue;\r
+ }\r
+\r
+ if (anot[index] == null)\r
+ {\r
+ anot[index] = new Annotation(label, "", type, 0);\r
+ }\r
+\r
+ anot[index].secondaryStructure = type != 'S' ? type : label\r
+ .length() == 0 ? ' ' : label.charAt(0);\r
+ anot[index].displayCharacter = label;\r
+ }\r
+ }\r
+\r
+ av.getAlignment().validateAnnotation(aa[activeRow]);\r
+\r
+ ap.alignmentChanged();\r
+ adjustPanelHeight();\r
+ repaint();\r
+\r
+ return;\r
+ }\r
+\r
+ String enterLabel(String text, String label)\r
+ {\r
+ EditNameDialog dialog = new EditNameDialog(text, null, label, null,\r
+ ap.alignFrame, "Enter Label", 400, 200, true);\r
+\r
+ if (dialog.accept)\r
+ {\r
+ return dialog.getName();\r
+ }\r
+ else\r
+ {\r
+ return null;\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void mousePressed(MouseEvent evt)\r
+ {\r
+ AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();\r
+ if (aa == null)\r
+ {\r
+ return;\r
+ }\r
+\r
+ int height = -scrollOffset;\r
+ activeRow = -1;\r
+\r
+ for (int i = 0; i < aa.length; i++)\r
+ {\r
+ if (aa[i].visible)\r
+ {\r
+ height += aa[i].height;\r
+ }\r
+\r
+ if (evt.getY() < height)\r
+ {\r
+ if (aa[i].editable)\r
+ {\r
+ activeRow = i;\r
+ }\r
+ else if (aa[i].graph > 0)\r
+ {\r
+ // Stretch Graph\r
+ graphStretch = i;\r
+ graphStretchY = evt.getY();\r
+ }\r
+\r
+ break;\r
+ }\r
+ }\r
+\r
+ if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK\r
+ && activeRow != -1)\r
+ {\r
+ if (av.getColumnSelection() == null)\r
+ {\r
+ return;\r
+ }\r
+\r
+ PopupMenu pop = new PopupMenu(\r
+ MessageManager.getString("label.structure_type"));\r
+ MenuItem item;\r
+ /*\r
+ * Just display the needed structure options\r
+ */\r
+ if (av.getAlignment().isNucleotide() == true)\r
+ {\r
+ item = new MenuItem(STEM);\r
+ item.addActionListener(this);\r
+ pop.add(item);\r
+ }\r
+ else\r
+ {\r
+ item = new MenuItem(HELIX);\r
+ item.addActionListener(this);\r
+ pop.add(item);\r
+ item = new MenuItem(SHEET);\r
+ item.addActionListener(this);\r
+ pop.add(item);\r
+ }\r
+ item = new MenuItem(LABEL);\r
+ item.addActionListener(this);\r
+ pop.add(item);\r
+ item = new MenuItem(COLOUR);\r
+ item.addActionListener(this);\r
+ pop.add(item);\r
+ item = new MenuItem(REMOVE);\r
+ item.addActionListener(this);\r
+ pop.add(item);\r
+ ap.alignFrame.add(pop);\r
+ pop.show(this, evt.getX(), evt.getY());\r
+\r
+ return;\r
+ }\r
+\r
+ ap.scalePanel.mousePressed(evt);\r
+ }\r
+\r
+ @Override\r
+ public void mouseReleased(MouseEvent evt)\r
+ {\r
+ graphStretch = -1;\r
+ graphStretchY = -1;\r
+ mouseDragging = false;\r
+ if (needValidating)\r
+ {\r
+ ap.validate();\r
+ needValidating = false;\r
+ }\r
+ ap.scalePanel.mouseReleased(evt);\r
+ }\r
+\r
+ @Override\r
+ public void mouseClicked(MouseEvent evt)\r
+ {\r
+ }\r
+\r
+ boolean needValidating = false;\r
+\r
+ @Override\r
+ public void mouseDragged(MouseEvent evt)\r
+ {\r
+ if (graphStretch > -1)\r
+ {\r
+ av.getAlignment().getAlignmentAnnotation()[graphStretch].graphHeight += graphStretchY\r
+ - evt.getY();\r
+ if (av.getAlignment().getAlignmentAnnotation()[graphStretch].graphHeight < 0)\r
+ {\r
+ av.getAlignment().getAlignmentAnnotation()[graphStretch].graphHeight = 0;\r
+ }\r
+ graphStretchY = evt.getY();\r
+ av.calcPanelHeight();\r
+ needValidating = true;\r
+ ap.paintAlignment(true);\r
+ }\r
+ else\r
+ {\r
+ ap.scalePanel.mouseDragged(evt);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void mouseMoved(MouseEvent evt)\r
+ {\r
+ AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();\r
+ if (aa == null)\r
+ {\r
+ return;\r
+ }\r
+\r
+ int row = -1;\r
+ int height = -scrollOffset;\r
+ for (int i = 0; i < aa.length; i++)\r
+ {\r
+\r
+ if (aa[i].visible)\r
+ {\r
+ height += aa[i].height;\r
+ }\r
+\r
+ if (evt.getY() < height)\r
+ {\r
+ row = i;\r
+ break;\r
+ }\r
+ }\r
+\r
+ int res = evt.getX() / av.getCharWidth() + av.getStartRes();\r
+\r
+ if (av.hasHiddenColumns())\r
+ {\r
+ res = av.getColumnSelection().adjustForHiddenColumns(res);\r
+ }\r
+\r
+ if (row > -1 && res < aa[row].annotations.length\r
+ && aa[row].annotations[res] != null)\r
+ {\r
+ StringBuffer text = new StringBuffer("Sequence position " + (res + 1));\r
+ if (aa[row].annotations[res].description != null)\r
+ {\r
+ text.append(" " + aa[row].annotations[res].description);\r
+ }\r
+ ap.alignFrame.statusBar.setText(text.toString());\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void mouseEntered(MouseEvent evt)\r
+ {\r
+ ap.scalePanel.mouseEntered(evt);\r
+ }\r
+\r
+ @Override\r
+ public void mouseExited(MouseEvent evt)\r
+ {\r
+ ap.scalePanel.mouseExited(evt);\r
+ }\r
+\r
+ public int adjustPanelHeight()\r
+ {\r
+ return adjustPanelHeight(true);\r
+ }\r
+\r
+ public int adjustPanelHeight(boolean repaint)\r
+ {\r
+ int height = av.calcPanelHeight();\r
+ this.setSize(new Dimension(getSize().width, height));\r
+ if (repaint)\r
+ {\r
+ repaint();\r
+ }\r
+ return height;\r
+ }\r
+\r
+ /**\r
+ * calculate the height for visible annotation, revalidating bounds where\r
+ * necessary ABSTRACT GUI METHOD\r
+ * \r
+ * @return total height of annotation\r
+ */\r
+\r
+ public void addEditableColumn(int i)\r
+ {\r
+ if (activeRow == -1)\r
+ {\r
+ AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();\r
+ if (aa == null)\r
+ {\r
+ return;\r
+ }\r
+\r
+ for (int j = 0; j < aa.length; j++)\r
+ {\r
+ if (aa[j].editable)\r
+ {\r
+ activeRow = j;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void update(Graphics g)\r
+ {\r
+ paint(g);\r
+ }\r
+\r
+ @Override\r
+ public void paint(Graphics g)\r
+ {\r
+ Dimension d = getSize();\r
+ imgWidth = d.width;\r
+ // (av.endRes - av.startRes + 1) * av.charWidth;\r
+ if (imgWidth < 1 || d.height < 1)\r
+ {\r
+ return;\r
+ }\r
+ if (image == null || imgWidth != image.getWidth(this)\r
+ || d.height != image.getHeight(this))\r
+ {\r
+ image = createImage(imgWidth, d.height);\r
+ gg = image.getGraphics();\r
+ gg.setFont(av.getFont());\r
+ fm = gg.getFontMetrics();\r
+ fastPaint = false;\r
+ }\r
+\r
+ if (fastPaint)\r
+ {\r
+ g.drawImage(image, 0, 0, this);\r
+ fastPaint = false;\r
+ return;\r
+ }\r
+\r
+ gg.setColor(Color.white);\r
+ gg.fillRect(0, 0, getSize().width, getSize().height);\r
+ drawComponent(gg, av.startRes, av.endRes + 1);\r
+\r
+ g.drawImage(image, 0, 0, this);\r
+ }\r
+\r
+ public void fastPaint(int horizontal)\r
+ {\r
+ if (horizontal == 0\r
+ || av.getAlignment().getAlignmentAnnotation() == null\r
+ || av.getAlignment().getAlignmentAnnotation().length < 1)\r
+ {\r
+ repaint();\r
+ return;\r
+ }\r
+\r
+ gg.copyArea(0, 0, imgWidth, getSize().height,\r
+ -horizontal * av.getCharWidth(), 0);\r
+ int sr = av.startRes, er = av.endRes + 1, transX = 0;\r
+\r
+ if (horizontal > 0) // scrollbar pulled right, image to the left\r
+ {\r
+ transX = (er - sr - horizontal) * av.getCharWidth();\r
+ sr = er - horizontal;\r
+ }\r
+ else if (horizontal < 0)\r
+ {\r
+ er = sr - horizontal;\r
+ }\r
+\r
+ gg.translate(transX, 0);\r
+\r
+ drawComponent(gg, sr, er);\r
+\r
+ gg.translate(-transX, 0);\r
+\r
+ fastPaint = true;\r
+ repaint();\r
+ }\r
+\r
+ /**\r
+ * DOCUMENT ME!\r
+ * \r
+ * @param g\r
+ * DOCUMENT ME!\r
+ * @param startRes\r
+ * DOCUMENT ME!\r
+ * @param endRes\r
+ * DOCUMENT ME!\r
+ */\r
+ public void drawComponent(Graphics g, int startRes, int endRes)\r
+ {\r
+ Font ofont = av.getFont();\r
+ g.setFont(ofont);\r
+\r
+ g.setColor(Color.white);\r
+ g.fillRect(0, 0, (endRes - startRes) * av.getCharWidth(),\r
+ getSize().height);\r
+\r
+ if (fm == null)\r
+ {\r
+ fm = g.getFontMetrics();\r
+ }\r
+\r
+ if ((av.getAlignment().getAlignmentAnnotation() == null)\r
+ || (av.getAlignment().getAlignmentAnnotation().length < 1))\r
+ {\r
+ g.setColor(Color.white);\r
+ g.fillRect(0, 0, getSize().width, getSize().height);\r
+ g.setColor(Color.black);\r
+ if (av.validCharWidth)\r
+ {\r
+ g.drawString(MessageManager\r
+ .getString("label.alignment_has_no_annotations"), 20, 15);\r
+ }\r
+\r
+ return;\r
+ }\r
+ g.translate(0, -scrollOffset);\r
+ renderer.drawComponent(this, av, g, activeRow, startRes, endRes);\r
+ g.translate(0, +scrollOffset);\r
+ }\r
+\r
+ int scrollOffset = 0;\r
+\r
+ public void setScrollOffset(int value, boolean repaint)\r
+ {\r
+ scrollOffset = value;\r
+ if (repaint)\r
+ {\r
+ repaint();\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public FontMetrics getFontMetrics()\r
+ {\r
+ return fm;\r
+ }\r
+\r
+ @Override\r
+ public Image getFadedImage()\r
+ {\r
+ return image;\r
+ }\r
+\r
+ @Override\r
+ public int getFadedImageWidth()\r
+ {\r
+ return imgWidth;\r
+ }\r
+\r
+ private int[] bounds = new int[2];\r
+\r
+ @Override\r
+ public int[] getVisibleVRange()\r
+ {\r
+ if (ap != null && ap.alabels != null)\r
+ {\r
+ int sOffset = -ap.alabels.scrollOffset;\r
+ int visHeight = sOffset + ap.annotationPanelHolder.getHeight();\r
+ bounds[0] = sOffset;\r
+ bounds[1] = visHeight;\r
+ return bounds;\r
+ }\r
+ else\r
+ {\r
+ return null;\r
+ }\r
+ }\r
+}\r