SequenceFeature display added
[jalview.git] / src / jalview / gui / SeqPanel.java
index b76873a..cc16a26 100755 (executable)
@@ -4,6 +4,7 @@ import java.awt.*;
 import java.awt.event.*;\r
 import jalview.datamodel.*;\r
 import javax.swing.*;\r
+import java.util.*;\r
 import jalview.schemes.*;\r
 import jalview.analysis.*;\r
 \r
@@ -12,7 +13,7 @@ public class SeqPanel extends JPanel
 {\r
 \r
   public    SeqCanvas         seqCanvas;\r
-  public    AlignmentPanel    parent;\r
+  public    AlignmentPanel    ap;\r
 \r
   protected int startres;\r
   protected int lastres;\r
@@ -33,16 +34,21 @@ public class SeqPanel extends JPanel
     setLayout(new BorderLayout());\r
     add(seqCanvas, BorderLayout.CENTER);\r
 \r
-    parent = p;\r
+    ap = p;\r
 \r
     addMouseMotionListener( new MouseMotionAdapter()\r
     {\r
       public void mouseMoved(MouseEvent evt)\r
-      {   doMouseMoved(evt);    }\r
+      {\r
+       if(av.getWrapAlignment())\r
+         return;\r
+        doMouseMoved(evt);    }\r
 \r
       public void mouseDragged(MouseEvent evt)\r
       {\r
-        if(evt.isShiftDown() || evt.isAltDown())\r
+        if(av.getWrapAlignment())\r
+         return;\r
+        if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown())\r
           doMouseDragged(evt);\r
         else\r
           doMouseDraggedDefineMode(evt);\r
@@ -53,14 +59,18 @@ public class SeqPanel extends JPanel
     {\r
       public void mouseReleased(MouseEvent evt)\r
       {\r
-        if(evt.isShiftDown() || evt.isAltDown())\r
+        if(av.getWrapAlignment())\r
+         return;\r
+        if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown())\r
           doMouseReleased(evt);\r
         else\r
           doMouseReleasedDefineMode(evt);\r
       }\r
       public void mousePressed(MouseEvent evt)\r
       {\r
-        if(evt.isShiftDown() || evt.isAltDown())\r
+        if(av.getWrapAlignment())\r
+         return;\r
+        if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown())\r
           doMousePressed(evt);\r
         else\r
           doMousePressedDefineMode(evt);\r
@@ -86,13 +96,13 @@ public class SeqPanel extends JPanel
 \r
     seqEditOccurred = -1;\r
 \r
-    parent.RefreshPanels();\r
+    ap.RefreshPanels();\r
     repaint();\r
 \r
   }\r
 \r
   public void doMousePressed(MouseEvent evt) {\r
-    parent.alignFrame.addHistoryItem("sequence edit");\r
+    ap.alignFrame.addHistoryItem("sequence edit");\r
     int seq;\r
     int res;\r
 \r
@@ -159,16 +169,39 @@ public class SeqPanel extends JPanel
     if(seq>=av.getAlignment().getHeight())\r
       return;\r
 \r
-    Object obj = ResidueProperties.aa2Triplet.get( av.getAlignment().getSequenceAt(seq).getCharAt(res)+"" ) ;\r
+    SequenceI sequence = av.getAlignment().getSequenceAt(seq);\r
+    Object obj = ResidueProperties.aa2Triplet.get( sequence.getCharAt(res)+"" ) ;\r
     String aa = "";\r
     if(obj!=null)\r
          aa = obj.toString();\r
 \r
-    StringBuffer text = new StringBuffer("Sequence " +(seq+1)+" ID: "+av.getAlignment().getSequenceAt(seq).getName());\r
+    StringBuffer text = new StringBuffer("Sequence " +(seq+1)+" ID: "+sequence.getName());\r
     if(aa!="")\r
       text.append("  Residue: "+aa+" ("+  av.getAlignment().getSequenceAt(seq).findPosition(res)+")");\r
 \r
-    parent.alignFrame.statusBar.setText(text.toString());\r
+    ap.alignFrame.statusBar.setText(text.toString());\r
+\r
+    if(av.showSequenceFeatures)\r
+    {\r
+      Vector features = sequence.getSequenceFeatures();\r
+      Enumeration e = features.elements();\r
+      StringBuffer sbuffer = new StringBuffer();\r
+\r
+      this.setToolTipText(null);\r
+      while (e.hasMoreElements())\r
+      {\r
+        SequenceFeature sf = (SequenceFeature) e.nextElement();\r
+        if (sf.getStart() <= sequence.findPosition(res) &&\r
+            sf.getEnd() >= sequence.findPosition(res))\r
+        {\r
+          sbuffer.append(sf.getType() + " " + sf.getDescription());\r
+          ToolTipManager.sharedInstance().registerComponent(this);\r
+          this.setToolTipText(sbuffer.toString());\r
+        }\r
+\r
+      }\r
+    }\r
+\r
 \r
   }\r
 \r
@@ -184,7 +217,7 @@ public class SeqPanel extends JPanel
     if (res != lastres)\r
     {\r
        // Group editing\r
-       if (evt.isAltDown())\r
+       if (evt.isAltDown() || evt.isControlDown())\r
         {\r
          SequenceGroup sg = av.getAlignment().findGroup(startseq);\r
           if (sg != null)\r
@@ -208,10 +241,20 @@ public class SeqPanel extends JPanel
 \r
                 if(!deleteAllowed && allGaps)\r
                   deleteAllowed = true;\r
-\r
               }\r
             }\r
 \r
+            // drag to right\r
+            if (res < av.getAlignment().getWidth() && res > lastres)\r
+                sg.setEndRes(sg.getEndRes() + 1);\r
+\r
+            // drag to left\r
+            else if (deleteAllowed && res < av.getAlignment().getWidth() &&\r
+                     res < lastres)\r
+                sg.setEndRes(sg.getEndRes() - 1);\r
+\r
+\r
+\r
 \r
             for (int i = 0; i < sg.getSize(); i++)\r
             {\r
@@ -316,13 +359,31 @@ public class SeqPanel extends JPanel
     stretchGroup = av.getRubberbandGroup();\r
 \r
     if(stretchGroup == null)\r
-        stretchGroup = av.alignment.findGroup((Sequence)av.getAlignment().getSequenceAt(seq));\r
+     {\r
+       stretchGroup = av.alignment.findGroup( (Sequence) av.getAlignment().\r
+                                             getSequenceAt(seq));\r
+       av.setRubberbandGroup( stretchGroup );\r
+     }\r
 \r
     else if(!stretchGroup.sequences.contains((Sequence)av.getAlignment().getSequenceAt(seq))\r
             || stretchGroup.getStartRes()>res\r
             || stretchGroup.getEndRes()<res)\r
      {\r
        stretchGroup = null;\r
+\r
+       SequenceGroup[] allGroups = av.alignment.findAllGroups( (Sequence) av.\r
+           getAlignment().\r
+           getSequenceAt(seq));\r
+\r
+       if (allGroups != null)\r
+         for (int i = 0; i < allGroups.length; i++)\r
+           if (allGroups[i].getStartRes() <= res &&\r
+               allGroups[i].getEndRes() >= res)\r
+           {\r
+             stretchGroup = allGroups[i];\r
+             av.setRubberbandGroup(stretchGroup);\r
+             break;\r
+           }\r
      }\r
 \r
     if(stretchGroup==null)\r
@@ -334,10 +395,21 @@ public class SeqPanel extends JPanel
       sg.addSequence( (Sequence)av.getAlignment().getSequenceAt(seq) );\r
       av.setRubberbandGroup( sg );\r
       stretchGroup = sg;\r
+\r
+      if(av.getConservationSelected())\r
+        Desktop.setConservationSliderSource(ap, av.getGlobalColourScheme(), "Background");\r
+      else if(av.getGlobalColourScheme()!=null && av.getGlobalColourScheme().canThreshold())\r
+      {\r
+        ResidueColourScheme rcs = (ResidueColourScheme) av.getGlobalColourScheme();\r
+        int threshold = rcs.getThreshold();\r
+        if (threshold > 0)\r
+          Desktop.setPIDSliderSource(ap, av.getGlobalColourScheme(), "Background");\r
+      }\r
+\r
     }\r
     else if( javax.swing.SwingUtilities.isRightMouseButton(evt))\r
     {\r
-        jalview.gui.PopupMenu pop = new jalview.gui.PopupMenu( parent , null);\r
+        jalview.gui.PopupMenu pop = new jalview.gui.PopupMenu( ap , null);\r
         pop.show(this, evt.getX(), evt.getY());\r
 \r
     // edit the properties of existing group\r
@@ -355,7 +427,6 @@ public class SeqPanel extends JPanel
     seqCanvas.paintFlag = true;\r
     repaint();\r
 \r
-\r
   }\r
 \r
   boolean changeEndSeq = false;\r
@@ -366,6 +437,47 @@ public class SeqPanel extends JPanel
 \r
   public void doMouseReleasedDefineMode(MouseEvent evt)\r
   {\r
+\r
+    if(stretchGroup.cs instanceof ClustalxColourScheme)\r
+    {\r
+      stretchGroup.cs = new ClustalxColourScheme(stretchGroup.sequences, av.alignment.getWidth());\r
+      seqCanvas.paintFlag = true;\r
+      repaint();\r
+    }\r
+\r
+    else if(stretchGroup.cs instanceof ConservationColourScheme)\r
+    {\r
+      ConservationColourScheme ccs = (ConservationColourScheme)stretchGroup.cs;\r
+\r
+      Conservation c = new Conservation("Group",\r
+                                        ResidueProperties.propHash, 3, stretchGroup.sequences, 0,\r
+                                        av.alignment.getWidth() );\r
+\r
+       c.calculate();\r
+       c.verdict(false, 100);\r
+       ccs = new ConservationColourScheme(c, ccs.cs);\r
+\r
+       stretchGroup.cs = ccs;\r
+\r
+\r
+       Desktop.setConservationSliderSource(ap, stretchGroup.cs, stretchGroup.getName()) ;\r
+\r
+       seqCanvas.paintFlag = true;\r
+       repaint();\r
+    }\r
+    else\r
+    {\r
+      if(stretchGroup.cs !=null && stretchGroup.cs.canThreshold())\r
+      {\r
+        ResidueColourScheme rcs =  (ResidueColourScheme) stretchGroup.cs;\r
+        int threshold = rcs.getThreshold();\r
+        if(threshold>0)\r
+          Desktop.setPIDSliderSource(ap, stretchGroup.cs, stretchGroup.getName());\r
+      }\r
+\r
+    }\r
+\r
+\r
     changeEndRes = false;\r
     changeStartRes = false;\r
     stretchGroup = null;\r
@@ -384,7 +496,7 @@ public class SeqPanel extends JPanel
       changeEndRes = true;\r
 \r
     else if(stretchGroup.getStartRes()==res)\r
-      // Edit end res position of selected group\r
+      // Edit start res position of selected group\r
       changeStartRes = true;\r
 \r
 \r