Merge branch 'kjvdh/features/PhylogenyViewer_tabbedsupport' into merge/2_11_2/kjvdh...
[jalview.git] / src / jalview / gui / AlignFrame.java
index e24cbea..a71d75f 100644 (file)
 package jalview.gui;
 
 import java.util.Locale;
+import jalview.analysis.AlignmentSorter;
+import jalview.analysis.AlignmentUtils;
+import jalview.analysis.CrossRef;
+import jalview.analysis.Dna;
+import jalview.analysis.ParseProperties;
+import jalview.analysis.SequenceIdMatcher;
+import jalview.analysis.TreeModel;
+import jalview.api.AlignExportSettingI;
+import jalview.api.AlignViewControllerGuiI;
+import jalview.api.AlignViewControllerI;
+import jalview.api.AlignViewportI;
+import jalview.api.AlignmentViewPanel;
+import jalview.api.FeatureSettingsControllerI;
+import jalview.api.SplitContainerI;
+import jalview.api.ViewStyleI;
+import jalview.bin.Cache;
+import jalview.bin.Jalview;
+import jalview.commands.CommandI;
+import jalview.commands.EditCommand;
+import jalview.commands.EditCommand.Action;
+import jalview.commands.OrderCommand;
+import jalview.commands.RemoveGapColCommand;
+import jalview.commands.RemoveGapsCommand;
+import jalview.commands.SlideSequencesCommand;
+import jalview.commands.TrimRegionCommand;
+import jalview.datamodel.AlignedCodonFrame;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentExportData;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.AlignmentOrder;
+import jalview.datamodel.AlignmentView;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.HiddenColumns;
+import jalview.datamodel.HiddenSequences;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.SeqCigar;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.ext.archaeopteryx.AptxInit;
+import jalview.ext.forester.io.SupportedTreeFileFilter;
+import jalview.ext.forester.io.TreeParser;
+import jalview.gui.ColourMenuHelper.ColourChangeListener;
+import jalview.gui.ViewSelectionMenu.ViewSetProvider;
+import jalview.io.AlignmentProperties;
+import jalview.io.AnnotationFile;
+import jalview.io.BioJsHTMLOutput;
+import jalview.io.DataSourceType;
+import jalview.io.FileFormat;
+import jalview.io.FileFormatI;
+import jalview.io.FileFormats;
+import jalview.io.FileLoader;
+import jalview.io.FileParse;
+import jalview.io.FormatAdapter;
+import jalview.io.HtmlSvgOutput;
+import jalview.io.IdentifyFile;
+import jalview.io.JPredFile;
+import jalview.io.JalviewFileChooser;
+import jalview.io.JalviewFileView;
+import jalview.io.JnetAnnotationMaker;
+import jalview.io.NewickFile;
+import jalview.io.ScoreMatrixFile;
+import jalview.io.TCoffeeScoreFile;
+import jalview.jbgui.GAlignFrame;
+import jalview.schemes.ColourSchemeI;
+import jalview.schemes.ColourSchemes;
+import jalview.schemes.ResidueColourScheme;
+import jalview.schemes.TCoffeeColourScheme;
+import jalview.util.MessageManager;
+import jalview.viewmodel.AlignmentViewport;
+import jalview.viewmodel.ViewportRanges;
+import jalview.ws.DBRefFetcher;
+import jalview.ws.DBRefFetcher.FetchFinishedListenerI;
+import jalview.ws.jws1.Discoverer;
+import jalview.ws.jws2.Jws2Discoverer;
+import jalview.ws.jws2.jabaws2.Jws2Instance;
+import jalview.ws.seqfetcher.DbSourceProxy;
 
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.GridLayout;
 import java.awt.Rectangle;
 import java.awt.Toolkit;
 import java.awt.datatransfer.Clipboard;
@@ -59,11 +139,13 @@ import java.util.Deque;
 import java.util.Enumeration;
 import java.util.Hashtable;
 import java.util.List;
+import java.util.StringTokenizer;
 import java.util.Vector;
 
 import javax.swing.ButtonGroup;
 import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JComponent;
+import javax.swing.JComboBox;
 import javax.swing.JEditorPane;
 import javax.swing.JInternalFrame;
 import javax.swing.JLabel;
@@ -3746,15 +3828,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   /**
    * Constructs a tree panel and adds it to the desktop
    * 
-   * @param type
-   *          tree type (NJ or AV)
-   * @param modelName
-   *          name of score model used to compute the tree
-   * @param options
-   *          parameters for the distance or similarity calculation
+   * @param params
+   * @param treeAlgo
+   * 
+   * @param tree
+   * 
+   * 
    */
-  void newTreePanel(String type, String modelName,
-          SimilarityParamsI options)
+  void newTreePanel(TreeModel tree, String treeAlgo,
+          String substitutionMatrix)
   {
     String frameTitle = "";
     TreePanel tp;
@@ -3766,7 +3848,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       SequenceGroup sg = viewport.getSelectionGroup();
 
       /* Decide if the selection is a column region */
-      for (SequenceI _s : sg.getSequences())
+      for (SequenceI _s : sg.getSequences()) // port this to Archaeopteryx?
       {
         if (_s.getLength() < sg.getEndRes())
         {
@@ -3790,7 +3872,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       }
     }
 
-    tp = new TreePanel(alignPanel, type, modelName, options);
+    tp = new TreePanel(alignPanel, tree, treeAlgo, substitutionMatrix);
     frameTitle = tp.getPanelTitle() + (onSelection ? " on region" : "");
 
     frameTitle += " from ";
@@ -3958,6 +4040,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         @Override
         public void actionPerformed(ActionEvent e)
         {
+          // adapt to Aptx
           tp.sortByTree_actionPerformed();
           addHistoryItem(tp.sortAlignmentIn(alignPanel));
 
@@ -4067,14 +4150,66 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   @Override
   protected void loadTreeMenuItem_actionPerformed(ActionEvent e)
   {
+    chooseTreeFile();
+  }
+
+  @Override
+  protected void loadTreeUrlItem_actionPerformed(ActionEvent e)
+  {
+    chooseTreeUrl();
+  }
+
+  @Override
+  protected void loadTreeBaseStudy_actionPerformed(ActionEvent e)
+  {
+    chooseTreeDb();
+
+  }
+
+  @Override
+  protected void loadTreeOfLife_actionPerformed(ActionEvent e)
+  {
+    chooseTreeDb();
+
+  }
+
+  @Override
+  protected void loadTreeFam_actionPerformed(ActionEvent e)
+  {
+    chooseTreeDb();
+
+  }
+
+  @Override
+  protected void loadTreePfam_actionPerformed(ActionEvent e)
+  {
+    chooseTreeDb();
+
+  }
+
+  @Override
+  protected void loadTreeBase_actionPerformed(ActionEvent e)
+  {
+    chooseTreeDb();
+
+  }
+
+
+  public void chooseTreeFile()
+  {
     // Pick the tree file
     JalviewFileChooser chooser = new JalviewFileChooser(
             Cache.getProperty("LAST_DIRECTORY"));
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle(
-            MessageManager.getString("label.select_newick_like_tree_file"));
+            MessageManager.getString("label.select_tree_file")); // modify
     chooser.setToolTipText(
-            MessageManager.getString("label.load_tree_file"));
+            MessageManager.getString("label.load_tree_for_sequence_set"));
+    for (SupportedTreeFileFilter treeFormat : SupportedTreeFileFilter
+            .values())
+    {
+      chooser.setFileFilter(treeFormat.getTreeFilter());
+    }
 
     chooser.setResponseHandler(0, new Runnable()
     {
@@ -4083,12 +4218,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       {
         String filePath = chooser.getSelectedFile().getPath();
         Cache.setProperty("LAST_DIRECTORY", filePath);
-        NewickFile fin = null;
-        try
-        {
-          fin = new NewickFile(new FileParse(chooser.getSelectedFile(),
-                  DataSourceType.FILE));
-          viewport.setCurrentTree(showNewickTree(fin, filePath).getTree());
+       TreeParser treeParser = null;
+       try {
+         treeParser = new TreeParser(filePath);
+         treeParser.loadTree(viewport);        
         } catch (Exception ex)
         {
           JvOptionPane.showMessageDialog(Desktop.desktop, ex.getMessage(),
@@ -4108,6 +4241,78 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       }
     });
     chooser.showOpenDialog(this);
+    }
+  }
+
+  /**
+   * Break up and move to TreeParser?
+   */
+  public void chooseTreeUrl()
+  {
+
+    JLabel label = new JLabel(
+            MessageManager.getString("label.tree_url_example"));
+    // add "example" button
+    final JComboBox<String> history = new JComboBox<>();
+
+    JPanel panel = new JPanel(new GridLayout(2, 1));
+    panel.add(label);
+    panel.add(history);
+    history.setPreferredSize(new Dimension(400, 20));
+    history.setEditable(true);
+    history.addItem("http://www.");
+
+    String historyItems = jalview.bin.Cache.getProperty("RECENT_URL");
+
+    StringTokenizer st;
+
+    if (historyItems != null)
+      {
+      st = new StringTokenizer(historyItems, "\t");
+
+      while (st.hasMoreTokens())
+      {
+        history.addItem(st.nextToken());
+      }
+      }
+
+    int reply = JvOptionPane.showInternalConfirmDialog(this, panel,
+            MessageManager.getString("label.load_tree_url"),
+            JvOptionPane.OK_CANCEL_OPTION);
+
+    if (reply == JvOptionPane.OK_OPTION)
+    {
+
+      String urlString = history.getSelectedItem().toString();
+      URL treeUrl;
+
+      try
+      {
+        FileFormatI format = null;
+
+        format = new IdentifyFile().identify(urlString, DataSourceType.URL);
+        // add actual use for the format identification (jalview .jar files)
+        treeUrl = new URL(urlString);
+        AptxInit.createInstanceFromUrl(treeUrl, viewport);
+
+      } catch (IOException | RuntimeException e)
+      {
+        JvOptionPane.showMessageDialog(this, MessageManager.formatMessage(
+                "exception.failed_to_read_data_from_source", new String[]
+                { urlString }),
+                MessageManager.getString("label.url_not_found"),
+                JvOptionPane.ERROR_MESSAGE);
+        e.printStackTrace();
+      }
+    }
+    else
+    {
+
+    }
+  }
+
+  public void chooseTreeDb()
+  {
   }
 
   public TreePanel showNewickTree(NewickFile nf, String treeTitle)
@@ -4225,6 +4430,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           final JMenu seqsrchmenu = new JMenu("Sequence Database Search");
           final JMenu analymenu = new JMenu("Analysis");
           final JMenu dismenu = new JMenu("Protein Disorder");
+          final JMenu phylogenmenu = new JMenu("Phylogenetic inference");
+
           // JAL-940 - only show secondary structure prediction services from
           // the legacy server
           if (// Cache.getDefault("SHOW_JWS1_SERVICES", true)
@@ -4264,6 +4471,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           wsmenu.add(secstrmenu);
           wsmenu.add(dismenu);
           wsmenu.add(analymenu);
+          wsmenu.add(phylogenmenu);
           // No search services yet
           // wsmenu.add(seqsrchmenu);
 
@@ -4371,7 +4579,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         }
         buildingMenu = false;
       }
-    }).start();
+    }, "BuildWebServiceThread").start();
 
   }
 
@@ -4479,7 +4687,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   protected void showProductsFor(final SequenceI[] sel, final boolean _odna,
           final String source)
   {
-    new Thread(CrossRefAction.getHandlerFor(sel, _odna, source, this))
+    new Thread(CrossRefAction.getHandlerFor(sel, _odna, source, this),
+            "CrossReferencesThread")
             .start();
   }
 
@@ -4788,7 +4997,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
             ex.printStackTrace();
           }
         }
-      }).start();
+      }, "DropFileThread").start();
     }
   }
 
@@ -5187,7 +5396,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
             });
             dbRefFetcher.fetchDBRefs(false);
           }
-        }).start();
+        }, "BuildFetchDBMenuThread").start();
 
       }