JAL-2600 Add in IdCanvas and checks for 0 size images
[jalview.git] / src / jalview / gui / AnnotationPanel.java
index 919356f..3dee5a8 100755 (executable)
@@ -30,6 +30,7 @@ import jalview.renderer.AwtRenderPanelI;
 import jalview.schemes.ResidueProperties;
 import jalview.util.Comparison;
 import jalview.util.MessageManager;
+import jalview.viewmodel.ViewportListenerI;
 
 import java.awt.AlphaComposite;
 import java.awt.Color;
@@ -50,6 +51,7 @@ import java.awt.event.MouseMotionListener;
 import java.awt.event.MouseWheelEvent;
 import java.awt.event.MouseWheelListener;
 import java.awt.image.BufferedImage;
+import java.beans.PropertyChangeEvent;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -70,7 +72,7 @@ import javax.swing.ToolTipManager;
  */
 public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
         MouseListener, MouseWheelListener, MouseMotionListener,
-        ActionListener, AdjustmentListener, Scrollable
+        ActionListener, AdjustmentListener, Scrollable, ViewportListenerI
 {
   String HELIX = MessageManager.getString("label.helix");
 
@@ -156,6 +158,8 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
     // and then set our own listener to consume all mousewheel events
     ap.annotationScroller.addMouseWheelListener(this);
     renderer = new AnnotationRenderer();
+
+    av.getRanges().addPropertyChangeListener(this);
   }
 
   public AnnotationPanel(AlignViewport av)
@@ -172,11 +176,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
       e.consume();
       if (e.getWheelRotation() > 0)
       {
-        ap.scrollRight(true);
+        av.getRanges().scrollRight(true);
       }
       else
       {
-        ap.scrollRight(false);
+        av.getRanges().scrollRight(false);
       }
     }
     else
@@ -447,7 +451,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
      * the selection list (read-only view) is in selection order, not
      * column order; make a copy so we can sort it
      */
-    List<Integer> selected = new ArrayList<Integer>(viscols.getSelected());
+    List<Integer> selected = new ArrayList<>(viscols.getSelected());
     Collections.sort(selected);
     for (int index : selected)
     {
@@ -967,7 +971,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
    * @param horizontal
    *          repaint with horizontal shift in alignment
    */
-  public void fastPaint(int horizontal)
+  public void fastPaint(int horizontal, boolean isresize)
   {
     if ((horizontal == 0) || gg == null
             || av.getAlignment().getAlignmentAnnotation() == null
@@ -977,22 +981,49 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
       repaint();
       return;
     }
-    long stime = System.currentTimeMillis();
-    gg.copyArea(0, 0, imgWidth, getHeight(),
-            -horizontal * av.getCharWidth(), 0);
-    long mtime = System.currentTimeMillis();
+
     int sr = av.getRanges().getStartRes();
     int er = av.getRanges().getEndRes() + 1;
     int transX = 0;
+    long stime;
+    long mtime;
 
-    if (horizontal > 0) // scrollbar pulled right, image to the left
+    if (isresize)
     {
-      transX = (er - sr - horizontal) * av.getCharWidth();
-      sr = er - horizontal;
+      imgWidth = (av.getRanges().getEndRes() - av.getRanges().getStartRes()
+              + 1) * av.getCharWidth();
+
+      if (imgWidth > 0)
+      {
+        BufferedImage newimage = new BufferedImage(imgWidth,
+                ap.getAnnotationPanel().getHeight(),
+                BufferedImage.TYPE_INT_ARGB);
+
+        gg = (Graphics2D) newimage.getGraphics();
+        gg.setFont(av.getFont());
+        gg.drawImage(image, null, 0, 0);
+        image = newimage;
+
+        transX = (er - horizontal - sr) * av.getCharWidth();
+        sr = er - horizontal - sr;
+      }
     }
-    else if (horizontal < 0)
+    else
     {
-      er = sr - horizontal;
+      stime = System.currentTimeMillis();
+      gg.copyArea(0, 0, imgWidth, getHeight(),
+              -horizontal * av.getCharWidth(), 0);
+      mtime = System.currentTimeMillis();
+
+      if (horizontal > 0) // scrollbar pulled right, image to the left
+      {
+        transX = (er - sr - horizontal) * av.getCharWidth();
+        sr = er - horizontal;
+      }
+      else if (horizontal < 0)
+      {
+        er = sr - horizontal;
+      }
     }
 
     gg.translate(transX, 0);
@@ -1159,4 +1190,19 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
       renderer.dispose();
     }
   }
+
+  @Override
+  public void propertyChange(PropertyChangeEvent evt)
+  {
+    // Respond to viewport range changes (e.g. alignment panel was scrolled)
+    if (evt.getPropertyName().equals("startres"))
+    {
+      fastPaint((int) evt.getNewValue() - (int) evt.getOldValue(), false);
+    }
+    else if (evt.getPropertyName().equals("endres"))
+    {
+      // resize
+      fastPaint((int) evt.getNewValue() - (int) evt.getOldValue(), true);
+    }
+  }
 }