JAL-1384 group/ungroup sequences with command/ctrl+G and shift+command/ctrl+G
[jalview.git] / src / jalview / appletgui / AlignFrame.java
index 6d8faaf..3325525 100644 (file)
@@ -17,9 +17,9 @@
  */
 package jalview.appletgui;
 
-import jalview.analysis.AAFrequency;
 import jalview.analysis.AlignmentSorter;
 import jalview.analysis.Conservation;
+import jalview.api.AlignViewControllerI;
 import jalview.api.SequenceStructureBinding;
 import jalview.bin.JalviewLite;
 import jalview.commands.CommandI;
@@ -35,7 +35,6 @@ import jalview.datamodel.AlignmentOrder;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.Sequence;
-import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.io.AnnotationFile;
@@ -83,7 +82,6 @@ import java.awt.event.KeyListener;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.io.IOException;
-import java.io.InputStreamReader;
 import java.net.URL;
 import java.net.URLEncoder;
 import java.util.Enumeration;
@@ -95,6 +93,7 @@ import java.util.Vector;
 public class AlignFrame extends EmbmenuFrame implements ActionListener,
         ItemListener, KeyListener
 {
+  public AlignViewControllerI avc;
   public AlignmentPanel alignPanel;
 
   public AlignViewport viewport;
@@ -123,7 +122,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
     viewport = new AlignViewport(al, applet);
     alignPanel = new AlignmentPanel(this, viewport);
-
+    avc = new jalview.controller.AlignViewController(viewport, alignPanel);
     viewport.updateConservation(alignPanel);
     viewport.updateConsensus(alignPanel);
 
@@ -545,6 +544,20 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
       }
       break;
 
+    case KeyEvent.VK_G:
+      if (evt.isControlDown())
+      {
+        if (evt.isShiftDown())
+        {
+          this.unGroup_actionPerformed();
+        }
+        else
+        {
+          this.createGroup_actionPerformed();
+        }
+      }
+      break;
+      
     case KeyEvent.VK_U:
       if (evt.isControlDown())
       {
@@ -1890,41 +1903,30 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   protected void makeGrpsFromSelection_actionPerformed()
   {
-    if (viewport.getSelectionGroup() != null)
-    {
-      SequenceGroup[] gps = jalview.analysis.Grouping.makeGroupsFrom(
-              viewport.getSequenceSelection(),
-              viewport.getAlignmentView(true).getSequenceStrings(
-                      viewport.getGapCharacter()), viewport.getAlignment()
-                      .getGroups());
-      viewport.getAlignment().deleteAllGroups();
-      viewport.sequenceColours = null;
-      viewport.setSelectionGroup(null);
-      // set view properties for each group
-      for (int g = 0; g < gps.length; g++)
-      {
-        // gps[g].setShowunconserved(viewport.getShowUnconserved());
-        gps[g].setshowSequenceLogo(viewport.isShowSequenceLogo());
-        viewport.getAlignment().addGroup(gps[g]);
-        Color col = new Color((int) (Math.random() * 255),
-                (int) (Math.random() * 255), (int) (Math.random() * 255));
-        col = col.brighter();
-        for (SequenceI sq : gps[g].getSequences(null))
-          viewport.setSequenceColour(sq, col);
-      }
+    if (avc.makeGroupsFromSelection()) {
       PaintRefresher.Refresh(this, viewport.getSequenceSetId());
       alignPanel.updateAnnotation();
       alignPanel.paintAlignment(true);
     }
   }
 
+  protected void createGroup_actionPerformed()
+  {
+    avc.createGroup();
+  }
+  protected void unGroup_actionPerformed()
+  {
+    if (avc.unGroup())
+    {
+      alignPanel.alignmentChanged();
+    }
+  }
   protected void deleteGroups_actionPerformed()
   {
-    viewport.getAlignment().deleteAllGroups();
-    viewport.sequenceColours = null;
-    viewport.setSelectionGroup(null);
-
-    alignPanel.paintAlignment(true);
+    if (avc.deleteGroups())
+    {
+      alignPanel.alignmentChanged();
+    }
   }
 
   public void selectAllSequenceMenuItem_actionPerformed()
@@ -2871,6 +2873,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   MenuItem grpsFromSelection = new MenuItem();
 
+  MenuItem createGroup = new MenuItem();
+
+  MenuItem unGroup = new MenuItem();
+
   MenuItem delete = new MenuItem();
 
   MenuItem copy = new MenuItem();
@@ -3079,6 +3085,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     deleteGroups.addActionListener(this);
     grpsFromSelection.setLabel("Make Groups for selection");
     grpsFromSelection.addActionListener(this);
+    createGroup.setLabel("Create Group");
+    unGroup.setLabel("Remove Group");
     copy.setLabel("Copy");
     copy.addActionListener(this);
     cut.setLabel("Cut");
@@ -3307,6 +3315,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     selectMenu.add(deselectAllSequenceMenuItem);
     selectMenu.add(invertSequenceMenuItem);
     selectMenu.add(invertColSel);
+    selectMenu.add(createGroup);
+    selectMenu.add(unGroup);
     selectMenu.add(grpsFromSelection);
     selectMenu.add(deleteGroups);