X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fappletgui%2FSeqCanvas.java;h=ac5ff899b871c443fe80a41691f4cbb77fe86b50;hb=42ae188a9819c341cd345baeab442cd0606ff157;hp=46ddf37833140146f3422f444b53e5a43f3245ba;hpb=ee53965807b83bf93a21cbc341cee9a9e005b2cb;p=jalview.git diff --git a/src/jalview/appletgui/SeqCanvas.java b/src/jalview/appletgui/SeqCanvas.java index 46ddf37..ac5ff89 100755 --- a/src/jalview/appletgui/SeqCanvas.java +++ b/src/jalview/appletgui/SeqCanvas.java @@ -35,15 +35,13 @@ public class SeqCanvas AlignViewport av; - boolean displaySearch = false; - int[] searchResults = null; + SearchResults searchResults = null; int chunkHeight; int chunkWidth; boolean fastPaint = false; - boolean isOverview = false; public SeqCanvas(AlignViewport av) { @@ -51,9 +49,30 @@ public class SeqCanvas fr = new FeatureRenderer(av); sr = new SequenceRenderer(av); PaintRefresher.Register(this, av.alignment); + } + + public AlignViewport getViewport() + { + return av; + } + public FeatureRenderer getFeatureRenderer() + { + return fr; + } + + MCview.AppletPDBCanvas pdbCanvas; + public SequenceRenderer getSequenceRenderer() + { + return sr; + } + + public void setPDBCanvas(MCview.AppletPDBCanvas pc) + { + pdbCanvas = pc; } + void drawNorthScale(Graphics g, int startx, int endx, int ypos) { int scalestartx = startx - startx % 10 + 10; @@ -135,11 +154,13 @@ public class SeqCanvas public void fastPaint(int horizontal, int vertical) { - if (gg == null) + if (fastPaint || gg == null) { + repaint(); return; } + fastPaint = true; gg.copyArea(horizontal * av.charWidth, vertical * av.charHeight, imgWidth, @@ -149,6 +170,7 @@ public class SeqCanvas int sr = av.startRes, er = av.endRes, ss = av.startSeq, es = av.endSeq, transX = 0, transY = 0; + if (horizontal > 0) // scrollbar pulled right, image to the left { transX = (er - sr - horizontal) * av.charWidth; @@ -182,12 +204,9 @@ public class SeqCanvas gg.translate(transX, transY); - gg.setColor(Color.white); - gg.fillRect(0, 0, (er - sr + 1) * av.charWidth, (es - ss) * av.charHeight); - drawPanel(gg, sr, er, ss, es, sr, ss, 0); + drawPanel(gg, sr, er, ss, es, 0); gg.translate( -transX, -transY); - fastPaint = true; repaint(); } @@ -209,7 +228,6 @@ public class SeqCanvas public void paint(Graphics g) { - sr.renderGaps(av.renderGaps); if (fastPaint) { @@ -248,12 +266,15 @@ public class SeqCanvas } else { - drawPanel(gg, av.startRes, av.endRes, av.startSeq, av.endSeq, av.startRes, - av.startSeq, 0); + drawPanel(gg, av.startRes, av.endRes, av.startSeq, av.endSeq, 0); } g.drawImage(img, 0, 0, this); + if (pdbCanvas != null) + { + pdbCanvas.updateSeqColours(); + } } int LABEL_WEST, LABEL_EAST; @@ -266,7 +287,7 @@ public class SeqCanvas if (av.scaleRightWrapped) { - LABEL_EAST = fm.stringWidth(getMask()+"0"); + LABEL_EAST = fm.stringWidth(getMask()); } if (av.scaleLeftWrapped) @@ -284,7 +305,7 @@ public class SeqCanvas */ String getMask() { - String mask = "0"; + String mask = "00"; for (int i = av.alignment.getWidth(); i > 0; i /= 10) { mask += "0"; @@ -303,7 +324,7 @@ public class SeqCanvas if (av.scaleRightWrapped) { - LABEL_EAST = fm.stringWidth(getMask()+"0"); + LABEL_EAST = fm.stringWidth(getMask()); } int LABEL_WEST = 0; @@ -359,16 +380,21 @@ public class SeqCanvas } - drawPanel(g, startRes, endx, 0, al.getHeight(), startRes, 0, ypos); + if(g.getClip()==null) + g.setClip(0, 0, cWidth * av.charWidth, canvasHeight); + + drawPanel(g, startRes, endx, 0, al.getHeight(), ypos); + g.setClip(null); + if(av.showAnnotation) { - g.translate(0, cHeight + ypos); + g.translate(0, cHeight + ypos+4); if(annotations==null) annotations = new AnnotationPanel(av); annotations.drawComponent( g, startRes, endx + 1); - g.translate(0, -cHeight - ypos); + g.translate(0, -cHeight - ypos-4); } g.translate(-LABEL_WEST, 0); @@ -398,8 +424,7 @@ public class SeqCanvas return annotations.adjustPanelHeight(); } - synchronized public void drawPanel(Graphics g, int x1, int x2, int y1, int y2, - int startx, int starty, int offset) + synchronized public void drawPanel(Graphics g, int startRes, int endRes, int startSeq, int endSeq, int offset) { g.setFont(av.getFont()); @@ -408,24 +433,37 @@ public class SeqCanvas SequenceI nextSeq; /// First draw the sequences ///////////////////////////// - for (int i = y1; i < y2; i++) + for (int i = startSeq; i < endSeq; i++) { nextSeq = av.alignment.getSequenceAt(i); - sr.drawSequence(g, nextSeq, av.alignment.findAllGroups(nextSeq), x1, x2, - (x1 - startx) * av.charWidth, + sr.drawSequence(g, nextSeq, av.alignment.findAllGroups(nextSeq), startRes, endRes, + (startRes - startRes) * av.charWidth, offset + - (i - starty) * av.charHeight, + (i - startSeq) * av.charHeight, av.charWidth, av.charHeight); if (av.showSequenceFeatures) { - fr.drawSequence(g, nextSeq, av.alignment.findAllGroups(nextSeq), x1, x2, - (x1 - startx) * av.charWidth, - offset + - (i - starty) * av.charHeight, + fr.drawSequence(g, nextSeq, startRes, endRes, + offset +(i - startSeq) * av.charHeight, av.charWidth, av.charHeight); } + /// Highlight search Results once all sequences have been drawn + ////////////////////////////////////////////////////////// + if (searchResults != null) + { + int[] visibleResults = searchResults.getResults(nextSeq, startRes, endRes); + if (visibleResults != null) + for (int r = 0; r < visibleResults.length; r += 2) + { + sr.drawHighlightedText(nextSeq, visibleResults[r], + visibleResults[r + 1], + (visibleResults[r] - startRes) * av.charWidth, + offset + ( (i - startSeq) * av.charHeight), + av.charWidth, av.charHeight); + } + } } ///////////////////////////////////// @@ -442,7 +480,7 @@ public class SeqCanvas group = (SequenceGroup) groups.elementAt(0); groupIndex = 0; } - if (group != null && !isOverview) + if (group != null) { do { @@ -452,10 +490,10 @@ public class SeqCanvas int top = -1; int bottom = -1; - for (i = y1; i < y2; i++) + for (i = startSeq; i < endSeq; i++) { - sx = (group.getStartRes() - startx) * av.charWidth; - sy = offset + ((i - starty) * av.charHeight); + sx = (group.getStartRes() - startRes) * av.charWidth; + sy = offset + ((i - startSeq) * av.charHeight); ex = (((group.getEndRes() + 1) - group.getStartRes()) * av.charWidth) - 1; @@ -464,14 +502,16 @@ public class SeqCanvas continue; } - if ( (sx <= (x2-x1)*av.charWidth) && + if ( (sx <= (endRes-startRes)*av.charWidth) && group.sequences.contains(av.alignment.getSequenceAt( i))) { - if ((bottom == -1) && - !group.sequences.contains( - av.alignment.getSequenceAt(i + 1))) - { + + if (bottom == -1) + { + if(i == endSeq-1 || // Dont check for i+1 if on the bottom row + !group.sequences.contains(av.alignment.getSequenceAt(i+1 ))) + bottom = sy + av.charHeight; } @@ -517,8 +557,8 @@ public class SeqCanvas if (sx + ex > imgWidth) ex = imgWidth; - else if (sx + ex >= (x2 - x1 + 1) * av.charWidth) - ex = (x2 - x1 + 1) * av.charWidth; + else if (sx + ex >= (endRes - startRes + 1) * av.charWidth) + ex = (endRes - startRes + 1) * av.charWidth; if (top != -1) { @@ -539,7 +579,7 @@ public class SeqCanvas if (inGroup) { - sy = offset + ( (i - starty) * av.charHeight); + sy = offset + ( (i - startSeq) * av.charHeight); if (sx >= 0 && sx < imgWidth) g.drawLine(sx, oldY, sx, sy); @@ -554,8 +594,8 @@ public class SeqCanvas if (sx + ex > imgWidth) ex = imgWidth; - else if (sx + ex >= (x2 - x1 + 1) * av.charWidth) - ex = (x2 - x1 + 1) * av.charWidth; + else if (sx + ex >= (endRes - startRes + 1) * av.charWidth) + ex = (endRes - startRes + 1) * av.charWidth; if (top != -1) { @@ -583,58 +623,10 @@ public class SeqCanvas } while (groupIndex < groups.size()); } - - /// Highlight search Results once all sequences have been drawn - ////////////////////////////////////////////////////////// - if (displaySearch) - { - for (int r = 0; r < searchResults.length; r += 3) - { - int searchSeq = searchResults[r]; - - if (searchSeq >= y1 && searchSeq < y2) - { - SequenceI seq = av.getAlignment().getSequenceAt(searchSeq); - - int searchStart = seq.findIndex(searchResults[r + 1]) - 1; - int searchEnd = seq.findIndex(searchResults[r + 2]) - 1; - - SequenceRenderer ssr = (SequenceRenderer) sr; - if (searchStart < x1) - { - searchStart = x1; - } - if (searchEnd > x2) - { - searchEnd = x2; - } - - ssr.drawHighlightedText(seq, - searchStart, - searchEnd, - (searchStart - startx) * av.charWidth, - offset + - (searchSeq-starty)*av.charHeight, - av.charWidth, - av.charHeight); - } - } - } - } - public void highlightSearchResults(int[] results) + public void highlightSearchResults(SearchResults results) { - // results are in the order sequence, startRes, endRes - if (results == null) - { - displaySearch = false; - } - else - { - displaySearch = true; - } - searchResults = results; repaint();