hide/show selected region menu entries and key bindings
[jalview.git] / src / jalview / appletgui / AlignFrame.java
index 74f12ef..1330cf6 100755 (executable)
@@ -341,37 +341,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     {
       boolean toggleSeqs = !evt.isControlDown();
       boolean toggleCols = !evt.isShiftDown();
-      boolean hide = false;
-      SequenceGroup sg = viewport.getSelectionGroup();
-
-      if (toggleSeqs)
-      {
-        if (sg != null && sg.getSize() != viewport.alignment.getHeight())
-        {
-          hide = true;
-          viewport.hideAllSelectedSeqs();
-        }
-        else if (!(toggleCols && viewport.colSel.getSelected().size() > 0))
-        {
-          viewport.showAllHiddenSeqs();
-        }
-      }
-
-      if (toggleCols)
-      {
-        if (viewport.colSel.getSelected().size() > 0)
-        {
-          viewport.hideSelectedColumns();
-          if (!toggleSeqs)
-          {
-            viewport.selectionGroup = sg;
-          }
-        }
-        else if (!hide)
-        {
-          viewport.showAllHiddenColumns();
-        }
-      }
+      toggleHiddenRegions(toggleSeqs, toggleCols);
       break;
     }
 
@@ -445,11 +415,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
       {
         if (evt.isAltDown())
         {
-          viewport.invertColumnSelection();
+          invertColSel_actionPerformed();
         }
         else
         {
-          this.invertSequenceMenuItem_actionPerformed();
+          invertSequenceMenuItem_actionPerformed();
         }
       }
       break;
@@ -471,7 +441,73 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     }
     alignPanel.paintAlignment(true);
   }
+  /**
+   * called by key handler and the hide all/show all menu items
+   * @param toggleSeqs
+   * @param toggleCols
+   */
+  private void toggleHiddenRegions(boolean toggleSeqs,
+          boolean toggleCols)
+  {
+    boolean hide = false;
+    SequenceGroup sg = viewport.getSelectionGroup();
+    if (!toggleSeqs && !toggleCols)
+    {
+      // Hide everything by the current selection - this is a hack - we do the
+      // invert and then hide
+      // first check that there will be visible columns after the invert.
+      if ((viewport.colSel != null
+              && viewport.colSel.getSelected() != null && viewport.colSel
+              .getSelected().size() > 0)
+              || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg
+                      .getEndRes()))
+      {
+        // now invert the sequence set, if required - empty selection implies
+        // that no hiding is required.
+        if (sg != null)
+        {
+          invertSequenceMenuItem_actionPerformed();
+          sg = viewport.getSelectionGroup();
+          toggleSeqs = true;
+
+        }
+        viewport.expandColSelection(sg, true);
+        // finally invert the column selection and get the new sequence
+        // selection and indicate it should be hidden.
+        invertColSel_actionPerformed();
+        toggleCols = true;
+      }
+    }
+
+    if (toggleSeqs)
+    {
+      if (sg != null && sg.getSize() != viewport.alignment.getHeight())
+      {
+        hide = true;
+        viewport.hideAllSelectedSeqs();
+      }
+      else if (!(toggleCols && viewport.colSel.getSelected().size() > 0))
+      {
+        viewport.showAllHiddenSeqs();
+      }
+    }
 
+    if (toggleCols)
+    {
+      if (viewport.colSel.getSelected().size() > 0)
+      {
+        viewport.hideSelectedColumns();
+        if (!toggleSeqs)
+        {
+          viewport.selectionGroup = sg;
+        }
+      }
+      else if (!hide)
+      {
+        viewport.showAllHiddenColumns();
+      }
+    }
+  }
   public void keyReleased(KeyEvent evt)
   {
   }
@@ -712,6 +748,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     else if (source == showSeqs)
     {
       viewport.showAllHiddenSeqs();
+      alignPanel.paintAlignment(true);
     }
     else if (source == hideColumns)
     {
@@ -722,6 +759,23 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
             && viewport.getSelectionGroup() != null)
     {
       viewport.hideAllSelectedSeqs();
+      alignPanel.paintAlignment(true);
+    }
+    else if (source == hideAllButSelection) {
+      toggleHiddenRegions(false,false);
+      alignPanel.paintAlignment(true);
+    }
+    else if (source == hideAllSelection) {
+      SequenceGroup sg = viewport.getSelectionGroup();
+      viewport.expandColSelection(sg, false);
+      viewport.hideAllSelectedSeqs();
+      viewport.hideSelectedColumns();
+      alignPanel.paintAlignment(true);
+    }
+    else if (source == showAllHidden) {
+      viewport.showAllHiddenColumns();
+      viewport.showAllHiddenSeqs();
+      alignPanel.paintAlignment(true);
     }
     else if (source == featureSettings)
     {
@@ -1677,6 +1731,12 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
     PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
   }
+  public void invertColSel_actionPerformed()
+  {
+    viewport.invertColumnSelection();
+    alignPanel.paintAlignment(true);
+    PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
+  }
 
   void trimAlignment(boolean trimLeft)
   {
@@ -2848,11 +2908,17 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     menu2.setLabel("Hide");
     hideColumns.setLabel("Selected Columns");
     hideSequences.setLabel("Selected Sequences");
+    hideAllButSelection.setLabel("All but Selected Region (Shift+Ctrl+H)");
+    hideAllSelection.setLabel("Selected Region");
+    showAllHidden.setLabel("All Sequences and Columns");
     invertColSel.addActionListener(this);
     showColumns.addActionListener(this);
     showSeqs.addActionListener(this);
     hideColumns.addActionListener(this);
     hideSequences.addActionListener(this);
+    hideAllButSelection.addActionListener(this);
+    hideAllSelection.addActionListener(this);
+    showAllHidden.addActionListener(this);
     formatMenu.setLabel("Format");
     selectMenu.setLabel("Select");
     newView.setLabel("New View");
@@ -2951,8 +3017,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     helpMenu.add(about);
     menu1.add(showColumns);
     menu1.add(showSeqs);
+    menu1.add(showAllHidden);
     menu2.add(hideColumns);
     menu2.add(hideSequences);
+    menu2.add(hideAllSelection);
+    menu2.add(hideAllButSelection);
     formatMenu.add(font);
     formatMenu.add(seqLimits);
     formatMenu.add(wrapMenuItem);
@@ -2996,6 +3065,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   MenuItem hideSequences = new MenuItem();
 
+  MenuItem hideAllButSelection = new MenuItem();
+  MenuItem hideAllSelection = new MenuItem();
+  MenuItem showAllHidden = new MenuItem();
+
   Menu formatMenu = new Menu();
 
   Menu selectMenu = new Menu();