Tooltips for features, links for features added
[jalview.git] / src / jalview / appletgui / SeqPanel.java
index 87e9bec..4b7a45e 100755 (executable)
@@ -25,6 +25,8 @@ import java.awt.event.*;
 import jalview.datamodel.*;\r
 import jalview.schemes.*;\r
 \r
+import java.util.Vector;\r
+\r
 public class SeqPanel\r
     extends Panel implements MouseMotionListener, MouseListener\r
 {\r
@@ -312,6 +314,7 @@ public class SeqPanel
                      ")");\r
        }\r
      }\r
+\r
      ap.alignFrame.statusBar.setText(text.toString());\r
 \r
     }\r
@@ -535,48 +538,71 @@ public class SeqPanel
         && sequence.getSequenceFeatures()!=null\r
         && av.featuresDisplayed!=null)\r
     {\r
+      StringBuffer featureText = new StringBuffer();\r
+      Vector allFeatures = getAllFeaturesAtRes(sequence, sequence.findPosition(res));\r
+\r
       int index = 0;\r
-      sequence.getSequenceFeatures();\r
-      boolean first = true;\r
-      while (index < sequence.getSequenceFeatures().length)\r
+      while (index < allFeatures.size())\r
       {\r
-        SequenceFeature sf = sequence.getSequenceFeatures()[index];\r
-        if (sf.getBegin() <= sequence.findPosition(res) &&\r
-            sf.getEnd() >= sequence.findPosition(res))\r
-        {\r
-          if(!av.featuresDisplayed.containsKey(sf.getType()))\r
-           {\r
-             index++;\r
-             continue;\r
-           }\r
+        SequenceFeature sf = (SequenceFeature) allFeatures.elementAt(index);\r
 \r
-          if(first)\r
-          {\r
-            text.append(" Sequence Feature:");\r
-            first = false;\r
-          }\r
-\r
-          text.append(" "+sf.getType());\r
+        featureText.append(sf.getType()+" "+sf.begin+":"+sf.end);\r
 \r
-          if(sf.getDescription()!=null)\r
-            text.append(" "+sf.getDescription());\r
+        if (sf.getDescription() != null)\r
+          featureText.append(" " + sf.getDescription());\r
 \r
-          if (sf.getStatus()!=null && sf.getStatus().length() > 0)\r
-          {\r
-            text.append(" (" + sf.getStatus() + ")");\r
-          }\r
-          text.append("; ");\r
+        if (sf.getStatus() != null && sf.getStatus().length() > 0)\r
+        {\r
+          featureText.append(" (" + sf.getStatus() + ")");\r
         }\r
+        featureText.append("\n");\r
 \r
         index++;\r
-\r
       }\r
+\r
+\r
+        if (tooltip == null)\r
+          tooltip = new Tooltip(featureText.toString(), seqCanvas);\r
+        else\r
+          tooltip.setTip(featureText.toString());\r
+\r
+        tooltip.repaint();\r
+\r
+     //   text.append(" Sequence Feature:");\r
+     //   text.append(featureText);\r
+\r
     }\r
 \r
+\r
      ap.alignFrame.statusBar.setText(text.toString());\r
 \r
   }\r
 \r
+  Vector getAllFeaturesAtRes(SequenceI seq, int res)\r
+  {\r
+    Vector allFeatures = new Vector();\r
+    int index = 0;\r
+    if(seq.getSequenceFeatures()!=null)\r
+    {\r
+      while (index < seq.getSequenceFeatures().length)\r
+      {\r
+        SequenceFeature sf = seq.getSequenceFeatures()[index];\r
+        if (sf.getBegin() <= res &&\r
+            sf.getEnd() >= res)\r
+        {\r
+          if (av.featuresDisplayed.containsKey(sf.getType()))\r
+          {\r
+            allFeatures.addElement(sf);\r
+          }\r
+        }\r
+        index++;\r
+      }\r
+    }\r
+    return allFeatures;\r
+  }\r
+\r
+  Tooltip tooltip;\r
+\r
   public void mouseDragged(MouseEvent evt)\r
   {\r
     if (mouseWheelPressed)\r
@@ -1048,57 +1074,90 @@ public class SeqPanel
               allGroups[i].getEndRes() >= res)\r
           {\r
             stretchGroup = allGroups[i];\r
-            av.setSelectionGroup(stretchGroup);\r
             break;\r
           }\r
         }\r
       }\r
+      av.setSelectionGroup(stretchGroup);\r
     }\r
 \r
-    if (stretchGroup == null)\r
+    if (av.cursorMode)\r
     {\r
-      // define a new group here\r
-      SequenceGroup sg = new SequenceGroup();\r
-      sg.setStartRes(res);\r
-      sg.setEndRes(res);\r
-      sg.addSequence(sequence, false);\r
-      av.setSelectionGroup(sg);\r
-      stretchGroup = sg;\r
-\r
-      if (av.getConservationSelected())\r
-      {\r
-        SliderPanel.setConservationSlider(ap, av.getGlobalColourScheme(),\r
-                                          "Background");\r
-      }\r
-      if (av.getAbovePIDThreshold())\r
-      {\r
-        SliderPanel.setPIDSliderSource(ap, av.getGlobalColourScheme(),\r
-                                       "Background");\r
-      }\r
-\r
+      seqCanvas.cursorX = findRes(evt);\r
+      seqCanvas.cursorY = findSeq(evt);\r
+      seqCanvas.repaint();\r
+      return;\r
     }\r
 \r
+\r
+\r
     // DETECT RIGHT MOUSE BUTTON IN AWT\r
-    else if ( (evt.getModifiers() & InputEvent.BUTTON3_MASK) ==\r
+    if ( (evt.getModifiers() & InputEvent.BUTTON3_MASK) ==\r
              InputEvent.BUTTON3_MASK)\r
     {\r
-      APopupMenu popup = new APopupMenu(ap, null, null);\r
+      Vector allFeatures = getAllFeaturesAtRes(sequence,\r
+                                               sequence.findPosition(res));\r
+\r
+      Vector links = null;\r
+      if(allFeatures!=null)\r
+      {\r
+        for (int i = 0; i < allFeatures.size(); i++)\r
+        {\r
+          SequenceFeature sf = (SequenceFeature) allFeatures.elementAt(i);\r
+          if (sf.links != null)\r
+          {\r
+            links = new Vector();\r
+            for (int j = 0; j < sf.links.size(); j++)\r
+            {\r
+              links.addElement(sf.links.elementAt(j));\r
+            }\r
+          }\r
+        }\r
+      }\r
+      APopupMenu popup = new APopupMenu(ap, null, links);\r
       this.add(popup);\r
       popup.show(this, evt.getX(), evt.getY());\r
+      ap.repaint();\r
     }\r
-\r
-    if (stretchGroup != null && stretchGroup.getEndRes() == res)\r
+    else\r
     {\r
-      // Edit end res position of selected group\r
-      changeEndRes = true;\r
-    }\r
+      //Only if left mouse button do we want to change group sizes\r
 \r
-    else if (stretchGroup != null && stretchGroup.getStartRes() == res)\r
-    {\r
-      // Edit end res position of selected group\r
-      changeStartRes = true;\r
-    }\r
+      if (stretchGroup == null)\r
+      {\r
+        // define a new group here\r
+        SequenceGroup sg = new SequenceGroup();\r
+        sg.setStartRes(res);\r
+        sg.setEndRes(res);\r
+        sg.addSequence(sequence, false);\r
+        av.setSelectionGroup(sg);\r
+        stretchGroup = sg;\r
+\r
+        if (av.getConservationSelected())\r
+        {\r
+          SliderPanel.setConservationSlider(ap, av.getGlobalColourScheme(),\r
+                                            "Background");\r
+        }\r
+        if (av.getAbovePIDThreshold())\r
+        {\r
+          SliderPanel.setPIDSliderSource(ap, av.getGlobalColourScheme(),\r
+                                         "Background");\r
+        }\r
 \r
+      }\r
+\r
+      if (stretchGroup != null && stretchGroup.getEndRes() == res)\r
+      {\r
+        // Edit end res position of selected group\r
+        changeEndRes = true;\r
+      }\r
+\r
+      else if (stretchGroup != null && stretchGroup.getStartRes() == res)\r
+      {\r
+        // Edit end res position of selected group\r
+        changeStartRes = true;\r
+      }\r
+    }\r
   }\r
 \r
   public void doMouseReleasedDefineMode(MouseEvent evt)\r