Edit and annotate wrapped alignment
[jalview.git] / src / jalview / gui / SeqPanel.java
index db120e1..444b6bb 100755 (executable)
@@ -69,6 +69,8 @@ public class SeqPanel extends JPanel
     SequenceGroup stretchGroup = null;\r
     boolean remove = false;\r
 \r
+    boolean mouseWheelPressed = false;\r
+\r
     /**\r
      * Creates a new SeqPanel object.\r
      *\r
@@ -93,21 +95,11 @@ public class SeqPanel extends JPanel
             {\r
                 public void mouseMoved(MouseEvent evt)\r
                 {\r
-                    if (av.getWrapAlignment())\r
-                    {\r
-                        return;\r
-                    }\r
-\r
                     doMouseMoved(evt);\r
                 }\r
 \r
                 public void mouseDragged(MouseEvent evt)\r
                 {\r
-                    if (av.getWrapAlignment())\r
-                    {\r
-                        return;\r
-                    }\r
-\r
                     if (editingSeqs)\r
                     {\r
                         doMouseDragged(evt);\r
@@ -119,14 +111,40 @@ public class SeqPanel extends JPanel
                 }\r
             });\r
 \r
+       addMouseWheelListener(new MouseWheelListener()\r
+       {\r
+         public void mouseWheelMoved(MouseWheelEvent e)\r
+         {\r
+\r
+           if (mouseWheelPressed)\r
+           {\r
+             Font font = av.getFont();\r
+             int fontSize = font.getSize();\r
+             if (e.getWheelRotation() > 0 && fontSize < 30)\r
+               fontSize++;\r
+             else if (fontSize > 1)\r
+               fontSize--;\r
+\r
+             av.setFont(new Font(font.getName(), font.getStyle(), fontSize));\r
+             ap.fontChanged();\r
+           }\r
+           else\r
+           {\r
+             if (e.getWheelRotation() > 0)\r
+               ap.scrollUp(false);\r
+             else\r
+               ap.scrollUp(true);\r
+           }\r
+\r
+         }\r
+       });\r
+\r
+\r
         addMouseListener(new MouseAdapter()\r
             {\r
                 public void mouseReleased(MouseEvent evt)\r
                 {\r
-                    if (av.getWrapAlignment())\r
-                    {\r
-                        return;\r
-                    }\r
+                    mouseWheelPressed = false;\r
 \r
                     if (editingSeqs)\r
                     {\r
@@ -140,10 +158,11 @@ public class SeqPanel extends JPanel
 \r
                 public void mousePressed(MouseEvent evt)\r
                 {\r
-                    if (av.getWrapAlignment())\r
-                    {\r
-                        return;\r
-                    }\r
+                  if( javax.swing.SwingUtilities.isMiddleMouseButton(evt))\r
+                  {\r
+                    mouseWheelPressed = true;\r
+                    return;\r
+                  }\r
 \r
                     if (evt.isShiftDown() || evt.isAltDown() ||\r
                             evt.isControlDown())\r
@@ -164,26 +183,73 @@ public class SeqPanel extends JPanel
 \r
                 public void mouseExited(MouseEvent evt)\r
                 {\r
-                    if (av.getWrapAlignment() || editingSeqs)\r
-                    {\r
-                        return;\r
-                    }\r
+                  if (editingSeqs)\r
+                  {\r
+                    return;\r
+                  }\r
 \r
-                    doMouseExitedDefineMode(evt);\r
+                  doMouseExitedDefineMode(evt);\r
                 }\r
 \r
                 public void mouseEntered(MouseEvent evt)\r
                 {\r
-                    if (av.getWrapAlignment() || editingSeqs)\r
-                    {\r
-                        return;\r
-                    }\r
+                  if (editingSeqs)\r
+                  {\r
+                    return;\r
+                  }\r
 \r
                     doMouseEnteredDefineMode(evt);\r
                 }\r
             });\r
     }\r
 \r
+    int findRes(MouseEvent evt)\r
+   {\r
+     int res = 0;\r
+     int x = evt.getX();\r
+\r
+    if (av.wrapAlignment)\r
+    {\r
+        int y = evt.getY();\r
+        y -= (2 * av.charHeight);\r
+        x -= seqCanvas.LABEL_WEST;\r
+\r
+        int chunkHeight = (av.getAlignment().getHeight() + 2) * av.charHeight;\r
+        int cwidth = seqCanvas.getWrappedCanvasWidth(this.getWidth());\r
+        int block = y/chunkHeight;\r
+        block += av.getStartRes()/cwidth;\r
+\r
+        res = block*cwidth   +   x / av.getCharWidth();\r
+    }\r
+    else\r
+    {\r
+        res = (x / av.getCharWidth()) + av.getStartRes();\r
+    }\r
+\r
+    return res;\r
+\r
+   }\r
+\r
+   int findSeq(MouseEvent evt)\r
+   {\r
+     int seq = 0;\r
+     int y = evt.getY();\r
+\r
+     if (av.wrapAlignment)\r
+     {\r
+       y -= (2 * av.charHeight);\r
+       int chunkHeight = (av.getAlignment().getHeight() + 2) * av.charHeight;\r
+       seq = ( (y % chunkHeight) / av.getCharHeight());\r
+     }\r
+     else\r
+     {\r
+       seq = (y / av.getCharHeight()) + av.getStartSeq();\r
+     }\r
+\r
+     return seq;\r
+   }\r
+\r
+\r
     /**\r
      * DOCUMENT ME!\r
      *\r
@@ -212,17 +278,11 @@ public class SeqPanel extends JPanel
      */\r
     public void doMousePressed(MouseEvent evt)\r
     {\r
-        ap.alignFrame.addHistoryItem(new HistoryItem("Edit Sequence",\r
-                av.alignment, HistoryItem.EDIT));\r
-\r
-        int seq;\r
-        int res;\r
-\r
-        int x = evt.getX();\r
-        int y = evt.getY();\r
+      ap.alignFrame.addHistoryItem(new HistoryItem("Edit Sequence",\r
+                                                   av.alignment, HistoryItem.EDIT));\r
 \r
-        res = (x / av.getCharWidth()) + av.getStartRes();\r
-        seq = (y / av.getCharHeight()) + av.getStartSeq();\r
+      int seq = findSeq(evt);\r
+      int res = findRes(evt);\r
 \r
         if ((seq < av.getAlignment().getHeight()) &&\r
                 (res < av.getAlignment().getSequenceAt(seq).getLength()))\r
@@ -249,39 +309,17 @@ public class SeqPanel extends JPanel
      */\r
     public void doMouseMoved(MouseEvent evt)\r
     {\r
-        int res = 0;\r
-        int seq = 0;\r
-        int x = evt.getX();\r
-        int y = evt.getY();\r
-\r
-        if (av.wrapAlignment)\r
-        {\r
-            y -= (2 * av.charHeight);\r
-\r
-            int chunkHeight = (av.getAlignment().getHeight() + 2) * av.charHeight;\r
+      int res = findRes(evt);\r
+      int seq = findSeq(evt);\r
 \r
-            res = (int) ((y / chunkHeight) * (getWidth() / av.charWidth)) +\r
-                (x / av.getCharWidth()) + av.getStartRes();\r
-\r
-            y %= chunkHeight;\r
-            seq = (y / av.getCharHeight()) + av.getStartSeq();\r
-        }\r
-        else\r
-        {\r
-            res = (x / av.getCharWidth()) + av.getStartRes();\r
-            seq = (y / av.getCharHeight()) + av.getStartSeq();\r
-        }\r
-\r
-        if (seq >= av.getAlignment().getHeight())\r
-        {\r
+      if(res<0 || seq<0 || seq >= av.getAlignment().getHeight())\r
             return;\r
-        }\r
 \r
-        SequenceI sequence = av.getAlignment().getSequenceAt(seq);\r
+      SequenceI sequence = av.getAlignment().getSequenceAt(seq);\r
 \r
-        if (res > sequence.getLength())\r
-        {\r
-            return;\r
+      if (res > sequence.getLength())\r
+      {\r
+          return;\r
         }\r
 \r
         Object obj = ResidueProperties.aa2Triplet.get(sequence.getCharAt(res) +\r
@@ -344,7 +382,7 @@ public class SeqPanel extends JPanel
     public void doMouseDragged(MouseEvent evt)\r
     {\r
         // If we're dragging we're editing\r
-        int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();\r
+        int res = findRes(evt);\r
 \r
         if (res < 0)\r
         {\r
@@ -536,52 +574,102 @@ public class SeqPanel extends JPanel
      */\r
     void editOccurred(int i)\r
     {\r
-        if (endEdit == startEdit)\r
-        {\r
-            ap.alignFrame.historyList.pop();\r
-            ap.alignFrame.updateEditMenuBar();\r
-        }\r
-\r
-        av.updateConservation();\r
-        av.updateConsensus();\r
+      if (endEdit == startEdit)\r
+      {\r
+        ap.alignFrame.historyList.pop();\r
+        ap.alignFrame.updateEditMenuBar();\r
+      }\r
+\r
+      av.updateConservation();\r
+      av.updateConsensus();\r
+\r
+      //Does the edit affect any groups?\r
+      //////////////////////////////\r
+      Vector groupsToUpdate = new Vector();\r
+      SequenceGroup sg = av.getSelectionGroup();\r
+\r
+      int s, g, gSize = av.alignment.getGroups().size();\r
+      if (sg != null)\r
+      {\r
+        groupsToUpdate.addElement(av.getSelectionGroup());\r
+        int sSize = sg.getSize();\r
+        for (s = 0; s < sSize; s++)\r
+        {\r
+          SequenceI seq = sg.getSequenceAt(s);\r
+\r
+          for (g = 0; g < gSize; g++)\r
+          {\r
+            SequenceGroup sg2 = (SequenceGroup) av.alignment.getGroups().\r
+                elementAt(\r
+                    g);\r
+            if (sg2.sequences.contains(seq))\r
+            {\r
+              if (!groupsToUpdate.contains(sg2))\r
+                groupsToUpdate.addElement(sg2);\r
+              continue;\r
+            }\r
+          }\r
+        }\r
+      }\r
+      else\r
+      {\r
+        SequenceI seq = av.alignment.getSequenceAt(startseq);\r
+        for (g = 0; g < gSize; g++)\r
+        {\r
+          SequenceGroup sg2 = (SequenceGroup) av.alignment.getGroups().elementAt(\r
+              g);\r
+          if (sg2.sequences.contains(seq))\r
+          {\r
+            if (!groupsToUpdate.contains(sg2))\r
+              groupsToUpdate.addElement(sg2);\r
+            continue;\r
+          }\r
+        }\r
+      }\r
+\r
+      gSize = groupsToUpdate.size();\r
+      for (g = 0; g < gSize; g++)\r
+      {\r
+        ( (SequenceGroup) groupsToUpdate.elementAt(g)).recalcConservation();\r
+      }\r
+      ////End of updating groups\r
+      //////////////////////////////////////////\r
 \r
         // Y O Y CLUSTALX\r
         ColourSchemeI cs = av.getGlobalColourScheme();\r
-\r
-        if (av.getSelectionGroup() != null)\r
+        if(cs!=null)\r
         {\r
-            av.getSelectionGroup().recalcConservation();\r
-        }\r
-\r
-        if (cs instanceof ConservationColourScheme)\r
-        {\r
-            ConservationColourScheme ccs = (ConservationColourScheme) cs;\r
+          if (cs.conservationApplied())\r
+          {\r
             Conservation c = new Conservation("All",\r
-                    ResidueProperties.propHash, 3, av.alignment.getSequences(),\r
-                    0, av.alignment.getWidth() - 1);\r
+                                              ResidueProperties.propHash, 3,\r
+                                              av.alignment.getSequences(),\r
+                                              0, av.alignment.getWidth() - 1);\r
             c.calculate();\r
             c.verdict(false, av.ConsPercGaps);\r
 \r
-            if (ccs.cs instanceof ClustalxColourScheme)\r
+            if (cs instanceof ClustalxColourScheme)\r
             {\r
-                ClustalxColourScheme cxs = (ClustalxColourScheme) ccs.cs;\r
-                cxs.resetClustalX(av.alignment.getSequences(),\r
-                    av.alignment.getWidth());\r
-                ccs = new ConservationColourScheme(c, cxs);\r
-                av.setGlobalColourScheme(ccs);\r
+              ClustalxColourScheme cxs = (ClustalxColourScheme) cs;\r
+              cxs.resetClustalX(av.alignment.getSequences(),\r
+                                av.alignment.getWidth());\r
+              cs.setConservation(c);\r
+              av.setGlobalColourScheme(cs);\r
             }\r
             else\r
             {\r
-                ccs = new ConservationColourScheme(c, ccs.cs);\r
-                av.setGlobalColourScheme(ccs);\r
+              cs.setConservation(c);\r
+              av.setGlobalColourScheme(cs);\r
             }\r
-        }\r
 \r
-        if (cs instanceof ClustalxColourScheme)\r
-        {\r
-            ((ClustalxColourScheme) cs).resetClustalX(av.alignment.getSequences(),\r
-                av.alignment.getWidth());\r
+          }\r
+\r
+          if (cs instanceof ClustalxColourScheme)\r
+          {\r
+            ( (ClustalxColourScheme) cs).resetClustalX(av.alignment.getSequences(),\r
+                                                       av.alignment.getWidth());\r
             av.setGlobalColourScheme(cs);\r
+          }\r
         }\r
     }\r
 \r
@@ -592,9 +680,9 @@ public class SeqPanel extends JPanel
      */\r
     public void doMousePressedDefineMode(MouseEvent evt)\r
     {\r
-        int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();\r
-        int seq = (evt.getY() / av.getCharHeight()) + av.getStartSeq();\r
-        oldSeq = seq;\r
+      int res = findRes(evt);\r
+      int seq = findSeq(evt);\r
+      oldSeq = seq;\r
 \r
         SequenceI sequence = (Sequence) av.getAlignment().getSequenceAt(seq);\r
 \r
@@ -707,25 +795,26 @@ public class SeqPanel extends JPanel
             return;\r
         }\r
 \r
-        if (stretchGroup.cs instanceof ClustalxColourScheme)\r
+        if(stretchGroup.cs!=null)\r
         {\r
-            ((ClustalxColourScheme) stretchGroup.cs).resetClustalX(stretchGroup.sequences,\r
+          if (stretchGroup.cs instanceof ClustalxColourScheme)\r
+          {\r
+            ( (ClustalxColourScheme) stretchGroup.cs).resetClustalX(stretchGroup.\r
+                sequences,\r
                 stretchGroup.getWidth());\r
-        }\r
+          }\r
 \r
-        if (stretchGroup.cs instanceof ConservationColourScheme)\r
-        {\r
-            ConservationColourScheme ccs = (ConservationColourScheme) stretchGroup.cs;\r
-            stretchGroup.cs = ccs;\r
+          if (stretchGroup.cs.conservationApplied())\r
+          {\r
             SliderPanel.setConservationSlider(ap, stretchGroup.cs,\r
-                stretchGroup.getName());\r
-        }\r
-        else\r
-        {\r
+                                              stretchGroup.getName());\r
+          }\r
+          else\r
+          {\r
             SliderPanel.setPIDSliderSource(ap, stretchGroup.cs,\r
-                stretchGroup.getName());\r
+                                           stretchGroup.getName());\r
+          }\r
         }\r
-\r
         changeEndRes = false;\r
         changeStartRes = false;\r
         stretchGroup = null;\r
@@ -739,11 +828,11 @@ public class SeqPanel extends JPanel
      */\r
     public void doMouseDraggedDefineMode(MouseEvent evt)\r
     {\r
-        int res = (evt.getX() / av.getCharWidth()) + av.getStartRes();\r
-        int y = (evt.getY() / av.getCharHeight()) + av.getStartSeq();\r
+      int res = findRes(evt);\r
+      int y = findSeq(evt);\r
 \r
-        if (stretchGroup == null)\r
-        {\r
+      if (stretchGroup == null)\r
+      {\r
             return;\r
         }\r
 \r
@@ -767,7 +856,7 @@ public class SeqPanel extends JPanel
         {\r
             res = av.getStartRes();\r
         }\r
-        else if (res > av.getEndRes())\r
+        else if (res > av.getEndRes() && !av.getWrapAlignment())\r
         {\r
             res = av.getEndRes();\r
         }\r