JAL-2587 Progress bar sizing tweaks
[jalview.git] / src / jalview / renderer / OverviewRenderer.java
index 9291ca6..b9d57a4 100644 (file)
@@ -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.Annotation;
 import jalview.datamodel.SequenceI;
@@ -32,9 +33,15 @@ import jalview.viewmodel.OverviewDimensions;
 import java.awt.Color;
 import java.awt.Graphics;
 import java.awt.image.BufferedImage;
+import java.beans.PropertyChangeSupport;
 
 public class OverviewRenderer
 {
+  public static final String UPDATE = "OverviewUpdate";
+
+  protected PropertyChangeSupport changeSupport = new PropertyChangeSupport(
+          this);
+
   private FeatureColourFinder finder;
 
   private jalview.api.SequenceRenderer sr;
@@ -48,15 +55,21 @@ 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;
+
   public OverviewRenderer(jalview.api.SequenceRenderer seqRenderer,
           FeatureRenderer fr, OverviewDimensions od)
-  // FeatureColourFinder colfinder, OverviewDimensions od)
   {
     sr = seqRenderer;
-    finder = new FeatureColourFinder(fr); // colfinder;
+    finder = new FeatureColourFinder(fr);
 
     pixelsPerCol = od.getPixelsPerCol();
     pixelsPerSeq = od.getPixelsPerSeq();
+    graphHeight = od.getGraphHeight();
     miniMe = new BufferedImage(od.getWidth(), od.getHeight(),
             BufferedImage.TYPE_INT_RGB);
   }
@@ -76,8 +89,17 @@ public class OverviewRenderer
     int rgbcolor = Color.white.getRGB();
     int seqIndex = 0;
     int pixelRow = 0;
+    int alignmentHeight = miniMe.getHeight() - graphHeight;
+
+    changeSupport.firePropertyChange(UPDATE, -1, 0);
+
     for (int alignmentRow : rows)
     {
+      if (redraw)
+      {
+        break;
+      }
+
       // get details of this alignment row
       boolean hidden = rows.isHidden(alignmentRow);
       SequenceI seq = rows.getSequence(alignmentRow);
@@ -90,6 +112,11 @@ public class OverviewRenderer
       int pixelCol = 0;
       for (int alignmentCol : cols)
       {
+        if (redraw)
+        {
+          break;
+        }
+
         // calculate where this column extends to in pixels
         int endCol = Math.min(
                 Math.round((colIndex + 1) * pixelsPerCol) - 1,
@@ -118,9 +145,31 @@ public class OverviewRenderer
         }
         colIndex++;
       }
-      pixelRow = endRow + 1;
+
+      if (pixelRow != endRow + 1)
+      {
+        changeSupport.firePropertyChange(UPDATE,
+                Math.round(100 * (float) pixelRow / alignmentHeight),
+                Math.round(
+                        100 * ((float) (endRow + 1) / alignmentHeight)));
+        pixelRow = endRow + 1;
+      }
       seqIndex++;
     }
+
+    // final update to progress bar if present
+    if (redraw)
+    {
+      changeSupport.firePropertyChange(UPDATE,
+              Math.round(100 * (float) (pixelRow - 1) / alignmentHeight),
+              0);
+    }
+    else
+    {
+      changeSupport.firePropertyChange(UPDATE,
+              Math.round(100 * alignmentHeight / miniMe.getHeight() - 1),
+              Math.round(100 * alignmentHeight / miniMe.getHeight()));
+    }
     return miniMe;
   }
 
@@ -171,6 +220,12 @@ public class OverviewRenderer
     int pixelCol = 0;
     for (int alignmentCol : cols)
     {
+      if (redraw)
+      {
+        changeSupport.firePropertyChange(UPDATE, 99, 0);
+        break;
+      }
+
       if (alignmentCol >= annotations.length)
       {
         break; // no more annotations to draw here
@@ -204,5 +259,24 @@ public class OverviewRenderer
         colIndex++;
       }
     }
+    changeSupport.firePropertyChange(UPDATE, 99, 100);
+  }
+
+  public void setRedraw(boolean b)
+  {
+    synchronized (this)
+    {
+      redraw = b;
+    }
+  }
+
+  public void addPropertyChangeListener(RendererListenerI listener)
+  {
+    changeSupport.addPropertyChangeListener(listener);
+  }
+
+  public void removePropertyChangeListener(RendererListenerI listener)
+  {
+    changeSupport.removePropertyChangeListener(listener);
   }
 }