JAL-3210 Improvements to eclipse detection. New src tree and SwingJS updated from...
[jalview.git] / src / jalview / viewmodel / OverviewDimensions.java
index 170f4e9..8dc7dd8 100644 (file)
@@ -26,7 +26,9 @@ import jalview.datamodel.AlignmentI;
 import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.HiddenSequences;
 
+import java.awt.Dimension;
 import java.awt.Graphics;
+import java.awt.Rectangle;
 
 public abstract class OverviewDimensions
 {
@@ -58,6 +60,12 @@ public abstract class OverviewDimensions
 
   protected int alheight;
 
+  protected float widthRatio;
+
+  protected float heightRatio;
+
+  private Rectangle vpbox = new Rectangle();
+
   /**
    * Create an OverviewDimensions object
    * 
@@ -67,17 +75,23 @@ public abstract class OverviewDimensions
    *          true if the annotation panel is to be shown, false otherwise
    */
   public OverviewDimensions(ViewportRanges ranges,
-          boolean showAnnotationPanel)
+          boolean showAnnotationPanel, Dimension dim)
   {
+    if (!showAnnotationPanel)
+    {
+      graphHeight = 0;
+    }
+
     // scale the initial size of overviewpanel to shape of alignment
     float initialScale = (float) ranges.getAbsoluteAlignmentWidth()
             / (float) ranges.getAbsoluteAlignmentHeight();
 
-    if (!showAnnotationPanel)
+    if (dim != null)
     {
-      graphHeight = 0;
+      width = dim.width;
+      sequencesHeight = dim.height;
+      return;
     }
-
     if (ranges.getAbsoluteAlignmentWidth() > ranges
             .getAbsoluteAlignmentHeight())
     {
@@ -110,6 +124,9 @@ public abstract class OverviewDimensions
    */
   public void drawBox(Graphics g)
   {
+    // System.out.println("OD drawBox " + boxX + " " + boxY + " " + boxWidth
+    // + " " + boxHeight);
+    updateBox();
     g.drawRect(boxX, boxY, boxWidth, boxHeight);
     g.drawRect(boxX + 1, boxY + 1, boxWidth - 2, boxHeight - 2);
   }
@@ -157,23 +174,28 @@ public abstract class OverviewDimensions
   public float getPixelsPerCol()
   {
     resetAlignmentDims();
-    return (float) width / alwidth;
+    return 1 / widthRatio;
   }
 
   public float getPixelsPerSeq()
   {
     resetAlignmentDims();
-    return (float) sequencesHeight / alheight;
+    return 1 / heightRatio;
   }
 
   public void setWidth(int w)
   {
     width = w;
+    widthRatio = (float) alwidth / width;
   }
 
   public void setHeight(int h)
   {
+    // BH 2019 problem was that component.resize() can come
+    // after setBoxPosition().
+    // Solution was to move setting of box dimensions to paint
     sequencesHeight = h - graphHeight;
+    heightRatio = (float) alheight / sequencesHeight;
   }
 
   /**
@@ -270,17 +292,22 @@ public abstract class OverviewDimensions
           int vpheight)
   {
     resetAlignmentDims();
+    vpbox = new Rectangle(startRes, startSeq, vpwidth, vpheight);
+    updateBox();
+  }
 
+  public void updateBox()
+  {
     // boxX, boxY is the x,y location equivalent to startRes, startSeq
-    int xPos = Math.min(startRes, alwidth - vpwidth + 1);
-    boxX = Math.round((float) xPos * width / alwidth);
-    boxY = Math.round((float) startSeq * sequencesHeight / alheight);
+    int xPos = Math.min(vpbox.x, alwidth - vpbox.width + 1);
+    boxX = Math.round(xPos / widthRatio);
+    boxY = Math.round(vpbox.y / heightRatio);
 
     // boxWidth is the width in residues translated to pixels
-    boxWidth = Math.round((float) vpwidth * width / alwidth);
+    boxWidth = Math.max(1, Math.round(vpbox.width / widthRatio));
 
     // boxHeight is the height in sequences translated to pixels
-    boxHeight = Math.round((float) vpheight * sequencesHeight / alheight);
+    boxHeight = Math.max(1, Math.round(vpbox.height / heightRatio));
   }
 
   /**