Make sure sequence is in mouse over alignment
[jalview.git] / src / jalview / appletgui / SeqPanel.java
index b954608..f9304cf 100755 (executable)
@@ -27,9 +27,11 @@ import java.awt.event.*;
 import jalview.commands.*;\r
 import jalview.datamodel.*;\r
 import jalview.schemes.*;\r
+import jalview.structure.SequenceListener;\r
+import jalview.structure.StructureSelectionManager;\r
 \r
 public class SeqPanel\r
-    extends Panel implements MouseMotionListener, MouseListener\r
+    extends Panel implements MouseMotionListener, MouseListener, SequenceListener\r
 {\r
 \r
   public SeqCanvas seqCanvas;\r
@@ -63,6 +65,9 @@ public class SeqPanel
 \r
   EditCommand editCommand;\r
 \r
+  StructureSelectionManager ssm;\r
+\r
+\r
   public SeqPanel(AlignViewport avp, AlignmentPanel p)\r
   {\r
     this.av = avp;\r
@@ -75,6 +80,8 @@ public class SeqPanel
 \r
     seqCanvas.addMouseMotionListener(this);\r
     seqCanvas.addMouseListener(this);\r
+    ssm = StructureSelectionManager.getStructureSelectionManager();\r
+    ssm.addStructureViewerListener(this);\r
 \r
     seqCanvas.repaint();\r
   }\r
@@ -99,13 +106,13 @@ public class SeqPanel
 \r
   void setCursorRow()\r
   {\r
-    seqCanvas.cursorY = getKeyboardNo(keyboardNo1) - 1;\r
+    seqCanvas.cursorY = getKeyboardNo1() - 1;\r
     scrollToVisible();\r
   }\r
 \r
   void setCursorColumn()\r
   {\r
-    seqCanvas.cursorX = getKeyboardNo(keyboardNo1) - 1;\r
+    seqCanvas.cursorX = getKeyboardNo1() - 1;\r
     scrollToVisible();\r
   }\r
 \r
@@ -117,8 +124,8 @@ public class SeqPanel
     }\r
     else\r
     {\r
-      seqCanvas.cursorX = getKeyboardNo(keyboardNo1) - 1;\r
-      seqCanvas.cursorY = getKeyboardNo(keyboardNo2) - 1;\r
+      seqCanvas.cursorX = getKeyboardNo1() - 1;\r
+      seqCanvas.cursorY = getKeyboardNo2() - 1;\r
       scrollToVisible();\r
     }\r
   }\r
@@ -129,7 +136,7 @@ public class SeqPanel
         (Sequence) av.getAlignment().getSequenceAt(seqCanvas.cursorY);\r
 \r
     seqCanvas.cursorX = sequence.findIndex(\r
-        getKeyboardNo(keyboardNo1) - 1\r
+        getKeyboardNo1() - 1\r
         );\r
     scrollToVisible();\r
   }\r
@@ -287,7 +294,7 @@ public class SeqPanel
       av.setSelectionGroup(sg);\r
     }\r
 \r
-    ap.repaint();\r
+    ap.paintAlignment(false);\r
   }\r
 \r
   void insertGapAtCursor(boolean group)\r
@@ -295,7 +302,7 @@ public class SeqPanel
     groupEditing = group;\r
     startseq = seqCanvas.cursorY;\r
     lastres = seqCanvas.cursorX;\r
-    editSequence(true, seqCanvas.cursorX + getKeyboardNo(keyboardNo1));\r
+    editSequence(true, seqCanvas.cursorX + getKeyboardNo1());\r
     endEditing();\r
   }\r
 \r
@@ -303,7 +310,7 @@ public class SeqPanel
   {\r
     groupEditing = group;\r
     startseq = seqCanvas.cursorY;\r
-    lastres = seqCanvas.cursorX + getKeyboardNo(keyboardNo1);\r
+    lastres = seqCanvas.cursorX + getKeyboardNo1();\r
     editSequence(false, seqCanvas.cursorX);\r
     endEditing();\r
   }\r
@@ -325,18 +332,31 @@ public class SeqPanel
     }\r
   }\r
 \r
-  int getKeyboardNo(StringBuffer kb)\r
+  int getKeyboardNo1()\r
   {\r
-    if (kb == null)\r
-    {\r
+    if (keyboardNo1 == null)\r
       return 1;\r
+    else\r
+    {\r
+      int value = Integer.parseInt(keyboardNo1.toString());\r
+      keyboardNo1 = null;\r
+      return value;\r
     }\r
+  }\r
+\r
+  int getKeyboardNo2()\r
+  {\r
+    if (keyboardNo2 == null)\r
+      return 1;\r
     else\r
     {\r
-      return Integer.parseInt(kb.toString());\r
+      int value = Integer.parseInt(keyboardNo2.toString());\r
+      keyboardNo2 = null;\r
+      return value;\r
     }\r
   }\r
 \r
+\r
   void setStatusMessage(SequenceI sequence, int res, int seq)\r
   {\r
     StringBuffer text = new StringBuffer("Sequence " + (seq + 1) + " ID: " +\r
@@ -428,12 +448,46 @@ public class SeqPanel
   }\r
 \r
   public void mouseClicked(MouseEvent evt)\r
-  {}\r
+  {\r
+    SequenceI sequence = av.alignment.getSequenceAt(findSeq(evt));\r
+    if (evt.getClickCount() > 1)\r
+    {\r
+      if (av.getSelectionGroup().getSize() == 1\r
+          && av.getSelectionGroup().getEndRes()\r
+          - av.getSelectionGroup().getStartRes() < 2)\r
+      {\r
+        av.setSelectionGroup(null);\r
+      }\r
+\r
+      SequenceFeature[] features = findFeaturesAtRes(\r
+          sequence,\r
+          sequence.findPosition(findRes(evt))\r
+          );\r
+\r
+      if (features != null && features.length > 0)\r
+      {\r
+        SearchResults highlight = new SearchResults();\r
+        highlight.addResult(sequence,\r
+                            features[0].getBegin(),\r
+                            features[0].getEnd());\r
+        seqCanvas.highlightSearchResults(highlight);\r
+      }\r
+      if (features != null && features.length > 0)\r
+      {\r
+        seqCanvas.getFeatureRenderer().amendFeatures(\r
+            new SequenceI[]\r
+            {sequence}, features, false, ap);\r
+\r
+        seqCanvas.highlightSearchResults(null);\r
+      }\r
+    }\r
+  }\r
 \r
   public void mouseReleased(MouseEvent evt)\r
   {\r
     mouseDragging = false;\r
     mouseWheelPressed = false;\r
+    ap.paintAlignment(true);\r
 \r
     if (!editingSeqs)\r
     {\r
@@ -442,7 +496,7 @@ public class SeqPanel
     }\r
 \r
     endEditing();\r
-    ap.repaint();\r
+\r
   }\r
 \r
   int startWrapBlock = -1;\r
@@ -533,6 +587,8 @@ public class SeqPanel
     return seq;\r
   }\r
 \r
+\r
+\r
   public void doMousePressed(MouseEvent evt)\r
   {\r
 \r
@@ -558,6 +614,34 @@ public class SeqPanel
     return;\r
   }\r
 \r
+\r
+  String lastMessage;\r
+  public void mouseOverSequence(SequenceI sequence, int index)\r
+  {\r
+    String tmp = sequence.hashCode()+index+"";\r
+    if (lastMessage == null || !lastMessage.equals(tmp))\r
+      ssm.mouseOverSequence(sequence, index);\r
+\r
+    lastMessage = tmp;\r
+  }\r
+\r
+\r
+  public void highlightSequence(jalview.datamodel.SequenceI seq, int index)\r
+  {\r
+    if(av.alignment.findIndex(seq)>-1)\r
+    {\r
+      SearchResults highlight = new SearchResults();\r
+      highlight.addResult(seq,index,index);\r
+      seqCanvas.highlightSearchResults(highlight);\r
+    }\r
+  }\r
+\r
+  public void updateColours(SequenceI seq, int index)\r
+  {\r
+    System.out.println("update the seqPanel colours");\r
+    //repaint();\r
+  }\r
+\r
   public void mouseMoved(MouseEvent evt)\r
   {\r
     int res = findRes(evt);\r
@@ -582,6 +666,11 @@ public class SeqPanel
       return;\r
     }\r
 \r
+\r
+    if (ssm != null)\r
+      mouseOverSequence(sequence, sequence.findPosition(res));\r
+\r
+\r
     StringBuffer text = new StringBuffer("Sequence " + (seq + 1) + " ID: " +\r
                                          sequence.getName());\r
 \r
@@ -612,11 +701,6 @@ public class SeqPanel
       }\r
     }\r
 \r
-    if (seqCanvas.pdbCanvas != null && sequence == seqCanvas.pdbCanvas.sequence)\r
-    {\r
-      seqCanvas.pdbCanvas.highlightRes(sequence.findPosition(res));\r
-    }\r
-\r
     ap.alignFrame.statusBar.setText(text.toString());\r
 \r
     StringBuffer tooltipText = new StringBuffer();\r
@@ -642,18 +726,13 @@ public class SeqPanel
     }\r
 \r
     // use aa to see if the mouse pointer is on a\r
-    if (av.showSequenceFeatures\r
-        && sequence.getSequenceFeatures() != null\r
-        && av.featuresDisplayed != null)\r
-    {\r
-\r
-      Vector allFeatures = getAllFeaturesAtRes(sequence,\r
+    SequenceFeature [] allFeatures = findFeaturesAtRes(sequence,\r
                                                sequence.findPosition(res));\r
 \r
       int index = 0;\r
-      while (index < allFeatures.size())\r
+      while (index < allFeatures.length)\r
       {\r
-        SequenceFeature sf = (SequenceFeature) allFeatures.elementAt(index);\r
+        SequenceFeature sf = allFeatures[index];\r
 \r
         tooltipText.append(sf.getType() + " " + sf.begin + ":" + sf.end);\r
 \r
@@ -674,7 +753,6 @@ public class SeqPanel
 \r
         index++;\r
       }\r
-    }\r
 \r
     if (tooltip == null)\r
     {\r
@@ -686,29 +764,35 @@ public class SeqPanel
     }\r
   }\r
 \r
-  Vector getAllFeaturesAtRes(SequenceI seq, int res)\r
+  SequenceFeature[] findFeaturesAtRes(SequenceI sequence, int res)\r
   {\r
-    Vector allFeatures = new Vector();\r
-    int index = 0;\r
-    if (seq.getSequenceFeatures() != null)\r
+    Vector tmp = new Vector();\r
+    SequenceFeature[] features = sequence.getSequenceFeatures();\r
+    if (features != null)\r
     {\r
-      while (index < seq.getSequenceFeatures().length)\r
+      for (int i = 0; i < features.length; i++)\r
       {\r
-        SequenceFeature sf = seq.getSequenceFeatures()[index];\r
-        if (sf.getBegin() <= res &&\r
-            sf.getEnd() >= res)\r
+        if (av.featuresDisplayed == null\r
+            || !av.featuresDisplayed.containsKey(features[i].getType()))\r
         {\r
-          if (av.featuresDisplayed.containsKey(sf.getType()))\r
-          {\r
-            allFeatures.addElement(sf);\r
-          }\r
+          continue;\r
+        }\r
+\r
+        if ( (features[i].getBegin() <= res) &&\r
+            (features[i].getEnd() >= res))\r
+        {\r
+          tmp.addElement(features[i]);\r
         }\r
-        index++;\r
       }\r
     }\r
-    return allFeatures;\r
+\r
+    features = new SequenceFeature[tmp.size()];\r
+    tmp.copyInto(features);\r
+\r
+    return features;\r
   }\r
 \r
+\r
   Tooltip tooltip;\r
 \r
   public void mouseDragged(MouseEvent evt)\r
@@ -764,7 +848,7 @@ public class SeqPanel
 \r
       lastMousePress = evt.getPoint();\r
 \r
-      ap.repaint();\r
+      ap.paintAlignment(false);\r
       ap.annotationPanel.image = null;\r
       return;\r
     }\r
@@ -1271,21 +1355,20 @@ public class SeqPanel
     if ( (evt.getModifiers() & InputEvent.BUTTON3_MASK) ==\r
         InputEvent.BUTTON3_MASK)\r
     {\r
-      Vector allFeatures = getAllFeaturesAtRes(sequence,\r
+      SequenceFeature [] allFeatures = findFeaturesAtRes(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
+        for (int i = 0; i < allFeatures.length; i++)\r
         {\r
-          SequenceFeature sf = (SequenceFeature) allFeatures.elementAt(i);\r
-          if (sf.links != null)\r
+          if (allFeatures[i].links != null)\r
           {\r
             links = new Vector();\r
-            for (int j = 0; j < sf.links.size(); j++)\r
+            for (int j = 0; j < allFeatures[i].links.size(); j++)\r
             {\r
-              links.addElement(sf.links.elementAt(j));\r
+              links.addElement(allFeatures[i].links.elementAt(j));\r
             }\r
           }\r
         }\r
@@ -1293,7 +1376,6 @@ public class SeqPanel
       APopupMenu popup = new APopupMenu(ap, null, links);\r
       this.add(popup);\r
       popup.show(this, evt.getX(), evt.getY());\r
-      ap.repaint();\r
       return;\r
     }\r
 \r
@@ -1371,7 +1453,7 @@ public class SeqPanel
     changeStartRes = false;\r
     stretchGroup = null;\r
     PaintRefresher.Refresh(ap, av.getSequenceSetId());\r
-    ap.repaint();\r
+    ap.paintAlignment(true);\r
   }\r
 \r
   public void doMouseDraggedDefineMode(MouseEvent evt)\r