X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAnnotationPanel.java;h=16db94c9dae6b19bb807abaa95420fb38a5d7a3e;hb=7e00183505bd4c58d1ce62ee121ed372c3b058f2;hp=ab86707b3175932bafb3ddf34c7c97b2fb293adc;hpb=bc18effe68ba80213a6d03ca7e6175adc6be71d6;p=jalview.git diff --git a/src/jalview/gui/AnnotationPanel.java b/src/jalview/gui/AnnotationPanel.java index ab86707..16db94c 100755 --- a/src/jalview/gui/AnnotationPanel.java +++ b/src/jalview/gui/AnnotationPanel.java @@ -77,6 +77,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, MouseListener, MouseWheelListener, MouseMotionListener, ActionListener, AdjustmentListener, Scrollable, ViewportListenerI { + enum DragMode + { + Select, Resize, Undefined + }; + String HELIX = MessageManager.getString("label.helix"); String SHEET = MessageManager.getString("label.sheet"); @@ -120,11 +125,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, // Used For mouse Dragging and resizing graphs int graphStretch = -1; - int graphStretchY = -1; + int mouseDragLastX = -1; - int min; // used by mouseDragged to see if user + int mouseDragLastY = -1; - int max; // used by mouseDragged to see if user + DragMode dragMode = DragMode.Undefined; boolean mouseDragging = false; @@ -500,10 +505,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, } /** - * DOCUMENT ME! + * Action on right mouse pressed on Mac is to show a pop-up menu for the + * annotation. Action on left mouse pressed is to find which annotation is + * pressed and mark the start of a column selection or graph resize operation. * * @param evt - * DOCUMENT ME! */ @Override public void mousePressed(MouseEvent evt) @@ -514,7 +520,13 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, { return; } + mouseDragLastX = evt.getX(); + mouseDragLastY = evt.getY(); + /* + * add visible annotation heights until we reach the y + * position, to find which annotation it is in + */ int height = 0; activeRow = -1; @@ -534,11 +546,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, } else if (aa[i].graph > 0) { - // Stretch Graph + /* + * we have clicked on a resizable graph annotation + */ graphStretch = i; - graphStretchY = y; } - break; } } @@ -604,17 +616,20 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, } /** - * DOCUMENT ME! + * Action on mouse up is to clear mouse drag data and call mouseReleased on + * ScalePanel, to deal with defining the selection group (if any) defined by + * the mouse drag * * @param evt - * DOCUMENT ME! */ @Override public void mouseReleased(MouseEvent evt) { graphStretch = -1; - graphStretchY = -1; + mouseDragLastX = -1; + mouseDragLastY = -1; mouseDragging = false; + dragMode = DragMode.Undefined; ap.getScalePanel().mouseReleased(evt); /* @@ -661,24 +676,73 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, @Override public void mouseDragged(MouseEvent evt) { - if (graphStretch > -1) + /* + * todo: if dragMode is Undefined: + * - set to Select if dx > dy + * - set to Resize if dy > dx + * - do nothing if dx == dy + */ + final int x = evt.getX(); + final int y = evt.getY(); + if (dragMode == DragMode.Undefined) { - av.getAlignment() - .getAlignmentAnnotation()[graphStretch].graphHeight += graphStretchY - - evt.getY(); - if (av.getAlignment() - .getAlignmentAnnotation()[graphStretch].graphHeight < 0) + int dx = Math.abs(x - mouseDragLastX); + int dy = Math.abs(y - mouseDragLastY); + if (graphStretch == -1 || dx > dy) { - av.getAlignment() - .getAlignmentAnnotation()[graphStretch].graphHeight = 0; + /* + * mostly horizontal drag, or not a graph annotation + */ + dragMode = DragMode.Select; + } + else if (dy > dx) + { + /* + * mostly vertical drag + */ + dragMode = DragMode.Resize; } - graphStretchY = evt.getY(); - adjustPanelHeight(); - ap.paintAlignment(false, false); } - else + + if (dragMode == DragMode.Undefined) + { + /* + * drag is diagonal - defer deciding whether to + * treat as up/down or left/right + */ + return; + } + + try + { + if (dragMode == DragMode.Resize) + { + /* + * resize graph annotation if mouse was dragged up or down + */ + int deltaY = mouseDragLastY - evt.getY(); + if (deltaY != 0) + { + AlignmentAnnotation graphAnnotation = av.getAlignment() + .getAlignmentAnnotation()[graphStretch]; + int newHeight = Math.max(0, graphAnnotation.graphHeight + deltaY); + graphAnnotation.graphHeight = newHeight; + adjustPanelHeight(); + ap.paintAlignment(false, false); + } + } + else + { + /* + * for mouse drag left or right, delegate to + * ScalePanel to adjust the column selection + */ + ap.getScalePanel().mouseDragged(evt); + } + } finally { - ap.getScalePanel().mouseDragged(evt); + mouseDragLastX = x; + mouseDragLastY = y; } }