X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fgui%2FAnnotationPanel.java;h=315b14123b2b3f50a8adc352fcc15e8127ea3520;hb=a7bec763a3e4f17a549115f8f9f19ee4c742c26b;hp=b8570a9740ceedbc7827dd1a506edbb5c1d4277e;hpb=9fff97021c2c637e426f6971d54dcf3fd4191985;p=jalview.git
diff --git a/src/jalview/gui/AnnotationPanel.java b/src/jalview/gui/AnnotationPanel.java
index b8570a9..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
@@ -24,8 +24,6 @@ import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
-import java.util.*;
-
import javax.swing.*;
@@ -38,26 +36,34 @@ import javax.swing.*;
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();
+ 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!! */
- public static int GRAPH_HEIGHT = 40;
AlignViewport av;
AlignmentPanel ap;
int activeRow = -1;
- Vector activeRes;
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.
*
@@ -65,6 +71,10 @@ public class AnnotationPanel extends JPanel implements MouseListener,
*/
public AnnotationPanel(AlignmentPanel ap)
{
+
+ if(System.getProperty("os.name").startsWith("Mac"))
+ MAC = true;
+
ToolTipManager.sharedInstance().registerComponent(this);
ToolTipManager.sharedInstance().setInitialDelay(0);
ToolTipManager.sharedInstance().setDismissDelay(10000);
@@ -76,6 +86,12 @@ public class AnnotationPanel extends JPanel implements MouseListener,
ap.annotationScroller.getVerticalScrollBar().addAdjustmentListener(this);
}
+ public AnnotationPanel(AlignViewport av)
+ {
+ this.av = av;
+ }
+
+
/**
* DOCUMENT ME!
*
@@ -89,7 +105,7 @@ public class AnnotationPanel extends JPanel implements MouseListener,
/**
* DOCUMENT ME!
*/
- public void adjustPanelHeight()
+ public int adjustPanelHeight()
{
// setHeight of panels
AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
@@ -116,9 +132,9 @@ public class AnnotationPanel extends JPanel implements MouseListener,
aa[i].height += 16;
}
- if (aa[i].isGraph)
+ if (aa[i].graph>0)
{
- aa[i].height += GRAPH_HEIGHT;
+ aa[i].height += aa[i].graphHeight;
}
if (aa[i].height == 0)
@@ -135,72 +151,11 @@ public class AnnotationPanel extends JPanel implements MouseListener,
}
this.setPreferredSize(new Dimension(1, height));
- }
- /**
- * DOCUMENT ME!
- *
- * @param col DOCUMENT ME!
- */
- public void removeEditableColumn(int col)
- {
- if (activeRow == -1)
- {
- AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
-
- for (int j = 0; j < aa.length; j++)
- {
- if (aa[j].editable)
- {
- activeRow = j;
-
- break;
- }
- }
- }
-
- if ((activeRes != null) && activeRes.contains(String.valueOf(col)))
- {
- activeRes.removeElement(String.valueOf(col));
- }
-
- repaint();
+ return height;
}
- /**
- * DOCUMENT ME!
- *
- * @param col DOCUMENT ME!
- */
- public void addEditableColumn(int col)
- {
- if (activeRow == -1)
- {
- AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
-
- for (int j = 0; j < aa.length; j++)
- {
- if (aa[j].editable)
- {
- activeRow = j;
-
- break;
- }
- }
- }
- if (activeRes == null)
- {
- activeRes = new Vector();
- }
-
- if (!activeRes.contains(String.valueOf(col)))
- {
- activeRes.addElement(String.valueOf(col));
- }
-
- repaint();
- }
/**
* DOCUMENT ME!
@@ -214,10 +169,9 @@ public class AnnotationPanel extends JPanel implements MouseListener,
if (evt.getActionCommand().equals(REMOVE))
{
- for (int i = 0; i < activeRes.size(); i++)
+ for (int i = 0; i < av.getColumnSelection().size(); i++)
{
- anot[Integer.parseInt(activeRes.get(i).toString())] = null;
- anot[Integer.parseInt(activeRes.get(i).toString())] = null;
+ anot[av.getColumnSelection().columnAt(i)] = null;
}
}
else if (evt.getActionCommand().equals(LABEL))
@@ -235,9 +189,9 @@ public class AnnotationPanel extends JPanel implements MouseListener,
aa[activeRow].hasText = true;
}
- for (int i = 0; i < activeRes.size(); i++)
+ for (int i = 0; i < av.getColumnSelection().size(); i++)
{
- int index = Integer.parseInt(activeRes.get(i).toString());
+ int index = av.getColumnSelection().columnAt(i);
if (anot[index] == null)
{
@@ -252,9 +206,9 @@ public class AnnotationPanel extends JPanel implements MouseListener,
Color col = JColorChooser.showDialog(this,
"Choose foreground colour", Color.black);
- for (int i = 0; i < activeRes.size(); i++)
+ for (int i = 0; i < av.getColumnSelection().size(); i++)
{
- int index = Integer.parseInt(activeRes.get(i).toString());
+ int index = av.getColumnSelection().columnAt(i);
if (anot[index] == null)
{
@@ -297,9 +251,9 @@ public class AnnotationPanel extends JPanel implements MouseListener,
aa[activeRow].hasText = true;
}
- for (int i = 0; i < activeRes.size(); i++)
+ for (int i = 0; i < av.getColumnSelection().size(); i++)
{
- int index = Integer.parseInt(activeRes.get(i).toString());
+ int index = av.getColumnSelection().columnAt(i);
if (anot[index] == null)
{
@@ -312,7 +266,6 @@ public class AnnotationPanel extends JPanel implements MouseListener,
}
adjustPanelHeight();
- activeRes = null;
repaint();
return;
@@ -325,14 +278,23 @@ public class AnnotationPanel extends JPanel implements MouseListener,
*/
public void mousePressed(MouseEvent evt)
{
+
+
+ AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
+ if(aa==null)
+ return;
+
+
int height = 0;
activeRow = -1;
- AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
for (int i = 0; i < aa.length; i++)
{
- height += aa[i].height;
+ if (aa[i].visible)
+ {
+ height += aa[i].height;
+ }
if (evt.getY() < height)
{
@@ -340,18 +302,21 @@ public class AnnotationPanel extends JPanel implements MouseListener,
{
activeRow = i;
}
- else
+ else if(aa[i].graph>0)
{
- activeRes = null;
+ //Stretch Graph
+ graphStretch = i;
+ graphStretchY = evt.getY();
}
break;
}
}
- if (SwingUtilities.isRightMouseButton(evt))
+
+ if (SwingUtilities.isRightMouseButton(evt) && activeRow!=-1)
{
- if (activeRes == null)
+ if (av.getColumnSelection() == null)
{
return;
}
@@ -384,42 +349,28 @@ public class AnnotationPanel extends JPanel implements MouseListener,
int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();
- if (evt.isControlDown() || evt.isAltDown())
- {
- addEditableColumn(res);
- }
- else if (evt.isShiftDown())
+ min = res;
+ max = res;
+
+ if (av.getColumnSelection().contains(res))
+ av.getColumnSelection().removeElement(res);
+ else
{
- if (activeRes == null)
+ av.getColumnSelection().addElement(res);
+ SequenceGroup sg = new SequenceGroup();
+
+ for (int i = 0; i < av.alignment.getSequences().size(); i++)
{
- activeRes = new Vector();
+ sg.addSequence(av.alignment.getSequenceAt(i), false);
}
- else
- {
- int start = Integer.parseInt(activeRes.get(activeRes.size() -
- 1).toString());
- int end = res;
-
- if (end < start)
- {
- int temp = end;
- end = start;
- start = temp;
- }
- for (int n = start; n <= end; n++)
- {
- addEditableColumn(n);
- }
- }
- }
- else
- {
- activeRes = new Vector();
- activeRes.addElement(String.valueOf(res));
+ sg.setStartRes(res);
+ sg.setEndRes(res);
+ av.setSelectionGroup(sg);
}
- repaint();
+ ap.repaint();
+
}
/**
@@ -429,6 +380,9 @@ public class AnnotationPanel extends JPanel implements MouseListener,
*/
public void mouseReleased(MouseEvent evt)
{
+ graphStretch = -1;
+ graphStretchY = -1;
+ mouseDragging = false;
}
/**
@@ -438,6 +392,8 @@ public class AnnotationPanel extends JPanel implements MouseListener,
*/
public void mouseEntered(MouseEvent evt)
{
+ if(mouseDragging)
+ ap.seqPanel.scrollCanvas(null);
}
/**
@@ -447,8 +403,11 @@ public class AnnotationPanel extends JPanel implements MouseListener,
*/
public void mouseExited(MouseEvent evt)
{
+ if(mouseDragging)
+ ap.seqPanel.scrollCanvas(evt);
}
+
/**
* DOCUMENT ME!
*
@@ -456,6 +415,65 @@ public class AnnotationPanel extends JPanel implements MouseListener,
*/
public void mouseDragged(MouseEvent evt)
{
+ if(graphStretch>-1)
+ {
+ 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
+ {
+ mouseDragging = true;
+
+ int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();
+
+ SequenceGroup sg = av.getSelectionGroup();
+
+ if (res < min)
+ {
+ min = res;
+ }
+
+ if (res > max)
+ {
+ 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();
+ }
+
+ }
}
/**
@@ -490,16 +508,43 @@ public class AnnotationPanel extends JPanel implements MouseListener,
}
}
+ if(row==-1)
+ return;
+
int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();
- if ((row > -1) && (res < aa[row].annotations.length) &&
- (aa[row].annotations[res] != null))
+ if(av.hasHiddenColumns)
+ res = av.getColumnSelection().adjustForHiddenColumns(res);
+
+ if ( aa[row].annotations!=null
+ && row > -1
+ && res < (int) aa[row].annotations.length)
{
- this.setToolTipText(aa[row].annotations[res].description);
+ 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);
- StringBuffer text = new StringBuffer("Sequence position " +
- (res + 1) + " " + aa[row].annotations[res].description);
- ap.alignFrame.statusBar.setText(text.toString());
+ if(aa[row].annotations[res]!=null)
+ {
+ StringBuffer text = new StringBuffer("Sequence position " +
+ (res + 1) + " " +
+ aa[row].annotations[res].description);
+
+ ap.alignFrame.statusBar.setText(text.toString());
+ }
}
}
@@ -519,29 +564,41 @@ public class AnnotationPanel extends JPanel implements MouseListener,
*/
public void paintComponent(Graphics g)
{
- g.setColor(Color.white);
- g.fillRect(0, 0, getWidth(), getHeight());
+ g.setColor(Color.white);
+ g.fillRect(0, 0, getWidth(), getHeight());
- if (fastPaint)
+ if(image!=null)
+ {if (fastPaint
+ || (getVisibleRect().width != g.getClipBounds().width)
+ || (getVisibleRect().height != g.getClipBounds().height))
{
- g.drawImage(image, 0, 0, this);
- fastPaint = false;
-
- return;
+ g.drawImage(image, 0, 0, this);
+ fastPaint = false;
+ return;
}
+ }
+ imgWidth = (av.endRes - av.startRes + 1) * av.charWidth;
- imgWidth = (av.endRes - av.startRes + 1) * av.charWidth;
-
+ if (image == null || imgWidth != image.getWidth()
+ || image.getHeight(this) != getHeight())
+ {
image = new BufferedImage(imgWidth, ap.annotationPanel.getHeight(),
- BufferedImage.TYPE_INT_RGB);
+ BufferedImage.TYPE_INT_RGB);
gg = (Graphics2D) image.getGraphics();
+
+ if(av.antiAlias)
gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
- RenderingHints.VALUE_ANTIALIAS_ON);
+ RenderingHints.VALUE_ANTIALIAS_ON);
gg.setFont(av.getFont());
+ fm = gg.getFontMetrics();
+ gg.setColor(Color.white);
+ gg.fillRect(0, 0, imgWidth, image.getHeight());
+ }
+
- drawComponent(gg, av.startRes, av.endRes + 1);
- g.drawImage(image, 0, 0, this);
+ drawComponent(gg, av.startRes, av.endRes + 1);
+ g.drawImage(image, 0, 0, this);
}
/**
@@ -551,12 +608,14 @@ public class AnnotationPanel extends JPanel implements MouseListener,
*/
public void fastPaint(int horizontal)
{
- if ((horizontal == 0) ||
- (av.alignment.getAlignmentAnnotation() == null) ||
- (av.alignment.getAlignmentAnnotation().length < 1))
+ if ((horizontal == 0)
+ || gg==null
+ || av.alignment.getAlignmentAnnotation()==null
+ || av.alignment.getAlignmentAnnotation().length < 1
+ || av.updatingConsensus
+ || av.updatingConservation)
{
repaint();
-
return;
}
@@ -583,7 +642,9 @@ public class AnnotationPanel extends JPanel implements MouseListener,
gg.translate(-transX, 0);
fastPaint = true;
+
repaint();
+
}
/**
@@ -593,35 +654,77 @@ public class AnnotationPanel extends JPanel implements MouseListener,
* @param startRes DOCUMENT ME!
* @param endRes DOCUMENT ME!
*/
- public void drawComponent(Graphics2D g, int startRes, int endRes)
+ public void drawComponent(Graphics g, int startRes, int endRes)
{
- if(fm==null)
+ 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);
+
+ Graphics2D fadedG = (Graphics2D) fadedImage.getGraphics();
+
+ fadedG.setColor(Color.white);
+ fadedG.fillRect(0, 0, imgWidth, image.getHeight());
+
+ fadedG.setComposite(
+ AlphaComposite.getInstance(
+ AlphaComposite.SRC_OVER, .3f));
+ fadedG.drawImage(image, 0, 0, this);
+
+ }
+
+ }
+ else
+ fadedImage = null;
+
+
+ g.setColor(Color.white);
+ g.fillRect(0, 0, (endRes - startRes) * av.charWidth, getHeight());
+
+ g.setFont(av.getFont());
+ if (fm == null)
fm = g.getFontMetrics();
- g.setColor(Color.white);
- g.fillRect(0, 0, (endRes - startRes) * av.charWidth, getHeight());
- if ((av.alignment.getAlignmentAnnotation() == null) ||
+
+
+ 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);
+ if(av.validCharWidth)
+ g.drawString("Alignment has no annotations", 20, 15);
return;
}
+
AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();
- int j;
- int x = 0;
- int y = 0;
- char[] lastSS = new char[aa.length];
- int[] lastSSX = new int[aa.length];
+ int x = 0, y = 0;
+ int column=0;
+ char lastSS;
+ int lastSSX;
int iconOffset = av.charHeight / 2;
boolean validRes = false;
+ boolean [] graphGroupDrawn = new boolean[aa.length];
+
+
//\u03B2 \u03B1
for (int i = 0; i < aa.length; i++)
{
@@ -632,8 +735,15 @@ public class AnnotationPanel extends JPanel implements MouseListener,
continue;
}
- if (row.isGraph)
+
+ lastSS = ' ';
+ lastSSX = 0;
+
+ if (row.graph>0)
{
+ if(row.graphGroup>-1 && graphGroupDrawn[ row.graphGroup ] )
+ continue;
+
// this is so that we draw the characters below the graph
y += row.height;
@@ -643,19 +753,71 @@ public class AnnotationPanel extends JPanel implements MouseListener,
}
}
+ if (av.updatingConsensus && aa[i].label.equals("Consensus"))
+ {
+ 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 Consensus....",20, y-row.height/2);
+
+ continue;
+ }
+ else if (av.updatingConservation && aa[i].label.equals("Conservation"))
+ {
+
+ 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 (row.hasText)
{
- iconOffset = av.charHeight / 2;
+ iconOffset = av.charHeight / 2 + 4;
}
else
{
iconOffset = 0;
}
- for (j = startRes; j < endRes; j++)
+ x = 0;
+ while (x < endRes-startRes)
{
- if ((row.annotations.length <= j) ||
- (row.annotations[j] == null))
+ 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;
}
@@ -664,69 +826,103 @@ public class AnnotationPanel extends JPanel implements MouseListener,
validRes = true;
}
- x = (j - startRes) * av.charWidth;
if (activeRow == i)
{
g.setColor(Color.red);
- if (activeRes != null)
+ if (av.getColumnSelection() != null)
{
- for (int n = 0; n < activeRes.size(); n++)
+ for (int n = 0; n < av.getColumnSelection().size(); n++)
{
- int v = Integer.parseInt(activeRes.get(n).toString());
+ int v = av.getColumnSelection().columnAt(n);
- if (v == j)
+ if (v == column)
{
- g.fillRect((j - startRes) * av.charWidth, y,
- av.charWidth, row.height);
+ g.fillRect(x * av.charWidth, y,
+ av.charWidth, av.charHeight);
}
}
}
}
- if (validRes &&
- (row.annotations[j].displayCharacter.length() > 0))
+ if (av.validCharWidth && validRes &&
+ (row.annotations[column].displayCharacter.length() > 0))
{
int charOffset = (av.charWidth -
- fm.charWidth(row.annotations[j].displayCharacter.charAt(
+ fm.charWidth(row.annotations[column].displayCharacter.charAt(
0))) / 2;
- g.setColor(row.annotations[j].colour);
+ g.setColor(row.annotations[column].colour);
- if (j == 0 || row.isGraph)
+ if (column == 0 || row.graph>0)
{
- g.drawString(row.annotations[j].displayCharacter, x+charOffset,
- y + iconOffset + 2);
+ g.drawString(row.annotations[column].displayCharacter,
+ (x*av.charWidth)+charOffset,
+ y + iconOffset );
}
- else if (((row.annotations[j - 1] == null) ||
- (row.annotations[j].displayCharacter != row.annotations[j -
- 1].displayCharacter)))
+ 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[j].displayCharacter, x+charOffset,
- y + iconOffset + 2);
+ g.drawString(row.annotations[column].displayCharacter,
+ x*av.charWidth+charOffset,
+ y + iconOffset );
}
}
if (row.hasIcons)
{
if (!validRes ||
- (row.annotations[j].secondaryStructure != lastSS[i]))
+ (row.annotations[column].secondaryStructure != lastSS))
{
- switch (lastSS[i])
+ switch (lastSS)
{
case 'H':
- g.setColor(HELIX_COLOUR);
- g.fillRoundRect(lastSSX[i], y + 4 + iconOffset,
- x - lastSSX[i], 7, 8, 8);
-
+ 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[i], y + 4 + iconOffset,
- x - lastSSX[i] - 4, 7);
- g.fillPolygon(new int[] { x - 4, x - 4, x },
+ 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,
@@ -735,125 +931,341 @@ public class AnnotationPanel extends JPanel implements MouseListener,
break;
- case 'C':
- break;
default:
g.setColor(Color.gray);
- g.fillRect(lastSSX[i], y + 6 + iconOffset,
- x - lastSSX[i], 2);
+ g.fillRect(lastSSX, y + 6 + iconOffset,
+ (x*av.charWidth) - lastSSX, 2);
break;
}
if (validRes)
{
- lastSS[i] = row.annotations[j].secondaryStructure;
+ lastSS = row.annotations[column].secondaryStructure;
}
else
{
- lastSS[i] = ' ';
+ lastSS = ' ';
}
- lastSSX[i] = x;
+ lastSSX = (x*av.charWidth);
}
}
- if (validRes && row.isGraph)
- {
- g.setColor(new Color(0, 0, 180));
-
- int height = (int) ((row.annotations[j].value / row.graphMax) * GRAPH_HEIGHT);
-
- if (row.windowLength > 1)
- {
- int total = 0;
-
- for (int i2 = j - (row.windowLength / 2);
- i2 < (j + (row.windowLength / 2)); i2++)
- {
- if ((i2 < 0) || (i2 >= av.alignment.getWidth()))
- {
- continue;
- }
-
- total += row.annotations[i2].value;
- }
- total /= row.windowLength;
- height = (int) ((total / row.graphMax) * GRAPH_HEIGHT);
- }
-
- g.setColor(row.annotations[j].colour);
- g.fillRect(x, y - height, av.charWidth, height);
- }
+ column++;
+ x++;
}
- x += av.charWidth;
+ if(column>=row.annotations.length)
+ column = row.annotations.length-1;
+
+ // x ++;
if (row.hasIcons)
{
- switch (lastSS[i])
- {
+ switch (lastSS)
+ {
case 'H':
- g.setColor(HELIX_COLOUR);
- g.fillRoundRect(lastSSX[i], y + 4 + iconOffset,
- x - lastSSX[i], 7, 8, 8);
-
+ 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;
+ }
- 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);
+ int sCol = (lastSSX / av.charWidth) + startRes;
+ int x1 = lastSSX;
+ int x2 = (x*av.charWidth);
- break;
+ 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;
+ }
- case 'C':
- break;
+ 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);
- g.fillRect(lastSSX[i], y + 6 + iconOffset, x - lastSSX[i], 2);
+ g.setColor(Color.gray);
+ if(!av.wrapAlignment || endRes==av.endRes)
+ g.fillRect(lastSSX, y + 6 + iconOffset,
+ (x*av.charWidth) - lastSSX, 2);
- break;
+ break;
+ }
+ }
+
+ 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;
}
- if (!row.isGraph)
+ 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;
+ }
+
+ if(aa.annotations[column]==null || aa.annotations[column-1]==null)
+ {
+ x++;
+ continue;
+ }
+
+
+ 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);
+
+ g.drawLine(x*av.charWidth-av.charWidth/2, y1, x*av.charWidth+av.charWidth/2, y2);
+ x ++;
+ }
+
+ 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;
+
+ 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 )
+ {
+ column = sRes + x;
+ if(av.hasHiddenColumns)
+ {
+ column = av.getColumnSelection().adjustForHiddenColumns(column);
+ }
+
+ 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)
+ {
+ 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)
+ public void drawGraph(Graphics g, AlignmentAnnotation aa, int width, int y, int sRes, int eRes)
{
- g.setColor(Color.white);
- g.fillRect(0, 0, width, y);
- g.setColor(new Color(0, 0, 180));
+ 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 x = 0;
+ int x = 0, height;
- for (int j = 0; j < aa.annotations.length; j++)
+ for (int j = sRes; j < eRes; j++)
+ {
+ if (aa.annotations[j] != null)
{
- g.setColor(new Color(0, 0, 180));
+ g.setColor(aa.annotations[j].colour);
+
+ height = (int) ( (aa.annotations[j].value / aa.graphMax) * y);
+ if (height > y)
+ height = y;
- int height = (int) ((aa.annotations[j].value / aa.graphMax) * GRAPH_HEIGHT);
- g.fillRect(x, y - height, av.charWidth, height);
- x += av.charWidth;
+ g.fillRect(x, y - height, av.charWidth, height);
}
+ x += av.charWidth;
+ }
}
+
}