all colours can threshold
[jalview.git] / src / jalview / appletgui / SeqPanel.java
index e6e02c5..1a6853b 100755 (executable)
@@ -15,6 +15,8 @@ public class SeqPanel extends Panel
 \r
   protected int lastres;\r
   protected int startseq;\r
+  int startEdit=-1;\r
+  int endEdit=-1;\r
 \r
   protected AlignViewport av;\r
 \r
@@ -24,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
@@ -46,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
@@ -59,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
@@ -96,18 +107,20 @@ public class SeqPanel extends Panel
 \r
   public void doMouseReleased(MouseEvent evt) {\r
 \r
-    startseq = -1;\r
-    lastres  = -1;\r
     if(seqEditOccurred>-1)\r
-      updateConservation(seqEditOccurred);\r
+      editOccurred(seqEditOccurred);\r
 \r
+    startseq = -1;\r
+    lastres  = -1;\r
     seqEditOccurred = -1;\r
-\r
+    editingSeqs  = false;\r
+    groupEditing = false;\r
     ap.repaint();\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
@@ -221,98 +234,107 @@ public class SeqPanel extends Panel
 \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
-            {\r
-              lastres=-1;\r
-              return;\r
-            }\r
-\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
-                deleteChar(res, startseq);\r
-              }\r
-            }\r
-\r
-          }\r
-      }\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
+             // 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
@@ -330,17 +352,21 @@ 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.getSequenceAt(seq).deleteCharAt(j);\r
+    seqEditOccurred=seq;\r
     av.alignment.getWidth();\r
     repaint();\r
-    seqEditOccurred=seq;\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
@@ -352,6 +378,7 @@ public class SeqPanel extends Panel
       cs = new ClustalxColourScheme(av.alignment.getSequences(), av.alignment.getWidth());\r
 \r
     ap.alignFrame.changeColour(cs);\r
+\r
   }\r
 \r
 //////////////////////////////////////////\r
@@ -464,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