JAL-2621 Added custom drag cursor to overview panel
[jalview.git] / src / jalview / appletgui / OverviewPanel.java
index 456a38c..7431f6a 100755 (executable)
@@ -31,7 +31,10 @@ import java.awt.BorderLayout;
 import java.awt.CheckboxMenuItem;
 import java.awt.Cursor;
 import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.Image;
 import java.awt.Panel;
+import java.awt.Point;
 import java.awt.PopupMenu;
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
@@ -43,9 +46,14 @@ import java.awt.event.MouseListener;
 import java.awt.event.MouseMotionListener;
 import java.beans.PropertyChangeEvent;
 
+import javax.swing.ImageIcon;
+
 public class OverviewPanel extends Panel implements Runnable,
         MouseMotionListener, MouseListener, ViewportListenerI
 {
+  protected Image dragImage = new ImageIcon(
+          getClass().getResource("/images/dragcursor.png")).getImage();
+
   private OverviewDimensions od;
 
   private OverviewCanvas oviewCanvas;
@@ -60,6 +68,8 @@ public class OverviewPanel extends Panel implements Runnable,
 
   private boolean draggingBox = false;
 
+  private Cursor dragCursor;
+
   public OverviewPanel(AlignmentPanel alPanel)
   {
     this.av = alPanel.av;
@@ -67,7 +77,8 @@ public class OverviewPanel extends Panel implements Runnable,
     setLayout(null);
 
     od = new OverviewDimensionsShowHidden(av.getRanges(),
-            (av.isShowAnnotation() && av.getSequenceConsensusHash() != null));
+            (av.isShowAnnotation()
+                    && av.getSequenceConsensusHash() != null));
 
     oviewCanvas = new OverviewCanvas(od, av);
     setLayout(new BorderLayout());
@@ -77,6 +88,20 @@ public class OverviewPanel extends Panel implements Runnable,
 
     av.getRanges().addPropertyChangeListener(this);
 
+    // set up custom cursor for use on Mac...
+    Point hotSpot = new Point(16, 16);
+    String cursorName = "Custom drag cursor";
+
+    if (Platform.isAMac())
+    {
+      dragCursor = getToolkit().createCustomCursor(dragImage, hotSpot,
+              cursorName);
+    }
+    else
+    {
+      dragCursor = Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR);
+    }
+
     addComponentListener(new ComponentAdapter()
     {
 
@@ -112,24 +137,38 @@ public class OverviewPanel extends Panel implements Runnable,
   @Override
   public void mouseClicked(MouseEvent evt)
   {
-    if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
+    if ((evt.getModifiers()
+            & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
     {
       showPopupMenu(evt);
     }
+    else if (od.isPositionInBox(evt.getX(), evt.getY()))
+    {
+      // display drag cursor at mouse position
+      this.getParent().setCursor(dragCursor);
+    }
+    else
+    {
+      // reset cursor
+      this.getParent()
+              .setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+    }
   }
 
   @Override
   public void mouseMoved(MouseEvent evt)
   {
+    System.out.println(evt.getY());
     if (od.isPositionInBox(evt.getX(), evt.getY()))
     {
       // display drag cursor at mouse position
-      setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
+      this.getParent().setCursor(dragCursor);
     }
     else
     {
       // reset cursor
-      setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+      this.getParent()
+              .setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
     }
   }
 
@@ -146,11 +185,12 @@ public class OverviewPanel extends Panel implements Runnable,
     }
     else
     {
+      // don't do anything if the mouse press is in the overview's box
+      // (wait to see if it's a drag instead)
+      // otherwise update the viewport
       if (!od.isPositionInBox(evt.getX(), evt.getY()))
-      {
-        // don't do anything if the mouse press is in the overview's box
-        // (wait to see if it's a drag instead)
-        // otherwise update the viewport
+      { 
+       draggingBox = false;
         od.updateViewportFromMouse(evt.getX(), evt.getY(),
                 av.getAlignment().getHiddenSequences(),
                 av.getAlignment().getHiddenColumns());
@@ -168,16 +208,13 @@ public class OverviewPanel extends Panel implements Runnable,
   @Override
   public void mouseReleased(MouseEvent evt)
   {
-    if (draggingBox)
-    {
-      draggingBox = false;
-    }
   }
 
   @Override
   public void mouseDragged(MouseEvent evt)
   {
-    if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
+    if ((evt.getModifiers()
+            & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
     {
       if (!Platform.isAMac())
       {
@@ -200,7 +237,7 @@ public class OverviewPanel extends Panel implements Runnable,
                 av.getAlignment().getHiddenSequences(),
                 av.getAlignment().getHiddenColumns());
       }
-      ap.paintAlignment(false);
+      ap.paintAlignment(false, false);
     }
   }
 
@@ -244,8 +281,8 @@ public class OverviewPanel extends Panel implements Runnable,
   public void run()
   {
     oviewCanvas.draw(av.isShowSequenceFeatures(),
-            (av.isShowAnnotation() && av
-                    .getAlignmentConservationAnnotation() != null),
+            (av.isShowAnnotation()
+                    && av.getAlignmentConservationAnnotation() != null),
             ap.seqPanel.seqCanvas.getFeatureRenderer());
     setBoxPosition();
   }
@@ -257,9 +294,8 @@ public class OverviewPanel extends Panel implements Runnable,
    */
   private void setBoxPosition()
   {
-    od.setBoxPosition(av.getAlignment()
-.getHiddenSequences(), av
-            .getAlignment().getHiddenColumns());
+    od.setBoxPosition(av.getAlignment().getHiddenSequences(),
+            av.getAlignment().getHiddenColumns());
     repaint();
   }
 
@@ -301,15 +337,15 @@ public class OverviewPanel extends Panel implements Runnable,
     {
       showHidden = false;
       od = new OverviewDimensionsHideHidden(av.getRanges(),
-              (av.isShowAnnotation() && av
-                      .getAlignmentConservationAnnotation() != null));
+              (av.isShowAnnotation()
+                      && av.getAlignmentConservationAnnotation() != null));
     }
     else
     {
       showHidden = true;
       od = new OverviewDimensionsShowHidden(av.getRanges(),
-              (av.isShowAnnotation() && av
-                      .getAlignmentConservationAnnotation() != null));
+              (av.isShowAnnotation()
+                      && av.getAlignmentConservationAnnotation() != null));
     }
     oviewCanvas.resetOviewDims(od);
     updateOverviewImage();
@@ -323,6 +359,9 @@ public class OverviewPanel extends Panel implements Runnable,
     try
     {
       av.getRanges().removePropertyChangeListener(this);
+      Frame parent = (Frame) getParent();
+      parent.dispose();
+      parent.setVisible(false);
     } finally
     {
       av = null;