+ /*
+ * 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);
+ if (notJustOne)
+ {
+ for (AlignmentAnnotation similar : av.getAlignment()
+ .findAnnotations(null, graphAnnotation.getCalcId(),
+ graphAnnotation.label))
+ {
+ similar.graphHeight = newHeight;
+ }
+
+ }
+ else
+ {
+ graphAnnotation.graphHeight = newHeight;
+ }
+ adjustPanelHeight();
+ ap.paintAlignment(false, false);
+ }
+ }
+ else if (dragMode == DragMode.MatrixSelect)
+ {
+ /*
+ * TODO draw a rubber band for range
+ */
+ mouseDragLastX = x;
+ mouseDragLastY = y;
+ ap.paintAlignment(false, false);
+ }
+ else
+ {
+ /*
+ * for mouse drag left or right, delegate to
+ * ScalePanel to adjust the column selection
+ */
+ ap.getScalePanel().mouseDragged(evt);
+ }
+ } finally
+ {
+ mouseDragLastX = x;
+ mouseDragLastY = y;
+ }
+ }
+
+ public void matrixSelectRange(MouseEvent evt)
+ {
+ /*
+ * get geometry of drag
+ */
+ int fromY = Math.min(firstDragY, evt.getY());
+ int toY = Math.max(firstDragY, evt.getY());
+ int fromX = Math.min(firstDragX, evt.getX());
+ int toX = Math.max(firstDragX, evt.getX());
+
+ int deltaY = toY - fromY;
+ int deltaX = toX - fromX;
+
+ int[] rowIndex = getRowIndexAndOffset(fromY,
+ av.getAlignment().getAlignmentAnnotation());
+ int[] toRowIndex = getRowIndexAndOffset(toY,
+ av.getAlignment().getAlignmentAnnotation());
+
+ if (rowIndex == null || toRowIndex == null)
+ {
+ jalview.bin.Console.trace("Drag out of range. needs to be clipped");
+
+ }
+ if (rowIndex[0] != toRowIndex[0])
+ {
+ jalview.bin.Console
+ .trace("Drag went to another row. needs to be clipped");
+ }
+
+ // rectangular selection on matrix style annotation
+ AlignmentAnnotation cma = av.getAlignment()
+ .getAlignmentAnnotation()[rowIndex[0]];
+
+ int lastX = getColumnForXPos(fromX);
+ int currentX = getColumnForXPos(toX);
+ int fromXc = Math.min(lastX, currentX);
+ int toXc = Math.max(lastX, currentX);
+ ContactListI forFromX = av.getContactList(cma, fromXc);
+ ContactListI forToX = av.getContactList(cma, toXc);
+
+ if (forFromX != null && forToX != null)
+ {
+ // FIXME will need two ContactGeometry objects when handling contact
+ // matrices with differing numbers of rows at each
+ // column
+ ContactGeometry xcgeom = new ContactGeometry(forFromX,
+ cma.graphHeight);
+ ContactGeometry.contactInterval lastXci = xcgeom.mapFor(rowIndex[1]);
+ ContactGeometry.contactInterval cXci = xcgeom
+ .mapFor(rowIndex[1] + deltaY);
+
+ // mark rectangular region formed by drag
+ jalview.bin.Console.trace("Matrix Selection from last(" + fromXc
+ + ",[" + lastXci.cStart + "," + lastXci.cEnd + "]) to cur("
+ + toXc + ",[" + cXci.cStart + "," + cXci.cEnd + "])");
+ int fr, to;
+ fr = Math.min(lastXci.cStart, cXci.cStart);
+ to = Math.max(lastXci.cEnd, cXci.cEnd);
+ int[] mappedPos = forFromX.getMappedPositionsFor(fr, to);
+ if (mappedPos != null)
+ {
+ jalview.bin.Console.trace("Marking " + fr + " to " + to
+ + " mapping to sequence positions " + mappedPos[0] + " to "
+ + mappedPos[1]);
+ for (int pair = 0; pair < mappedPos.length; pair += 2)
+ {
+ for (int c = mappedPos[pair]; c <= mappedPos[pair + 1]; c++)
+ // {
+ // if (cma.sequenceRef != null)
+ // {
+ // int col = cma.sequenceRef.findIndex(cma.sequenceRef.getStart()+c);
+ // av.getColumnSelection().addElement(col);
+ // }
+ // else
+ {
+ av.getColumnSelection().addElement(c - 1);
+ }
+ }
+ }
+ fr = Math.min(lastX, currentX);
+ to = Math.max(lastX, currentX);
+
+ jalview.bin.Console.trace("Marking " + fr + " to " + to);
+ for (int c = fr; c <= to; c++)
+ {
+ av.getColumnSelection().addElement(c);
+ }