inprogress
[jalview.git] / forester / java / src / org / forester / archaeopteryx / ArchaeopteryxE.java
index 9e483b7..9146fe8 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,11 +29,14 @@ 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;
 import org.forester.phylogeny.Phylogeny;
 import org.forester.phylogeny.data.SequenceRelation;
+import org.forester.util.ForesterConstants;
 import org.forester.util.ForesterUtil;
 
 // Use like this:
@@ -46,70 +53,77 @@ 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_node_boxes_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 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_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 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_internal_cbmi;
+    private JCheckBoxMenuItem           _show_default_node_shapes_external_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                = "";
+    // private int                         _ext_node_data_buffer_change_counter = 0;
     @Override
     public void actionPerformed( final ActionEvent e ) {
         final Object o = e.getSource();
@@ -122,11 +136,6 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         else if ( o == _confcolor_item ) {
             getMainPanel().getCurrentTreePanel().confColor();
         }
-        else if ( o == _infer_common_sn_names_item ) {
-            if ( getCurrentTreePanel() != null ) {
-                getCurrentTreePanel().inferCommonPartOfScientificNames();
-            }
-        }
         else if ( o == _collapse_species_specific_subtrees ) {
             if ( getCurrentTreePanel() != null ) {
                 getCurrentTreePanel().collapseSpeciesSpecificSubtrees();
@@ -138,12 +147,12 @@ 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();
         }
-        else if ( o == _view_as_NHX_item ) {
-            viewAsNHX();
-        }
         else if ( o == _view_as_XML_item ) {
             viewAsXML();
         }
@@ -186,11 +195,17 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         else if ( o == _choose_minimal_confidence_mi ) {
             chooseMinimalConfidence();
         }
+        else if ( o == _choose_node_size_mi ) {
+            MainFrame.chooseNodeSize( getOptions(), this );
+        }
         else if ( o == _overview_placment_mi ) {
             MainFrame.cycleOverview( getOptions(), getCurrentTreePanel() );
         }
-        else if ( o == _show_node_boxes_cbmi ) {
-            updateOptions( getOptions() );
+        else if ( o == _cycle_node_fill_mi ) {
+            MainFrame.cycleNodeFill( getOptions(), getCurrentTreePanel() );
+        }
+        else if ( o == _cycle_node_shape_mi ) {
+            MainFrame.cycleNodeShape( getOptions(), getCurrentTreePanel() );
         }
         else if ( o == _non_lined_up_cladograms_rbmi ) {
             updateOptions( getOptions() );
@@ -222,6 +237,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() );
         }
@@ -249,15 +267,24 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         else if ( o == _color_labels_same_as_parent_branch ) {
             updateOptions( getOptions() );
         }
+        else if ( o == _show_default_node_shapes_internal_cbmi ) {
+            updateOptions( getOptions() );
+        }
+        else if ( o == _show_default_node_shapes_external_cbmi ) {
+            updateOptions( getOptions() );
+        }
+        else if ( o == _taxonomy_colorize_node_shapes_cbmi ) {
+            updateOptions( getOptions() );
+        }
         else if ( o == _about_item ) {
             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() );
@@ -265,7 +292,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() );
@@ -273,7 +300,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() );
@@ -281,7 +308,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() );
@@ -290,6 +317,237 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         repaint();
     }
 
+    @Override
+    public void destroy() {
+        AptxUtil.printAppletMessage( NAME, "going to be destroyed " );
+        removeAllTextFrames();
+        if ( getMainPanel() != null ) {
+            getMainPanel().terminate();
+        }
+    }
+
+    /**
+     * 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 getCurrentTreePanel().getCurrentExternalNodesDataBufferAsString();
+    }
+
+    public int getCurrentExternalNodesDataBufferChangeCounter() {
+        return getCurrentTreePanel().getCurrentExternalNodesDataBufferChangeCounter();
+    }
+
+    public int getCurrentExternalNodesDataBufferLength() {
+        return getCurrentTreePanel().getCurrentExternalNodesDataBufferAsString().length();
+    }
+
+    /**
+     * This method returns the current phylogeny as a string in the chosen format
+     * 
+     * @param format must be NH, NHX, NEXUS or PHYLOXML
+     * @return the phylogeny string
+     * @author Herve Menager
+     */
+    public String getCurrentPhylogeny( final String format ) {
+        removeAllTextFrames();
+        if ( ( getMainPanel().getCurrentPhylogeny() == null ) || getMainPanel().getCurrentPhylogeny().isEmpty()
+                || ( getMainPanel().getCurrentPhylogeny().getNumberOfExternalNodes() > 10000 ) ) {
+            return new String();
+        }
+        switch ( ForesterConstants.PhylogeneticTreeFormats.valueOf( format ) ) {
+            case NH:
+                return getMainPanel().getCurrentPhylogeny().toNewHampshire();
+            case NHX:
+                return getMainPanel().getCurrentPhylogeny().toNewHampshireX();
+            case NEXUS:
+                return getMainPanel().getCurrentPhylogeny().toNexus();
+            case PHYLOXML:
+                return getMainPanel().getCurrentPhylogeny().toPhyloXML( -1 );
+            default:
+                break;
+        }
+        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;
+    }
+
+    public Options getOptions() {
+        return _options;
+    }
+
+    @Override
+    public void init() {
+        final String config_filename = getParameter( Constants.APPLET_PARAM_NAME_FOR_CONFIG_FILE_URL );
+        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 );
+        AptxUtil.printAppletMessage( NAME, "URL for phylogenies is " + phys_url_string );
+        // Get URL to tree file
+        if ( phys_url_string != null ) {
+            try {
+                phys_url = new URL( phys_url_string );
+            }
+            catch ( final Exception e ) {
+                ForesterUtil.printErrorMessage( NAME, "error: " + e );
+                e.printStackTrace();
+                JOptionPane.showMessageDialog( this, NAME + ": Could not create URL from: \"" + phys_url_string
+                        + "\"\nException: " + e, "Failed to create URL", JOptionPane.ERROR_MESSAGE );
+            }
+        }
+        // Load the tree from URL
+        if ( phys_url != null ) {
+            try {
+                phys = AptxUtil.readPhylogeniesFromUrl( phys_url,
+                                                        getConfiguration().isValidatePhyloXmlAgainstSchema(),
+                                                        getConfiguration().isReplaceUnderscoresInNhParsing(),
+                                                        getConfiguration().isInternalNumberAreConfidenceForNhParsing(),
+                                                        getConfiguration().getTaxonomyExtraction() );
+            }
+            catch ( final Exception e ) {
+                ForesterUtil.printErrorMessage( NAME, e.toString() );
+                e.printStackTrace();
+                JOptionPane.showMessageDialog( this,
+                                               NAME + ": Failed to read phylogenies: " + "\nException: " + e,
+                                               "Failed to read phylogenies",
+                                               JOptionPane.ERROR_MESSAGE );
+            }
+        }
+        if ( ( phys == null ) || ( phys.length < 1 ) ) {
+            ForesterUtil.printErrorMessage( NAME, "phylogenies from [" + phys_url + "] are null or empty" );
+            JOptionPane.showMessageDialog( this,
+                                           NAME + ": phylogenies from [" + phys_url + "] are null or empty",
+                                           "Failed to read phylogenies",
+                                           JOptionPane.ERROR_MESSAGE );
+            return;
+        }
+        else {
+            AptxUtil.printAppletMessage( NAME, "loaded " + phys.length + " phylogenies from: " + phys_url );
+        }
+        setVisible( false );
+        setMainPanel( new MainPanelApplets( getConfiguration(), this ) );
+        _jmenubar = new JMenuBar();
+        if ( !getConfiguration().isHideControlPanelAndMenubar() ) {
+            if ( !getConfiguration().isUseNativeUI() ) {
+                _jmenubar.setBackground( getConfiguration().getGuiMenuBackgroundColor() );
+            }
+            buildToolsMenu();
+            buildViewMenu();
+            buildFontSizeMenu();
+            buildOptionsMenu();
+            buildTypeMenu();
+            buildHelpMenu();
+            setJMenuBar( _jmenubar );
+        }
+        final Container contentpane = getContentPane();
+        contentpane.setLayout( new BorderLayout() );
+        contentpane.add( getMainPanel(), BorderLayout.CENTER );
+        addComponentListener( new ComponentAdapter() {
+
+            @Override
+            public void componentResized( final ComponentEvent e ) {
+                if ( getMainPanel().getCurrentTreePanel() != null ) {
+                    getMainPanel().getCurrentTreePanel().setParametersForPainting( getMainPanel().getCurrentTreePanel()
+                                                                                           .getWidth(),
+                                                                                   getMainPanel().getCurrentTreePanel()
+                                                                                           .getHeight(),
+                                                                                   false );
+                }
+            }
+        } );
+        if ( getConfiguration().isUseTabbedDisplay() ) {
+            AptxUtil.printAppletMessage( NAME, "using tabbed display" );
+            AptxUtil.addPhylogeniesToTabs( phys,
+                                           new File( phys_url.getFile() ).getName(),
+                                           phys_url.toString(),
+                                           getConfiguration(),
+                                           getMainPanel() );
+        }
+        else {
+            AptxUtil.printAppletMessage( NAME, "not using tabbed display" );
+            AptxUtil.addPhylogenyToPanel( phys, getConfiguration(), getMainPanel() );
+        }
+        validate();
+        setName( NAME );
+        getMainPanel().getControlPanel().showWholeAll();
+        getMainPanel().getControlPanel().showWhole();
+        System.gc();
+        AptxUtil.printAppletMessage( NAME, "successfully initialized" );
+        /* GUILHEM_BEG */
+        getCurrentTreePanel().getControlPanel().getSequenceRelationTypeBox().removeAllItems();
+        for( final SequenceRelation.SEQUENCE_RELATION_TYPE type : getMainPanel().getCurrentPhylogeny()
+                .getRelevantSequenceRelationTypes() ) {
+            getCurrentTreePanel().getControlPanel().getSequenceRelationTypeBox().addItem( type );
+        }
+        final String default_relation = getParameter( Constants.APPLET_PARAM_NAME_FOR_DEFAULT_SEQUENCE_RELATION_TYPE );
+        if ( default_relation != null ) {
+            getCurrentTreePanel().getControlPanel().getSequenceRelationTypeBox().setSelectedItem( default_relation );
+        }
+        final String default_sequence = getParameter( Constants.APPLET_PARAM_NAME_FOR_DEFAULT_QUERY_SEQUENCE );
+        if ( default_sequence != null ) {
+            getCurrentTreePanel().getControlPanel().getSequenceRelationBox().setSelectedItem( default_sequence );
+            /* GUILHEM_END */
+        }
+        setVisible( true );
+    }
+
+    public void showTextFrame( final String s, final String title ) {
+        checkTextFrames();
+        _textframes.addLast( TextFrame.instantiate( s, title, _textframes ) );
+    }
+
+    @Override
+    public void start() {
+        if ( getMainPanel() != null ) {
+            getMainPanel().validate();
+        }
+        requestFocus();
+        requestFocusInWindow();
+        requestFocus();
+        AptxUtil.printAppletMessage( NAME, "started" );
+    }
+
     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" ) );
@@ -331,7 +589,7 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
 
             @Override
             public void stateChanged( final ChangeEvent e ) {
-                MainFrame.setOvPlacementColorChooseMenuItem( _overview_placment_mi, getCurrentTreePanel() );
+                MainFrame.setOvPlacementColorChooseMenuItem( _overview_placment_mi, getOptions() );
                 MainFrame.setTextColorChooseMenuItem( _switch_colors_mi, getCurrentTreePanel() );
                 MainFrame
                         .setTextMinSupportMenuItem( _choose_minimal_confidence_mi, getOptions(), getCurrentTreePanel() );
@@ -344,6 +602,9 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
                                                                      _uniform_cladograms_rbmi,
                                                                      _ext_node_dependent_cladogram_rbmi,
                                                                      _label_direction_cbmi );
+                MainFrame.setCycleNodeFillMenuItem( _cycle_node_fill_mi, getOptions() );
+                MainFrame.setCycleNodeShapeMenuItem( _cycle_node_shape_mi, getOptions() );
+                MainFrame.setTextNodeSizeMenuItem( _choose_node_size_mi, getOptions() );
             }
         } );
         _options_jmenu.add( MainFrame.customizeMenuItemAsLabel( new JMenuItem( MainFrame.DISPLAY_SUBHEADER ),
@@ -357,11 +618,20 @@ 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_node_boxes_cbmi = new JCheckBoxMenuItem( MainFrame.DISPLAY_NODE_BOXES_LABEL ) );
+        _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_overview_cbmi = new JCheckBoxMenuItem( MainFrame.SHOW_OVERVIEW_LABEL ) );
+        _options_jmenu.add( _show_confidence_stddev_cbmi = new JCheckBoxMenuItem( MainFrame.SHOW_CONF_STDDEV_LABEL ) );
+        _options_jmenu
+                .add( _show_default_node_shapes_internal_cbmi = new JCheckBoxMenuItem( MainFrame.DISPLAY_NODE_BOXES_LABEL_INT ) );
+        _options_jmenu
+                .add( _show_default_node_shapes_external_cbmi = new JCheckBoxMenuItem( MainFrame.DISPLAY_NODE_BOXES_LABEL_EXT ) );
+        _options_jmenu
+                .add( _taxonomy_colorize_node_shapes_cbmi = new JCheckBoxMenuItem( MainFrame.TAXONOMY_COLORIZE_NODE_SHAPES_LABEL ) );
+        _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( _label_direction_cbmi = new JCheckBoxMenuItem( MainFrame.LABEL_DIRECTION_LABEL ) );
         _options_jmenu
                 .add( _color_labels_same_as_parent_branch = new JCheckBoxMenuItem( MainFrame.COLOR_LABELS_LABEL ) );
@@ -389,13 +659,20 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         customizeJMenuItem( _choose_minimal_confidence_mi );
         customizeJMenuItem( _switch_colors_mi );
         customizeJMenuItem( _overview_placment_mi );
-        customizeCheckBoxMenuItem( _show_node_boxes_cbmi, getOptions().getDefaultNodeShape() );
         customizeCheckBoxMenuItem( _label_direction_cbmi,
                                    getOptions().getNodeLabelDirection() == NODE_LABEL_DIRECTION.RADIAL );
         customizeCheckBoxMenuItem( _screen_antialias_cbmi, getOptions().isAntialiasScreen() );
         customizeCheckBoxMenuItem( _background_gradient_cbmi, getOptions().isBackgroundColorGradient() );
         customizeCheckBoxMenuItem( _show_domain_labels, getOptions().isShowDomainLabels() );
         customizeCheckBoxMenuItem( _abbreviate_scientific_names, getOptions().isAbbreviateScientificTaxonNames() );
+        customizeCheckBoxMenuItem( _show_default_node_shapes_external_cbmi, getOptions()
+                .isShowDefaultNodeShapesExternal() );
+        customizeCheckBoxMenuItem( _show_default_node_shapes_internal_cbmi, getOptions()
+                .isShowDefaultNodeShapesInternal() );
+        customizeCheckBoxMenuItem( _taxonomy_colorize_node_shapes_cbmi, getOptions().isTaxonomyColorizeNodeShapes() );
+        customizeJMenuItem( _cycle_node_shape_mi );
+        customizeJMenuItem( _cycle_node_fill_mi );
+        customizeJMenuItem( _choose_node_size_mi );
         customizeCheckBoxMenuItem( _color_labels_same_as_parent_branch, getOptions().isColorLabelsSameAsParentBranch() );
         customizeCheckBoxMenuItem( _search_case_senstive_cbmi, getOptions().isSearchCaseSensitive() );
         customizeCheckBoxMenuItem( _show_scale_cbmi, getOptions().isShowScale() );
@@ -409,6 +686,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 );
     }
 
@@ -425,9 +703,6 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         _tools_menu.add( _midpoint_root_item = new JMenuItem( "Midpoint-Root" ) );
         customizeJMenuItem( _midpoint_root_item );
         _tools_menu.addSeparator();
-        _tools_menu
-                .add( _infer_common_sn_names_item = new JMenuItem( "Infer Common Parts of Internal Scientific Names" ) );
-        customizeJMenuItem( _infer_common_sn_names_item );
         _tools_menu.add( _collapse_species_specific_subtrees = new JMenuItem( "Collapse Species-Specific Subtrees" ) );
         customizeJMenuItem( _collapse_species_specific_subtrees );
         _jmenubar.add( _tools_menu );
@@ -458,56 +733,39 @@ 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 );
         customizeJMenuItem( _view_as_nexus_item );
         _jmenubar.add( _view_jmenu );
     }
 
-    private void chooseFont() {
-        final FontChooser fc = new FontChooser();
-        fc.setFont( getMainPanel().getTreeFontSet().getLargeFont() );
-        fc.showDialog( this, "Select the Base Font" );
-        getMainPanel().getTreeFontSet().setBaseFont( fc.getFont() );
-    }
-
-    private void chooseMinimalConfidence() {
-        final String s = ( String ) JOptionPane
-                .showInputDialog( this,
-                                  "Please the minimum for confidence values to be displayed.\n" + "[current value: "
-                                          + getOptions().getMinConfidenceValue() + "]\n",
-                                  "Minimal Confidence Value",
-                                  JOptionPane.QUESTION_MESSAGE,
-                                  null,
-                                  null,
-                                  getOptions().getMinConfidenceValue() );
-        if ( !ForesterUtil.isEmpty( s ) ) {
-            boolean success = true;
-            double m = 0.0;
-            final String m_str = s.trim();
-            if ( !ForesterUtil.isEmpty( m_str ) ) {
-                try {
-                    m = Double.parseDouble( m_str );
+    void checkTextFrames() {
+        if ( _textframes.size() > 5 ) {
+            try {
+                if ( _textframes.getFirst() != null ) {
+                    _textframes.getFirst().removeMe();
                 }
-                catch ( final Exception ex ) {
-                    success = false;
+                else {
+                    _textframes.removeFirst();
                 }
             }
-            else {
-                success = false;
-            }
-            if ( success && ( m >= 0.0 ) ) {
-                getOptions().setMinConfidenceValue( m );
+            catch ( final NoSuchElementException e ) {
+                // Ignore.
             }
         }
     }
 
+    void clearCurrentExternalNodesDataBuffer() {
+        getCurrentTreePanel().clearCurrentExternalNodesDataBuffer();
+    }
+
     void customizeCheckBoxMenuItem( final JCheckBoxMenuItem item, final boolean is_selected ) {
         if ( item != null ) {
             item.setFont( MainFrame.menu_font );
@@ -529,24 +787,13 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         jmi.addActionListener( this );
     }
 
-    private void customizeRadioButtonMenuItem( final JRadioButtonMenuItem item, final boolean is_selected ) {
-        if ( item != null ) {
-            item.setFont( MainFrame.menu_font );
-            if ( !getConfiguration().isUseNativeUI() ) {
-                item.setBackground( getConfiguration().getGuiMenuBackgroundColor() );
-                item.setForeground( getConfiguration().getGuiMenuTextColor() );
+    void displayBasicInformation() {
+        if ( ( getMainPanel().getCurrentPhylogeny() != null ) && !getMainPanel().getCurrentPhylogeny().isEmpty() ) {
+            String title = "Basic Information";
+            if ( !ForesterUtil.isEmpty( getMainPanel().getCurrentPhylogeny().getName() ) ) {
+                title = getMainPanel().getCurrentPhylogeny().getName() + " " + title;
             }
-            item.setSelected( is_selected );
-            item.addActionListener( this );
-        }
-    }
-
-    @Override
-    public void destroy() {
-        Util.printAppletMessage( NAME, "going to be destroyed " );
-        removeTextFrame();
-        if ( getMainPanel() != null ) {
-            getMainPanel().terminate();
+            showTextFrame( AptxUtil.createBasicInformation( getMainPanel().getCurrentPhylogeny() ), title );
         }
     }
 
@@ -562,132 +809,66 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         return _label_direction_cbmi;
     }
 
-    private MainPanel getMainPanel() {
-        return _main_panel;
-    }
-
-    public Options getOptions() {
-        return _options;
-    }
-
     Options getOtions() {
         return _options;
     }
 
-    @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 );
-        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 );
-        // Get URL to tree file
-        if ( phys_url_string != null ) {
-            try {
-                phys_url = new URL( phys_url_string );
-            }
-            catch ( final Exception e ) {
-                ForesterUtil.printErrorMessage( NAME, "error: " + e );
-                e.printStackTrace();
-                JOptionPane.showMessageDialog( this, NAME + ": Could not create URL from: \"" + phys_url_string
-                        + "\"\nException: " + e, "Failed to create URL", JOptionPane.ERROR_MESSAGE );
-            }
-        }
-        // Load the tree from URL
-        if ( phys_url != null ) {
-            try {
-                phys = Util.readPhylogeniesFromUrl( phys_url, getConfiguration().isValidatePhyloXmlAgainstSchema() );
-            }
-            catch ( final Exception e ) {
-                ForesterUtil.printErrorMessage( NAME, e.toString() );
-                e.printStackTrace();
-                JOptionPane.showMessageDialog( this,
-                                               NAME + ": Failed to read phylogenies: " + "\nException: " + e,
-                                               "Failed to read phylogenies",
-                                               JOptionPane.ERROR_MESSAGE );
-            }
-        }
-        if ( ( phys == null ) || ( phys.length < 1 ) ) {
-            ForesterUtil.printErrorMessage( NAME, "phylogenies from [" + phys_url + "] are null or empty" );
-            JOptionPane.showMessageDialog( this,
-                                           NAME + ": phylogenies from [" + phys_url + "] are null or empty",
-                                           "Failed to read phylogenies",
-                                           JOptionPane.ERROR_MESSAGE );
-            return;
-        }
-        else {
-            Util.printAppletMessage( NAME, "loaded " + phys.length + " phylogenies from: " + phys_url );
-        }
-        setVisible( false );
-        setMainPanel( new MainPanelApplets( getConfiguration(), this ) );
-        _jmenubar = new JMenuBar();
-        if ( !getConfiguration().isHideControlPanelAndMenubar() ) {
-            if ( !getConfiguration().isUseNativeUI() ) {
-                _jmenubar.setBackground( getConfiguration().getGuiMenuBackgroundColor() );
-            }
-            buildToolsMenu();
-            buildViewMenu();
-            buildFontSizeMenu();
-            buildOptionsMenu();
-            buildTypeMenu();
-            buildHelpMenu();
-            setJMenuBar( _jmenubar );
-        }
-        final Container contentpane = getContentPane();
-        contentpane.setLayout( new BorderLayout() );
-        contentpane.add( getMainPanel(), BorderLayout.CENTER );
-        addComponentListener( new ComponentAdapter() {
-
-            @Override
-            public void componentResized( final ComponentEvent e ) {
-                if ( getMainPanel().getCurrentTreePanel() != null ) {
-                    getMainPanel().getCurrentTreePanel().setParametersForPainting( getMainPanel().getCurrentTreePanel()
-                                                                                           .getWidth(),
-                                                                                   getMainPanel().getCurrentTreePanel()
-                                                                                           .getHeight(),
-                                                                                   false );
-                }
+    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" );
             }
-        } );
-        if ( getConfiguration().isUseTabbedDisplay() ) {
-            Util.printAppletMessage( NAME, "using tabbed display" );
-            Util.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() );
-        }
-        validate();
-        setName( NAME );
-        getMainPanel().getControlPanel().showWholeAll();
-        getMainPanel().getControlPanel().showWhole();
-        System.gc();
-        Util.printAppletMessage( NAME, "successfully initialized" );
-        /* GUILHEM_BEG */
-        getCurrentTreePanel().getControlPanel().getSequenceRelationTypeBox().removeAllItems();
-        for( final SequenceRelation.SEQUENCE_RELATION_TYPE type : getMainPanel().getCurrentPhylogeny()
-                .getRelevantSequenceRelationTypes() ) {
-            getCurrentTreePanel().getControlPanel().getSequenceRelationTypeBox().addItem( type );
-        }
-        final String default_relation = getParameter( Constants.APPLET_PARAM_NAME_FOR_DEFAULT_SEQUENCE_RELATION_TYPE );
-        if ( default_relation != null ) {
-            getCurrentTreePanel().getControlPanel().getSequenceRelationTypeBox().setSelectedItem( default_relation );
-        }
-        final String default_sequence = getParameter( Constants.APPLET_PARAM_NAME_FOR_DEFAULT_QUERY_SEQUENCE );
-        if ( default_sequence != null ) {
-            getCurrentTreePanel().getControlPanel().getSequenceRelationBox().setSelectedItem( default_sequence );
-            /* GUILHEM_END */
-        }
-        setVisible( true );
+        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 initializeTypeMenu( final Options options ) {
@@ -725,31 +906,19 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         }
     }
 
-    private boolean isScreenAntialias() {
-        return true;
-    }
-
-    private void removeBranchColors() {
-        if ( getMainPanel().getCurrentPhylogeny() != null ) {
-            Util.removeBranchColors( getMainPanel().getCurrentPhylogeny() );
-        }
-    }
-
-    void removeTextFrame() {
-        if ( _textframe != null ) {
-            _textframe.close();
-            _textframe = null;
+    void removeAllTextFrames() {
+        for( final TextFrame tf : _textframes ) {
+            if ( tf != null ) {
+                tf.close();
+            }
         }
+        _textframes.clear();
     }
 
     void setConfiguration( final Configuration configuration ) {
         _configuration = configuration;
     }
 
-    private void setMainPanel( final MainPanelApplets main_panel ) {
-        _main_panel = main_panel;
-    }
-
     void setOptions( final Options options ) {
         _options = options;
     }
@@ -818,43 +987,6 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
         }
     }
 
-    private void setupUI() {
-        try {
-            if ( getConfiguration().isUseNativeUI() ) {
-                UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
-            }
-            else {
-                UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );
-            }
-        }
-        catch ( final UnsupportedLookAndFeelException e ) {
-            Util.dieWithSystemError( "UnsupportedLookAndFeelException: " + e.toString() );
-        }
-        catch ( final ClassNotFoundException e ) {
-            Util.dieWithSystemError( "ClassNotFoundException: " + e.toString() );
-        }
-        catch ( final InstantiationException e ) {
-            Util.dieWithSystemError( "InstantiationException: " + e.toString() );
-        }
-        catch ( final IllegalAccessException e ) {
-            Util.dieWithSystemError( "IllegalAccessException: " + e.toString() );
-        }
-        catch ( final Exception e ) {
-            Util.dieWithSystemError( e.toString() );
-        }
-    }
-
-    @Override
-    public void start() {
-        if ( getMainPanel() != null ) {
-            getMainPanel().validate();
-        }
-        requestFocus();
-        requestFocusInWindow();
-        requestFocus();
-        Util.printAppletMessage( NAME, "started" );
-    }
-
     void switchColors() {
         final TreeColorSet colorset = getMainPanel().getCurrentTreePanel().getTreeColorSet();
         final ColorSchemeChooser csc = new ColorSchemeChooser( getMainPanel(), colorset );
@@ -894,7 +1026,12 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
                 && _abbreviate_scientific_names.isSelected() );
         options.setColorLabelsSameAsParentBranch( ( _color_labels_same_as_parent_branch != null )
                 && _color_labels_same_as_parent_branch.isSelected() );
-        options.setShowNodeBoxes( ( _show_node_boxes_cbmi != null ) && _show_node_boxes_cbmi.isSelected() );
+        options.setShowDefaultNodeShapesInternal( ( _show_default_node_shapes_internal_cbmi != null )
+                && _show_default_node_shapes_internal_cbmi.isSelected() );
+        options.setShowDefaultNodeShapesExternal( ( _show_default_node_shapes_external_cbmi != null )
+                && _show_default_node_shapes_external_cbmi.isSelected() );
+        options.setTaxonomyColorizeNodeShapes( ( _taxonomy_colorize_node_shapes_cbmi != null )
+                && _taxonomy_colorize_node_shapes_cbmi.isSelected() );
         if ( ( _non_lined_up_cladograms_rbmi != null ) && ( _non_lined_up_cladograms_rbmi.isSelected() ) ) {
             options.setCladogramType( CLADOGRAM_TYPE.NON_LINED_UP );
         }
@@ -918,6 +1055,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() );
         }
@@ -957,39 +1096,131 @@ public class ArchaeopteryxE extends JApplet implements ActionListener {
     }
 
     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;
+    void viewAsXML() {
+        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 );
         }
-        _textframe = TextFrame.instantiate( getMainPanel().getCurrentPhylogeny().toNewHampshireX() );
     }
 
-    void viewAsXML() {
-        removeTextFrame();
-        if ( ( getMainPanel().getCurrentPhylogeny() == null ) || getMainPanel().getCurrentPhylogeny().isEmpty()
-                || ( getMainPanel().getCurrentPhylogeny().getNumberOfExternalNodes() > 10000 ) ) {
-            return;
+    private void chooseFont() {
+        final FontChooser fc = new FontChooser();
+        fc.setFont( getMainPanel().getTreeFontSet().getLargeFont() );
+        fc.showDialog( this, "Select the Base Font" );
+        getMainPanel().getTreeFontSet().setBaseFont( fc.getFont() );
+    }
+
+    private void chooseMinimalConfidence() {
+        final String s = ( String ) JOptionPane
+                .showInputDialog( this,
+                                  "Please the minimum for confidence values to be displayed.\n" + "[current value: "
+                                          + getOptions().getMinConfidenceValue() + "]\n",
+                                  "Minimal Confidence Value",
+                                  JOptionPane.QUESTION_MESSAGE,
+                                  null,
+                                  null,
+                                  getOptions().getMinConfidenceValue() );
+        if ( !ForesterUtil.isEmpty( s ) ) {
+            boolean success = true;
+            double m = 0.0;
+            final String m_str = s.trim();
+            if ( !ForesterUtil.isEmpty( m_str ) ) {
+                try {
+                    m = Double.parseDouble( m_str );
+                }
+                catch ( final Exception ex ) {
+                    success = false;
+                }
+            }
+            else {
+                success = false;
+            }
+            if ( success && ( m >= 0.0 ) ) {
+                getOptions().setMinConfidenceValue( m );
+            }
+        }
+    }
+
+    private void customizeRadioButtonMenuItem( final JRadioButtonMenuItem item, final boolean is_selected ) {
+        if ( item != null ) {
+            item.setFont( MainFrame.menu_font );
+            if ( !getConfiguration().isUseNativeUI() ) {
+                item.setBackground( getConfiguration().getGuiMenuBackgroundColor() );
+                item.setForeground( getConfiguration().getGuiMenuTextColor() );
+            }
+            item.setSelected( is_selected );
+            item.addActionListener( this );
+        }
+    }
+
+    private MainPanel getMainPanel() {
+        return _main_panel;
+    }
+
+    private boolean isScreenAntialias() {
+        return true;
+    }
+
+    private void removeBranchColors() {
+        if ( getMainPanel().getCurrentPhylogeny() != null ) {
+            AptxUtil.removeBranchColors( getMainPanel().getCurrentPhylogeny() );
+        }
+    }
+
+    private void setMainPanel( final MainPanelApplets main_panel ) {
+        _main_panel = main_panel;
+    }
+
+    private void setupUI() {
+        try {
+            if ( getConfiguration().isUseNativeUI() ) {
+                UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
+            }
+            else {
+                UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );
+            }
+        }
+        catch ( final UnsupportedLookAndFeelException e ) {
+            AptxUtil.dieWithSystemError( "UnsupportedLookAndFeelException: " + e.toString() );
+        }
+        catch ( final ClassNotFoundException e ) {
+            AptxUtil.dieWithSystemError( "ClassNotFoundException: " + e.toString() );
+        }
+        catch ( final InstantiationException e ) {
+            AptxUtil.dieWithSystemError( "InstantiationException: " + e.toString() );
+        }
+        catch ( final IllegalAccessException e ) {
+            AptxUtil.dieWithSystemError( "IllegalAccessException: " + e.toString() );
+        }
+        catch ( final Exception e ) {
+            AptxUtil.dieWithSystemError( e.toString() );
         }
-        _textframe = TextFrame.instantiate( getMainPanel().getCurrentPhylogeny().toPhyloXML( 0 ) );
     }
 
     static void setupScreenTextAntialias( final List<TreePanel> treepanels, final boolean antialias ) {