X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Frenderer%2FOverviewRenderer.java;h=1c50aab80e84692c970b07a8e0ce80a5daf53436;hb=14550ad1e5da4b81082a3a06222cbe26eb9435ce;hp=56dba82efb9846c665f9e79360c0159f769c5a9d;hpb=a435323c67f5dd67ab887bb0c71cf493d04c9272;p=jalview.git diff --git a/src/jalview/renderer/OverviewRenderer.java b/src/jalview/renderer/OverviewRenderer.java index 56dba82..1c50aab 100644 --- a/src/jalview/renderer/OverviewRenderer.java +++ b/src/jalview/renderer/OverviewRenderer.java @@ -22,6 +22,7 @@ package jalview.renderer; import jalview.api.AlignmentColsCollectionI; import jalview.api.AlignmentRowsCollectionI; +import jalview.api.RendererListenerI; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.Annotation; @@ -36,12 +37,22 @@ import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; +import java.beans.PropertyChangeSupport; public class OverviewRenderer { // transparency of hidden cols/seqs overlay private final float TRANSPARENCY = 0.5f; + private final Color HIDDEN_COLOUR = Color.DARK_GRAY.darker(); + + public static final String UPDATE = "OverviewUpdate"; + + private static final int MAX_PROGRESS = 100; + + private PropertyChangeSupport changeSupport = new PropertyChangeSupport( + this); + private FeatureColourFinder finder; // image to render on @@ -53,6 +64,9 @@ public class OverviewRenderer // raw number of pixels to allocate to each row private float pixelsPerSeq; + // height in pixels of graph + private int graphHeight; + // flag to indicate whether to halt drawing private volatile boolean redraw = false; @@ -61,20 +75,21 @@ public class OverviewRenderer private ResidueShaderI shader; - private ResidueColourFinder resColFinder; + private OverviewResColourFinder resColFinder; public OverviewRenderer(FeatureRenderer fr, OverviewDimensions od, AlignmentI alignment, - ResidueShaderI resshader) + ResidueShaderI resshader, OverviewResColourFinder colFinder) { finder = new FeatureColourFinder(fr); - resColFinder = new OverviewResColourFinder(); + resColFinder = colFinder; al = alignment; shader = resshader; pixelsPerCol = od.getPixelsPerCol(); pixelsPerSeq = od.getPixelsPerSeq(); + graphHeight = od.getGraphHeight(); miniMe = new BufferedImage(od.getWidth(), od.getHeight(), BufferedImage.TYPE_INT_RGB); } @@ -94,6 +109,12 @@ public class OverviewRenderer int rgbcolor = Color.white.getRGB(); int seqIndex = 0; int pixelRow = 0; + int alignmentHeight = miniMe.getHeight() - graphHeight; + int totalPixels = miniMe.getWidth() * alignmentHeight; + + int lastRowUpdate = 0; + int lastUpdate = 0; + changeSupport.firePropertyChange(UPDATE, -1, 0); for (int alignmentRow : rows) { @@ -141,20 +162,60 @@ public class OverviewRenderer miniMe.setRGB(col, row, rgbcolor); } } - + + // store last update value + lastUpdate = sendProgressUpdate( + (pixelCol + 1) * (endRow - pixelRow), totalPixels, + lastRowUpdate, lastUpdate); + pixelCol = endCol + 1; } colIndex++; } - pixelRow = endRow + 1; + + if (pixelRow != endRow + 1) + { + // store row offset and last update value + lastRowUpdate = sendProgressUpdate(endRow + 1, alignmentHeight, 0, + lastUpdate); + lastUpdate = lastRowUpdate; + pixelRow = endRow + 1; + } seqIndex++; } overlayHiddenRegions(rows, cols); + // final update to progress bar if present + if (redraw) + { + sendProgressUpdate(pixelRow - 1, alignmentHeight, 0, 0); + } + else + { + sendProgressUpdate(alignmentHeight, miniMe.getHeight(), 0, 0); + } return miniMe; } - /** + /* + * Calculate progress update value and fire event + * @param rowOffset number of rows to offset calculation by + * @return new rowOffset - return value only to be used when at end of a row + */ + private int sendProgressUpdate(int position, int maximum, int rowOffset, + int lastUpdate) + { + int newUpdate = rowOffset + + Math.round(MAX_PROGRESS * ((float) position / maximum)); + if (newUpdate > lastUpdate) + { + changeSupport.firePropertyChange(UPDATE, rowOffset, newUpdate); + return newUpdate; + } + return newUpdate; + } + + /* * Find the colour of a sequence at a specified column position * * @param seq @@ -228,7 +289,7 @@ public class OverviewRenderer int colIndex = 0; int pixelCol = 0; - Color hidden = Color.DARK_GRAY.darker(); + Color hidden = resColFinder.getHiddenColour(); Graphics2D g2d = (Graphics2D) hiddenImage.getGraphics(); @@ -319,8 +380,10 @@ public class OverviewRenderer { if (redraw) { + changeSupport.firePropertyChange(UPDATE, MAX_PROGRESS - 1, 0); break; } + if (alignmentCol >= annotations.length) { break; // no more annotations to draw here @@ -350,10 +413,13 @@ public class OverviewRenderer g.fillRect(pixelCol, y - height, endCol - pixelCol + 1, height); } + pixelCol = endCol + 1; colIndex++; } } + changeSupport.firePropertyChange(UPDATE, MAX_PROGRESS - 1, + MAX_PROGRESS); } /** @@ -370,4 +436,14 @@ public class OverviewRenderer redraw = b; } } + + public void addPropertyChangeListener(RendererListenerI listener) + { + changeSupport.addPropertyChangeListener(listener); + } + + public void removePropertyChangeListener(RendererListenerI listener) + { + changeSupport.removePropertyChangeListener(listener); + } }