sequences are private in SequenceGroup
[jalview.git] / src / jalview / appletgui / SeqPanel.java
index 55bc65a..6869964 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
@@ -55,6 +57,9 @@ public class SeqPanel
   StringBuffer keyboardNo1;\r
   StringBuffer keyboardNo2;\r
 \r
+  boolean mouseWheelPressed = false;\r
+  Point lastMousePress;\r
+\r
   public SeqPanel(AlignViewport avp, AlignmentPanel p)\r
   {\r
     this.av = avp;\r
@@ -140,26 +145,32 @@ public class SeqPanel
 \r
 \r
      endEditing();\r
-     while (seqCanvas.cursorY < av.startSeq)\r
-     {\r
-       ap.scrollUp(true);\r
-     }\r
-     while (seqCanvas.cursorY + 1 > av.endSeq)\r
+     if (av.wrapAlignment)\r
      {\r
-       ap.scrollUp(false);\r
+       ap.scrollToWrappedVisible(seqCanvas.cursorX);\r
      }\r
-     while (seqCanvas.cursorX < av.startRes)\r
+     else\r
      {\r
+       while (seqCanvas.cursorY < av.startSeq)\r
+       {\r
+         ap.scrollUp(true);\r
+       }\r
+       while (seqCanvas.cursorY + 1 > av.endSeq)\r
+       {\r
+         ap.scrollUp(false);\r
+       }\r
+       while (seqCanvas.cursorX < av.startRes)\r
+       {\r
 \r
-       if(!ap.scrollRight(false))\r
-         break;\r
-     }\r
-     while (seqCanvas.cursorX > av.endRes)\r
-     {\r
-       if(!ap.scrollRight(true))\r
-         break;\r
+         if (!ap.scrollRight(false))\r
+           break;\r
+       }\r
+       while (seqCanvas.cursorX > av.endRes)\r
+       {\r
+         if (!ap.scrollRight(true))\r
+           break;\r
+       }\r
      }\r
-\r
      setStatusMessage(av.alignment.getSequenceAt(seqCanvas.cursorY),\r
                       seqCanvas.cursorX, seqCanvas.cursorY);\r
 \r
@@ -176,7 +187,7 @@ public class SeqPanel
        SequenceGroup sg = av.selectionGroup;\r
        //Find the top and bottom of this group\r
        int min = av.alignment.getHeight(), max = 0;\r
-       for(int i=0; i<sg.getSize(); i++)\r
+       for(int i=0; i<sg.getSize(false); i++)\r
        {\r
          int index = av.alignment.findIndex( sg.getSequenceAt(i) );\r
          if(index > max)\r
@@ -212,7 +223,7 @@ public class SeqPanel
        else\r
        {\r
          // Now add any sequences between min and max\r
-         sg.sequences.removeAllElements();\r
+         sg.getSequences(false).removeAllElements();\r
          for (int i = min; i < max; i++)\r
          {\r
            sg.addSequence(av.alignment.getSequenceAt(i), false);\r
@@ -303,11 +314,21 @@ public class SeqPanel
                      ")");\r
        }\r
      }\r
+\r
      ap.alignFrame.statusBar.setText(text.toString());\r
 \r
     }\r
      public void mousePressed(MouseEvent evt)\r
      {\r
+       lastMousePress = evt.getPoint();\r
+\r
+       if ( (evt.getModifiers() & InputEvent.BUTTON2_MASK) ==\r
+         InputEvent.BUTTON2_MASK)\r
+       {\r
+         mouseWheelPressed = true;\r
+         return;\r
+       }\r
+\r
        if (evt.isShiftDown() || evt.isAltDown() ||\r
            evt.isControlDown())\r
        {\r
@@ -354,6 +375,7 @@ public class SeqPanel
   public void mouseReleased(MouseEvent evt)\r
   {\r
     mouseDragging = false;\r
+    mouseWheelPressed = false;\r
 \r
     if (!editingSeqs)\r
     {\r
@@ -364,7 +386,7 @@ public class SeqPanel
      editOccurred();\r
 \r
      endEditing();\r
-       ap.repaint();\r
+     ap.repaint();\r
   }\r
 \r
   int startWrapBlock=-1;\r
@@ -516,55 +538,133 @@ 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
-\r
-          if(first)\r
-          {\r
-            text.append(" Sequence Feature:");\r
-            first = false;\r
-          }\r
+        SequenceFeature sf = (SequenceFeature) allFeatures.elementAt(index);\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.getValue("status") != null )\r
+        {\r
+          featureText.append(" (" + sf.getValue("status") + ")");\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 (!editingSeqs)\r
-{\r
-  doMouseDraggedDefineMode(evt);\r
-  return;\r
-}\r
+    if (mouseWheelPressed)\r
+    {\r
+      int oldWidth = av.charWidth;\r
+\r
+      //Which is bigger, left-right or up-down?\r
+      if (Math.abs(evt.getY() - lastMousePress.y)\r
+          > Math.abs(evt.getX() - lastMousePress.x))\r
+      {\r
+        int fontSize = av.font.getSize();\r
+\r
+        if (evt.getY() < lastMousePress.y && av.charHeight > 1)\r
+        {\r
+          fontSize--;\r
+        }\r
+        else if (evt.getY() > lastMousePress.y)\r
+        {\r
+          fontSize++;\r
+        }\r
+\r
+\r
+        if(fontSize<1)\r
+          fontSize = 1;\r
+\r
+        av.setFont(new Font(av.font.getName(), av.font.getStyle(), fontSize));\r
+        av.charWidth = oldWidth;\r
+      }\r
+      else\r
+      {\r
+        if (evt.getX() < lastMousePress.x && av.charWidth > 1)\r
+        {\r
+          av.charWidth--;\r
+        }\r
+        else if (evt.getX() > lastMousePress.x)\r
+        {\r
+          av.charWidth++;\r
+        }\r
+\r
+        if(av.charWidth<1)\r
+        {\r
+          av.charWidth = 1;\r
+        }\r
+      }\r
+\r
+      ap.fontChanged();\r
+\r
+      FontMetrics fm = getFontMetrics(av.getFont());\r
+      av.validCharWidth = fm.charWidth('M') <= av.charWidth;\r
+\r
+      lastMousePress = evt.getPoint();\r
+\r
+      ap.repaint();\r
+      ap.annotationPanel.image = null;\r
+      return;\r
+      }\r
+\r
+      if (!editingSeqs)\r
+      {\r
+        doMouseDraggedDefineMode(evt);\r
+        return;\r
+      }\r
 \r
   int res = findRes(evt);\r
 \r
@@ -620,7 +720,7 @@ public class SeqPanel
 \r
         //Are we editing within a selection group?\r
         if (groupEditing\r
-            || (sg != null && sg.sequences.contains(seq)))\r
+            || (sg != null && sg.getSequences(false).contains(seq)))\r
         {\r
           fixedColumns = true;\r
 \r
@@ -671,7 +771,7 @@ public class SeqPanel
                  fixedRight--)\r
             {\r
               blank = true;\r
-              for (int s = 0; s < sg.getSize(); s++)\r
+              for (int s = 0; s < sg.getSize(false); s++)\r
               {\r
                 seq = sg.getSequenceAt(s);\r
                 for (int j = 0; j < startres - lastres; j++)\r
@@ -690,7 +790,7 @@ public class SeqPanel
 \r
             if (!blank)\r
             {\r
-              if(sg.getSize() == av.alignment.getHeight())\r
+              if(sg.getSize(false) == av.alignment.getHeight())\r
               {\r
                 //We can still insert gaps if the selectionGroup\r
                 //contains all the sequences\r
@@ -712,7 +812,7 @@ public class SeqPanel
             /// Are we able to delete?\r
             // ie are all columns blank?\r
 \r
-            for (int s = 0; s < sg.getSize(); s++)\r
+            for (int s = 0; s < sg.getSize(false); s++)\r
             {\r
               seq = sg.getSequenceAt(s);\r
 \r
@@ -735,7 +835,7 @@ public class SeqPanel
           }\r
 \r
 \r
-          for (int i = 0; i < sg.getSize(); i++)\r
+          for (int i = 0; i < sg.getSize(false); i++)\r
           {\r
             seq = sg.getSequenceAt(i);\r
 \r
@@ -919,6 +1019,8 @@ public class SeqPanel
 //////////////////////////////////////////\r
   public void doMousePressedDefineMode(MouseEvent evt)\r
   {\r
+\r
+\r
     if (scrollThread != null)\r
     {\r
       scrollThread.running = false;\r
@@ -956,7 +1058,7 @@ public class SeqPanel
       }\r
     }\r
 \r
-    else if (!stretchGroup.sequences.contains(sequence)\r
+    else if (!stretchGroup.getSequences(false).contains(sequence)\r
              || stretchGroup.getStartRes() > res\r
              || stretchGroup.getEndRes() < res)\r
     {\r
@@ -972,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
@@ -1036,8 +1171,8 @@ public class SeqPanel
     {\r
       if (stretchGroup.cs instanceof ClustalxColourScheme)\r
       {\r
-        ( (ClustalxColourScheme) stretchGroup.cs).resetClustalX(stretchGroup.\r
-            sequences,\r
+        ( (ClustalxColourScheme) stretchGroup.cs).resetClustalX(\r
+            stretchGroup.getSequences(true),\r
             stretchGroup.getWidth());\r
       }\r
 \r
@@ -1140,7 +1275,7 @@ public class SeqPanel
 \r
           Sequence nextSeq = (Sequence) av.getAlignment().getSequenceAt(oldSeq);\r
 \r
-          if (stretchGroup.sequences.contains(nextSeq))\r
+          if (stretchGroup.getSequences(false).contains(nextSeq))\r
           {\r
               stretchGroup.deleteSequence(seq, false);\r
           }\r