make groups from selection
[jalview.git] / src / jalview / appletgui / AlignFrame.java
index 3280815..74f12ef 100755 (executable)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)
- * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
+ * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
  * 
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -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.*;
@@ -68,6 +69,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     viewport.updateConsensus(alignPanel);
 
     annotationPanelMenuItem.setState(viewport.showAnnotation);
+    displayNonconservedMenuItem.setState(viewport.getShowunconserved());
 
     seqLimits.setState(viewport.showJVSuffix);
 
@@ -101,7 +103,6 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
         centreColumnLabelFlag.setState(true);
         centreColumnLabelFlag_stateChanged();
       }
-
       try
       {
         param = applet.getParameter("windowWidth");
@@ -175,6 +176,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
       }
       viewport.showSequenceFeatures = true;
       sequenceFeatures.setState(true);
+      if (viewport.featureSettings!=null)
+      {
+        viewport.featureSettings.refreshTable();
+      }
       alignPanel.paintAlignment(true);
     }
 
@@ -477,7 +482,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   public void itemStateChanged(ItemEvent evt)
   {
-    if (evt.getSource() == colourTextMenuItem)
+    if (evt.getSource() == displayNonconservedMenuItem)
+    {
+      displayNonconservedMenuItem_actionPerformed();
+    }
+    else if (evt.getSource() == colourTextMenuItem)
     {
       colourTextMenuItem_actionPerformed();
     }
@@ -642,6 +651,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     {
       delete_actionPerformed();
     }
+    else if (source == grpsFromSelection)
+    {
+      makeGrpsFromSelection_actionPerformed();
+    }
     else if (source == deleteGroups)
     {
       deleteGroups_actionPerformed();
@@ -927,18 +940,34 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     return annotation;
   }
 
+  private Hashtable getDisplayedFeatureCols()
+  {
+    if (alignPanel.getFeatureRenderer()!=null) {
+      FeatureRenderer fr = alignPanel.getFeatureRenderer();
+      Hashtable fcols = new Hashtable();
+      Enumeration en = viewport.featuresDisplayed.keys();
+      while (en.hasMoreElements())
+      {
+        Object col = en.nextElement();
+        fcols.put(col,fr.featureColours.get(col));
+      }
+      return fcols;
+    }
+    return null;
+  }
+
   public String outputFeatures(boolean displayTextbox, String format)
   {
     String features;
     if (format.equalsIgnoreCase("Jalview"))
     {
       features = new FeaturesFile().printJalviewFormat(viewport.alignment
-              .getSequencesArray(), viewport.featuresDisplayed);
+              .getSequencesArray(), getDisplayedFeatureCols());
     }
     else
     {
       features = new FeaturesFile().printGFFFormat(viewport.alignment
-              .getSequencesArray(), viewport.featuresDisplayed);
+              .getSequencesArray(), getDisplayedFeatureCols());
     }
 
     if (displayTextbox)
@@ -1570,7 +1599,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();
@@ -1910,6 +1968,12 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     alignPanel.paintAlignment(true);
   }
 
+  protected void displayNonconservedMenuItem_actionPerformed()
+  {
+    viewport.setShowunconserved(displayNonconservedMenuItem.getState());
+    alignPanel.paintAlignment(true);
+  }
+
   protected void wrapMenuItem_actionPerformed()
   {
     viewport.setWrapAlignment(wrapMenuItem.getState());
@@ -2114,12 +2178,12 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
     modifyPID_actionPerformed();
   }
-
   public void sortPairwiseMenuItem_actionPerformed()
   {
     SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
     AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
             .getAlignment().getSequenceAt(0), null);
+
     addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
             viewport.alignment));
     alignPanel.paintAlignment(true);
@@ -2127,17 +2191,19 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   public void sortIDMenuItem_actionPerformed()
   {
-    // addHistoryItem(new HistoryItem("ID Sort", viewport.alignment,
-    // HistoryItem.SORT));
+    SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
     AlignmentSorter.sortByID(viewport.getAlignment());
+    addHistoryItem(new OrderCommand("ID Sort", oldOrder,
+            viewport.alignment));
     alignPanel.paintAlignment(true);
   }
 
   public void sortGroupMenuItem_actionPerformed()
   {
-    // addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,
-    // HistoryItem.SORT));
+    SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
     AlignmentSorter.sortByGroup(viewport.getAlignment());
+    addHistoryItem(new OrderCommand("Group Sort", oldOrder,
+            viewport.alignment));
     alignPanel.paintAlignment(true);
 
   }
@@ -2266,8 +2332,28 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     jalview.bin.JalviewLite.addFrame(tp, treeFile, 600, 500);
     addTreeMenuItem(tp, treeFile);
   }
-
-  void addTreeMenuItem(final TreePanel treePanel, String title)
+  /**
+   * sort the alignment using the given treePanel
+   * @param treePanel tree used to sort view
+   * @param title string used for undo event name
+   */
+  public void sortByTree(TreePanel treePanel, String title)
+  {
+    SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
+    AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel
+            .getTree());
+    // addHistoryItem(new HistoryItem("Sort", viewport.alignment,
+    // HistoryItem.SORT));
+    addHistoryItem(new OrderCommand("Order by "+title, oldOrder,
+            viewport.alignment));
+    alignPanel.paintAlignment(true);
+  }
+  /**
+   * Do any automatic reordering of the alignment and add the necessary bits to the menu structure for the new tree
+   * @param treePanel
+   * @param title
+   */
+  protected void addTreeMenuItem(final TreePanel treePanel, final String title)
   {
     final MenuItem item = new MenuItem(title);
     sortByTreeMenu.add(item);
@@ -2275,16 +2361,21 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     {
       public void actionPerformed(ActionEvent evt)
       {
-        // addHistoryItem(new HistoryItem("Sort", viewport.alignment,
-        // HistoryItem.SORT));
-        AlignmentSorter.sortByTree(viewport.getAlignment(), treePanel
-                .getTree());
-        alignPanel.paintAlignment(true);
+        sortByTree(treePanel, title); // treePanel.getTitle());
       }
     });
 
     treePanel.addWindowListener(new WindowAdapter()
     {
+      public void windowOpened(WindowEvent e)
+      {
+        if (viewport.sortByTree)
+        {
+          sortByTree(treePanel, title);
+        }
+        super.windowOpened(e);
+      }
+
       public void windowClosing(WindowEvent e)
       {
         sortByTreeMenu.remove(item);
@@ -2303,10 +2394,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)
@@ -2322,6 +2414,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(
@@ -2337,38 +2431,15 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
                         "For help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list",
                         x, y += fh);
         g.drawString("If  you use Jalview, please cite:", x, y += fh + 8);
-        g
-                .drawString(
-                        "\"Clamp, M., Cuff, J., Searle, S. M. and Barton, G. J. (2004), The Jalview Java Alignment Editor\"",
-                        x, y += fh);
-        g.drawString("Bioinformatics,  2004 20;426-7.", x, y += fh);
-      }
-    }
-
-    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();
+        g.drawString(
+                        "Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)",x,y+=fh);
+        g.drawString("Jalview Version 2 - a multiple sequence alignment editor and analysis workbench",x,y+=fh);
+        g.drawString("Bioinformatics doi: 10.1093/bioinformatics/btp033",x,y+=fh);
       }
     }
 
     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);
 
   }
@@ -2503,6 +2574,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   CheckboxMenuItem colourTextMenuItem = new CheckboxMenuItem();
 
+  CheckboxMenuItem displayNonconservedMenuItem = new CheckboxMenuItem();
+
   MenuItem alProperties = new MenuItem("Alignment Properties...");
 
   MenuItem overviewMenuItem = new MenuItem();
@@ -2527,6 +2600,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   MenuItem deleteGroups = new MenuItem();
 
+  MenuItem grpsFromSelection= new MenuItem();
+
   MenuItem delete = new MenuItem();
 
   MenuItem copy = new MenuItem();
@@ -2677,6 +2752,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     annotationPanelMenuItem.addItemListener(this);
     colourTextMenuItem.setLabel("Colour Text");
     colourTextMenuItem.addItemListener(this);
+    displayNonconservedMenuItem.setLabel("Show non-conserved");
+    displayNonconservedMenuItem.addItemListener(this);
     alProperties.addActionListener(this);
     overviewMenuItem.setLabel("Overview Window");
     overviewMenuItem.addActionListener(this);
@@ -2703,6 +2780,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");
@@ -2883,6 +2962,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     formatMenu.add(viewBoxesMenuItem);
     formatMenu.add(viewTextMenuItem);
     formatMenu.add(colourTextMenuItem);
+    formatMenu.add(displayNonconservedMenuItem);
     formatMenu.add(renderGapsMenuItem);
     formatMenu.add(centreColumnLabelFlag);
     selectMenu.add(findMenuItem);
@@ -2891,7 +2971,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();