JAL-2349 JAL-3855 highlight residues associated with elements under mouse - Jmol...
[jalview.git] / src / jalview / gui / AnnotationPanel.java
index ccc086c..d31e52d 100755 (executable)
@@ -852,7 +852,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
      */
     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());
@@ -873,41 +877,59 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
     AlignmentAnnotation cma = av.getAlignment()
             .getAlignmentAnnotation()[rowIndex[0]];
 
-    int fromXp = Math.min(firstDragX, evt.getX());
-    int toXp = Math.max(firstDragX, evt.getX());
-    int lastX = getColumnForXPos(fromXp);
-    int currentX = getColumnForXPos(toXp);
-    ContactListI forLastX = av.getContactList(cma, lastX);
-    ContactListI forCurrentX = av.getContactList(cma, currentX);
-    if (forLastX != null && forCurrentX != null)
+    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(forLastX,
+      ContactGeometry lastXcgeom = new ContactGeometry(forFromX,
               cma.graphHeight);
-      ContactGeometry.contactInterval lastXci = lastXcgeom.mapFor(
-              rowIndex[1],
-              rowIndex[1] + ((fromY == firstDragY) ? -deltaY : deltaY));
-      ContactGeometry cXcgeom = new ContactGeometry(forCurrentX,
+      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);
+              rowIndex[1] - deltaY);
+
       // mark rectangular region formed by drag
-      System.err.println("Matrix Selection from last(" + lastXci.cStart
-              + "," + lastXci.cEnd + ") to cur(" + cXci.cStart + ","
-              + cXci.cEnd + ")");
+      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++)
       {
-        av.getColumnSelection().addElement(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++)
       {
-        av.getColumnSelection().addElement(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);
@@ -997,15 +1019,14 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
   static int[] getRowIndexAndOffset(int yPos, AlignmentAnnotation[] aa)
   {
     int[] res = new int[2];
+    res[0] = -1;
+    res[1] = 0;
     if (aa == null)
     {
-      res[0] = -1;
-      res[1] = 0;
       return res;
     }
     int row = -1;
     int height = 0, lheight = 0;
-
     for (int i = 0; i < aa.length; i++)
     {
       if (aa[i].visible)
@@ -1076,12 +1097,16 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
       if (clist != null)
       {
         ContactGeometry cgeom = new ContactGeometry(clist, ann.graphHeight);
-        ContactGeometry.contactInterval ci = cgeom.mapFor(rowAndOffset,
-                rowAndOffset);
-        tooltip += "Contact from " + ci.cStart + " to " + ci.cEnd;
-
-        // ap.getStructureSelectionManager().mouseOverSequence(ann.sequenceRef,
-        // new int[] {column, ci.cStart,ci.cEnd}, -1, null)
+        ContactGeometry.contactInterval ci = cgeom.mapFor(rowAndOffset);
+        ContactRange cr = clist.getRangeFor(ci.cStart, ci.cEnd);
+        tooltip = "Contact from " + clist.getPosition() + ", [" + ci.cStart
+                + " - " + ci.cEnd + "]" + "<br/>Mean:" + cr.getMean();
+        int col = ann.sequenceRef.findPosition(column);
+        ap.getStructureSelectionManager()
+                .highlightPositionsOn(ann.sequenceRef, new int[][]
+                { new int[] { col, col },
+                    new int[]
+                    { ci.cStart, ci.cEnd } }, null);
       }
     }
     return tooltip;