JAL-1065 - Visualize T-Coffee quality scores for an alignment
[jalview.git] / src / jalview / appletgui / AlignFrame.java
index 8387089..c1dbf30 100644 (file)
@@ -1,6 +1,6 @@
 /*\r
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)\r
- * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle\r
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)\r
+ * Copyright (C) 2011 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle\r
  * \r
  * This file is part of Jalview.\r
  * \r
  */\r
 package jalview.appletgui;\r
 \r
-import java.net.*;\r
-import java.util.*;\r
-\r
-import java.awt.*;\r
-import java.awt.event.*;\r
-\r
-import jalview.analysis.*;\r
+import jalview.analysis.AAFrequency;\r
+import jalview.analysis.AlignmentSorter;\r
+import jalview.analysis.Conservation;\r
 import jalview.api.SequenceStructureBinding;\r
 import jalview.bin.JalviewLite;\r
-import jalview.commands.*;\r
-import jalview.datamodel.*;\r
-import jalview.io.*;\r
-import jalview.schemes.*;\r
+import jalview.commands.CommandI;\r
+import jalview.commands.EditCommand;\r
+import jalview.commands.OrderCommand;\r
+import jalview.commands.RemoveGapColCommand;\r
+import jalview.commands.RemoveGapsCommand;\r
+import jalview.commands.SlideSequencesCommand;\r
+import jalview.commands.TrimRegionCommand;\r
+import jalview.datamodel.Alignment;\r
+import jalview.datamodel.AlignmentI;\r
+import jalview.datamodel.AlignmentOrder;\r
+import jalview.datamodel.ColumnSelection;\r
+import jalview.datamodel.PDBEntry;\r
+import jalview.datamodel.Sequence;\r
+import jalview.datamodel.SequenceGroup;\r
+import jalview.datamodel.SequenceI;\r
+import jalview.io.AnnotationFile;\r
+import jalview.io.AppletFormatAdapter;\r
+import jalview.io.FeaturesFile;\r
+import jalview.io.TCoffeeScoreFile;\r
+import jalview.schemes.Blosum62ColourScheme;\r
+import jalview.schemes.BuriedColourScheme;\r
+import jalview.schemes.ClustalxColourScheme;\r
+import jalview.schemes.ColourSchemeI;\r
+import jalview.schemes.HelixColourScheme;\r
+import jalview.schemes.HydrophobicColourScheme;\r
+import jalview.schemes.NucleotideColourScheme;\r
+import jalview.schemes.PIDColourScheme;\r
+import jalview.schemes.ResidueProperties;\r
+import jalview.schemes.StrandColourScheme;\r
+import jalview.schemes.TCoffeeColourScheme;\r
+import jalview.schemes.TaylorColourScheme;\r
+import jalview.schemes.TurnColourScheme;\r
+import jalview.schemes.ZappoColourScheme;\r
 import jalview.structure.StructureSelectionManager;\r
 \r
-public class AlignFrame extends EmbmenuFrame implements ActionListener,\r
-        ItemListener, KeyListener\r
+import java.awt.BorderLayout;\r
+import java.awt.Canvas;\r
+import java.awt.CheckboxMenuItem;\r
+import java.awt.Color;\r
+import java.awt.Font;\r
+import java.awt.FontMetrics;\r
+import java.awt.Frame;\r
+import java.awt.Graphics;\r
+import java.awt.Label;\r
+import java.awt.Menu;\r
+import java.awt.MenuBar;\r
+import java.awt.MenuItem;\r
+import java.awt.event.ActionEvent;\r
+import java.awt.event.ActionListener;\r
+import java.awt.event.FocusEvent;\r
+import java.awt.event.FocusListener;\r
+import java.awt.event.ItemEvent;\r
+import java.awt.event.ItemListener;\r
+import java.awt.event.KeyEvent;\r
+import java.awt.event.KeyListener;\r
+import java.awt.event.WindowAdapter;\r
+import java.awt.event.WindowEvent;\r
+import java.io.IOException;\r
+import java.io.InputStreamReader;\r
+import java.net.URL;\r
+import java.net.URLEncoder;\r
+import java.util.Enumeration;\r
+import java.util.Hashtable;\r
+import java.util.StringTokenizer;\r
+import java.util.Vector;\r
+\r
+public class AlignFrame extends EmbmenuFrame implements ActionListener,  ItemListener, KeyListener\r
 {\r
   public AlignmentPanel alignPanel;\r
 \r
@@ -44,11 +99,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
   int DEFAULT_HEIGHT = 500;\r
 \r
   String jalviewServletURL;\r
+  \r
+  TCoffeeScoreFile tcoffeeScoreFile;\r
 \r
-  public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet,\r
-          String title, boolean embedded)\r
+  public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet, String title, boolean embedded)\r
   {\r
-\r
     if (applet != null)\r
     {\r
       jalviewServletURL = applet.getParameter("APPLICATION_URL");\r
@@ -144,7 +199,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     alignPanel.annotationSpaceFillerHolder.addKeyListener(this);\r
     alignPanel.alabels.addKeyListener(this);\r
     createAlignFrameWindow(embedded, title);\r
-    alignPanel.validate();\r
+\r
+    validate();\r
     alignPanel.adjustAnnotationHeight();\r
     alignPanel.paintAlignment(true);\r
   }\r
@@ -160,14 +216,26 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
   }\r
 \r
   /**\r
-   * DOCUMENT ME!\r
+   * Load a features file onto the alignment\r
    * \r
-   * @param String\r
-   *          DOCUMENT ME!\r
+   * @param file file URL, content, or other resolvable path\r
+   * @param type is protocol for accessing data referred to by file\r
    */\r
 \r
   public void parseFeaturesFile(String file, String type)\r
   {\r
+    parseFeaturesFile(file, type, true);\r
+  }\r
+  \r
+  /**\r
+   * Load a features file onto the alignment\r
+   * \r
+   * @param file file URL, content, or other resolvable path\r
+   * @param type is protocol for accessing data referred to by file\r
+   * @param autoenabledisplay when true, display features flag will be automatically enabled if features are loaded\r
+   */\r
+  public void parseFeaturesFile(String file, String type, boolean autoenabledisplay)\r
+  {    \r
     Hashtable featureLinks = new Hashtable();\r
     boolean featuresFile = false;\r
     try\r
@@ -187,8 +255,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
       {\r
         alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureLinks = featureLinks;\r
       }\r
-      viewport.showSequenceFeatures = true;\r
-      sequenceFeatures.setState(true);\r
+      if (autoenabledisplay)\r
+      {\r
+        viewport.showSequenceFeatures = true;\r
+        sequenceFeatures.setState(true);\r
+      }\r
       if (viewport.featureSettings != null)\r
       {\r
         viewport.featureSettings.refreshTable();\r
@@ -600,6 +671,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     {\r
       viewport.autocalculateConsensus = autoCalculate.getState();\r
     }\r
+    else if (evt.getSource() == sortByTree)\r
+    {\r
+      viewport.sortByTree = sortByTree.getState();\r
+    }\r
     else if (evt.getSource() == this.centreColumnLabelFlag)\r
     {\r
       centreColumnLabelFlag_stateChanged();\r
@@ -664,6 +739,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     {\r
       loadAnnotations();\r
     }\r
+    else if( source == loadScores ) {\r
+       loadScores();\r
+    }\r
     else if (source == outputAnnotations)\r
     {\r
       outputAnnotations(true);\r
@@ -919,6 +997,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     {\r
       changeColour(new Blosum62ColourScheme());\r
     }\r
+    else if (source == tcoffeeColour) {\r
+        changeColour(new TCoffeeColourScheme(tcoffeeScoreFile));\r
+    }\r
     else if (source == annotationColour)\r
     {\r
       new AnnotationColourChooser(viewport, alignPanel);\r
@@ -1008,6 +1089,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     jalview.bin.JalviewLite.addFrame(frame, "Paste Annotations ", 400, 300);\r
 \r
   }\r
+  \r
+  public void loadScores() {\r
+         //TODO\r
+         \r
+  }\r
 \r
   public String outputAnnotations(boolean displayTextbox)\r
   {\r
@@ -1031,7 +1117,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 \r
   private Hashtable getDisplayedFeatureCols()\r
   {\r
-    if (alignPanel.getFeatureRenderer() != null)\r
+    if (alignPanel.getFeatureRenderer() != null && viewport.featuresDisplayed!=null)\r
     {\r
       FeatureRenderer fr = alignPanel.getFeatureRenderer();\r
       Hashtable fcols = new Hashtable();\r
@@ -1064,12 +1150,25 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 \r
     if (displayTextbox)\r
     {\r
-      CutAndPasteTransfer cap = new CutAndPasteTransfer(false, this);\r
+      boolean frimport=false;\r
+      if (features==null || features.equals("No Features Visible"))\r
+      {\r
+        features = "# No features visible - paste some and import them here.";\r
+        frimport=true;\r
+      }\r
+      \r
+      CutAndPasteTransfer cap = new CutAndPasteTransfer(frimport, this);\r
+      if (frimport)\r
+      {\r
+        cap.setAnnotationImport();\r
+      }\r
       Frame frame = new Frame();\r
       frame.add(cap);\r
       jalview.bin.JalviewLite.addFrame(frame, "Features", 600, 500);\r
-\r
       cap.setText(features);\r
+    } else {\r
+      if (features==null)\r
+        features = "";\r
     }\r
 \r
     return features;\r
@@ -2211,7 +2310,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 \r
       cs.setConsensus(viewport.hconsensus);\r
 \r
-    }\r
+    }             \r
     viewport.setGlobalColourScheme(cs);\r
 \r
     if (viewport.getColourAppliesToAllGroups())\r
@@ -2537,7 +2636,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
         sortByTree(treePanel, title); // treePanel.getTitle());\r
       }\r
     });\r
-\r
+    \r
     treePanel.addWindowListener(new WindowAdapter()\r
     {\r
       public void windowOpened(WindowEvent e)\r
@@ -2571,9 +2670,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     alignPanel.paintAlignment(true);\r
     return true;\r
   }\r
+\r
   protected void documentation_actionPerformed()\r
   {\r
-    showURL("http://www.jalview.org/help.html", "HELP");\r
+    alignPanel.av.applet.openJalviewHelpUrl();\r
   }\r
 \r
   protected void about_actionPerformed()\r
@@ -2644,45 +2744,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     }\r
     else\r
     {\r
-      try\r
-      {\r
-        if (url.indexOf(":") == -1)\r
-        {\r
-          // TODO: verify (Bas Vroling bug) prepend codebase or server URL to\r
-          // form valid URL\r
-          // Should really use docbase, not codebase.\r
-          if (url.indexOf("/") == 0)\r
-          {\r
-            String codebase = viewport.applet.getCodeBase().toString();\r
-            url = codebase.substring(0, codebase.length()\r
-                    - viewport.applet.getCodeBase().getFile().length())\r
-                    + url;\r
-          }\r
-          else\r
-          {\r
-            url = viewport.applet.getCodeBase() + url;\r
-          }\r
-          System.out.println("Show url (prepended codebase): " + url);\r
-        }\r
-        else\r
-        {\r
-          System.out.println("Show url: " + url);\r
-        }\r
-        if (url.indexOf("javascript:") == 0)\r
-        {\r
-          // no target for the javascript context\r
-          viewport.applet.getAppletContext().showDocument(\r
-                  new java.net.URL(url));\r
-        }\r
-        else\r
-        {\r
-          viewport.applet.getAppletContext().showDocument(\r
-                  new java.net.URL(url), target);\r
-        }\r
-      } catch (Exception ex)\r
-      {\r
-        ex.printStackTrace();\r
-      }\r
+      viewport.applet.showURL(url, target);\r
     }\r
   }\r
 \r
@@ -2698,6 +2760,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
   MenuItem loadTree = new MenuItem("Load Associated Tree ...");\r
 \r
   MenuItem loadAnnotations = new MenuItem("Load Features/Annotations ...");\r
+  \r
+  MenuItem loadScores = new MenuItem("Load Associated T-Coffee scores ...");\r
 \r
   MenuItem outputFeatures = new MenuItem("Export Features ...");\r
 \r
@@ -2776,6 +2840,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
   MenuItem PIDColour = new MenuItem();\r
 \r
   MenuItem BLOSUM62Colour = new MenuItem();\r
+  \r
+  MenuItem tcoffeeColour = new MenuItem();\r
 \r
   MenuItem njTreeBlosumMenuItem = new MenuItem();\r
 \r
@@ -2842,6 +2908,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
   CheckboxMenuItem autoCalculate = new CheckboxMenuItem(\r
           "Autocalculate Consensus", true);\r
 \r
+  CheckboxMenuItem sortByTree = new CheckboxMenuItem(\r
+          "Sort Alignment With New Tree", true);\r
+\r
   Menu sortByTreeMenu = new Menu();\r
 \r
   Menu sort = new Menu();\r
@@ -2897,6 +2966,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 \r
     loadTree.addActionListener(this);\r
     loadAnnotations.addActionListener(this);\r
+    loadScores.addActionListener(this);\r
     outputFeatures.addActionListener(this);\r
     outputAnnotations.addActionListener(this);\r
     selectAllSequenceMenuItem.addActionListener(this);\r
@@ -2962,8 +3032,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     PIDColour.addActionListener(this);\r
     BLOSUM62Colour.setLabel("BLOSUM62 Score");\r
     BLOSUM62Colour.addActionListener(this);\r
-    avDistanceTreeBlosumMenuItem\r
-            .setLabel("Average Distance Using BLOSUM62");\r
+    tcoffeeColour.setLabel("T-Coffee Scores");\r
+    tcoffeeColour.setEnabled(false);   // it will enabled only if a score file is provided\r
+    tcoffeeColour.addActionListener(this);\r
+    avDistanceTreeBlosumMenuItem .setLabel("Average Distance Using BLOSUM62");\r
     avDistanceTreeBlosumMenuItem.addActionListener(this);\r
     njTreeBlosumMenuItem.setLabel("Neighbour Joining Using BLOSUM62");\r
     njTreeBlosumMenuItem.addActionListener(this);\r
@@ -3037,6 +3109,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     sort.setLabel("Sort");\r
     calculate.setLabel("Calculate Tree");\r
     autoCalculate.addItemListener(this);\r
+    sortByTree.addItemListener(this);\r
     inputText.setLabel("Input from textbox");\r
     inputText.addActionListener(this);\r
     centreColumnLabelFlag.setLabel("Centre column labels");\r
@@ -3107,7 +3180,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     fileMenu.add(inputText);\r
     fileMenu.add(loadTree);\r
     fileMenu.add(loadAnnotations);\r
-\r
+    fileMenu.add(loadScores);\r
+    \r
     fileMenu.addSeparator();\r
     fileMenu.add(outputTextboxMenu);\r
     fileMenu.add(outputFeatures);\r
@@ -3168,6 +3242,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     colourMenu.add(turnColour);\r
     colourMenu.add(buriedColour);\r
     colourMenu.add(nucleotideColour);\r
+    colourMenu.add(tcoffeeColour);\r
     colourMenu.add(userDefinedColour);\r
     colourMenu.addSeparator();\r
     colourMenu.add(conservationMenuItem);\r
@@ -3181,6 +3256,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     calculateMenu.add(pairwiseAlignmentMenuItem);\r
     calculateMenu.add(PCAMenuItem);\r
     calculateMenu.add(autoCalculate);\r
+    calculateMenu.add(sortByTree);\r
     this.add(statusBar, BorderLayout.SOUTH);\r
     pasteMenu.add(pasteNew);\r
     pasteMenu.add(pasteThis);\r
@@ -3580,4 +3656,41 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
   {\r
     alignPanel.seqPanel.scrollTo(row, column);    \r
   }\r
+  public void scrollToRow(int row)\r
+  {\r
+    alignPanel.seqPanel.scrollToRow(row);    \r
+  }\r
+  public void scrollToColumn(int column)\r
+  {\r
+    alignPanel.seqPanel.scrollToColumn(column);    \r
+  }\r
+  /**\r
+   * @return the alignments unique ID.\r
+   */\r
+  public String getSequenceSetId() {\r
+    return viewport.getSequenceSetId();\r
+  }\r
+  \r
+  \r
+  /**\r
+   * Load the (T-Coffee) score file from the specified url \r
+   * \r
+   * @param url The absolute path from where download and read the score file\r
+   * @throws IOException \r
+   */\r
+  public void loadScoreFile( URL url ) throws IOException {\r
+         \r
+         TCoffeeScoreFile file = TCoffeeScoreFile.load( new InputStreamReader( url.openStream() ) );\r
+         if( file == null ) {\r
+                 throw new RuntimeException("The file provided does not match the T-Coffee scores file format");\r
+         }\r
+         \r
+         tcoffeeColour.setEnabled(true);\r
+         tcoffeeScoreFile = file;\r
+         \r
+         // switch to this color\r
+         changeColour(new TCoffeeColourScheme(tcoffeeScoreFile));\r
+  }\r
+  \r
+  \r
 }\r