return false;\r
vscroll.setValue(vscroll.getValue() + 1);\r
}\r
-\r
return true;\r
}\r
\r
\r
public void adjustmentValueChanged(AdjustmentEvent evt)\r
{\r
+ int oldX = av.getStartRes();\r
+ int oldY = av.getStartSeq();\r
\r
if (evt.getSource() == hscroll)\r
{\r
if(overviewPanel!=null)\r
overviewPanel.setBoxPosition();\r
\r
- repaint();\r
+ seqPanel.seqCanvas.fastPaint(av.getStartRes()-oldX, av.getStartSeq()-oldY);\r
+ idPanel.idCanvas.fastPaint( av.getStartSeq()-oldY );\r
+ scalePanel.repaint();\r
+ annotationPanel.fastPaint(av.getStartRes()-oldX);\r
\r
}\r
\r
static Color HELIX_COLOUR = Color.red.darker();\r
static Color SHEET_COLOUR = Color.green.darker().darker();\r
\r
- BufferedImage bi;\r
+\r
+ BufferedImage image;\r
+ Graphics2D gg;\r
+ FontMetrics fm;\r
+ int imgWidth=0;\r
+\r
\r
\r
\r
\r
public void paintComponent(Graphics g)\r
{\r
- if(bi==null\r
- || bi.getWidth()!=ap.annotationPanel.getWidth()\r
- || bi.getHeight()!=ap.annotationPanel.getHeight())\r
- {\r
- bi = new BufferedImage(ap.annotationPanel.getWidth(),\r
- ap.annotationPanel.getHeight(),\r
- BufferedImage.TYPE_INT_RGB);\r
- }\r
+ g.setColor(Color.white);\r
+ g.fillRect(0,0,getWidth(), getHeight());\r
+\r
+ imgWidth = (av.endRes-av.startRes+1) *av.charWidth;\r
+\r
+ image = new BufferedImage(imgWidth,\r
+ ap.annotationPanel.getHeight(),\r
+ BufferedImage.TYPE_INT_RGB);\r
+ gg = (Graphics2D) image.getGraphics();\r
+ gg.setColor(Color.white);\r
+ gg.fillRect(0, 0, imgWidth, getHeight());\r
+ gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
+ RenderingHints.VALUE_ANTIALIAS_ON);\r
+ fm = gg.getFontMetrics();\r
+ gg.setFont(av.getFont());\r
\r
- drawComponent( (Graphics2D)bi.getGraphics() );\r
- g.drawImage( bi, 0, 0, this);\r
+\r
+ drawComponent( gg, av.startRes, av.endRes+1);\r
+ g.drawImage( image, 0, 0, this);\r
}\r
\r
- public void drawComponent(Graphics2D g)\r
+ public void fastPaint(int horizontal)\r
+{\r
+ if(image==null || horizontal ==0)\r
{\r
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);\r
- FontMetrics fm = g.getFontMetrics();\r
- g.setFont(av.getFont());\r
- g.setColor(Color.white);\r
- g.fillRect(0,0,getWidth(),getHeight());\r
+ repaint();\r
+ return;\r
+ }\r
+\r
+ gg.copyArea( 0,0, imgWidth, getHeight(), -horizontal*av.charWidth, 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.charWidth;\r
+ sr = er - horizontal ;\r
+ }\r
+ else if(horizontal<0)\r
+ {\r
+ er = sr-horizontal;\r
+ }\r
+\r
+\r
+ gg.translate(transX, 0);\r
+\r
+ drawComponent(gg, sr, er);\r
+\r
+ gg.translate( -transX, 0 );\r
+\r
+ getGraphics().drawImage(image, 0, 0, this);\r
+}\r
+\r
+\r
+ public void drawComponent(Graphics2D g, int startRes, int endRes)\r
+ {\r
+ g.setColor(Color.white);\r
+ g.fillRect(0,0,(endRes-startRes) *av.charWidth, getHeight());\r
if(av.alignment.getAlignmentAnnotation()==null || av.alignment.getAlignmentAnnotation().length<1)\r
{\r
g.setColor(Color.black);\r
else\r
iconOffset = 0;\r
\r
- for(j=av.startRes; j<av.endRes+1; j++)\r
+ for(j=startRes; j<endRes; j++)\r
{\r
validRes = row.annotations[j]==null?false:true;\r
\r
- x = (j-av.getStartRes())*av.charWidth;\r
+ x = (j-startRes)*av.charWidth;\r
\r
\r
if(activeRow==i)\r
{\r
int v = Integer.parseInt(activeRes.get(n).toString()) ;\r
if (v == j)\r
- g.fillRect( (j-av.getStartRes()) * av.charWidth, y, av.charWidth, row.height);\r
+ g.fillRect( (j-startRes) * av.charWidth, y, av.charWidth, row.height);\r
}\r
}\r
\r
\r
import java.awt.*;\r
import java.awt.Graphics2D.*;\r
-\r
+import java.awt.image.*;\r
import javax.swing.*;\r
import jalview.datamodel.*;\r
import jalview.analysis.*;\r
\r
protected int maxIdLength = -1;\r
protected String maxIdStr = null;\r
+ BufferedImage image;\r
+ Graphics2D gg;\r
+ int imgHeight=0;\r
\r
public IdCanvas(AlignViewport av)\r
{\r
PaintRefresher.Register(this);\r
}\r
\r
- public void drawIdString(Graphics gg,SequenceI s,int i, int starty, int ypos) {\r
+ public void drawIdString(Graphics2D gg,SequenceI s,int i, int starty, int ypos) {\r
int charHeight = av.getCharHeight();\r
\r
\r
\r
}\r
\r
- public void paintComponent(Graphics g) {\r
- Graphics2D gg = (Graphics2D)g;\r
- gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);\r
- AlignmentI al = av.alignment;\r
- int charHeight = av.charHeight;\r
- Font italic = new Font(av.getFont().getName(), Font.ITALIC, av.getFont().getSize());\r
+ public void fastPaint(int vertical)\r
+ {\r
+ if(image==null)\r
+ {\r
+ repaint();\r
+ return;\r
+ }\r
+\r
+ gg.copyArea( 0,0, getWidth(), imgHeight, 0, -vertical*av.charHeight );\r
\r
- gg.setFont(italic);\r
+ int ss=av.startSeq, es=av.endSeq, transY = 0;\r
+ if(vertical>0) // scroll down\r
+ {\r
+ transY = imgHeight - vertical*av.charHeight;\r
+ ss = es - vertical;\r
+ }\r
+ else if(vertical<0)\r
+ {\r
+ es = ss-vertical;\r
+ }\r
\r
+ gg.translate(0, transY);\r
+\r
+ drawIds(ss, es);\r
+\r
+ gg.translate( 0, -transY );\r
+\r
+\r
+ getGraphics().drawImage(image, 0, 0, this);\r
+ }\r
\r
+ public void paintComponent(Graphics g)\r
+ {\r
+ imgHeight = getHeight();\r
+ imgHeight -= imgHeight % av.charHeight;\r
+ image = new BufferedImage(getWidth(), imgHeight, BufferedImage.TYPE_INT_RGB);\r
+ gg = (Graphics2D) image.getGraphics();\r
//Fill in the background\r
gg.setColor(Color.white);\r
- gg.fillRect(0,0,getWidth(),getHeight());\r
+ gg.fillRect(0, 0, getWidth(), imgHeight);\r
+ gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
+ RenderingHints.VALUE_ANTIALIAS_ON);\r
+ Font italic = new Font(av.getFont().getName(), Font.ITALIC,\r
+ av.getFont().getSize());\r
+ gg.setFont(italic);\r
+\r
+\r
+ g.setColor(Color.white);\r
+ g.fillRect(0,0,getWidth(),getHeight());\r
+\r
+ drawIds( av.getStartSeq(), av.endSeq);\r
+\r
+ g.drawImage(image, 0, 0, this);\r
+ }\r
+\r
+ void drawIds(int starty, int endy)\r
+ {\r
\r
Color currentColor = Color.white;\r
Color currentTextColor = Color.black;\r
\r
- //Which ids are we printing\r
- int starty = av.getStartSeq();\r
- int endy = av.endSeq;\r
-\r
if (av.getWrapAlignment())\r
{\r
// Draw the rest of the panels\r
- int chunkHeight = (al.getHeight() + 2)*av.charHeight;\r
+ int chunkHeight = (av.alignment.getHeight() + 2)*av.charHeight;\r
int row = av.getStartRes() / av.chunkWidth ;\r
for(int ypos=2*av.charHeight;\r
- ypos <= getHeight() && row*av.chunkWidth<al.getWidth();\r
+ ypos <= getHeight() && row*av.chunkWidth<av.alignment.getWidth();\r
ypos += chunkHeight, row++ )\r
{\r
for (int i = starty; i < av.alignment.getHeight(); i++)\r
{\r
- SequenceI s = al.getSequenceAt(i);\r
+ SequenceI s = av.alignment.getSequenceAt(i);\r
drawIdString(gg, s, i, 0, ypos);\r
}\r
}\r
{\r
// Selected sequence colours\r
\r
- if (av.getSelectionGroup()!= null && av.getSelectionGroup().sequences.contains(al.getSequenceAt(i)))\r
+ if (av.getSelectionGroup()!= null\r
+ && av.getSelectionGroup().sequences.contains(av.alignment.getSequenceAt(i)))\r
{\r
// if(av.alignment.findGroup(al.getSequenceAt(i)).getEndRes()==\r
currentColor = Color.lightGray;\r
}\r
else\r
{\r
- currentColor = al.getSequenceAt(i).getColor();\r
+ currentColor = av.alignment.getSequenceAt(i).getColor();\r
currentTextColor = Color.black;\r
}\r
\r
gg.setColor(currentColor);\r
\r
gg.fillRect(0,\r
- AlignmentUtil.getPixelHeight(starty, i, charHeight),\r
+ AlignmentUtil.getPixelHeight(starty, i, av.charHeight),\r
getWidth(),\r
- charHeight);\r
+ av.charHeight);\r
\r
gg.setColor(currentTextColor);\r
- String string = al.getSequenceAt(i).getName();\r
+ String string = av.alignment.getSequenceAt(i).getName();\r
if(av.getShowFullId())\r
- string = al.getSequenceAt(i).getDisplayId();\r
+ string = av.alignment.getSequenceAt(i).getDisplayId();\r
gg.drawString(string, 0,\r
- AlignmentUtil.getPixelHeight(starty, i, charHeight) +\r
- charHeight - (charHeight / 5));\r
+ AlignmentUtil.getPixelHeight(starty, i, av.charHeight) +\r
+ av.charHeight - (av.charHeight / 5));\r
}\r
\r
// add a border\r
}\r
\r
\r
+public void fastPaint(int horizontal, int vertical)\r
+{\r
+ if(horizontal==0 && vertical==0)\r
+ {\r
+ return;\r
+ }\r
+\r
+\r
+ if (img==null || paintFlag)\r
+ {\r
+ repaint();\r
+ return;\r
+ }\r
+\r
+ gg.copyArea( 0,0, imgWidth, imgHeight, -horizontal*av.charWidth, -vertical*av.charHeight );\r
+\r
+ int sr=av.startRes, er=av.endRes+1, ss = av.startSeq, es = av.endSeq, transX=0, transY = 0;\r
+ if(horizontal>0) // scrollbar pulled right, image to the left\r
+ {\r
+ transX = (er-sr-horizontal)*av.charWidth;\r
+ sr = er - horizontal ;\r
+ }\r
+ else if(horizontal<0)\r
+ {\r
+ er = sr-horizontal;\r
+ }\r
+\r
+\r
+\r
+\r
+ if(vertical>0) // scroll down\r
+ {\r
+ transY = imgHeight - vertical*av.charHeight;\r
+ ss = es - vertical;\r
+ }\r
+ else if(vertical<0)\r
+ {\r
+\r
+ es = ss-vertical;\r
+\r
+ }\r
+\r
+ gg.translate(transX, transY);\r
+\r
+ drawPanel(gg, sr,er,ss,es,sr,ss,0);\r
+\r
+ gg.translate( -transX, -transY );\r
+ getGraphics().drawImage(img,0,0,this);\r
+\r
+}\r
+\r
/**\r
* Definitions of startx and endx (hopefully):\r
* SMJS This is what I'm working towards!\r
\r
public void paintComponent(Graphics g)\r
{\r
+ // this draws the whole of the alignment\r
\r
- if (img==null || imgWidth!=getWidth() || imgHeight!=getHeight() || paintFlag)\r
- {\r
imgWidth = getWidth();\r
imgHeight = getHeight();\r
+\r
+ imgWidth -= imgWidth%av.charWidth;\r
+ imgHeight-= imgHeight%av.charHeight;\r
+\r
img = createImage(imgWidth,imgHeight);\r
gg = (Graphics2D)img.getGraphics();\r
gg.setFont(av.getFont());\r
gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);\r
+ gg.setClip(0,0,imgWidth, imgHeight);\r
paintFlag = false;\r
- }\r
\r
\r
chunkWidth = getWidth()/av.charWidth;\r
av.setChunkHeight(chunkHeight);\r
av.setChunkWidth(chunkWidth);\r
\r
- gg.setColor(Color.WHITE);\r
- gg.fillRect(0,0,imgWidth,imgHeight);\r
+ g.setColor(Color.WHITE);\r
+ g.fillRect(0,0,getWidth(), getHeight());\r
\r
if (av.getWrapAlignment())\r
drawWrappedPanel(gg, getWidth(), getHeight(), av.startRes);\r
inGroup = true;\r
if (group == av.getSelectionGroup())\r
{\r
- g.setStroke(new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 3f, new float[]{5f,2f,2f}, 0f ));\r
+ // g.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 3f, new float[]{5f,2f,2f}, 0f ));\r
g.setColor(Color.RED);\r
}\r
else\r