rio, lca, refactoring
[jalview.git] / forester / java / src / org / forester / archaeopteryx / ArchaeopteryxE.java
index 51f09b0..c388c5e 100644 (file)
@@ -7,10 +7,14 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.net.URL;
+import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
 
 import javax.swing.ButtonGroup;
 import javax.swing.JApplet;
@@ -25,6 +29,8 @@ import javax.swing.UnsupportedLookAndFeelException;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 
+import org.apache.commons.codec.binary.Base64;
+import org.forester.archaeopteryx.AptxUtil.GraphicsExportType;
 import org.forester.archaeopteryx.Options.CLADOGRAM_TYPE;
 import org.forester.archaeopteryx.Options.NODE_LABEL_DIRECTION;
 import org.forester.archaeopteryx.Options.PHYLOGENY_GRAPHICS_TYPE;
@@ -47,73 +53,76 @@ import org.forester.util.ForesterUtil;
 // </applet>
 public class ArchaeopteryxE extends JApplet implements ActionListener {
 
-    private final static String  NAME             = "ArchaeopteryxE";
-    private static final long    serialVersionUID = -1220055577935759443L;
-    private Configuration        _configuration;
-    private MainPanelApplets     _main_panel;
-    private JMenuBar             _jmenubar;
-    private JMenu                _options_jmenu;
-    private JMenu                _font_size_menu;
-    private JMenuItem            _super_tiny_fonts_mi;
-    private JMenuItem            _tiny_fonts_mi;
-    private JMenuItem            _small_fonts_mi;
-    private JMenuItem            _medium_fonts_mi;
-    private JMenuItem            _large_fonts_mi;
-    private TextFrame            _textframe;
-    private JMenu                _tools_menu;
-    private JMenuItem            _taxcolor_item;
-    private JMenuItem            _confcolor_item;
-    private JMenuItem            _midpoint_root_item;
-    private JMenu                _view_jmenu;
-    private JMenuItem            _view_as_XML_item;
-    private JMenuItem            _view_as_NH_item;
-    private JMenuItem            _view_as_NHX_item;
-    private JMenuItem            _view_as_nexus_item;
-    private JMenu                _type_menu;
-    private JCheckBoxMenuItem    _rectangular_type_cbmi;
-    private JCheckBoxMenuItem    _triangular_type_cbmi;
-    private JCheckBoxMenuItem    _curved_type_cbmi;
-    private JCheckBoxMenuItem    _convex_type_cbmi;
-    private JCheckBoxMenuItem    _euro_type_cbmi;
-    private JCheckBoxMenuItem    _rounded_type_cbmi;
-    private JCheckBoxMenuItem    _unrooted_type_cbmi;
-    private JCheckBoxMenuItem    _circular_type_cbmi;
-    private JMenuItem            _help_item;
-    private JMenuItem            _about_item;
-    private JMenu                _help_jmenu;
-    private JMenuItem            _website_item;
-    private JMenuItem            _phyloxml_website_item;
-    private JMenuItem            _phyloxml_ref_item;
-    private JMenuItem            _aptx_ref_item;
-    private JMenuItem            _remove_branch_color_item;
-    private JMenuItem            _infer_common_sn_names_item;
-    private JCheckBoxMenuItem    _show_domain_labels;
-    private JCheckBoxMenuItem    _color_labels_same_as_parent_branch;
-    private JCheckBoxMenuItem    _abbreviate_scientific_names;
-    private JCheckBoxMenuItem    _screen_antialias_cbmi;
-    private JCheckBoxMenuItem    _background_gradient_cbmi;
-    private JRadioButtonMenuItem _non_lined_up_cladograms_rbmi;
-    private JRadioButtonMenuItem _uniform_cladograms_rbmi;
-    private JRadioButtonMenuItem _ext_node_dependent_cladogram_rbmi;
-    private Options              _options;
-    private JMenuItem            _choose_font_mi;
-    private JMenuItem            _switch_colors_mi;
-    JCheckBoxMenuItem            _label_direction_cbmi;
-    private JCheckBoxMenuItem    _show_scale_cbmi;
-    private JCheckBoxMenuItem    _search_case_senstive_cbmi;
-    private JCheckBoxMenuItem    _search_whole_words_only_cbmi;
-    private JCheckBoxMenuItem    _inverse_search_result_cbmi;
-    private JCheckBoxMenuItem    _show_overview_cbmi;
-    private JMenuItem            _choose_minimal_confidence_mi;
-    private JCheckBoxMenuItem    _show_branch_length_values_cbmi;
-    private JMenuItem            _collapse_species_specific_subtrees;
-    private JMenuItem            _overview_placment_mi;
-    private ButtonGroup          _radio_group_1;
-    private JCheckBoxMenuItem    _show_default_node_shapes_cbmi;
-    private JMenuItem            _cycle_node_shape_mi;
-    private JMenuItem            _cycle_node_fill_mi;
-    private JMenuItem            _choose_node_size_mi;
-    private JCheckBoxMenuItem    _taxonomy_colorize_node_shapes_cbmi;
+    private final static String         NAME                  = "ArchaeopteryxE";
+    private static final long           serialVersionUID      = -1220055577935759443L;
+    private Configuration               _configuration;
+    private MainPanelApplets            _main_panel;
+    private JMenuBar                    _jmenubar;
+    private JMenu                       _options_jmenu;
+    private JMenu                       _font_size_menu;
+    private JMenuItem                   _super_tiny_fonts_mi;
+    private JMenuItem                   _tiny_fonts_mi;
+    private JMenuItem                   _small_fonts_mi;
+    private JMenuItem                   _medium_fonts_mi;
+    private JMenuItem                   _large_fonts_mi;
+    private JMenu                       _tools_menu;
+    private JMenuItem                   _taxcolor_item;
+    private JMenuItem                   _confcolor_item;
+    private JMenuItem                   _midpoint_root_item;
+    private JMenu                       _view_jmenu;
+    private JMenuItem                   _view_as_XML_item;
+    private JMenuItem                   _view_as_NH_item;
+    private JMenuItem                   _view_as_NHX_item;
+    private JMenuItem                   _view_as_nexus_item;
+    private JMenuItem                   _display_basic_information_item;
+    private JMenu                       _type_menu;
+    private JCheckBoxMenuItem           _rectangular_type_cbmi;
+    private JCheckBoxMenuItem           _triangular_type_cbmi;
+    private JCheckBoxMenuItem           _curved_type_cbmi;
+    private JCheckBoxMenuItem           _convex_type_cbmi;
+    private JCheckBoxMenuItem           _euro_type_cbmi;
+    private JCheckBoxMenuItem           _rounded_type_cbmi;
+    private JCheckBoxMenuItem           _unrooted_type_cbmi;
+    private JCheckBoxMenuItem           _circular_type_cbmi;
+    private JMenuItem                   _help_item;
+    private JMenuItem                   _about_item;
+    private JMenu                       _help_jmenu;
+    private JMenuItem                   _website_item;
+    private JMenuItem                   _phyloxml_website_item;
+    private JMenuItem                   _phyloxml_ref_item;
+    private JMenuItem                   _aptx_ref_item;
+    private JMenuItem                   _remove_branch_color_item;
+    private JMenuItem                   _infer_common_sn_names_item;
+    private JCheckBoxMenuItem           _show_domain_labels;
+    private JCheckBoxMenuItem           _color_labels_same_as_parent_branch;
+    private JCheckBoxMenuItem           _abbreviate_scientific_names;
+    private JCheckBoxMenuItem           _screen_antialias_cbmi;
+    private JCheckBoxMenuItem           _background_gradient_cbmi;
+    private JRadioButtonMenuItem        _non_lined_up_cladograms_rbmi;
+    private JRadioButtonMenuItem        _uniform_cladograms_rbmi;
+    private JRadioButtonMenuItem        _ext_node_dependent_cladogram_rbmi;
+    private Options                     _options;
+    private JMenuItem                   _choose_font_mi;
+    private JMenuItem                   _switch_colors_mi;
+    JCheckBoxMenuItem                   _label_direction_cbmi;
+    private JCheckBoxMenuItem           _show_scale_cbmi;
+    private JCheckBoxMenuItem           _search_case_senstive_cbmi;
+    private JCheckBoxMenuItem           _search_whole_words_only_cbmi;
+    private JCheckBoxMenuItem           _inverse_search_result_cbmi;
+    private JCheckBoxMenuItem           _show_overview_cbmi;
+    private JMenuItem                   _choose_minimal_confidence_mi;
+    private JCheckBoxMenuItem           _show_branch_length_values_cbmi;
+    private JMenuItem                   _collapse_species_specific_subtrees;
+    private JMenuItem                   _overview_placment_mi;
+    private ButtonGroup                 _radio_group_1;
+    private JCheckBoxMenuItem           _show_default_node_shapes_cbmi;
+    private JMenuItem                   _cycle_node_shape_mi;
+    private JMenuItem                   _cycle_node_fill_mi;
+    private JMenuItem                   _choose_node_size_mi;
+    private JCheckBoxMenuItem           _taxonomy_colorize_node_shapes_cbmi;
+    private JCheckBoxMenuItem           _show_confidence_stddev_cbmi;
+    private final LinkedList<TextFrame> _textframes           = new LinkedList<TextFrame>();
+    private String                      _ext_node_data_buffer = "";
 
     @Override
     public void actionPerformed( final ActionEvent e ) {
@@ -143,6 +152,9 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         else if ( o == _switch_colors_mi ) {
             switchColors();
         }
+        else if ( o == _display_basic_information_item ) {
+            displayBasicInformation();
+        }
         else if ( o == _view_as_NH_item ) {
             viewAsNH();
         }
@@ -233,6 +245,9 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         else if ( o == _show_branch_length_values_cbmi ) {
             updateOptions( getOptions() );
         }
+        else if ( o == _show_confidence_stddev_cbmi ) {
+            updateOptions( getOptions() );
+        }
         else if ( o == _label_direction_cbmi ) {
             updateOptions( getOptions() );
         }
@@ -270,11 +285,11 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
             MainFrame.about();
         }
         else if ( o == _help_item ) {
-            MainFrame.help( getConfiguration().getWebLinks() );
+            help( getConfiguration().getWebLinks() );
         }
         else if ( o == _website_item ) {
             try {
-                Util.openWebsite( Constants.APTX_WEB_SITE, true, this );
+                AptxUtil.openWebsite( Constants.APTX_WEB_SITE, true, this );
             }
             catch ( final IOException e1 ) {
                 ForesterUtil.printErrorMessage( Constants.PRG_NAME, e1.toString() );
@@ -282,7 +297,7 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         }
         else if ( o == _phyloxml_website_item ) {
             try {
-                Util.openWebsite( Constants.PHYLOXML_WEB_SITE, true, this );
+                AptxUtil.openWebsite( Constants.PHYLOXML_WEB_SITE, true, this );
             }
             catch ( final IOException e1 ) {
                 ForesterUtil.printErrorMessage( Constants.PRG_NAME, e1.toString() );
@@ -290,7 +305,7 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         }
         else if ( o == _aptx_ref_item ) {
             try {
-                Util.openWebsite( Constants.APTX_REFERENCE_URL, true, this );
+                AptxUtil.openWebsite( Constants.APTX_REFERENCE_URL, true, this );
             }
             catch ( final IOException e1 ) {
                 ForesterUtil.printErrorMessage( Constants.PRG_NAME, e1.toString() );
@@ -298,7 +313,7 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         }
         else if ( o == _phyloxml_ref_item ) {
             try {
-                Util.openWebsite( Constants.PHYLOXML_REFERENCE_URL, true, this );
+                AptxUtil.openWebsite( Constants.PHYLOXML_REFERENCE_URL, true, this );
             }
             catch ( final IOException e1 ) {
                 ForesterUtil.printErrorMessage( Constants.PRG_NAME, e1.toString() );
@@ -307,6 +322,85 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         repaint();
     }
 
+    void help( final Map<String, WebLink> weblinks ) {
+        final StringBuilder sb = new StringBuilder();
+        sb.append( "Display options\n" );
+        sb.append( "-------------------\n" );
+        sb.append( "Use the checkboxes to select types of information to display on the tree.\n\n" );
+        sb.append( "Clickable tree nodes\n" );
+        sb.append( "--------------------\n" );
+        sb.append( "Tree nodes can be clicked, the action is determined by the 'click on node to' menu\n" );
+        sb.append( "or by right clicking:\n" );
+        sb.append( "o  Display Node Data -- display information for a node\n" );
+        sb.append( "o  Collapse/Uncollapse -- collapse and uncollapse subtree from clicked node\n" );
+        sb.append( "o  Root/Reroot -- change tree root to clicked node\n" );
+        sb.append( "o  Sub/Super Tree -- toggle between subtree from clicked node and whole tree\n" );
+        sb.append( "o  Swap Descendants -- switch descendant on either side of clicked node\n" );
+        sb.append( "o  Colorize Subtree -- color a subtree\n" );
+        sb.append( "o  Open Sequence Web -- launch a web browser to display sequence information\n" );
+        sb.append( "o  Open Taxonomy Web -- launch a web browser to display taxonomy information\n" );
+        sb.append( "-  there may be additional choices depending on this particular setup\n\n" );
+        sb.append( "Right clicking on a node always displays the information of a node.\n\n" );
+        sb.append( "Zooming\n" );
+        sb.append( "---------\n" );
+        sb.append( "The mouse wheel and the plus and minus keys control zooming.\n" );
+        sb.append( "Mouse wheel+Ctrl changes the text size.\n" );
+        sb.append( "Mouse wheel+Shift controls zooming in vertical direction only.\n" );
+        sb.append( "Use the buttons on the control panel to zoom the tree in and out, horizontally or vertically.\n" );
+        sb.append( "The entire tree can be fitted into the window by clicking the \"F\" button, or by pressing F, Delete, or Home.\n" );
+        sb.append( "The up, down, left, and right keys can be used to move the visible part (if zoomed in).\n" );
+        sb.append( "Up, down, left, and right+Shift can be used to control zooming horizontally and vertically.\n" );
+        sb.append( "Plus and minus keys+Ctrl change the text size; F+Ctrl, Delete+Ctrl, or Home+Ctrl resets it.\n\n" );
+        sb.append( "Quick tree manipulation:\n" );
+        sb.append( "------------------------\n" );
+        sb.append( "Order Subtrees -- order the tree by branch length\n" );
+        sb.append( "Uncollapse All -- uncollapse any and all collapsed branches\n\n" );
+        sb.append( "Memory problems (Java heap space error)\n" );
+        sb.append( "---------------------------------------\n" );
+        sb.append( "Since the Java default memory allocation is quite small, it might by necessary (for trees\n" );
+        sb.append( "with more than approximately 5000 external nodes) to increase the memory which Java can use, with\n" );
+        sb.append( "the '-Xmx' Java command line option. For example:\n" );
+        sb.append( "java -Xms32m -Xmx256m -cp path\\to\\forester.jar org.forester.archaeopteryx.Archaeopteryx\n\n" );
+        if ( ( weblinks != null ) && ( weblinks.size() > 0 ) ) {
+            sb.append( "Active web links\n" );
+            sb.append( "--------------------\n" );
+            for( final String key : weblinks.keySet() ) {
+                sb.append( " " + weblinks.get( key ).toString() + "\n" );
+            }
+        }
+        sb.append( "\n" );
+        sb.append( "phyloXML\n" );
+        sb.append( "-------------------\n" );
+        sb.append( "Reference: " + Constants.PHYLOXML_REFERENCE + "\n" );
+        sb.append( "Website: " + Constants.PHYLOXML_WEB_SITE + "\n" );
+        sb.append( "Version: " + ForesterConstants.PHYLO_XML_VERSION + "\n" );
+        sb.append( "\n" );
+        sb.append( "For more information: http://www.phylosoft.org/archaeopteryx/\n" );
+        sb.append( "Email: " + Constants.AUTHOR_EMAIL + "\n\n" );
+        TextFrame.instantiate( sb.toString(), "Help", _textframes );
+    }
+
+    void setCurrentExternalNodesDataBuffer( final String s ) {
+        if ( !ForesterUtil.isEmpty( s ) ) {
+            _ext_node_data_buffer = s.trim();
+        }
+        else {
+            _ext_node_data_buffer = "";
+        }
+    }
+
+    /**
+     * This method returns the current external node data which
+     * has been selected by the user by clicking the "Return ..."
+     * menu item. This method is expected to be called from Javascript or
+     * something like it.
+     * 
+     * @return current external node data as String
+     */
+    public String getCurrentExternalNodesDataBuffer() {
+        return _ext_node_data_buffer;
+    }
+
     /**
      * This method returns the current phylogeny as a string in the chosen format
      * 
@@ -315,7 +409,7 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
      * @author Herve Menager
      */
     public String getCurrentPhylogeny( final String format ) {
-        removeTextFrame();
+        removeAllTextFrames();
         if ( ( getMainPanel().getCurrentPhylogeny() == null ) || getMainPanel().getCurrentPhylogeny().isEmpty()
                 || ( getMainPanel().getCurrentPhylogeny().getNumberOfExternalNodes() > 10000 ) ) {
             return new String();
@@ -335,6 +429,40 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         return new String();
     }
 
+    /**
+     * This method returns a view of the current phylogeny in a chosen 
+     * graphics format, base64-encoded in a string so that in can be used
+     * from javascript.
+     * 
+     * @param format must be GraphicsExportType (gif, jpg, pdf, png, tif, bmp)
+     * @return the phylogeny string
+     * @author Herve Menager
+     */
+    public String getCurrentPhylogenyGraphicsAsBase64EncodedString( final String format ) {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try {
+            AptxUtil.writePhylogenyToGraphicsByteArrayOutputStream( baos,
+                                                                    _main_panel.getWidth(),
+                                                                    _main_panel.getHeight(),
+                                                                    getCurrentTreePanel(),
+                                                                    getCurrentTreePanel().getControlPanel(),
+                                                                    GraphicsExportType.valueOf( format ),
+                                                                    getOptions() );
+        }
+        catch ( final IOException ioe ) {
+            ForesterUtil.printErrorMessage( NAME, ioe.toString() );
+            ioe.printStackTrace();
+            JOptionPane.showMessageDialog( this,
+                                           NAME + ": Failed to generate graphics: " + "\nException: " + ioe,
+                                           "Failed to generate graphics",
+                                           JOptionPane.ERROR_MESSAGE );
+            return null;
+        }
+        final byte[] bytes = baos.toByteArray();
+        final String dataImg = Base64.encodeBase64String( bytes );
+        return dataImg;
+    }
+
     void buildFontSizeMenu() {
         _font_size_menu = MainFrame.createMenu( MainFrame.FONT_SIZE_MENU_LABEL, getConfiguration() );
         _font_size_menu.add( _super_tiny_fonts_mi = new JMenuItem( "Super tiny fonts" ) );
@@ -405,7 +533,11 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         _radio_group_1.add( _ext_node_dependent_cladogram_rbmi );
         _radio_group_1.add( _uniform_cladograms_rbmi );
         _radio_group_1.add( _non_lined_up_cladograms_rbmi );
-        //
+        _options_jmenu.add( _show_overview_cbmi = new JCheckBoxMenuItem( MainFrame.SHOW_OVERVIEW_LABEL ) );
+        _options_jmenu.add( _show_scale_cbmi = new JCheckBoxMenuItem( MainFrame.DISPLAY_SCALE_LABEL ) );
+        _options_jmenu
+                .add( _show_branch_length_values_cbmi = new JCheckBoxMenuItem( MainFrame.DISPLAY_BRANCH_LENGTH_VALUES_LABEL ) );
+        _options_jmenu.add( _show_confidence_stddev_cbmi = new JCheckBoxMenuItem( MainFrame.SHOW_CONF_STDDEV_LABEL ) );
         _options_jmenu
                 .add( _show_default_node_shapes_cbmi = new JCheckBoxMenuItem( MainFrame.DISPLAY_NODE_BOXES_LABEL ) );
         _options_jmenu
@@ -413,11 +545,6 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         _options_jmenu.add( _cycle_node_shape_mi = new JMenuItem( MainFrame.CYCLE_NODE_SHAPE_LABEL ) );
         _options_jmenu.add( _cycle_node_fill_mi = new JMenuItem( MainFrame.CYCLE_NODE_FILL_LABEL ) );
         _options_jmenu.add( _choose_node_size_mi = new JMenuItem( MainFrame.CHOOSE_NODE_SIZE_LABEL ) );
-        //
-        _options_jmenu.add( _show_scale_cbmi = new JCheckBoxMenuItem( MainFrame.DISPLAY_SCALE_LABEL ) );
-        _options_jmenu
-                .add( _show_branch_length_values_cbmi = new JCheckBoxMenuItem( MainFrame.DISPLAY_BRANCH_LENGTH_VALUES_LABEL ) );
-        _options_jmenu.add( _show_overview_cbmi = new JCheckBoxMenuItem( MainFrame.SHOW_OVERVIEW_LABEL ) );
         _options_jmenu.add( _label_direction_cbmi = new JCheckBoxMenuItem( MainFrame.LABEL_DIRECTION_LABEL ) );
         _options_jmenu
                 .add( _color_labels_same_as_parent_branch = new JCheckBoxMenuItem( MainFrame.COLOR_LABELS_LABEL ) );
@@ -469,6 +596,7 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         customizeCheckBoxMenuItem( _show_overview_cbmi, getOptions().isShowOverview() );
         customizeCheckBoxMenuItem( _search_whole_words_only_cbmi, getOptions().isMatchWholeTermsOnly() );
         customizeCheckBoxMenuItem( _inverse_search_result_cbmi, getOptions().isInverseSearchResult() );
+        customizeCheckBoxMenuItem( _show_confidence_stddev_cbmi, getOptions().isShowConfidenceStddev() );
         _jmenubar.add( _options_jmenu );
     }
 
@@ -518,11 +646,14 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
     }
 
     void buildViewMenu() {
-        _view_jmenu = MainFrame.createMenu( "View as Text", getConfiguration() );
+        _view_jmenu = MainFrame.createMenu( "View", getConfiguration() );
+        _view_jmenu.add( _display_basic_information_item = new JMenuItem( "Display Basic Information" ) );
+        _view_jmenu.addSeparator();
         _view_jmenu.add( _view_as_XML_item = new JMenuItem( "View as phyloXML" ) );
         _view_jmenu.add( _view_as_NH_item = new JMenuItem( "View as Newick" ) );
         _view_jmenu.add( _view_as_NHX_item = new JMenuItem( "View as NHX" ) );
         _view_jmenu.add( _view_as_nexus_item = new JMenuItem( "View as Nexus" ) );
+        customizeJMenuItem( _display_basic_information_item );
         customizeJMenuItem( _view_as_NH_item );
         customizeJMenuItem( _view_as_NHX_item );
         customizeJMenuItem( _view_as_XML_item );
@@ -603,8 +734,8 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
 
     @Override
     public void destroy() {
-        Util.printAppletMessage( NAME, "going to be destroyed " );
-        removeTextFrame();
+        AptxUtil.printAppletMessage( NAME, "going to be destroyed " );
+        removeAllTextFrames();
         if ( getMainPanel() != null ) {
             getMainPanel().terminate();
         }
@@ -637,15 +768,15 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
     @Override
     public void init() {
         final String config_filename = getParameter( Constants.APPLET_PARAM_NAME_FOR_CONFIG_FILE_URL );
-        Util.printAppletMessage( NAME, "URL for configuration file is: " + config_filename );
-        final Configuration configuration = new Configuration( config_filename, true, true );
+        AptxUtil.printAppletMessage( NAME, "URL for configuration file is: " + config_filename );
+        final Configuration configuration = new Configuration( config_filename, true, true, true );
         setConfiguration( configuration );
         setOptions( Options.createInstance( configuration ) );
         setupUI();
         URL phys_url = null;
         Phylogeny[] phys = null;
         final String phys_url_string = getParameter( Constants.APPLET_PARAM_NAME_FOR_URL_OF_TREE_TO_LOAD );
-        Util.printAppletMessage( NAME, "URL for phylogenies is " + phys_url_string );
+        AptxUtil.printAppletMessage( NAME, "URL for phylogenies is " + phys_url_string );
         // Get URL to tree file
         if ( phys_url_string != null ) {
             try {
@@ -661,7 +792,7 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         // Load the tree from URL
         if ( phys_url != null ) {
             try {
-                phys = Util.readPhylogeniesFromUrl( phys_url, getConfiguration().isValidatePhyloXmlAgainstSchema() );
+                phys = AptxUtil.readPhylogeniesFromUrl( phys_url, getConfiguration().isValidatePhyloXmlAgainstSchema() );
             }
             catch ( final Exception e ) {
                 ForesterUtil.printErrorMessage( NAME, e.toString() );
@@ -681,7 +812,7 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
             return;
         }
         else {
-            Util.printAppletMessage( NAME, "loaded " + phys.length + " phylogenies from: " + phys_url );
+            AptxUtil.printAppletMessage( NAME, "loaded " + phys.length + " phylogenies from: " + phys_url );
         }
         setVisible( false );
         setMainPanel( new MainPanelApplets( getConfiguration(), this ) );
@@ -715,23 +846,23 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
             }
         } );
         if ( getConfiguration().isUseTabbedDisplay() ) {
-            Util.printAppletMessage( NAME, "using tabbed display" );
-            Util.addPhylogeniesToTabs( phys,
-                                       new File( phys_url.getFile() ).getName(),
-                                       phys_url.toString(),
-                                       getConfiguration(),
-                                       getMainPanel() );
+            AptxUtil.printAppletMessage( NAME, "using tabbed display" );
+            AptxUtil.addPhylogeniesToTabs( phys,
+                                           new File( phys_url.getFile() ).getName(),
+                                           phys_url.toString(),
+                                           getConfiguration(),
+                                           getMainPanel() );
         }
         else {
-            Util.printAppletMessage( NAME, "not using tabbed display" );
-            Util.addPhylogenyToPanel( phys, getConfiguration(), getMainPanel() );
+            AptxUtil.printAppletMessage( NAME, "not using tabbed display" );
+            AptxUtil.addPhylogenyToPanel( phys, getConfiguration(), getMainPanel() );
         }
         validate();
         setName( NAME );
         getMainPanel().getControlPanel().showWholeAll();
         getMainPanel().getControlPanel().showWhole();
         System.gc();
-        Util.printAppletMessage( NAME, "successfully initialized" );
+        AptxUtil.printAppletMessage( NAME, "successfully initialized" );
         /* GUILHEM_BEG */
         getCurrentTreePanel().getControlPanel().getSequenceRelationTypeBox().removeAllItems();
         for( final SequenceRelation.SEQUENCE_RELATION_TYPE type : getMainPanel().getCurrentPhylogeny()
@@ -791,14 +922,7 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
 
     private void removeBranchColors() {
         if ( getMainPanel().getCurrentPhylogeny() != null ) {
-            Util.removeBranchColors( getMainPanel().getCurrentPhylogeny() );
-        }
-    }
-
-    void removeTextFrame() {
-        if ( _textframe != null ) {
-            _textframe.close();
-            _textframe = null;
+            AptxUtil.removeBranchColors( getMainPanel().getCurrentPhylogeny() );
         }
     }
 
@@ -888,19 +1012,19 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
             }
         }
         catch ( final UnsupportedLookAndFeelException e ) {
-            Util.dieWithSystemError( "UnsupportedLookAndFeelException: " + e.toString() );
+            AptxUtil.dieWithSystemError( "UnsupportedLookAndFeelException: " + e.toString() );
         }
         catch ( final ClassNotFoundException e ) {
-            Util.dieWithSystemError( "ClassNotFoundException: " + e.toString() );
+            AptxUtil.dieWithSystemError( "ClassNotFoundException: " + e.toString() );
         }
         catch ( final InstantiationException e ) {
-            Util.dieWithSystemError( "InstantiationException: " + e.toString() );
+            AptxUtil.dieWithSystemError( "InstantiationException: " + e.toString() );
         }
         catch ( final IllegalAccessException e ) {
-            Util.dieWithSystemError( "IllegalAccessException: " + e.toString() );
+            AptxUtil.dieWithSystemError( "IllegalAccessException: " + e.toString() );
         }
         catch ( final Exception e ) {
-            Util.dieWithSystemError( e.toString() );
+            AptxUtil.dieWithSystemError( e.toString() );
         }
     }
 
@@ -912,7 +1036,7 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         requestFocus();
         requestFocusInWindow();
         requestFocus();
-        Util.printAppletMessage( NAME, "started" );
+        AptxUtil.printAppletMessage( NAME, "started" );
     }
 
     void switchColors() {
@@ -981,6 +1105,8 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
             }
         }
         options.setShowOverview( ( _show_overview_cbmi != null ) && _show_overview_cbmi.isSelected() );
+        options.setShowConfidenceStddev( ( _show_confidence_stddev_cbmi != null )
+                && _show_confidence_stddev_cbmi.isSelected() );
         if ( ( _show_branch_length_values_cbmi != null ) && _show_branch_length_values_cbmi.isEnabled() ) {
             options.setShowBranchLengthValues( _show_branch_length_values_cbmi.isSelected() );
         }
@@ -1019,40 +1145,88 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         ( ( JCheckBoxMenuItem ) o ).setSelected( true );
     }
 
+    void displayBasicInformation() {
+        if ( ( getMainPanel().getCurrentPhylogeny() != null ) && !getMainPanel().getCurrentPhylogeny().isEmpty() ) {
+            String title = "Basic Information";
+            if ( !ForesterUtil.isEmpty( getMainPanel().getCurrentPhylogeny().getName() ) ) {
+                title = getMainPanel().getCurrentPhylogeny().getName() + " " + title;
+            }
+            showTextFrame( AptxUtil.createBasicInformation( getMainPanel().getCurrentPhylogeny() ), title );
+        }
+    }
+
     void viewAsNexus() {
-        removeTextFrame();
-        if ( ( getMainPanel().getCurrentPhylogeny() == null ) || getMainPanel().getCurrentPhylogeny().isEmpty()
-                || ( getMainPanel().getCurrentPhylogeny().getNumberOfExternalNodes() > 10000 ) ) {
-            return;
+        if ( ( getMainPanel().getCurrentPhylogeny() != null ) && !getMainPanel().getCurrentPhylogeny().isEmpty() ) {
+            String title = "Nexus";
+            if ( !ForesterUtil.isEmpty( getMainPanel().getCurrentPhylogeny().getName() ) ) {
+                title = getMainPanel().getCurrentPhylogeny().getName() + " " + title;
+            }
+            showTextFrame( getMainPanel().getCurrentPhylogeny().toNexus( getOptions()
+                                   .getNhConversionSupportValueStyle() ),
+                           title );
         }
-        _textframe = TextFrame.instantiate( getMainPanel().getCurrentPhylogeny().toNexus() );
     }
 
     void viewAsNH() {
-        removeTextFrame();
-        if ( ( getMainPanel().getCurrentPhylogeny() == null ) || getMainPanel().getCurrentPhylogeny().isEmpty()
-                || ( getMainPanel().getCurrentPhylogeny().getNumberOfExternalNodes() > 10000 ) ) {
-            return;
+        if ( ( getMainPanel().getCurrentPhylogeny() != null ) && !getMainPanel().getCurrentPhylogeny().isEmpty() ) {
+            String title = "New Hampshire";
+            if ( !ForesterUtil.isEmpty( getMainPanel().getCurrentPhylogeny().getName() ) ) {
+                title = getMainPanel().getCurrentPhylogeny().getName() + " " + title;
+            }
+            showTextFrame( getMainPanel().getCurrentPhylogeny()
+                                   .toNewHampshire( false, getOptions().getNhConversionSupportValueStyle() ),
+                           title );
         }
-        _textframe = TextFrame.instantiate( getMainPanel().getCurrentPhylogeny().toNewHampshire( false ) );
     }
 
     void viewAsNHX() {
-        removeTextFrame();
-        if ( ( getMainPanel().getCurrentPhylogeny() == null ) || getMainPanel().getCurrentPhylogeny().isEmpty()
-                || ( getMainPanel().getCurrentPhylogeny().getNumberOfExternalNodes() > 10000 ) ) {
-            return;
+        if ( ( getMainPanel().getCurrentPhylogeny() != null ) && !getMainPanel().getCurrentPhylogeny().isEmpty() ) {
+            String title = "NHX";
+            if ( !ForesterUtil.isEmpty( getMainPanel().getCurrentPhylogeny().getName() ) ) {
+                title = getMainPanel().getCurrentPhylogeny().getName() + " " + title;
+            }
+            showTextFrame( getMainPanel().getCurrentPhylogeny().toNewHampshireX(), title );
         }
-        _textframe = TextFrame.instantiate( getMainPanel().getCurrentPhylogeny().toNewHampshireX() );
     }
 
     void viewAsXML() {
-        removeTextFrame();
-        if ( ( getMainPanel().getCurrentPhylogeny() == null ) || getMainPanel().getCurrentPhylogeny().isEmpty()
-                || ( getMainPanel().getCurrentPhylogeny().getNumberOfExternalNodes() > 10000 ) ) {
-            return;
+        if ( ( getMainPanel().getCurrentPhylogeny() != null ) && !getMainPanel().getCurrentPhylogeny().isEmpty() ) {
+            String title = "phyloXML";
+            if ( !ForesterUtil.isEmpty( getMainPanel().getCurrentPhylogeny().getName() ) ) {
+                title = getMainPanel().getCurrentPhylogeny().getName() + " " + title;
+            }
+            showTextFrame( getMainPanel().getCurrentPhylogeny().toPhyloXML( 0 ), title );
+        }
+    }
+
+    public void showTextFrame( final String s, final String title ) {
+        checkTextFrames();
+        _textframes.addLast( TextFrame.instantiate( s, title, _textframes ) );
+    }
+
+    void checkTextFrames() {
+        if ( _textframes.size() > 5 ) {
+            try {
+                if ( _textframes.getFirst() != null ) {
+                    _textframes.getFirst().removeMe();
+                }
+                else {
+                    _textframes.removeFirst();
+                }
+            }
+            catch ( final NoSuchElementException e ) {
+                // Ignore.
+            }
+        }
+    }
+
+    void removeAllTextFrames() {
+        for( final TextFrame tf : _textframes ) {
+            if ( tf != null ) {
+                tf.close();
+            }
         }
-        _textframe = TextFrame.instantiate( getMainPanel().getCurrentPhylogeny().toPhyloXML( 0 ) );
+        _textframes.clear();
     }
 
     static void setupScreenTextAntialias( final List<TreePanel> treepanels, final boolean antialias ) {