X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=inline;f=src%2Fjalview%2Fgui%2FAnnotationPanel.java;h=315b14123b2b3f50a8adc352fcc15e8127ea3520;hb=d587f1aa61946dc14f6f089cf1dc2a3116cfb773;hp=a6c2055230f953ce3687ee212899a59abb4f0e9c;hpb=18dbe82eae761c1e96d2eb5b842747a515db116f;p=jalview.git
diff --git a/src/jalview/gui/AnnotationPanel.java b/src/jalview/gui/AnnotationPanel.java
index a6c2055..315b141 100755
--- a/src/jalview/gui/AnnotationPanel.java
+++ b/src/jalview/gui/AnnotationPanel.java
@@ -1,6 +1,6 @@
/*
* Jalview - A Sequence Alignment Editor and Viewer
- * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * Copyright (C) 2006 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
@@ -18,751 +18,1254 @@
*/
package jalview.gui;
-import java.util.*;
+import jalview.datamodel.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
+
import javax.swing.*;
-import jalview.datamodel.*;
-public class AnnotationPanel
- extends JPanel implements MouseListener,
+/**
+ * DOCUMENT ME!
+ *
+ * @author $author$
+ * @version $Revision$
+ */
+public class AnnotationPanel extends JPanel implements MouseListener,
MouseMotionListener, ActionListener, AdjustmentListener
{
- static String HELIX = "Helix";
- static String SHEET = "Sheet";
- static String LABEL = "Label";
- static String REMOVE = "Remove Annotation";
- static String COLOUR = "Colour";
- static Color HELIX_COLOUR = Color.red.darker();
- static Color SHEET_COLOUR = Color.green.darker().darker();
-
- public static int GRAPH_HEIGHT = 40;
- AlignViewport av;
- AlignmentPanel ap;
- int activeRow = -1;
- Vector activeRes;
- BufferedImage image;
- Graphics2D gg;
- FontMetrics fm;
- int imgWidth = 0;
- boolean fastPaint = false;
-
- public AnnotationPanel(AlignmentPanel ap)
- {
- ToolTipManager.sharedInstance().registerComponent(this);
- ToolTipManager.sharedInstance().setInitialDelay(0);
- ToolTipManager.sharedInstance().setDismissDelay(10000);
- this.ap = ap;
- av = ap.av;
- this.setLayout(null);
- addMouseListener(this);
- addMouseMotionListener(this);
- ap.annotationScroller.getVerticalScrollBar().addAdjustmentListener(this);
- }
-
- public void adjustmentValueChanged(AdjustmentEvent evt)
- {
- ap.alabels.setScrollOffset( -evt.getValue());
- }
-
- public void adjustPanelHeight()
- {
- // setHeight of panels
- AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
- int height = 0;
-
- if (aa != null)
+ final String HELIX = "Helix";
+ final String SHEET = "Sheet";
+ 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();
+
+ /** DOCUMENT ME!! */
+ AlignViewport av;
+ AlignmentPanel ap;
+ int activeRow = -1;
+ BufferedImage image;
+ BufferedImage fadedImage;
+ Graphics2D gg;
+ FontMetrics fm;
+ int imgWidth = 0;
+ boolean fastPaint = false;
+
+ //Used For mouse Dragging and resizing graphs
+ int graphStretch = -1;
+ int graphStretchY = -1;
+ int min; //used by mouseDragged to see if user
+ int max; //used by mouseDragged to see if user
+ boolean mouseDragging = false;
+
+ boolean MAC = false;
+
+ /**
+ * Creates a new AnnotationPanel object.
+ *
+ * @param ap DOCUMENT ME!
+ */
+ public AnnotationPanel(AlignmentPanel ap)
{
- for (int i = 0; i < aa.length; i++)
- {
- if (!aa[i].visible)
- {
- continue;
- }
- aa[i].height = 0;
+ if(System.getProperty("os.name").startsWith("Mac"))
+ MAC = true;
+
+ ToolTipManager.sharedInstance().registerComponent(this);
+ ToolTipManager.sharedInstance().setInitialDelay(0);
+ ToolTipManager.sharedInstance().setDismissDelay(10000);
+ this.ap = ap;
+ av = ap.av;
+ this.setLayout(null);
+ addMouseListener(this);
+ addMouseMotionListener(this);
+ ap.annotationScroller.getVerticalScrollBar().addAdjustmentListener(this);
+ }
- if (aa[i].hasText)
- {
- aa[i].height += av.charHeight;
- }
+ public AnnotationPanel(AlignViewport av)
+ {
+ this.av = av;
+ }
- if (aa[i].hasIcons)
- {
- aa[i].height += 16;
- }
- if (aa[i].isGraph)
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void adjustmentValueChanged(AdjustmentEvent evt)
+ {
+ ap.alabels.setScrollOffset(-evt.getValue());
+ }
+
+ /**
+ * DOCUMENT ME!
+ */
+ public int adjustPanelHeight()
+ {
+ // setHeight of panels
+ AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
+ int height = 0;
+
+ if (aa != null)
{
- aa[i].height += GRAPH_HEIGHT;
+ for (int i = 0; i < aa.length; i++)
+ {
+ if (!aa[i].visible)
+ {
+ continue;
+ }
+
+ aa[i].height = 0;
+
+ if (aa[i].hasText)
+ {
+ aa[i].height += av.charHeight;
+ }
+
+ if (aa[i].hasIcons)
+ {
+ aa[i].height += 16;
+ }
+
+ if (aa[i].graph>0)
+ {
+ aa[i].height += aa[i].graphHeight;
+ }
+
+ if (aa[i].height == 0)
+ {
+ aa[i].height = 20;
+ }
+
+ height += aa[i].height;
+ }
}
-
- if (aa[i].height == 0)
+ else
{
- aa[i].height = 20;
+ height = 20;
}
- height += aa[i].height;
- }
- }
- else
- {
- height = 20;
+ this.setPreferredSize(new Dimension(1, height));
+
+ return height;
}
- this.setPreferredSize(new Dimension(1, height));
- }
- public void removeEditableColumn(int col)
- {
- if (activeRow == -1)
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void actionPerformed(ActionEvent evt)
{
- AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
+ AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
+ Annotation[] anot = aa[activeRow].annotations;
- for (int j = 0; j < aa.length; j++)
- {
- if (aa[j].editable)
+ if (evt.getActionCommand().equals(REMOVE))
{
- activeRow = j;
- break;
+ for (int i = 0; i < av.getColumnSelection().size(); i++)
+ {
+ anot[av.getColumnSelection().columnAt(i)] = null;
+ }
}
- }
- }
+ else if (evt.getActionCommand().equals(LABEL))
+ {
+ String label = JOptionPane.showInputDialog(this, "Enter Label ",
+ "Enter label", JOptionPane.QUESTION_MESSAGE);
- if (activeRes != null && activeRes.contains(String.valueOf(col)))
- {
- activeRes.removeElement(String.valueOf(col));
- }
- repaint();
- }
+ if (label == null)
+ {
+ return;
+ }
+ if ((label.length() > 0) && !aa[activeRow].hasText)
+ {
+ aa[activeRow].hasText = true;
+ }
- public void addEditableColumn(int col)
- {
- if (activeRow == -1)
- {
- AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
+ for (int i = 0; i < av.getColumnSelection().size(); i++)
+ {
+ int index = av.getColumnSelection().columnAt(i);
- for (int j = 0; j < aa.length; j++)
- {
- if (aa[j].editable)
- {
- activeRow = j;
- break;
+ if (anot[index] == null)
+ {
+ anot[index] = new Annotation(label, "", ' ', 0);
+ }
+
+ anot[index].displayCharacter = label;
+ }
}
- }
- }
+ else if (evt.getActionCommand().equals(COLOUR))
+ {
+ Color col = JColorChooser.showDialog(this,
+ "Choose foreground colour", Color.black);
- if (activeRes == null)
- activeRes = new Vector();
+ for (int i = 0; i < av.getColumnSelection().size(); i++)
+ {
+ int index = av.getColumnSelection().columnAt(i);
- if (!activeRes.contains(String.valueOf(col)))
- activeRes.addElement(String.valueOf(col));
+ if (anot[index] == null)
+ {
+ anot[index] = new Annotation("", "", ' ', 0);
+ }
- repaint();
- }
+ anot[index].colour = col;
+ }
+ }
+ else // HELIX OR SHEET
+ {
+ char type = 0;
+ String symbol = "\u03B1";
- public void actionPerformed(ActionEvent evt)
- {
- AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
- Annotation[] anot = aa[activeRow].annotations;
+ if (evt.getActionCommand().equals(HELIX))
+ {
+ type = 'H';
+ }
+ else if (evt.getActionCommand().equals(SHEET))
+ {
+ type = 'E';
+ symbol = "\u03B2";
+ }
- if (evt.getActionCommand().equals(REMOVE))
- {
- for (int i = 0; i < activeRes.size(); i++)
- {
- anot[Integer.parseInt(activeRes.get(i).toString())] = null;
- anot[Integer.parseInt(activeRes.get(i).toString())] = null;
- }
- }
- else if (evt.getActionCommand().equals(LABEL))
- {
- String label = JOptionPane.showInputDialog(this, "Enter Label ",
- "Enter label",
- JOptionPane.QUESTION_MESSAGE);
+ if (!aa[activeRow].hasIcons)
+ {
+ aa[activeRow].hasIcons = true;
+ }
- if (label == null)
- return;
+ String label = JOptionPane.showInputDialog("Enter a label for the structure?",
+ symbol);
- if ( (label.length() > 0) && !aa[activeRow].hasText)
- {
- aa[activeRow].hasText = true;
- }
+ if (label == null)
+ {
+ return;
+ }
- for (int i = 0; i < activeRes.size(); i++)
- {
- int index = Integer.parseInt(activeRes.get(i).toString());
+ if ((label.length() > 0) && !aa[activeRow].hasText)
+ {
+ aa[activeRow].hasText = true;
+ }
- if (anot[index] == null)
- {
- anot[index] = new Annotation(label, "", ' ', 0);
- }
- anot[index].displayCharacter = label;
- }
- }
- else if (evt.getActionCommand().equals(COLOUR))
- {
- Color col = JColorChooser.showDialog(this,
- "Choose foreground colour",
- Color.black);
+ for (int i = 0; i < av.getColumnSelection().size(); i++)
+ {
+ int index = av.getColumnSelection().columnAt(i);
- for (int i = 0; i < activeRes.size(); i++)
- {
- int index = Integer.parseInt(activeRes.get(i).toString());
+ if (anot[index] == null)
+ {
+ anot[index] = new Annotation(label, "", type, 0);
+ }
- if (anot[index] == null)
- {
- anot[index] = new Annotation("", "", ' ', 0);
+ anot[index].secondaryStructure = type;
+ anot[index].displayCharacter = label;
+ }
}
- anot[index].colour = col;
- }
+ adjustPanelHeight();
+ repaint();
+
+ return;
}
- 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";
- }
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void mousePressed(MouseEvent evt)
+ {
- if (!aa[activeRow].hasIcons)
- {
- aa[activeRow].hasIcons = true;
- }
- String label = JOptionPane.showInputDialog(
- "Enter a label for the structure?",
- symbol);
+ AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
+ if(aa==null)
+ return;
- if (label == null)
- return;
- if ( (label.length() > 0) && !aa[activeRow].hasText)
- {
- aa[activeRow].hasText = true;
- }
+ int height = 0;
+ activeRow = -1;
- for (int i = 0; i < activeRes.size(); i++)
- {
- int index = Integer.parseInt(activeRes.get(i).toString());
- if (anot[index] == null)
+ for (int i = 0; i < aa.length; i++)
{
- anot[index] = new Annotation(label, "", type, 0);
+ 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;
+ }
}
- anot[index].secondaryStructure = type;
- anot[index].displayCharacter = label;
- }
- }
- adjustPanelHeight();
- activeRes = null;
- repaint();
+ if (SwingUtilities.isRightMouseButton(evt) && activeRow!=-1)
+ {
+ if (av.getColumnSelection() == null)
+ {
+ return;
+ }
- return;
- }
+ JPopupMenu pop = new JPopupMenu("Structure type");
+ JMenuItem item = new JMenuItem(HELIX);
+ item.addActionListener(this);
+ pop.add(item);
+ item = new JMenuItem(SHEET);
+ item.addActionListener(this);
+ pop.add(item);
+ item = new JMenuItem(LABEL);
+ item.addActionListener(this);
+ pop.add(item);
+ item = new JMenuItem(COLOUR);
+ item.addActionListener(this);
+ pop.add(item);
+ item = new JMenuItem(REMOVE);
+ item.addActionListener(this);
+ pop.add(item);
+ pop.show(this, evt.getX(), evt.getY());
+
+ return;
+ }
- public void mousePressed(MouseEvent evt)
- {
- int height = 0;
- activeRow = -1;
- AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
+ if (aa == null)
+ {
+ return;
+ }
- for (int i = 0; i < aa.length; i++)
- {
- height += aa[i].height;
+ int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();
- if (evt.getY() < height)
- {
- if (aa[i].editable)
- activeRow = i;
- else
- activeRes = null;
+ min = res;
+ max = res;
- break;
- }
- }
+ if (av.getColumnSelection().contains(res))
+ av.getColumnSelection().removeElement(res);
+ else
+ {
+ av.getColumnSelection().addElement(res);
+ SequenceGroup sg = new SequenceGroup();
+ for (int i = 0; i < av.alignment.getSequences().size(); i++)
+ {
+ sg.addSequence(av.alignment.getSequenceAt(i), false);
+ }
- if (SwingUtilities.isRightMouseButton(evt))
- {
- if (activeRes == null)
- {
- return;
- }
+ sg.setStartRes(res);
+ sg.setEndRes(res);
+ av.setSelectionGroup(sg);
+ }
+ ap.repaint();
- JPopupMenu pop = new JPopupMenu("Structure type");
- JMenuItem item = new JMenuItem(HELIX);
- item.addActionListener(this);
- pop.add(item);
- item = new JMenuItem(SHEET);
- item.addActionListener(this);
- pop.add(item);
- item = new JMenuItem(LABEL);
- item.addActionListener(this);
- pop.add(item);
- item = new JMenuItem(COLOUR);
- item.addActionListener(this);
- pop.add(item);
- item = new JMenuItem(REMOVE);
- item.addActionListener(this);
- pop.add(item);
- pop.show(this, evt.getX(), evt.getY());
-
- return;
}
-
- if (aa == null)
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void mouseReleased(MouseEvent evt)
{
- return;
+ graphStretch = -1;
+ graphStretchY = -1;
+ mouseDragging = false;
}
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void mouseEntered(MouseEvent evt)
+ {
+ if(mouseDragging)
+ ap.seqPanel.scrollCanvas(null);
+ }
- int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();
-
- if (evt.isControlDown() || evt.isAltDown())
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void mouseExited(MouseEvent evt)
{
- addEditableColumn(res);
+ if(mouseDragging)
+ ap.seqPanel.scrollCanvas(evt);
}
- else if (evt.isShiftDown())
+
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void mouseDragged(MouseEvent evt)
{
- if (activeRes == null)
+ if(graphStretch>-1)
{
- activeRes = new Vector();
+ av.alignment.getAlignmentAnnotation()[graphStretch].graphHeight += graphStretchY - evt.getY();
+ if(av.alignment.getAlignmentAnnotation()[graphStretch].graphHeight <0)
+ av.alignment.getAlignmentAnnotation()[graphStretch].graphHeight = 0;
+ graphStretchY = evt.getY();
+ adjustPanelHeight();
+ ap.repaint();
}
else
{
- int start = Integer.parseInt(activeRes.get(activeRes.size() -
- 1).toString());
- int end = res;
+ mouseDragging = true;
+
+ int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();
+
+ SequenceGroup sg = av.getSelectionGroup();
- if (end < start)
+ if (res < min)
{
- int temp = end;
- end = start;
- start = temp;
+ min = res;
}
- for (int n = start; n <= end; n++)
+ if (res > max)
{
- addEditableColumn(n);
+ max = res;
+ }
+
+ if (sg != null)
+ {
+ if (!av.getColumnSelection().contains(res))
+ {
+ av.getColumnSelection().addElement(res);
+ }
+
+ if (res > sg.getStartRes())
+ {
+ sg.setEndRes(res);
+ }
+ else if (res < sg.getStartRes())
+ {
+ sg.setStartRes(res);
+ }
+
+ for (int i = min; i <= max; i++)
+ {
+ if ((i < sg.getStartRes()) || (i > sg.getEndRes()))
+ {
+ av.getColumnSelection().removeElement(i);
+ }
+ else
+ {
+ av.getColumnSelection().addElement(i);
+ }
+ }
+
+ ap.repaint();
}
+
}
}
- else
+
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void mouseMoved(MouseEvent evt)
{
- activeRes = new Vector();
- activeRes.addElement(String.valueOf(res));
- }
+ AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
- repaint();
- }
+ if (aa == null)
+ {
+ return;
+ }
- public void mouseReleased(MouseEvent evt)
- {
- }
+ int row = -1;
+ int height = 0;
- public void mouseEntered(MouseEvent evt)
- {
- }
+ for (int i = 0; i < aa.length; i++)
+ {
+ if (aa[i].visible)
+ {
+ height += aa[i].height;
+ }
- public void mouseExited(MouseEvent evt)
- {
- }
+ if (evt.getY() < height)
+ {
+ row = i;
- public void mouseDragged(MouseEvent evt)
- {
- }
+ break;
+ }
+ }
- public void mouseMoved(MouseEvent evt)
- {
- AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
+ if(row==-1)
+ return;
- if (aa == null)
- {
- return;
- }
+ int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();
- int row = -1;
- int height = 0;
+ if(av.hasHiddenColumns)
+ res = av.getColumnSelection().adjustForHiddenColumns(res);
- for (int i = 0; i < aa.length; i++)
- {
- if (aa[i].visible)
- {
- height += aa[i].height;
- }
+ if ( aa[row].annotations!=null
+ && row > -1
+ && res < (int) aa[row].annotations.length)
+ {
+ if(aa[row].graphGroup>-1)
+ {
+ StringBuffer tip = new StringBuffer("");
+ for (int gg = 0; gg < aa.length; gg++)
+ {
+ if (aa[gg].graphGroup == aa[row].graphGroup && aa[gg].annotations[res]!=null)
+ tip.append(aa[gg].label+" "+aa[gg].annotations[res].description+"
" );
+ }
+ if(tip.length()!=6)
+ {
+ tip.setLength(tip.length() - 4);
+ this.setToolTipText(tip.toString() + "");
+ }
+ }
+ else if(aa[row].annotations[res] != null)
+ this.setToolTipText(aa[row].annotations[res].description);
- if (evt.getY() < height)
- {
- row = i;
+ if(aa[row].annotations[res]!=null)
+ {
+ StringBuffer text = new StringBuffer("Sequence position " +
+ (res + 1) + " " +
+ aa[row].annotations[res].description);
- break;
- }
+ ap.alignFrame.statusBar.setText(text.toString());
+ }
+ }
}
- int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();
+ /**
+ * DOCUMENT ME!
+ *
+ * @param evt DOCUMENT ME!
+ */
+ public void mouseClicked(MouseEvent evt)
+ {
+ }
- if ( (row > -1) && (res < aa[row].annotations.length) &&
- (aa[row].annotations[res] != null))
+ /**
+ * DOCUMENT ME!
+ *
+ * @param g DOCUMENT ME!
+ */
+ public void paintComponent(Graphics g)
{
- this.setToolTipText(aa[row].annotations[res].description);
+ g.setColor(Color.white);
+ g.fillRect(0, 0, getWidth(), getHeight());
- StringBuffer text = new StringBuffer("Sequence position " +
- (res + 1) + " " +
- aa[row].annotations[res].description);
- ap.alignFrame.statusBar.setText(text.toString());
- }
- }
+ if(image!=null)
+ {if (fastPaint
+ || (getVisibleRect().width != g.getClipBounds().width)
+ || (getVisibleRect().height != g.getClipBounds().height))
+ {
+ g.drawImage(image, 0, 0, this);
+ fastPaint = false;
+ return;
+ }
+ }
+ imgWidth = (av.endRes - av.startRes + 1) * av.charWidth;
- public void mouseClicked(MouseEvent evt)
- {
- }
+ if (image == null || imgWidth != image.getWidth()
+ || image.getHeight(this) != getHeight())
+ {
+ image = new BufferedImage(imgWidth, ap.annotationPanel.getHeight(),
+ BufferedImage.TYPE_INT_RGB);
+ gg = (Graphics2D) image.getGraphics();
+
+ if(av.antiAlias)
+ gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+ RenderingHints.VALUE_ANTIALIAS_ON);
+
+ gg.setFont(av.getFont());
+ fm = gg.getFontMetrics();
+ gg.setColor(Color.white);
+ gg.fillRect(0, 0, imgWidth, image.getHeight());
+ }
- public void paintComponent(Graphics g)
- {
- g.setColor(Color.white);
- g.fillRect(0, 0, getWidth(), getHeight());
- if (fastPaint)
- {
+ drawComponent(gg, av.startRes, av.endRes + 1);
g.drawImage(image, 0, 0, this);
- fastPaint = false;
-
- return;
}
- imgWidth = (av.endRes - av.startRes + 1) * av.charWidth;
+ /**
+ * DOCUMENT ME!
+ *
+ * @param horizontal DOCUMENT ME!
+ */
+ public void fastPaint(int horizontal)
+ {
+ if ((horizontal == 0)
+ || gg==null
+ || av.alignment.getAlignmentAnnotation()==null
+ || av.alignment.getAlignmentAnnotation().length < 1
+ || av.updatingConsensus
+ || av.updatingConservation)
+ {
+ repaint();
+ return;
+ }
- image = new BufferedImage(imgWidth, ap.annotationPanel.getHeight(),
- BufferedImage.TYPE_INT_RGB);
- gg = (Graphics2D) image.getGraphics();
- gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
- RenderingHints.VALUE_ANTIALIAS_ON);
+ gg.copyArea(0, 0, imgWidth, getHeight(), -horizontal * av.charWidth, 0);
- gg.setFont(av.getFont());
- fm = gg.getFontMetrics();
+ int sr = av.startRes;
+ int er = av.endRes + 1;
+ int transX = 0;
- drawComponent(gg, av.startRes, av.endRes + 1);
- g.drawImage(image, 0, 0, this);
- }
+ if (horizontal > 0) // scrollbar pulled right, image to the left
+ {
+ transX = (er - sr - horizontal) * av.charWidth;
+ sr = er - horizontal;
+ }
+ else if (horizontal < 0)
+ {
+ er = sr - horizontal;
+ }
- public void fastPaint(int horizontal)
- {
- if ( (horizontal == 0) ||
- (av.alignment.getAlignmentAnnotation() == null) ||
- (av.alignment.getAlignmentAnnotation().length < 1))
- {
- repaint();
+ gg.translate(transX, 0);
- return;
- }
+ drawComponent(gg, sr, er);
- gg.copyArea(0, 0, imgWidth, getHeight(), -horizontal * av.charWidth, 0);
+ gg.translate(-transX, 0);
- int sr = av.startRes;
- int er = av.endRes + 1;
- int transX = 0;
+ fastPaint = true;
+
+ repaint();
- if (horizontal > 0) // scrollbar pulled right, image to the left
- {
- transX = (er - sr - horizontal) * av.charWidth;
- sr = er - horizontal;
- }
- else if (horizontal < 0)
- {
- er = sr - horizontal;
}
- gg.translate(transX, 0);
+ /**
+ * DOCUMENT ME!
+ *
+ * @param g DOCUMENT ME!
+ * @param startRes DOCUMENT ME!
+ * @param endRes DOCUMENT ME!
+ */
+ public void drawComponent(Graphics g, int startRes, int endRes)
+ {
+ if(av.updatingConsensus || av.updatingConservation)
+ {
+ if(image==null)
+ {
+ return;
+ }
+ //We'll keep a record of the old image,
+ //and draw a faded image until the calculation
+ //has completed
+ if(fadedImage==null
+ || fadedImage.getWidth()!=imgWidth
+ || fadedImage.getHeight()!=image.getHeight())
+ {
+ fadedImage = new BufferedImage(
+ imgWidth, image.getHeight(),
+ BufferedImage.TYPE_INT_RGB);
- drawComponent(gg, sr, er);
+ Graphics2D fadedG = (Graphics2D) fadedImage.getGraphics();
- gg.translate( -transX, 0);
+ fadedG.setColor(Color.white);
+ fadedG.fillRect(0, 0, imgWidth, image.getHeight());
- fastPaint = true;
- repaint();
- }
+ fadedG.setComposite(
+ AlphaComposite.getInstance(
+ AlphaComposite.SRC_OVER, .3f));
+ fadedG.drawImage(image, 0, 0, this);
- public void drawComponent(Graphics2D g, int startRes, int endRes)
- {
- g.setColor(Color.white);
- g.fillRect(0, 0, (endRes - startRes) * av.charWidth, getHeight());
+ }
- if ( (av.alignment.getAlignmentAnnotation() == null) ||
- (av.alignment.getAlignmentAnnotation().length < 1))
- {
- g.setColor(Color.white);
- g.fillRect(0, 0, getWidth(), getHeight());
- g.setColor(Color.black);
- g.drawString("Alignment has no annotations", 20, 15);
+ }
+ else
+ fadedImage = null;
- return;
- }
- AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
+ g.setColor(Color.white);
+ g.fillRect(0, 0, (endRes - startRes) * av.charWidth, getHeight());
- int j;
- int x = 0;
- int y = 0;
- char[] lastSS = new char[aa.length];
- int[] lastSSX = new int[aa.length];
- int iconOffset = av.charHeight / 2;
- boolean validRes = false;
+ g.setFont(av.getFont());
+ if (fm == null)
+ fm = g.getFontMetrics();
- //\u03B2 \u03B1
- for (int i = 0; i < aa.length; i++)
- {
- AlignmentAnnotation row = aa[i];
- if (!row.visible)
- {
- continue;
- }
- if (row.isGraph)
- {
- // this is so that we draw the characters below the graph
- y += row.height;
- if (row.hasText)
+ if ( (av.alignment.getAlignmentAnnotation() == null) ||
+ (av.alignment.getAlignmentAnnotation().length < 1))
{
- y -= av.charHeight;
+ g.setColor(Color.white);
+ g.fillRect(0, 0, getWidth(), getHeight());
+ g.setColor(Color.black);
+ if(av.validCharWidth)
+ g.drawString("Alignment has no annotations", 20, 15);
+
+ return;
}
- }
- if (row.hasText)
- {
- iconOffset = av.charHeight / 2;
- }
- else
- {
- iconOffset = 0;
- }
- for (j = startRes; j < endRes; j++)
- {
- if ( (row.annotations.length <= j) ||
- (row.annotations[j] == null))
- {
- validRes = false;
- }
- else
- {
- validRes = true;
- }
+ AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
+
+ int x = 0, y = 0;
+ int column=0;
+ char lastSS;
+ int lastSSX;
+ int iconOffset = av.charHeight / 2;
+ boolean validRes = false;
- x = (j - startRes) * av.charWidth;
+ boolean [] graphGroupDrawn = new boolean[aa.length];
- if (activeRow == i)
+
+ //\u03B2 \u03B1
+ for (int i = 0; i < aa.length; i++)
{
- g.setColor(Color.red);
+ AlignmentAnnotation row = aa[i];
- if (activeRes != null)
- {
- for (int n = 0; n < activeRes.size(); n++)
+ if (!row.visible)
{
- int v = Integer.parseInt(activeRes.get(n).toString());
-
- if (v == j)
- {
- g.fillRect( (j - startRes) * av.charWidth, y,
- av.charWidth, row.height);
- }
+ continue;
}
- }
- }
- if (validRes &&
- (row.annotations[j].displayCharacter.length() > 0))
- {
- int charOffset = (av.charWidth -
- fm.charWidth(row.annotations[j].displayCharacter.
- charAt(
- 0))) / 2;
- g.setColor(row.annotations[j].colour);
-
- if (j == 0)
- {
- g.drawString(row.annotations[j].displayCharacter,
- x, y + iconOffset + 2);
- }
- else if (
- ( (row.annotations[j - 1] == null) ||
- (row.annotations[j].displayCharacter != row.annotations[j -
- 1].displayCharacter)))
- {
- g.drawString(row.annotations[j].displayCharacter, x,
- y + iconOffset + 2);
- }
- }
+ lastSS = ' ';
+ lastSSX = 0;
- if (row.hasIcons)
- {
- if (!validRes ||
- (row.annotations[j].secondaryStructure != lastSS[i]))
- {
- switch (lastSS[i])
+ if (row.graph>0)
{
- case 'H':
- g.setColor(HELIX_COLOUR);
- g.fillRoundRect(lastSSX[i], y + 4 + iconOffset,
- x - lastSSX[i], 7, 8, 8);
+ if(row.graphGroup>-1 && graphGroupDrawn[ row.graphGroup ] )
+ continue;
- break;
+ // this is so that we draw the characters below the graph
+ y += row.height;
- case 'E':
- g.setColor(SHEET_COLOUR);
- g.fillRect(lastSSX[i], y + 4 + iconOffset,
- x - lastSSX[i] - 4, 7);
- g.fillPolygon(new int[]
- {x - 4, x - 4, x},
- new int[]
- {
- y + iconOffset, y + 14 + iconOffset,
- y + 8 + iconOffset
- }, 3);
+ if (row.hasText)
+ {
+ y -= av.charHeight;
+ }
+ }
- break;
+ if (av.updatingConsensus && aa[i].label.equals("Consensus"))
+ {
+ y += av.charHeight;
- case 'C':
- break;
+ g.drawImage(fadedImage,
+ 0,y-row.height,imgWidth, y,
+ 0,y-row.height,imgWidth, y, this);
+ g.setColor(Color.black);
+ // g.drawString("Calculating Consensus....",20, y-row.height/2);
- default:
- g.setColor(Color.gray);
- g.fillRect(lastSSX[i], y + 6 + iconOffset,
- x - lastSSX[i], 2);
+ continue;
+ }
+ else if (av.updatingConservation && aa[i].label.equals("Conservation"))
+ {
- break;
+ y += av.charHeight;
+ g.drawImage(fadedImage,
+ 0, y - row.height, imgWidth, y,
+ 0, y - row.height, imgWidth, y, this);
+
+ g.setColor(Color.black);
+ // g.drawString("Calculating Conservation.....",20, y-row.height/2);
+
+ continue;
+ }
+ else if (av.updatingConservation && aa[i].label.equals("Quality"))
+ {
+
+ y += av.charHeight;
+ g.drawImage(fadedImage,
+ 0, y - row.height, imgWidth, y,
+ 0, y - row.height, imgWidth, y, this);
+ g.setColor(Color.black);
+ /// g.drawString("Calculating Quality....",20, y-row.height/2);
+
+ continue;
}
- if (validRes)
+
+ if (row.hasText)
{
- lastSS[i] = row.annotations[j].secondaryStructure;
+ iconOffset = av.charHeight / 2 + 4;
}
else
{
- lastSS[i] = ' ';
+ iconOffset = 0;
}
- lastSSX[i] = x;
- }
- }
-
- if (validRes && row.isGraph)
- {
- g.setColor(new Color(0, 0, 180));
+ x = 0;
+ while (x < endRes-startRes)
+ {
+ if (av.hasHiddenColumns)
+ {
+ column = av.getColumnSelection().adjustForHiddenColumns(startRes+x);
+ if (column > row.annotations.length-1)
+ {
+ break;
+ }
+ }
+ else
+ column = startRes+x;
+
+
+ if ((row.annotations.length <= column) ||
+ (row.annotations[column] == null))
+ {
+ validRes = false;
+ }
+ else
+ {
+ validRes = true;
+ }
+
+
+ if (activeRow == i)
+ {
+ g.setColor(Color.red);
+
+ if (av.getColumnSelection() != null)
+ {
+ for (int n = 0; n < av.getColumnSelection().size(); n++)
+ {
+ int v = av.getColumnSelection().columnAt(n);
+
+ if (v == column)
+ {
+ g.fillRect(x * av.charWidth, y,
+ av.charWidth, av.charHeight);
+ }
+ }
+ }
+ }
+
+ if (av.validCharWidth && validRes &&
+ (row.annotations[column].displayCharacter.length() > 0))
+ {
+
+ int charOffset = (av.charWidth -
+ fm.charWidth(row.annotations[column].displayCharacter.charAt(
+ 0))) / 2;
+ g.setColor(row.annotations[column].colour);
+
+ if (column == 0 || row.graph>0)
+ {
+ g.drawString(row.annotations[column].displayCharacter,
+ (x*av.charWidth)+charOffset,
+ y + iconOffset );
+ }
+ else if (
+ row.annotations[column - 1] == null
+ ||(!row.annotations[column].displayCharacter.equals(
+ row.annotations[column - 1].displayCharacter)
+ ||
+ (row.annotations[column].displayCharacter.length() <2 &&
+ row.annotations[column].secondaryStructure==' ')))
+ {
+ g.drawString(row.annotations[column].displayCharacter,
+ x*av.charWidth+charOffset,
+ y + iconOffset );
+ }
+ }
+
+ if (row.hasIcons)
+ {
+ if (!validRes ||
+ (row.annotations[column].secondaryStructure != lastSS))
+ {
+ switch (lastSS)
+ {
+ case 'H':
+ g.setColor(HELIX_COLOUR);
+ if (MAC)
+ {
+ //Off by 1 offset when drawing rects and ovals
+ //to offscreen image on the MAC
+ g.fillRoundRect(lastSSX, y + 4 + iconOffset,
+ (x*av.charWidth) - lastSSX, 7, 8, 8);
+ break;
+ }
+
+ int sCol = (lastSSX / av.charWidth) + startRes;
+ int x1 = lastSSX;
+ int x2 = (x*av.charWidth);
+
+ if(sCol==0 ||
+ row.annotations[sCol-1]==null ||
+ row.annotations[sCol-1].secondaryStructure!='H')
+ {
+ g.fillArc(lastSSX, y+4+iconOffset, av.charWidth, 8, 90,180) ;
+ x1 += av.charWidth/2;
+ }
+
+ if(row.annotations[column]==null ||
+ row.annotations[column].secondaryStructure!='H')
+ {
+ g.fillArc((x*av.charWidth)-av.charWidth,
+ y+4+iconOffset, av.charWidth, 8, 270,180);
+ x2 -= av.charWidth/2;
+ }
+
+ g.fillRect(x1, y+4+iconOffset, x2-x1, 8);
+ break;
+
+ case 'E':
+ g.setColor(SHEET_COLOUR);
+ g.fillRect(lastSSX, y + 4 + iconOffset,
+ (x*av.charWidth) - lastSSX - 4, 7);
+ g.fillPolygon(new int[] { (x*av.charWidth) - 4,
+ (x*av.charWidth) - 4,
+ (x*av.charWidth) },
+ new int[]
+ {
+ y + iconOffset, y + 14 + iconOffset,
+ y + 8 + iconOffset
+ }, 3);
+
+ break;
+
+
+ default:
+ g.setColor(Color.gray);
+ g.fillRect(lastSSX, y + 6 + iconOffset,
+ (x*av.charWidth) - lastSSX, 2);
+
+ break;
+ }
+
+ if (validRes)
+ {
+ lastSS = row.annotations[column].secondaryStructure;
+ }
+ else
+ {
+ lastSS = ' ';
+ }
+
+ lastSSX = (x*av.charWidth);
+ }
+ }
+
+
+ column++;
+ x++;
+ }
- int height = (int) ( (row.annotations[j].value / row.graphMax) *
- GRAPH_HEIGHT);
+ if(column>=row.annotations.length)
+ column = row.annotations.length-1;
- if (row.windowLength > 1)
- {
- int total = 0;
+ // x ++;
- for (int i2 = j - (row.windowLength / 2);
- i2 < (j + (row.windowLength / 2)); i2++)
+ if (row.hasIcons)
{
- if ( (i2 < 0) || (i2 >= av.alignment.getWidth()))
+ switch (lastSS)
{
- continue;
+ case 'H':
+ g.setColor(HELIX_COLOUR);
+ if (MAC)
+ {
+ //Off by 1 offset when drawing rects and ovals
+ //to offscreen image on the MAC
+ g.fillRoundRect(lastSSX, y + 4 + iconOffset,
+ (x*av.charWidth) - lastSSX, 7, 8, 8);
+ break;
+ }
+
+ int sCol = (lastSSX / av.charWidth) + startRes;
+ int x1 = lastSSX;
+ int x2 = (x*av.charWidth);
+
+ if (sCol == 0 ||
+ row.annotations[sCol - 1] == null ||
+ row.annotations[sCol - 1].secondaryStructure != 'H')
+ {
+ g.fillArc(lastSSX, y + 4 + iconOffset, av.charWidth, 8, 90, 180);
+ x1 += av.charWidth / 2;
+ }
+
+ if (row.annotations[column] == null ||
+ row.annotations[column].secondaryStructure != 'H')
+ {
+ g.fillArc((x*av.charWidth) - av.charWidth,
+ y + 4 + iconOffset, av.charWidth, 8, 270,
+ 180);
+ x2 -= av.charWidth / 2;
+ }
+
+ g.fillRect(x1, y + 4 + iconOffset, x2 - x1, 8);
+
+ break;
+
+ case 'E':
+ g.setColor(SHEET_COLOUR);
+
+ if (row.annotations[endRes] == null
+ || row.annotations[endRes].secondaryStructure != 'E')
+ {
+ g.fillRect(lastSSX, y + 4 + iconOffset,
+ (x*av.charWidth) - lastSSX - 4, 7);
+ g.fillPolygon(new int[]
+ {(x*av.charWidth) - 4,
+ (x*av.charWidth) - 4,
+ (x*av.charWidth)},
+ new int[]
+ {
+ y + iconOffset, y + 14 + iconOffset,
+ y + 7 + iconOffset
+ }, 3);
+ }
+ else
+ {
+ g.fillRect(lastSSX, y + 4 + iconOffset,
+ (x+1) * av.charWidth - lastSSX, 7);
+ }
+ break;
+
+ default:
+ g.setColor(Color.gray);
+ if(!av.wrapAlignment || endRes==av.endRes)
+ g.fillRect(lastSSX, y + 6 + iconOffset,
+ (x*av.charWidth) - lastSSX, 2);
+
+ break;
}
+ }
- total += row.annotations[i2].value;
+ if (row.graph>0 && row.graphHeight>0)
+ {
+ if(row.graph == AlignmentAnnotation.LINE_GRAPH )
+ {
+ if(row.graphGroup>-1 && !graphGroupDrawn[row.graphGroup])
+ {
+ float groupmax=-999999, groupmin=9999999;
+ for(int gg=0; gggroupmax)
+ groupmax = aa[gg].graphMax;
+ if(aa[gg].graphMin0 && row.hasText)
+ {
+ y += av.charHeight;
+ }
- g.setColor(row.annotations[j].colour);
- g.fillRect(x, y - height, av.charWidth, height);
+ if (row.graph==0)
+ {
+ y += aa[i].height;
+ }
}
+ }
+
+ public void drawLineGraph(Graphics g, AlignmentAnnotation aa,
+ int sRes, int eRes,
+ int y,
+ float min, float max,
+ int graphHeight)
+ {
+ if(sRes>aa.annotations.length)
+ return;
+
+
+ int x = 0;
+
+ //Adjustment for fastpaint to left
+ if(eRes aaMax)
+ {
+ break;
+ }
- case 'E':
- g.setColor(SHEET_COLOUR);
- g.fillRect(lastSSX[i], y + 4 + iconOffset,
- x - lastSSX[i] - 4, 7);
- g.fillPolygon(new int[]
- {x - 4, x - 4, x},
- new int[]
- {
- y + iconOffset, y + 14 + iconOffset,
- y + 7 + iconOffset
- }, 3);
+ if(aa.annotations[column]==null || aa.annotations[column-1]==null)
+ {
+ x++;
+ continue;
+ }
- break;
- case 'C':
- break;
+ g.setColor(aa.annotations[column].colour);
+ y1 = y - (int) (((aa.annotations[column-1].value-min) / range) * graphHeight);
+ y2 = y - (int) (((aa.annotations[column].value-min) / range) * graphHeight);
- default:
- g.setColor(Color.gray);
- g.fillRect(lastSSX[i], y + 6 + iconOffset, x - lastSSX[i], 2);
+ g.drawLine(x*av.charWidth-av.charWidth/2, y1, x*av.charWidth+av.charWidth/2, y2);
+ x ++;
+ }
- break;
- }
+ if(aa.threshold!=null)
+ {
+ g.setColor(aa.threshold.colour);
+ Graphics2D g2 = (Graphics2D)g;
+ g2.setStroke(new BasicStroke(1,
+ BasicStroke.CAP_SQUARE,
+ BasicStroke.JOIN_ROUND, 3f,
+ new float[] { 5f, 3f }, 0f));
+
+ y2 = (int)(y - ((aa.threshold.value-min) / range)*graphHeight);
+ g.drawLine(0,y2,(eRes-sRes)*av.charWidth,y2);
+ g2.setStroke(new BasicStroke());
}
+ }
+
+ public void drawBarGraph(Graphics g, AlignmentAnnotation aa,
+ int sRes, int eRes,
+ float min, float max,
+ int y)
+ {
+ if(sRes>aa.annotations.length)
+ return;
+
+ eRes = Math.min(eRes, aa.annotations.length);
+
+ int x=0, y1=y, y2=y;
- if (row.isGraph && row.hasText)
+ float range = max - min;
+
+ if(min<0)
+ y2 = y - (int)((0-min / (range))*aa.graphHeight);
+
+ g.setColor(Color.gray);
+
+ g.drawLine(x,y2,(eRes-sRes)*av.charWidth,y2);
+
+ int column;
+ int aaMax = aa.annotations.length-1;
+
+ while( x < eRes-sRes )
{
- y += av.charHeight;
- }
+ column = sRes + x;
+ if(av.hasHiddenColumns)
+ {
+ column = av.getColumnSelection().adjustForHiddenColumns(column);
+ }
- if (!row.isGraph)
+ if(column > aaMax)
+ {
+ break;
+ }
+
+ if (aa.annotations[column] == null)
+ {
+ x ++;
+ continue;
+ }
+
+ g.setColor(aa.annotations[column].colour);
+ y1 = y - (int) (((aa.annotations[column].value-min) / (range)) * aa.graphHeight);
+
+ if(y1-y2>0)
+ g.fillRect(x*av.charWidth, y2, av.charWidth, y1-y2 );
+ else
+ g.fillRect(x*av.charWidth, y1, av.charWidth, y2-y1 );
+
+ x ++ ;
+
+ }
+ if(aa.threshold!=null)
{
- y += aa[i].height;
+ g.setColor(aa.threshold.colour);
+ Graphics2D g2 = (Graphics2D)g;
+ g2.setStroke(new BasicStroke(1,
+ BasicStroke.CAP_SQUARE,
+ BasicStroke.JOIN_ROUND, 3f,
+ new float[] { 5f, 3f }, 0f));
+
+ y2 = (int)(y - ((aa.threshold.value-min) / range)*aa.graphHeight);
+ g.drawLine(0,y2,(eRes-sRes)*av.charWidth,y2);
+ g2.setStroke(new BasicStroke());
}
}
- }
-
- // used by overview window
- public void drawGraph(Graphics g, AlignmentAnnotation aa, int width, int y)
- {
- g.setColor(Color.white);
- g.fillRect(0, 0, width, y);
- g.setColor(new Color(0, 0, 180));
-
- int x = 0;
- for (int j = 0; j < aa.annotations.length; j++)
+ // used by overview window
+ public void drawGraph(Graphics g, AlignmentAnnotation aa, int width, int y, int sRes, int eRes)
{
+ eRes = Math.min(eRes, aa.annotations.length);
+ g.setColor(Color.white);
+ g.fillRect(0, 0, width, y);
g.setColor(new Color(0, 0, 180));
- int height = (int) ( (aa.annotations[j].value / aa.graphMax) *
- GRAPH_HEIGHT);
- g.fillRect(x, y - height, av.charWidth, height);
- x += av.charWidth;
+ int x = 0, height;
+
+ for (int j = sRes; j < eRes; j++)
+ {
+ if (aa.annotations[j] != null)
+ {
+ g.setColor(aa.annotations[j].colour);
+
+ height = (int) ( (aa.annotations[j].value / aa.graphMax) * y);
+ if (height > y)
+ height = y;
+
+ g.fillRect(x, y - height, av.charWidth, height);
+ }
+ x += av.charWidth;
+ }
}
- }
+
}