X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fappletgui%2FOverviewCanvas.java;h=07f591971754be002438eb8392145dba1f51bdec;hb=2a86b2b3d7b5e8ad3f23d7895637cbfb24685fac;hp=2fbdeabf2395258ad4874d331e956b6a7b49f1a7;hpb=536a4a9c407a4c07b71e86e75135eaa2ba5e8850;p=jalview.git diff --git a/src/jalview/appletgui/OverviewCanvas.java b/src/jalview/appletgui/OverviewCanvas.java index 2fbdeab..07f5919 100644 --- a/src/jalview/appletgui/OverviewCanvas.java +++ b/src/jalview/appletgui/OverviewCanvas.java @@ -20,19 +20,18 @@ */ 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 javax.swing.JComponent; - -public class OverviewCanvas extends JComponent +public class OverviewCanvas extends Component { // This is set true if the alignment view changes whilst // the overview is being calculated @@ -42,17 +41,15 @@ public class OverviewCanvas extends JComponent private OverviewDimensions od; + private OverviewRenderer or = null; + private Image miniMe; private Image offscreen; private AlignViewport av; - // Can set different properties in this seqCanvas than - // main visible SeqCanvas - private SequenceRenderer sr; - - private FeatureRenderer fr; + private jalview.renderer.seqfeatures.FeatureRenderer fr; private Frame nullFrame; @@ -65,16 +62,23 @@ public class OverviewCanvas extends JComponent 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() { @@ -83,6 +87,10 @@ public class OverviewCanvas extends JComponent if (updaterunning) { restart = true; + if (or != null) + { + or.setRedraw(true); + } } else { @@ -93,49 +101,41 @@ public class OverviewCanvas extends JComponent } public void draw(boolean showSequenceFeatures, boolean showAnnotation, - AlignmentPanel ap) + FeatureRenderer transferRenderer) { miniMe = null; - if (av.isShowSequenceFeatures()) + if (showSequenceFeatures) { - fr.transferSettings(ap.seqPanel.seqCanvas.getFeatureRenderer()); + fr.transferSettings(transferRenderer); } setPreferredSize(new Dimension(od.getWidth(), od.getHeight())); + or = new OverviewRenderer(fr, od, av.getAlignment(), + av.getResidueShading(), new OverviewResColourFinder()); miniMe = nullFrame.createImage(od.getWidth(), od.getHeight()); 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(); + miniMe = or.draw(od.getRows(av.getAlignment()), + od.getColumns(av.getAlignment())); - buildImage(sampleRow, sampleCol, mg); + Graphics mg = miniMe.getGraphics(); - // check for conservation annotation to make sure overview works for DNA too + // checks 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()); - } + mg.translate(0, od.getSequencesHeight()); + or.drawGraph(mg, av.getAlignmentConservationAnnotation(), + od.getGraphHeight(), od.getColumns(av.getAlignment())); + mg.translate(0, -od.getSequencesHeight()); } - System.gc(); if (restart) { restart = false; - draw(showSequenceFeatures, showAnnotation, ap); + draw(showSequenceFeatures, showAnnotation, transferRenderer); } else { @@ -143,95 +143,6 @@ public class OverviewCanvas extends JComponent } } - /* - * 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.getAlignment().getHiddenColumns() - .isVisible(lastcol))) - { - color = color.darker().darker(); - } - return color; - } - @Override public void update(Graphics g) { @@ -251,4 +162,12 @@ public class OverviewCanvas extends JComponent } } + /** + * Nulls references to protect against potential memory leaks + */ + void dispose() + { + od = null; + } + }