X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fappletgui%2FOverviewCanvas.java;h=7f4e9622df0cf4b1bf5324e69e12d03b6d0a0e93;hb=refs%2Fheads%2FJAL-3437_load_project;hp=dea8ddc6e09c649daa1ca4066f7643dd589470d8;hpb=3b5d07562d8974f2fde820a1390c404d8734ebeb;p=jalview.git diff --git a/src/jalview/appletgui/OverviewCanvas.java b/src/jalview/appletgui/OverviewCanvas.java index dea8ddc..7f4e962 100644 --- a/src/jalview/appletgui/OverviewCanvas.java +++ b/src/jalview/appletgui/OverviewCanvas.java @@ -20,19 +20,20 @@ */ package jalview.appletgui; -import jalview.datamodel.SequenceI; -import jalview.renderer.seqfeatures.FeatureColourFinder; +import jalview.renderer.OverviewRenderer; +import jalview.renderer.OverviewResColourFinder; import jalview.viewmodel.OverviewDimensions; import java.awt.Color; +import java.awt.Component; import java.awt.Dimension; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; +import java.awt.image.BufferedImage; -import javax.swing.JComponent; - -public class OverviewCanvas extends JComponent +@SuppressWarnings("serial") +public class OverviewCanvas extends Component { // This is set true if the alignment view changes whilst // the overview is being calculated @@ -42,42 +43,54 @@ public class OverviewCanvas extends JComponent private OverviewDimensions od; + private OverviewRenderer or = null; + private Image miniMe; private Image offscreen; private AlignViewport av; - private AlignmentPanel ap; + private boolean showSequenceFeatures; + + private boolean showAnnotation; - // Can set different properties in this seqCanvas than - // main visible SeqCanvas - private SequenceRenderer sr; + private jalview.api.FeatureRenderer featureRenderer; - private FeatureRenderer fr; + private jalview.renderer.seqfeatures.FeatureRenderer fr; private Frame nullFrame; - public OverviewCanvas(OverviewDimensions overviewDims, - AlignViewport alignvp, AlignmentPanel alignp) + private OverviewPanel panel; + + public OverviewCanvas(OverviewPanel panel, + OverviewDimensions overviewDims, + AlignViewport alignvp) { + this.panel = panel; od = overviewDims; - av = alignp.av; - ap = alignp; + av = alignvp; nullFrame = new Frame(); nullFrame.addNotify(); - sr = new SequenceRenderer(av); - sr.graphics = nullFrame.getGraphics(); - sr.renderGaps = false; - sr.forOverview = true; - fr = new FeatureRenderer(av); + fr = new jalview.renderer.seqfeatures.FeatureRenderer(av); + } + + /** + * Update the overview dimensions object used by the canvas (e.g. if we change + * from showing hidden columns to hiding them or vice versa) + * + * @param overviewDims + */ + public void resetOviewDims(OverviewDimensions overviewDims) + { + od = overviewDims; } - /* - * Signals to drawing code that the associated alignment viewport - * has changed and a redraw will be required + /** + * Signals to drawing code that the associated alignment viewport has changed + * and a redraw will be required */ public boolean restartDraw() { @@ -86,6 +99,10 @@ public class OverviewCanvas extends JComponent if (updaterunning) { restart = true; + if (or != null) + { + or.setRedraw(true); + } } else { @@ -95,143 +112,24 @@ public class OverviewCanvas extends JComponent } } - public void draw(boolean showSequenceFeatures, boolean showAnnotation) + public void draw(boolean showSequenceFeatures, boolean showAnnotation, + jalview.api.FeatureRenderer featureRenderer) { - miniMe = null; + this.showSequenceFeatures = showSequenceFeatures; + this.showAnnotation = showAnnotation; + this.featureRenderer = featureRenderer; - if (av.isShowSequenceFeatures()) + if (showSequenceFeatures) { - fr.transferSettings(ap.seqPanel.seqCanvas.getFeatureRenderer()); + fr.transferSettings(featureRenderer); } setPreferredSize(new Dimension(od.getWidth(), od.getHeight())); - miniMe = nullFrame.createImage(od.getWidth(), od.getHeight()); + or = new OverviewRenderer(panel.ap, fr, od, av.getAlignment(), + av.getResidueShading(), new OverviewResColourFinder()); offscreen = nullFrame.createImage(od.getWidth(), od.getHeight()); - - Graphics mg = miniMe.getGraphics(); - - int alwidth = av.getAlignment().getWidth(); - int alheight = av.getAlignment().getAbsoluteHeight(); - float sampleCol = alwidth / (float) od.getWidth(); - float sampleRow = alheight / (float) od.getSequencesHeight(); - - buildImage(sampleRow, sampleCol, mg); - - // check for conservation annotation to make sure overview works for DNA too - if (showAnnotation) - { - for (int col = 0; col < od.getWidth() && !restart; col++) - { - mg.translate(col, od.getSequencesHeight()); - ap.annotationPanel.renderer.drawGraph(mg, - av.getAlignmentConservationAnnotation(), - av.getAlignmentConservationAnnotation().annotations, - (int) (sampleCol) + 1, od.getGraphHeight(), - (int) (col * sampleCol), (int) (col * sampleCol) + 1); - mg.translate(-col, -od.getSequencesHeight()); - } - } - System.gc(); - - if (restart) - { - restart = false; - draw(showSequenceFeatures, showAnnotation); - } - else - { - updaterunning = false; - } - } - - /* - * Build the overview panel image - */ - private void buildImage(float sampleRow, float sampleCol, Graphics mg) - { - int lastcol = 0; - int lastrow = 0; - int xstart = 0; - int ystart = 0; - Color color = Color.yellow; - int sameRow = 0; - int sameCol = 0; - - SequenceI seq = null; - FeatureColourFinder finder = new FeatureColourFinder(fr); - - final boolean hasHiddenCols = av.hasHiddenColumns(); - boolean hiddenRow = false; - - for (int row = 0; row < od.getSequencesHeight() && !restart; row++) - { - if ((int) (row * sampleRow) == lastrow) - { - sameRow++; - } - else - { - // get the sequence which would be at alignment index 'lastrow' if no - // rows were hidden, and determine whether it is hidden or not - hiddenRow = av.getAlignment().isHidden(lastrow); - seq = av.getAlignment().getSequenceAtAbsoluteIndex(lastrow); - - for (int col = 0; col < od.getWidth(); col++) - { - if ((int) (col * sampleCol) == lastcol - && (int) (row * sampleRow) == lastrow) - { - sameCol++; - } - else - { - lastcol = (int) (col * sampleCol); - - color = getColumnColourFromSequence(seq, hiddenRow, - hasHiddenCols, lastcol, finder); - - mg.setColor(color); - if (sameCol == 1 && sameRow == 1) - { - mg.drawLine(xstart, ystart, xstart, ystart); - } - else - { - mg.fillRect(xstart, ystart, sameCol, sameRow); - } - - xstart = col; - sameCol = 1; - } - } - lastrow = (int) (row * sampleRow); - ystart = row; - sameRow = 1; - } - } - } - - /* - * Find the colour of a sequence at a specified column position - */ - private Color getColumnColourFromSequence( - jalview.datamodel.SequenceI seq, boolean hiddenRow, - boolean hasHiddenCols, int lastcol, FeatureColourFinder finder) - { - Color color = Color.white; - if (seq.getLength() > lastcol) - { - color = sr.getResidueColour(seq, lastcol, finder); - } - - if (hiddenRow - || (hasHiddenCols && !av.getColumnSelection() - .isVisible(lastcol))) - { - color = color.darker().darker(); - } - return color; + or.drawMiniMe(); } @Override @@ -243,13 +141,43 @@ public class OverviewCanvas extends JComponent @Override public void paint(Graphics g) { - Graphics og = offscreen.getGraphics(); if (miniMe != null) { + Graphics og = offscreen.getGraphics(); og.drawImage(miniMe, 0, 0, this); og.setColor(Color.red); od.drawBox(og); g.drawImage(offscreen, 0, 0, this); + og.dispose(); + } + } + + /** + * Nulls references to protect against potential memory leaks + */ + void dispose() + { + od = null; + } + + public void finalizeDraw(BufferedImage miniMe) + { + if (restart) + { + restart = false; + draw(showSequenceFeatures, showAnnotation, featureRenderer); + } + else + { + this.miniMe = miniMe; + // checks for conservation annotation to make sure overview works for DNA + // too + if (showAnnotation) + { + or.drawGraph(av.getAlignmentConservationAnnotation()); + } + updaterunning = false; + repaint(); } }