JAL-4107 fix merge and avoid NPE
[jalview.git] / src / jalview / gui / AnnotationPanel.java
index 35ae242..93af6ec 100755 (executable)
@@ -150,6 +150,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
    */
   public AnnotationPanel(AlignmentPanel ap)
   {
+    setName("AnnotationPanel");
     ToolTipManager.sharedInstance().registerComponent(this);
     ToolTipManager.sharedInstance().setInitialDelay(0);
     ToolTipManager.sharedInstance().setDismissDelay(10000);
@@ -355,7 +356,8 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
         @Override
         public void colourSelected(Color c)
         {
-          HiddenColumns hiddenColumns = av.getAlignment().getHiddenColumns();
+          HiddenColumns hiddenColumns = av.getAlignment()
+                  .getHiddenColumns();
           for (int index : av.getColumnSelection().getSelected())
           {
             if (hiddenColumns.isVisible(index))
@@ -366,10 +368,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
               }
               fAnot[index].colour = c;
             }
-        }};
+          }
+        };
       };
-      JalviewColourChooser.showColourChooser(this,
-              title, Color.black, listener);
+      JalviewColourChooser.showColourChooser(this, title, Color.black,
+              listener);
     }
     else
     // HELIX, SHEET or STEM
@@ -634,6 +637,10 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
     mouseDragLastX = -1;
     mouseDragLastY = -1;
     mouseDragging = false;
+    if (dragMode == DragMode.Resize)
+    {
+      ap.adjustAnnotationHeight();
+    }
     dragMode = DragMode.Undefined;
     ap.getScalePanel().mouseReleased(evt);
 
@@ -674,16 +681,25 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
   }
 
   /**
-   * DOCUMENT ME!
+   * Action on starting or continuing a mouse drag. There are two possible
+   * actions:
+   * <ul>
+   * <li>drag up or down on a graphed annotation increases or decreases the
+   * height of the graph</li>
+   * <li>dragging left or right selects the columns dragged across</li>
+   * </ul>
+   * A drag on a graph annotation is treated as column selection if it starts
+   * with more horizontal than vertical movement, and as resize if it starts
+   * with more vertical than horizontal movement. Once started, the drag does
+   * not change mode.
    * 
    * @param evt
-   *          DOCUMENT ME!
    */
   @Override
   public void mouseDragged(MouseEvent evt)
   {
     /*
-     * todo: if dragMode is Undefined:
+     * if dragMode is Undefined:
      * - set to Select if dx > dy
      * - set to Resize if dy > dx
      * - do nothing if dx == dy
@@ -711,13 +727,13 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
     }
 
     if (dragMode == DragMode.Undefined)
-    {
+      {
       /*
        * drag is diagonal - defer deciding whether to
        * treat as up/down or left/right
        */
-      return;
-    }
+        return;
+      }
 
     try
     {
@@ -734,6 +750,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
           int newHeight = Math.max(0, graphAnnotation.graphHeight + deltaY);
           graphAnnotation.graphHeight = newHeight;
           adjustPanelHeight();
+          setNoFastPaint();
           ap.paintAlignment(false, false);
         }
       }
@@ -875,6 +892,10 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
             && ann.annotations[column] != null)
     {
       tooltip = ann.annotations[column].description;
+      if ("".equals(tooltip))
+      {
+        tooltip = null;
+      }
     }
 
     return tooltip;
@@ -986,7 +1007,8 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
   }
 
   private volatile boolean imageFresh = false;
-  private Rectangle visibleRect = new Rectangle(), clipBounds = new Rectangle();
+  private Rectangle visibleRect = new Rectangle(),
+          clipBounds = new Rectangle();
 
   /**
    * DOCUMENT ME!
@@ -997,23 +1019,25 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
   @Override
   public void paintComponent(Graphics g)
   {
-         
-         // BH: note that this method is generally recommended to 
-         // call super.paintComponent(g). Otherwise, the children of this
-         // component will not be rendered. That is not needed here 
-         // because AnnotationPanel does not have any children. It is
-         // just a JPanel contained in a JViewPort. 
+    // BH: note that this method is generally recommended to
+    // call super.paintComponent(g). Otherwise, the children of this
+    // component will not be rendered. That is not needed here
+    // because AnnotationPanel does not have any children. It is
+    // just a JPanel contained in a JViewPort.
 
     computeVisibleRect(visibleRect);
-    
     g.setColor(Color.white);
     g.fillRect(0, 0, visibleRect.width, visibleRect.height);
 
-    if (image != null)
+    ViewportRanges ranges = av.getRanges();
+
+    if (allowFastPaint && image != null)
     {
-       // BH 2018 optimizing generation of new Rectangle().
-      if (fastPaint || (visibleRect.width != (clipBounds = g.getClipBounds(clipBounds)).width)
-            || (visibleRect.height != clipBounds.height))
+      // BH 2018 optimizing generation of new Rectangle().
+      if (fastPaint
+              || (visibleRect.width != (clipBounds = g
+                      .getClipBounds(clipBounds)).width)
+              || (visibleRect.height != clipBounds.height))
       {
 
          
@@ -1022,10 +1046,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
         return;
       }
     }
-    imgWidth = (av.getRanges().getEndRes() - av.getRanges().getStartRes()
-            + 1) * av.getCharWidth();
+    imgWidth = (ranges.getEndRes() - ranges.getStartRes() + 1)
+            * av.getCharWidth();
     if (imgWidth < 1)
     {
+      fastPaint = false;
       return;
     }
     Graphics2D gg;
@@ -1064,8 +1089,10 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
       gg.setColor(Color.white);
       gg.fillRect(0, 0, imgWidth, image.getHeight());
       imageFresh = true;
-    } else {
-        gg = (Graphics2D) image.getGraphics();
+    }
+    else
+    {
+      gg = (Graphics2D) image.getGraphics();
 
     }
     
@@ -1077,11 +1104,6 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
   }
 
   /**
-   * set true to enable redraw timing debug output on stderr
-   */
-  private final boolean debugRedraw = false;
-
-  /**
    * non-Thread safe repaint
    * 
    * @param horizontal
@@ -1102,19 +1124,27 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
     int er = av.getRanges().getEndRes() + 1;
     int transX = 0;
 
-    Graphics2D gg = (Graphics2D) image.getGraphics();
-
-    gg.copyArea(0, 0, imgWidth, getHeight(),
-            -horizontal * av.getCharWidth(), 0);
-
-    if (horizontal > 0) // scrollbar pulled right, image to the left
+    if (er == sr + 1)
     {
-      transX = (er - sr - horizontal) * av.getCharWidth();
-      sr = er - horizontal;
+      fastPaint = false;
+      return;
     }
-    else if (horizontal < 0)
-    {
-      er = sr - horizontal;
+    Graphics2D gg = (Graphics2D) image.getGraphics();
+
+    if (imgWidth>Math.abs(horizontal*av.getCharWidth())) {
+      //scroll is less than imgWidth away so can re-use buffered graphics
+      gg.copyArea(0, 0, imgWidth, getHeight(),
+              -horizontal * av.getCharWidth(), 0);
+      
+      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);
@@ -1124,7 +1154,6 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
     gg.translate(-transX, 0);
 
     gg.dispose();
-    
     fastPaint = true;
 
     // Call repaint on alignment panel so that repaints from other alignment
@@ -1242,6 +1271,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
 
   private int[] bounds = new int[2];
 
+  private boolean allowFastPaint;
   @Override
   public int[] getVisibleVRange()
   {
@@ -1268,7 +1298,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
     ap = null;
     image = null;
     fadedImage = null;
-//    gg = null;
+    // gg = null;
     _mwl = null;
 
     /*
@@ -1348,4 +1378,13 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
     }
     return annotationHeight;
   }
+  
+  /**
+   * Clears the flag that allows a 'fast paint' on the next repaint, so
+   * requiring a full repaint
+   */
+  public void setNoFastPaint()
+  {
+    allowFastPaint = false;
+  }
 }