all colours can threshold
[jalview.git] / src / jalview / appletgui / SeqPanel.java
index 46535b1..1a6853b 100755 (executable)
@@ -13,12 +13,10 @@ public class SeqPanel extends Panel
   public    SeqCanvas         seqCanvas;\r
   public    AlignmentPanel    ap;\r
 \r
-  protected int startres;\r
   protected int lastres;\r
-  protected int endres;\r
-\r
   protected int startseq;\r
-  protected int padseq;\r
+  int startEdit=-1;\r
+  int endEdit=-1;\r
 \r
   protected AlignViewport av;\r
 \r
@@ -28,6 +26,10 @@ public class SeqPanel extends Panel
   ScrollThread scrollThread = null;\r
   boolean mouseDragging = false;\r
 \r
+  boolean editingSeqs = false;\r
+  boolean groupEditing = false;\r
+\r
+\r
 \r
   public SeqPanel(AlignViewport avp, AlignmentPanel p) {\r
     this.av         = avp;\r
@@ -50,7 +52,7 @@ public class SeqPanel extends Panel
       {\r
         if(av.getWrapAlignment())\r
          return;\r
-        if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown())\r
+        if( editingSeqs )\r
           doMouseDragged(evt);\r
         else\r
           doMouseDraggedDefineMode(evt);\r
@@ -63,32 +65,37 @@ public class SeqPanel extends Panel
       {\r
         if(av.getWrapAlignment())\r
          return;\r
-        if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown())\r
+        if(editingSeqs)\r
           doMouseReleased(evt);\r
         else\r
           doMouseReleasedDefineMode(evt);\r
+\r
       }\r
       public void mousePressed(MouseEvent evt)\r
       {\r
         if(av.getWrapAlignment())\r
          return;\r
         if(evt.isShiftDown() || evt.isAltDown() || evt.isControlDown())\r
+        {\r
+          if(evt.isAltDown() || evt.isControlDown())\r
+            groupEditing = true;\r
+\r
+          editingSeqs = true;\r
           doMousePressed(evt);\r
+        }\r
         else\r
           doMousePressedDefineMode(evt);\r
       }\r
       public void mouseExited(MouseEvent evt)\r
       {\r
-        if (av.getWrapAlignment() || evt.isShiftDown() || evt.isAltDown() ||\r
-                  evt.isControlDown())\r
+        if (av.getWrapAlignment() || editingSeqs)\r
                 return;\r
               doMouseExitedDefineMode(evt);\r
 \r
       }\r
       public void mouseEntered(MouseEvent evt)\r
       {\r
-        if (av.getWrapAlignment() || evt.isShiftDown() || evt.isAltDown() ||\r
-            evt.isControlDown())\r
+        if (av.getWrapAlignment() || editingSeqs)\r
           return;\r
         doMouseEnteredDefineMode(evt);\r
       }\r
@@ -100,25 +107,20 @@ public class SeqPanel extends Panel
 \r
   public void doMouseReleased(MouseEvent evt) {\r
 \r
-    int x = evt.getX();\r
-    int res = x/av.getCharWidth() + av.getStartRes();\r
-\r
-    endres = res;\r
+    if(seqEditOccurred>-1)\r
+      editOccurred(seqEditOccurred);\r
 \r
     startseq = -1;\r
-    startres = -1;\r
     lastres  = -1;\r
-    if(seqEditOccurred>-1)\r
-      updateConservation(seqEditOccurred);\r
-\r
     seqEditOccurred = -1;\r
-\r
+    editingSeqs  = false;\r
+    groupEditing = false;\r
     ap.repaint();\r
-\r
   }\r
 \r
   public void doMousePressed(MouseEvent evt) {\r
-    ap.alignFrame.addHistoryItem("sequence edit");\r
+    ap.alignFrame.addHistoryItem( new HistoryItem(\r
+        "Edit Sequence",av.alignment, HistoryItem.EDIT));\r
     int seq;\r
     int res;\r
 \r
@@ -136,20 +138,11 @@ public class SeqPanel extends Panel
       // in the alignment\r
 \r
       startseq = seq;\r
-\r
-      if (startseq == (av.getAlignment().getHeight() - 1))\r
-        padseq = 1;\r
-      else\r
-        padseq = 1;\r
-\r
-      startres = res;\r
       lastres = res;\r
-\r
     }\r
     else\r
     {\r
       startseq = -1;\r
-      startres = -1;\r
       lastres = -1;\r
     }\r
 \r
@@ -226,107 +219,123 @@ public class SeqPanel extends Panel
   }\r
 \r
   public void doMouseDragged(MouseEvent evt) {\r
-    // If we're dragging we're editing\r
 \r
-    if(lastres==-1)\r
-      return;\r
+      // If we're dragging we're editing\r
+      int res = evt.getX() / av.getCharWidth() + av.getStartRes();\r
+      if (res < 0)\r
+        res = 0;\r
 \r
-    int x = evt.getX();\r
+      if (lastres == -1 || lastres == res)\r
+        return;\r
 \r
-    int res = x/av.getCharWidth() + av.getStartRes();\r
-    if (res < 0)\r
-      res = 0;\r
+      boolean dragRight = true;\r
+      if (res < av.getAlignment().getWidth() && res < lastres)\r
+        dragRight = false;\r
 \r
-    if (res != lastres)\r
-    {\r
-       // Group editing\r
-       if (evt.isAltDown() || evt.isControlDown())\r
-        {\r
-         SequenceGroup sg = av.getSelectionGroup();\r
-          if(sg==null)\r
-            av.getAlignment().findGroup(startseq);\r
-          if (sg != null)\r
-          {\r
-            boolean deleteAllowed = false;\r
-            if (res < av.getAlignment().getWidth() && res < lastres)\r
-            {\r
-              /// Are we able to delete?\r
-              boolean allGaps = true;\r
-              for (int i = 0; i < sg.getSize(); i++)\r
-              {\r
-                SequenceI s = sg.getSequenceAt(i);\r
-                for (int j = lastres-1; j >= res && allGaps; j--)\r
-                {\r
-                    if (!jalview.util.Comparison.isGap(s.getSequence().charAt(j)))\r
-                    {\r
-                      res = j + 1;\r
-                      allGaps = false;\r
-                    }\r
-                }\r
-\r
-                if(!deleteAllowed && allGaps)\r
-                  deleteAllowed = true;\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
-              SequenceI s = sg.getSequenceAt(i);\r
-              int k = av.alignment.findIndex(s);\r
-\r
-              // drag to right\r
-              if (res < av.getAlignment().getWidth() && res > lastres)\r
-                for (int j = lastres; j < res; j++)\r
-                  insertChar(j, k);\r
-\r
-              // drag to left\r
-              else if (deleteAllowed && res < av.getAlignment().getWidth() && res < lastres)\r
-              {\r
-                for (int j = res; j < lastres; j++)\r
-                {\r
-                  deleteChar(j, k);\r
-                  startres = res;\r
-                }\r
-              }\r
-            }\r
-          }\r
-        }\r
-        else /////Editing a single sequence///////////\r
-        {\r
-          if (res < av.getAlignment().getWidth() && res > lastres)\r
-          {\r
-            // dragging to the right\r
-            for (int j = lastres; j < res; j++)\r
-              insertChar(j, startseq);\r
-          }\r
-          else if (res < av.getAlignment().getWidth() && res < lastres)\r
-          {\r
-            // dragging to the left\r
-            for (int j = res; j < lastres; j++)\r
-            {\r
-              deleteChar(j, startseq);\r
-              startres = res;\r
-            }\r
-         }\r
-\r
-       }\r
 \r
-    }\r
+      if (res != lastres)\r
+     {\r
+         // Group editing\r
+         if (groupEditing)\r
+         {\r
+           SequenceGroup sg = av.getSelectionGroup();\r
+           if(sg==null)\r
+           {\r
+             lastres=-1;\r
+             return;\r
+           }\r
 \r
-    lastres = res;\r
-    seqCanvas.repaint();\r
+             // drag to right\r
+             if(dragRight)\r
+                 sg.setEndRes(sg.getEndRes() + (res-lastres));\r
+\r
+             // drag to left\r
+             else\r
+             {\r
+                /// Are we able to delete?\r
+                // ie are all columns blank?\r
+                boolean deleteAllowed = false;\r
+               for (int s = 0; s < sg.getSize(); s++)\r
+               {\r
+                 SequenceI seq = sg.getSequenceAt(s);\r
+                 for (int j=res; j<lastres; j++)\r
+                 {\r
+                   if(seq.getSequence().length()<=j)\r
+                     continue;\r
+\r
+                   if(!jalview.util.Comparison.isGap(seq.getSequence().charAt(j)))\r
+                   {\r
+                     // Not a gap, block edit not valid\r
+                     res=j+1;\r
+                     deleteAllowed = false;\r
+                     continue;\r
+                   }\r
+                   deleteAllowed = true;\r
+                 }\r
+               }\r
+\r
+               if(!deleteAllowed)\r
+               {\r
+                 lastres = -1;\r
+                 return;\r
+               }\r
+\r
+               sg.setEndRes(sg.getEndRes() - (lastres-res));\r
+             }\r
+\r
+\r
+             for (int i = 0; i < sg.getSize(); i++)\r
+             {\r
+               SequenceI s = sg.getSequenceAt(i);\r
+               int k = av.alignment.findIndex(s);\r
+\r
+               // drag to right\r
+               if (dragRight)\r
+                 for (int j = lastres; j < res; j++)\r
+                   insertChar(j, k);\r
+\r
+               // drag to left\r
+               else\r
+               {\r
+                 for (int j = res; j < lastres; j++)\r
+                 {\r
+                   if(s.getLength()>j)\r
+                     deleteChar(res, k);\r
+                 }\r
+               }\r
+             }\r
+         }\r
+         else /////Editing a single sequence///////////\r
+         {\r
+           if (res < av.getAlignment().getWidth() && res > lastres)\r
+           {\r
+             // dragging to the right\r
+             for (int j = lastres; j < res; j++)\r
+               insertChar(j, startseq);\r
+           }\r
+           else if (res < av.getAlignment().getWidth() && res < lastres)\r
+           {\r
+             // dragging to the left\r
+             for (int j = lastres; j > res; j--)\r
+             {\r
+               if( jalview.util.Comparison.isGap(\r
+                 av.alignment.getSequenceAt(startseq).getSequence().charAt(res)))\r
+\r
+               deleteChar(res, startseq);\r
+               else\r
+               {\r
+\r
+                 break;\r
+               }\r
+             }\r
+           }\r
+\r
+         }\r
+     }\r
+\r
+     endEdit = res;\r
+     lastres = res;\r
+      seqCanvas.repaint();\r
   }\r
 \r
   public void drawChars(int seqstart, int seqend, int start) {\r
@@ -343,19 +352,33 @@ public class SeqPanel extends Panel
   public void deleteChar(int j, int seq)\r
   {\r
 \r
-    if ( jalview.util.Comparison.isGap( av.alignment.getSequenceAt(seq).getSequence().charAt(j)))\r
-        av.alignment.getSequenceAt(seq).deleteCharAt(j);\r
-\r
-    av.alignment.getWidth();\r
-    seqCanvas.repaint();\r
+    av.alignment.getSequenceAt(seq).deleteCharAt(j);\r
     seqEditOccurred=seq;\r
+    av.alignment.getWidth();\r
+    repaint();\r
   }\r
 \r
 \r
-  void updateConservation(int i)\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
+\r
+    ColourSchemeI cs = av.getGlobalColourScheme();\r
+    if(cs instanceof ConservationColourScheme)\r
+      cs = ( (ConservationColourScheme) cs).cs;\r
+\r
+    if(cs instanceof ClustalxColourScheme)\r
+      cs = new ClustalxColourScheme(av.alignment.getSequences(), av.alignment.getWidth());\r
+\r
+    ap.alignFrame.changeColour(cs);\r
+\r
   }\r
 \r
 //////////////////////////////////////////\r
@@ -468,9 +491,8 @@ public class SeqPanel extends Panel
     }\r
     else\r
     {\r
-      if(stretchGroup.cs !=null && stretchGroup.cs.canThreshold())\r
+      if(stretchGroup.cs !=null)\r
       {\r
-        ResidueColourScheme rcs =  (ResidueColourScheme) stretchGroup.cs;\r
         SliderPanel.setPIDSliderSource(ap, stretchGroup.cs, stretchGroup.getName());\r
       }\r
 \r