+ 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)
+ {
+ System.out.println("Drag out of range. needs to be clipped");
+
+ }
+ if (rowIndex[0] != toRowIndex[0])
+ {
+ System.out.println("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)
+ {
+ ContactGeometry lastXcgeom = new ContactGeometry(forFromX,
+ cma.graphHeight);
+ ContactGeometry.contactInterval lastXci = lastXcgeom
+ .mapFor(rowIndex[1], rowIndex[1] - deltaY);
+
+ ContactGeometry cXcgeom = new ContactGeometry(forToX,
+ cma.graphHeight);
+ ContactGeometry.contactInterval cXci = cXcgeom.mapFor(rowIndex[1],
+ rowIndex[1] - deltaY);
+
+ // mark rectangular region formed by drag
+ System.err.println("Matrix Selection from last(" + fromXc + ",["
+ + lastXci.cStart + "," + lastXci.cEnd + "]) to cur(" + toXc
+ + ",[" + cXci.cStart + "," + cXci.cEnd + "])");
+ int fr, to;
+ fr = Math.min(lastXci.cStart, lastXci.cEnd);
+ to = Math.max(lastXci.cStart, lastXci.cEnd);
+ System.err.println("Marking " + fr + " to " + to);
+ for (int c = fr; c <= to; c++)
+ {
+ if (cma.sequenceRef != null)
+ {
+ int col = cma.sequenceRef.findIndex(c);
+ av.getColumnSelection().addElement(col);
+ }
+ else
+ {
+ av.getColumnSelection().addElement(c);
+ }
+ }
+ fr = Math.min(cXci.cStart, cXci.cEnd);
+ to = Math.max(cXci.cStart, cXci.cEnd);
+ System.err.println("Marking " + fr + " to " + to);
+ for (int c = fr; c <= to; c++)
+ {
+ if (cma.sequenceRef != null)
+ {
+ int col = cma.sequenceRef.findIndex(c);
+ av.getColumnSelection().addElement(col);
+ }
+ else
+ {
+ av.getColumnSelection().addElement(c);
+ }
+ }
+ fr = Math.min(lastX, currentX);
+ to = Math.max(lastX, currentX);
+
+ System.err.println("Marking " + fr + " to " + to);
+ for (int c = fr; c <= to; c++)
+ {
+ av.getColumnSelection().addElement(c);
+ }
+ }
+
+ }
+