display feature score in tooltip
[jalview.git] / src / jalview / gui / SeqPanel.java
index bdfcef4..8f63c52 100755 (executable)
@@ -36,7 +36,7 @@ import jalview.structure.*;
  * @version $Revision$
  */
 public class SeqPanel extends JPanel implements MouseListener,
-        MouseMotionListener, MouseWheelListener, SequenceListener
+        MouseMotionListener, MouseWheelListener, SequenceListener, SelectionListener
 
 {
   /** DOCUMENT ME!! */
@@ -124,6 +124,7 @@ public class SeqPanel extends JPanel implements MouseListener,
       addMouseWheelListener(this);
       ssm = StructureSelectionManager.getStructureSelectionManager();
       ssm.addStructureViewerListener(this);
+      ssm.addSelectionListener(this);
     }
   }
 
@@ -455,6 +456,7 @@ public class SeqPanel extends JPanel implements MouseListener,
     }
 
     ap.paintAlignment(false);
+    av.sendSelection();
   }
 
   void insertGapAtCursor(boolean group)
@@ -605,6 +607,10 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   public void highlightSequence(SearchResults results)
   {
+    if (av.followHighlight)
+    {
+      ap.scrollToPosition(results, false);
+    }
     seqCanvas.highlightSearchResults(results);
   }
 
@@ -679,123 +685,144 @@ public class SeqPanel extends JPanel implements MouseListener,
     // use aa to see if the mouse pointer is on a
     if (av.showSequenceFeatures)
     {
+      int rpos;
       SequenceFeature[] features = findFeaturesAtRes(sequence
-              .getDatasetSequence(), sequence.findPosition(res));
+              .getDatasetSequence(), rpos = sequence.findPosition(res));
+      appendFeatures(tooltipText, linkImageURL.toString(), rpos, features);
+    }
+    if (tooltipText.length() == 6) // <html></html>
+    {
+      setToolTipText(null);
+    }
+    else
+    {
+      tooltipText.append("</html>");
+      if (lastTooltip == null
+              || !lastTooltip.equals(tooltipText.toString()))
+        setToolTipText(tooltipText.toString());
+
+      lastTooltip = tooltipText.toString();
+    }
 
-      if (features != null)
+  }
+  /**
+   * appends the features at rpos to the given stringbuffer ready for display in a tooltip
+   * @param tooltipText2
+   * @param linkImageURL
+   * @param rpos
+   * @param features
+   * TODO refactor to Jalview 'utilities' somehow. 
+   */
+  public static void appendFeatures(StringBuffer tooltipText2, String linkImageURL,
+          int rpos, SequenceFeature[] features)
+  {
+    String tmpString;
+    if (features != null)
+    {
+      for (int i = 0; i < features.length; i++)
       {
-        for (int i = 0; i < features.length; i++)
+        if (features[i].getType().equals("disulfide bond"))
         {
-          if (features[i].getType().equals("disulfide bond"))
+          if (features[i].getBegin() == rpos
+                  || features[i].getEnd() == rpos)
           {
-            if (features[i].getBegin() == sequence.findPosition(res)
-                    || features[i].getEnd() == sequence.findPosition(res))
+            if (tooltipText2.length() > 6)
             {
-              if (tooltipText.length() > 6)
-              {
-                tooltipText.append("<br>");
-              }
-              tooltipText.append("disulfide bond " + features[i].getBegin()
-                      + ":" + features[i].getEnd());
-              if (features[i].links != null)
-              {
-                tooltipText.append(" <img src=\"" + linkImageURL + "\">");
-              }
+              tooltipText2.append("<br>");
+            }
+            tooltipText2.append("disulfide bond " + features[i].getBegin()
+                    + ":" + features[i].getEnd());
+            if (features[i].links != null)
+            {
+              tooltipText2.append(" <img src=\"" + linkImageURL + "\">");
             }
           }
-          else
+        }
+        else
+        {
+          if (tooltipText2.length() > 6)
+          {
+            tooltipText2.append("<br>");
+          }
+
+          tooltipText2.append(features[i].getType() + " ");
+          if (rpos!=0)
+          {
+            // we are marking a positional feature
+            tooltipText2.append(features[i].begin);
+          }
+          if (features[i].begin != features[i].end)
+          {
+            tooltipText2.append(" " + features[i].end);
+          }
+
+          if (features[i].getDescription() != null
+                  && !features[i].description.equals(features[i]
+                          .getType()))
           {
-            if (tooltipText.length() > 6)
+            tmpString = features[i].getDescription();
+            int startTag = tmpString.toUpperCase().indexOf("<HTML>");
+            if (startTag > -1)
             {
-              tooltipText.append("<br>");
+              tmpString = tmpString.substring(startTag + 6);
             }
-
-            tooltipText.append(features[i].getType() + " "
-                    + features[i].begin);
-            if (features[i].begin != features[i].end)
+            int endTag = tmpString.toUpperCase().indexOf("</BODY>");
+            if (endTag > -1)
+            {
+              tmpString = tmpString.substring(0, endTag);
+            }
+            endTag = tmpString.toUpperCase().indexOf("</HTML>");
+            if (endTag > -1)
             {
-              tooltipText.append(" " + features[i].end);
+              tmpString = tmpString.substring(0, endTag);
             }
 
-            if (features[i].getDescription() != null
-                    && !features[i].description.equals(features[i]
-                            .getType()))
+            if (startTag > -1)
             {
-              tmpString = features[i].getDescription();
-              int startTag = tmpString.toUpperCase().indexOf("<HTML>");
-              if (startTag > -1)
-              {
-                tmpString = tmpString.substring(startTag + 6);
-              }
-              int endTag = tmpString.toUpperCase().indexOf("</BODY>");
-              if (endTag > -1)
-              {
-                tmpString = tmpString.substring(0, endTag);
-              }
-              endTag = tmpString.toUpperCase().indexOf("</HTML>");
-              if (endTag > -1)
+              tooltipText2.append("; " + tmpString);
+            }
+            else
+            {
+              if (tmpString.indexOf("<") > -1
+                      || tmpString.indexOf(">") > -1)
               {
-                tmpString = tmpString.substring(0, endTag);
-              }
+                // The description does not specify html is to
+                // be used, so we must remove < > symbols
+                tmpString = tmpString.replaceAll("<", "&lt;");
+                tmpString = tmpString.replaceAll(">", "&gt;");
+
+                tooltipText2.append("; ");
+                tooltipText2.append(tmpString);
 
-              if (startTag > -1)
-              {
-                tooltipText.append("; " + tmpString);
               }
               else
               {
-                if (tmpString.indexOf("<") > -1
-                        || tmpString.indexOf(">") > -1)
-                {
-                  // The description does not specify html is to
-                  // be used, so we must remove < > symbols
-                  tmpString = tmpString.replaceAll("<", "&lt;");
-                  tmpString = tmpString.replaceAll(">", "&gt;");
-
-                  tooltipText.append("; ");
-                  tooltipText.append(tmpString);
-
-                }
-                else
-                {
-                  tooltipText.append("; " + tmpString);
-                }
-              }
-            }
-            if (features[i].getValue("status") != null)
-            {
-              String status = features[i].getValue("status").toString();
-              if (status.length() > 0)
-              {
-                tooltipText.append("; (" + features[i].getValue("status")
-                        + ")");
+                tooltipText2.append("; " + tmpString);
               }
             }
-
-            if (features[i].links != null)
+          }
+          if (features[i].getScore()!=Float.NaN)
+          {
+            tooltipText2.append(" Score="+features[i].getScore());
+          }
+          if (features[i].getValue("status") != null)
+          {
+            String status = features[i].getValue("status").toString();
+            if (status.length() > 0)
             {
-              tooltipText.append(" <img src=\"" + linkImageURL + "\">");
+              tooltipText2.append("; (" + features[i].getValue("status")
+                      + ")");
             }
+          }
 
+          if (features[i].links != null)
+          {
+            tooltipText2.append(" <img src=\"" + linkImageURL + "\">");
           }
+
         }
       }
     }
-
-    if (tooltipText.length() == 6) // <html></html>
-    {
-      setToolTipText(null);
-    }
-    else
-    {
-      tooltipText.append("</html>");
-      if (lastTooltip == null
-              || !lastTooltip.equals(tooltipText.toString()))
-        setToolTipText(tooltipText.toString());
-
-      lastTooltip = tooltipText.toString();
-    }
-
   }
 
   String lastTooltip;
@@ -1514,6 +1541,7 @@ public class SeqPanel extends JPanel implements MouseListener,
       sg.setEndRes(res);
       sg.addSequence(sequence, false);
       av.setSelectionGroup(sg);
+      
       stretchGroup = sg;
 
       if (av.getConservationSelected())
@@ -1591,7 +1619,7 @@ public class SeqPanel extends JPanel implements MouseListener,
     changeEndRes = false;
     changeStartRes = false;
     stretchGroup = null;
-
+    av.sendSelection();
   }
 
   /**
@@ -1791,4 +1819,50 @@ public class SeqPanel extends JPanel implements MouseListener,
       }
     }
   }
+  /**
+   * modify current selection according to a received message.
+   */
+  public void selection(SequenceGroup seqsel, ColumnSelection colsel,
+          SelectionSource source)
+  {
+    // TODO: fix this hack - source of messages is align viewport, but SeqPanel handles selection messages...
+    if (av==source)
+    {
+      return;
+    }
+    // do we want to thread this ? (contention with seqsel and colsel locks, I suspect)
+    boolean repaint=false;
+    if (av.followSelection)
+    {
+      if (av.selectionGroup==null || !av.isSelectionGroupChanged())
+      {
+        SequenceGroup sgroup = (seqsel!=null) ? seqsel.intersect(av.alignment, (av.hasHiddenRows) ? av.hiddenRepSequences : null)
+                  : null;
+        if (sgroup!=null && sgroup.getSize()>0)
+        {
+          av.setSelectionGroup(sgroup);
+        } else {
+          av.setSelectionGroup(null);
+        }
+        repaint = av.isSelectionGroupChanged();
+      }
+      if (av.colSel==null || !av.isColSelChanged())
+      {
+        // Check to see if the current selection is from a previous message
+        if (colsel==null || colsel.size()==0)
+        {
+          av.colSel.clear();
+        } else {
+          av.colSel = new ColumnSelection(colsel);
+        } 
+        repaint |= av.isColSelChanged();
+      }
+    }
+    if (repaint)
+    {
+      // probably finessing with multiple redraws here
+      PaintRefresher.Refresh(this, av.getSequenceSetId());
+      // ap.paintAlignment(false);
+    }
+  }
 }