JAL-244 Fix mismatched vertical positioning of sequences and their labels in wrap...
[jalview.git] / src / jalview / gui / AnnotationPanel.java
index 9970702..8321741 100755 (executable)
@@ -72,6 +72,7 @@ import jalview.util.MessageManager;
 import jalview.util.Platform;
 import jalview.viewmodel.ViewportListenerI;
 import jalview.viewmodel.ViewportRanges;
+import jalview.ws.datamodel.MappableContactMatrixI;
 import jalview.ws.datamodel.alphafold.PAEContactMatrix;
 
 /**
@@ -667,24 +668,48 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
           if (matrix.hasGroups())
           {
             SequenceI rseq = clicked.sequenceRef;
-            BitSet grp = matrix.getGroupsFor(currentX);
+            BitSet grp = new BitSet();
+            grp.or(matrix.getGroupsFor(currentX));
             // TODO: cXci needs to be mapped to real groups
             for (int c = fr; c <= to; c++)
             {
               BitSet additionalGrp = matrix.getGroupsFor(c);
               grp.or(additionalGrp);
             }
+
             HiddenColumns hc = av.getAlignment().getHiddenColumns();
-            for (int p = grp.nextSetBit(0); p >= 0; p = grp
+            ColumnSelection cs = av.getColumnSelection();
+            
+            for (int p=grp.nextSetBit(0); p >= 0; p = grp
                     .nextSetBit(p + 1))
             {
-              int offp = (rseq != null)
-                      ? rseq.findIndex(rseq.getStart() - 1 + p)
-                      : p;
-
-              if (!av.hasHiddenColumns() || hc.isVisible(offp))
+              if (matrix instanceof MappableContactMatrixI)
               {
-                av.getColumnSelection().addElement(offp);
+                // find the end of this run of set bits
+                int nextp = grp.nextClearBit(p)-1;
+                int[] pos = ((MappableContactMatrixI)matrix).getMappedPositionsFor(rseq, p,nextp);
+                p=nextp;
+                
+                if (pos!=null)
+                {
+                  for (int pos_p = pos[0];pos_p<=pos[1];pos_p++)
+                  {
+                    int col = rseq.findIndex(pos_p)-1;
+                    if (col>=0 && (!av.hasHiddenColumns() || hc.isVisible(col)))
+                    {
+                      cs.addElement(col);
+                    }
+                  }
+                }
+              } else {
+                int offp = (rseq != null)
+                        ? rseq.findIndex(rseq.getStart() - 1 + p)
+                        : p;
+  
+                if (!av.hasHiddenColumns() || hc.isVisible(offp))
+                {
+                  cs.addElement(offp);
+                }
               }
             }
           }
@@ -712,7 +737,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
         if (evt.isControlDown()
                 && PAEContactMatrix.PAEMATRIX.equals(clicked.getCalcId()))
         {
-          int c = fr - 1;
+          int c = fr;
           ContactRange cr = forCurrentX.getRangeFor(fr, to);
           double cval;
           // TODO: could use GraphLine instead of arbitrary picking
@@ -722,7 +747,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
           // controls feathering - what other elements in row/column
           // should we select
           double thresh = cr.getMean() + (cr.getMax() - cr.getMean()) * .15;
-          while (c > 0)
+          while (c >= 0)
           {
             cval = forCurrentX.getContactAt(c);
             if (// cr.getMin() <= cval &&
@@ -1053,12 +1078,12 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
       ContactGeometry lastXcgeom = new ContactGeometry(forFromX,
               cma.graphHeight);
       ContactGeometry.contactInterval lastXci = lastXcgeom
-              .mapFor(rowIndex[1], rowIndex[1] - deltaY);
+              .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
       jalview.bin.Console.trace("Matrix Selection from last(" + fromXc
@@ -1222,7 +1247,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
       {
         row = i;
         res[0] = row;
-        res[1] = height - yPos;
+        res[1] = yPos-lheight;
         break;
       }
     }
@@ -1276,6 +1301,10 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
     // TODO abstract tooltip generator so different implementations can be built
     if (ann.graph == AlignmentAnnotation.CONTACT_MAP)
     {
+      if (rowAndOffset>=ann.graphHeight)
+      {
+        return null;
+      }
       ContactListI clist = av.getContactList(ann, column);
       if (clist != null)
       {