hide/show selected region menu entries and key bindings
[jalview.git] / src / jalview / appletgui / AlignFrame.java
index 1bfc475..1330cf6 100755 (executable)
@@ -26,6 +26,7 @@ import java.awt.*;
 import java.awt.event.*;
 
 import jalview.analysis.*;
+import jalview.bin.JalviewLite;
 import jalview.commands.*;
 import jalview.datamodel.*;
 import jalview.io.*;
@@ -340,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;
     }
 
@@ -444,11 +415,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
       {
         if (evt.isAltDown())
         {
-          viewport.invertColumnSelection();
+          invertColSel_actionPerformed();
         }
         else
         {
-          this.invertSequenceMenuItem_actionPerformed();
+          invertSequenceMenuItem_actionPerformed();
         }
       }
       break;
@@ -470,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)
   {
   }
@@ -650,6 +687,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     {
       delete_actionPerformed();
     }
+    else if (source == grpsFromSelection)
+    {
+      makeGrpsFromSelection_actionPerformed();
+    }
     else if (source == deleteGroups)
     {
       deleteGroups_actionPerformed();
@@ -707,6 +748,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     else if (source == showSeqs)
     {
       viewport.showAllHiddenSeqs();
+      alignPanel.paintAlignment(true);
     }
     else if (source == hideColumns)
     {
@@ -717,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)
     {
@@ -1594,7 +1653,36 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
       this.setVisible(false);
     }
   }
-
+  protected void makeGrpsFromSelection_actionPerformed()
+  {
+    if (viewport.getSelectionGroup() != null)
+    {
+      SequenceGroup[] gps = jalview.analysis.Grouping.makeGroupsFrom(
+              viewport.getSequenceSelection(), viewport.getAlignmentView(
+                      true).getSequenceStrings(viewport.getGapCharacter()),
+              viewport.alignment.getGroups());
+      viewport.alignment.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].setIncludeAllConsSymbols(viewport.isIncludeAllConsensusSymbols());
+        viewport.alignment.addGroup(gps[g]);
+        Color col = new Color((int) (Math.random() * 255), (int) (Math
+                .random() * 255), (int) (Math.random() * 255));
+        col = col.brighter();
+        for (Enumeration sq = gps[g].getSequences(null).elements(); sq
+                .hasMoreElements(); viewport.setSequenceColour(
+                (SequenceI) sq.nextElement(), col))
+          ;
+      }
+      PaintRefresher.Refresh(this, viewport.getSequenceSetId());
+      // alignPanel.updateAnnotation();
+      alignPanel.paintAlignment(true);
+    }
+  }
   protected void deleteGroups_actionPerformed()
   {
     viewport.alignment.deleteAllGroups();
@@ -1643,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)
   {
@@ -2360,10 +2454,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     class AboutPanel extends Canvas
     {
       String version;
-
-      public AboutPanel(String version)
+      String builddate;
+      public AboutPanel(String version, String builddate)
       {
         this.version = version;
+        this.builddate = builddate;
       }
 
       public void paint(Graphics g)
@@ -2379,6 +2474,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
         // lite and application
         g.setFont(new Font("Helvetica", Font.BOLD, 14));
         g.drawString("JalviewLite - Release " + version, x, y += fh);
+        g.setFont(new Font("Helvetica", Font.BOLD, 12));
+        g.drawString("Build date: "+builddate, x, y += fh);
         g.setFont(new Font("Helvetica", Font.PLAIN, 12));
         g
                 .drawString(
@@ -2401,30 +2498,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
       }
     }
 
-    String version = "test";
-    java.net.URL url = getClass().getResource("/.build_properties");
-    if (url != null)
-    {
-      try
-      {
-        BufferedReader reader = new BufferedReader(new InputStreamReader(
-                url.openStream()));
-        String line;
-        while ((line = reader.readLine()) != null)
-        {
-          if (line.indexOf("VERSION") > -1)
-          {
-            version = line.substring(line.indexOf("=") + 1);
-          }
-        }
-      } catch (Exception ex)
-      {
-        ex.printStackTrace();
-      }
-    }
-
     Frame frame = new Frame();
-    frame.add(new AboutPanel(version));
+    frame.add(new AboutPanel(JalviewLite.getVersion(), JalviewLite.getBuildDate()));
     jalview.bin.JalviewLite.addFrame(frame, "Jalview", 580, 220);
 
   }
@@ -2585,6 +2660,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   MenuItem deleteGroups = new MenuItem();
 
+  MenuItem grpsFromSelection= new MenuItem();
+
   MenuItem delete = new MenuItem();
 
   MenuItem copy = new MenuItem();
@@ -2763,6 +2840,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     nucleotideColour.addActionListener(this);
     deleteGroups.setLabel("Undefine Groups");
     deleteGroups.addActionListener(this);
+    grpsFromSelection.setLabel("Make Groups for selection");
+    grpsFromSelection.addActionListener(this);
     copy.setLabel("Copy");
     copy.addActionListener(this);
     cut.setLabel("Cut");
@@ -2829,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");
@@ -2932,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);
@@ -2952,7 +3040,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     selectMenu.add(deselectAllSequenceMenuItem);
     selectMenu.add(invertSequenceMenuItem);
     selectMenu.add(invertColSel);
+    selectMenu.add(grpsFromSelection);
     selectMenu.add(deleteGroups);
+    
   }
 
   MenuItem featureSettings = new MenuItem();
@@ -2975,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();