1st fix of embedded applet null pointer "issue"... ^^
[jalview.git] / forester / java / src / org / forester / archaeopteryx / MainFrame.java
index 98f2669..8d5a4e7 100644 (file)
 
 package org.forester.archaeopteryx;
 
+import java.awt.Color;
 import java.awt.Component;
 import java.awt.Container;
 import java.awt.Font;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.io.IOException;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.NoSuchElementException;
 
 import javax.swing.JApplet;
 import javax.swing.JCheckBoxMenuItem;
@@ -42,11 +45,16 @@ import javax.swing.JMenuBar;
 import javax.swing.JMenuItem;
 import javax.swing.JOptionPane;
 import javax.swing.JRadioButtonMenuItem;
+import javax.swing.SwingUtilities;
 
 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.archaeopteryx.tools.InferenceManager;
+import org.forester.archaeopteryx.tools.ProcessPool;
+import org.forester.archaeopteryx.tools.ProcessRunning;
 import org.forester.phylogeny.Phylogeny;
+import org.forester.phylogeny.PhylogenyNodeI.NH_CONVERSION_SUPPORT_VALUE_STYLE;
 import org.forester.phylogeny.data.NodeVisualization.NodeFill;
 import org.forester.phylogeny.data.NodeVisualization.NodeShape;
 import org.forester.util.ForesterConstants;
@@ -54,157 +62,171 @@ import org.forester.util.ForesterUtil;
 
 public abstract class MainFrame extends JFrame implements ActionListener {
 
-    static final String       USE_MOUSEWHEEL_SHIFT_TO_ROTATE      = "In this display type, use mousewheel + Shift to rotate [or A and S]";
-    static final String       PHYLOXML_REF_TOOL_TIP               = Constants.PHYLOXML_REFERENCE;                                                                                                                                       //TODO //FIXME
-    static final String       APTX_REF_TOOL_TIP                   = Constants.APTX_REFERENCE;
-    private static final long serialVersionUID                    = 3655000897845508358L;
-    final static Font         menu_font                           = new Font( Configuration.getDefaultFontFamilyName(),
-                                                                              Font.PLAIN,
-                                                                              10 );
-    static final String       TYPE_MENU_HEADER                    = "Type";
-    static final String       RECTANGULAR_TYPE_CBMI_LABEL         = "Rectangular";
-    static final String       EURO_TYPE_CBMI_LABEL                = "Euro Type";
-    static final String       CURVED_TYPE_CBMI_LABEL              = "Curved";
-    static final String       TRIANGULAR_TYPE_CBMI_LABEL          = "Triangular";
-    static final String       CONVEX_TYPE_CBMI_LABEL              = "Convex";
-    static final String       ROUNDED_TYPE_CBMI_LABEL             = "Rounded";
-    static final String       UNROOTED_TYPE_CBMI_LABEL            = "Unrooted (alpha)";                                                                                                                                                 //TODO
-    static final String       CIRCULAR_TYPE_CBMI_LABEL            = "Circular (alpha)";                                                                                                                                                 //TODO
-    static final String       OPTIONS_HEADER                      = "Options";
-    static final String       SEARCH_SUBHEADER                    = "Search:";
-    static final String       DISPLAY_SUBHEADER                   = "Display:";
-    static final String       SEARCH_TERMS_ONLY_LABEL             = "Match Complete Terms Only";
-    static final String       SEARCH_CASE_SENSITIVE_LABEL         = "Case Sensitive";
-    static final String       INVERSE_SEARCH_RESULT_LABEL         = "Negate Result";
-    static final String       DISPLAY_BRANCH_LENGTH_VALUES_LABEL  = "Display Branch Length Values";
-    static final String       DISPLAY_SCALE_LABEL                 = "Display Scale";
-    static final String       NON_LINED_UP_CLADOGRAMS_LABEL       = "Non-Lined Up Cladograms";
-    static final String       UNIFORM_CLADOGRAMS_LABEL            = "Total Node Sum Dependent Cladograms";
-    static final String       LABEL_DIRECTION_LABEL               = "Radial Labels";
-    static final String       LABEL_DIRECTION_TIP                 = "To use radial node labels in radial and unrooted display types";
-    static final String       SCREEN_ANTIALIAS_LABEL              = "Antialias";
-    static final String       COLOR_LABELS_LABEL                  = "Colorize Labels Same as Parent Branch";
-    static final String       BG_GRAD_LABEL                       = "Background Color Gradient";
-    static final String       DISPLAY_NODE_BOXES_LABEL            = "Display Node Shapes";
-    static final String       SHOW_OVERVIEW_LABEL                 = "Show Overview";
-    static final String       FONT_SIZE_MENU_LABEL                = "Font Size";
-    static final String       NONUNIFORM_CLADOGRAMS_LABEL         = "External Node Sum Dependent Cladograms";
-    static final String       SHOW_DOMAIN_LABELS_LABEL            = "Show Domain Labels";
-    static final String       COLOR_LABELS_TIP                    = "To use parent branch colors for node labels as well, need to turn off taxonomy dependent colorization and turn on branch colorization for this to become apparent";
-    static final String       ABBREV_SN_LABEL                     = "Abbreviate Scientific Taxonomic Names";
-    static final String       TAXONOMY_COLORIZE_NODE_SHAPES_LABEL = "Colorize Node Shapes According to Taxonomy";
-    static final String       CYCLE_NODE_SHAPE_LABEL              = "Cycle Node Shapes";
-    static final String       CYCLE_NODE_FILL_LABEL               = "Cycle Node Fill Type";
-    static final String       CHOOSE_NODE_SIZE_LABEL              = "Choose Node Shape Size";
-    JMenuBar                  _jmenubar;
-    JMenu                     _file_jmenu;
-    JMenu                     _tools_menu;
-    JMenu                     _view_jmenu;
-    JMenu                     _options_jmenu;
-    JMenu                     _font_size_menu;
-    JMenu                     _help_jmenu;
-    JMenuItem[]               _load_phylogeny_from_webservice_menu_items;
+    static final String         USE_MOUSEWHEEL_SHIFT_TO_ROTATE          = "In this display type, use mousewheel + Shift to rotate [or A and S]";
+    static final String         PHYLOXML_REF_TOOL_TIP                   = Constants.PHYLOXML_REFERENCE;                                                                                                                                       //TODO //FIXME
+    static final String         APTX_REF_TOOL_TIP                       = Constants.APTX_REFERENCE;
+    private static final long   serialVersionUID                        = 3655000897845508358L;
+    final static Font           menu_font                               = new Font( Configuration.getDefaultFontFamilyName(),
+                                                                                    Font.PLAIN,
+                                                                                    10 );
+    static final String         TYPE_MENU_HEADER                        = "Type";
+    static final String         RECTANGULAR_TYPE_CBMI_LABEL             = "Rectangular";
+    static final String         EURO_TYPE_CBMI_LABEL                    = "Euro Type";
+    static final String         CURVED_TYPE_CBMI_LABEL                  = "Curved";
+    static final String         TRIANGULAR_TYPE_CBMI_LABEL              = "Triangular";
+    static final String         CONVEX_TYPE_CBMI_LABEL                  = "Convex";
+    static final String         ROUNDED_TYPE_CBMI_LABEL                 = "Rounded";
+    static final String         UNROOTED_TYPE_CBMI_LABEL                = "Unrooted (alpha)";                                                                                                                                                 //TODO
+    static final String         CIRCULAR_TYPE_CBMI_LABEL                = "Circular (alpha)";                                                                                                                                                 //TODO
+    static final String         OPTIONS_HEADER                          = "Options";
+    static final String         SEARCH_SUBHEADER                        = "Search:";
+    static final String         DISPLAY_SUBHEADER                       = "Display:";
+    static final String         SEARCH_TERMS_ONLY_LABEL                 = "Match Complete Terms Only";
+    static final String         SEARCH_CASE_SENSITIVE_LABEL             = "Case Sensitive";
+    static final String         INVERSE_SEARCH_RESULT_LABEL             = "Negate Result";
+    static final String         DISPLAY_BRANCH_LENGTH_VALUES_LABEL      = "Display Branch Length Values";
+    static final String         DISPLAY_SCALE_LABEL                     = "Display Scale";
+    static final String         NON_LINED_UP_CLADOGRAMS_LABEL           = "Non-Lined Up Cladograms";
+    static final String         UNIFORM_CLADOGRAMS_LABEL                = "Total Node Sum Dependent Cladograms";
+    static final String         LABEL_DIRECTION_LABEL                   = "Radial Labels";
+    static final String         LABEL_DIRECTION_TIP                     = "To use radial node labels in radial and unrooted display types";
+    static final String         SCREEN_ANTIALIAS_LABEL                  = "Antialias";
+    static final String         COLOR_LABELS_LABEL                      = "Colorize Labels Same as Parent Branch";
+    static final String         BG_GRAD_LABEL                           = "Background Color Gradient";
+    static final String         DISPLAY_NODE_BOXES_LABEL                = "Show Node Shapes";
+    static final String         SHOW_OVERVIEW_LABEL                     = "Show Overview";
+    static final String         FONT_SIZE_MENU_LABEL                    = "Font Size";
+    static final String         NONUNIFORM_CLADOGRAMS_LABEL             = "External Node Sum Dependent Cladograms";
+    static final String         SHOW_DOMAIN_LABELS_LABEL                = "Show Domain Labels";
+    static final String         COLOR_LABELS_TIP                        = "To use parent branch colors for node labels as well, need to turn off taxonomy dependent colorization and turn on branch colorization for this to become apparent";
+    static final String         ABBREV_SN_LABEL                         = "Abbreviate Scientific Taxonomic Names";
+    static final String         TAXONOMY_COLORIZE_NODE_SHAPES_LABEL     = "Colorize Node Shapes According to Taxonomy";
+    static final String         CYCLE_NODE_SHAPE_LABEL                  = "Cycle Node Shapes";
+    static final String         CYCLE_NODE_FILL_LABEL                   = "Cycle Node Fill Type";
+    static final String         CHOOSE_NODE_SIZE_LABEL                  = "Choose Node Shape Size";
+    static final String         SHOW_CONF_STDDEV_LABEL                  = "Show Confidence Standard Deviations";
+    static final String         USE_BRACKETS_FOR_CONF_IN_NH_LABEL       = "Use Brackets for Confidence Values";
+    static final String         USE_INTERNAL_NAMES_FOR_CONF_IN_NH_LABEL = "Use Internal Node Names for Confidence Values";
+    JMenuBar                    _jmenubar;
+    JMenu                       _file_jmenu;
+    JMenu                       _tools_menu;
+    JMenu                       _view_jmenu;
+    JMenu                       _options_jmenu;
+    JMenu                       _font_size_menu;
+    JMenu                       _help_jmenu;
+    JMenuItem[]                 _load_phylogeny_from_webservice_menu_items;
     // file menu:
-    JMenuItem                 _open_item;
-    JMenuItem                 _open_url_item;
-    JMenuItem                 _save_item;
-    JMenuItem                 _save_all_item;
-    JMenuItem                 _close_item;
-    JMenuItem                 _exit_item;
-    JMenuItem                 _new_item;
+    JMenuItem                   _open_item;
+    JMenuItem                   _open_url_item;
+    JMenuItem                   _save_item;
+    JMenuItem                   _save_all_item;
+    JMenuItem                   _close_item;
+    JMenuItem                   _exit_item;
+    JMenuItem                   _new_item;
     // tools menu:
-    JMenuItem                 _midpoint_root_item;
-    JMenuItem                 _taxcolor_item;
-    JMenuItem                 _confcolor_item;
-    JMenuItem                 _color_rank_jmi;
-    JMenuItem                 _infer_common_sn_names_item;
-    JMenuItem                 _collapse_species_specific_subtrees;
-    JMenuItem                 _collapse_below_threshold;                                                                                                                                                                                //TODO implememt me
-    JMenuItem                 _obtain_detailed_taxonomic_information_jmi;
-    JMenuItem                 _obtain_detailed_taxonomic_information_deleting_jmi;
-    JMenuItem                 _obtain_uniprot_seq_information_jmi;
-    JMenuItem                 _move_node_names_to_tax_sn_jmi;
-    JMenuItem                 _move_node_names_to_seq_names_jmi;
-    JMenuItem                 _extract_tax_code_from_node_names_jmi;
+    JMenuItem                   _midpoint_root_item;
+    JMenuItem                   _taxcolor_item;
+    JMenuItem                   _confcolor_item;
+    JMenuItem                   _color_rank_jmi;
+    JMenuItem                   _infer_common_sn_names_item;
+    JMenuItem                   _collapse_species_specific_subtrees;
+    JMenuItem                   _collapse_below_threshold;                                                                                                                                                                                    //TODO implememt me
+    JMenuItem                   _obtain_detailed_taxonomic_information_jmi;
+    JMenuItem                   _obtain_detailed_taxonomic_information_deleting_jmi;
+    JMenuItem                   _obtain_uniprot_seq_information_jmi;
+    JMenuItem                   _move_node_names_to_tax_sn_jmi;
+    JMenuItem                   _move_node_names_to_seq_names_jmi;
+    JMenuItem                   _extract_tax_code_from_node_names_jmi;
     // font size menu:
-    JMenuItem                 _super_tiny_fonts_item;
-    JMenuItem                 _tiny_fonts_item;
-    JMenuItem                 _small_fonts_item;
-    JMenuItem                 _medium_fonts_item;
-    JMenuItem                 _large_fonts_item;
+    JMenuItem                   _super_tiny_fonts_item;
+    JMenuItem                   _tiny_fonts_item;
+    JMenuItem                   _small_fonts_item;
+    JMenuItem                   _medium_fonts_item;
+    JMenuItem                   _large_fonts_item;
     // options menu:
     // _  screen and print
-    JMenuItem                 _choose_font_mi;
-    JMenuItem                 _switch_colors_mi;
-    JCheckBoxMenuItem         _label_direction_cbmi;
+    JMenuItem                   _choose_font_mi;
+    JMenuItem                   _switch_colors_mi;
+    JCheckBoxMenuItem           _label_direction_cbmi;
     // _  screen display
-    JCheckBoxMenuItem         _screen_antialias_cbmi;
-    JCheckBoxMenuItem         _background_gradient_cbmi;
-    JRadioButtonMenuItem      _non_lined_up_cladograms_rbmi;
-    JRadioButtonMenuItem      _uniform_cladograms_rbmi;
-    JRadioButtonMenuItem      _ext_node_dependent_cladogram_rbmi;
-    JCheckBoxMenuItem         _show_branch_length_values_cbmi;
-    JCheckBoxMenuItem         _show_scale_cbmi;                                                                                                                                                                                         //TODO fix me
-    JCheckBoxMenuItem         _show_overview_cbmi;
-    JCheckBoxMenuItem         _show_domain_labels;
-    JCheckBoxMenuItem         _abbreviate_scientific_names;
-    JCheckBoxMenuItem         _color_labels_same_as_parent_branch;
-    JMenuItem                 _overview_placment_mi;
-    JMenuItem                 _choose_minimal_confidence_mi;
-    JCheckBoxMenuItem         _show_default_node_shapes_cbmi;
-    JMenuItem                 _cycle_node_shape_mi;
-    JMenuItem                 _cycle_node_fill_mi;
-    JMenuItem                 _choose_node_size_mi;
-    JCheckBoxMenuItem         _taxonomy_colorize_node_shapes_cbmi;
+    JCheckBoxMenuItem           _screen_antialias_cbmi;
+    JCheckBoxMenuItem           _background_gradient_cbmi;
+    JRadioButtonMenuItem        _non_lined_up_cladograms_rbmi;
+    JRadioButtonMenuItem        _uniform_cladograms_rbmi;
+    JRadioButtonMenuItem        _ext_node_dependent_cladogram_rbmi;
+    JCheckBoxMenuItem           _show_branch_length_values_cbmi;
+    JCheckBoxMenuItem           _show_scale_cbmi;                                                                                                                                                                                             //TODO fix me
+    JCheckBoxMenuItem           _show_overview_cbmi;
+    JCheckBoxMenuItem           _show_domain_labels;
+    JCheckBoxMenuItem           _abbreviate_scientific_names;
+    JCheckBoxMenuItem           _color_labels_same_as_parent_branch;
+    JMenuItem                   _overview_placment_mi;
+    JMenuItem                   _choose_minimal_confidence_mi;
+    JCheckBoxMenuItem           _show_default_node_shapes_cbmi;
+    JMenuItem                   _cycle_node_shape_mi;
+    JMenuItem                   _cycle_node_fill_mi;
+    JMenuItem                   _choose_node_size_mi;
+    JCheckBoxMenuItem           _taxonomy_colorize_node_shapes_cbmi;
+    JCheckBoxMenuItem           _show_confidence_stddev_cbmi;
     // _  print
-    JCheckBoxMenuItem         _graphics_export_visible_only_cbmi;
-    JCheckBoxMenuItem         _antialias_print_cbmi;
-    JCheckBoxMenuItem         _print_black_and_white_cbmi;
-    JCheckBoxMenuItem         _print_using_actual_size_cbmi;
-    JCheckBoxMenuItem         _graphics_export_using_actual_size_cbmi;
-    JMenuItem                 _print_size_mi;
-    JMenuItem                 _choose_pdf_width_mi;
+    JCheckBoxMenuItem           _graphics_export_visible_only_cbmi;
+    JCheckBoxMenuItem           _antialias_print_cbmi;
+    JCheckBoxMenuItem           _print_black_and_white_cbmi;
+    JCheckBoxMenuItem           _print_using_actual_size_cbmi;
+    JCheckBoxMenuItem           _graphics_export_using_actual_size_cbmi;
+    JMenuItem                   _print_size_mi;
+    JMenuItem                   _choose_pdf_width_mi;
     // _  parsing
-    JCheckBoxMenuItem         _internal_number_are_confidence_for_nh_parsing_cbmi;
-    JCheckBoxMenuItem         _extract_pfam_style_tax_codes_cbmi;
-    JCheckBoxMenuItem         _replace_underscores_cbmi;
+    JCheckBoxMenuItem           _internal_number_are_confidence_for_nh_parsing_cbmi;
+    JCheckBoxMenuItem           _extract_pfam_style_tax_codes_cbmi;
+    JCheckBoxMenuItem           _replace_underscores_cbmi;
+    JCheckBoxMenuItem           _use_brackets_for_conf_in_nh_export_cbmi;
+    JCheckBoxMenuItem           _use_internal_names_for_conf_in_nh_export_cbmi;
     // _  search
-    JCheckBoxMenuItem         _search_case_senstive_cbmi;
-    JCheckBoxMenuItem         _search_whole_words_only_cbmi;
-    JCheckBoxMenuItem         _inverse_search_result_cbmi;
+    JCheckBoxMenuItem           _search_case_senstive_cbmi;
+    JCheckBoxMenuItem           _search_whole_words_only_cbmi;
+    JCheckBoxMenuItem           _inverse_search_result_cbmi;
     // type menu:
-    JMenu                     _type_menu;
-    JCheckBoxMenuItem         _rectangular_type_cbmi;
-    JCheckBoxMenuItem         _triangular_type_cbmi;
-    JCheckBoxMenuItem         _curved_type_cbmi;
-    JCheckBoxMenuItem         _convex_type_cbmi;
-    JCheckBoxMenuItem         _euro_type_cbmi;
-    JCheckBoxMenuItem         _rounded_type_cbmi;
-    JCheckBoxMenuItem         _unrooted_type_cbmi;
-    JCheckBoxMenuItem         _circular_type_cbmi;
+    JMenu                       _type_menu;
+    JCheckBoxMenuItem           _rectangular_type_cbmi;
+    JCheckBoxMenuItem           _triangular_type_cbmi;
+    JCheckBoxMenuItem           _curved_type_cbmi;
+    JCheckBoxMenuItem           _convex_type_cbmi;
+    JCheckBoxMenuItem           _euro_type_cbmi;
+    JCheckBoxMenuItem           _rounded_type_cbmi;
+    JCheckBoxMenuItem           _unrooted_type_cbmi;
+    JCheckBoxMenuItem           _circular_type_cbmi;
     // view as text menu:
-    JMenuItem                 _view_as_NH_item;
-    JMenuItem                 _view_as_NHX_item;
-    JMenuItem                 _view_as_XML_item;
-    JMenuItem                 _view_as_nexus_item;
-    JMenuItem                 _display_basic_information_item;
+    JMenuItem                   _view_as_NH_item;
+    JMenuItem                   _view_as_NHX_item;
+    JMenuItem                   _view_as_XML_item;
+    JMenuItem                   _view_as_nexus_item;
+    JMenuItem                   _display_basic_information_item;
     // help menu:
-    JMenuItem                 _about_item;
-    JMenuItem                 _help_item;
-    JMenuItem                 _website_item;
-    JMenuItem                 _phyloxml_website_item;
-    JMenuItem                 _phyloxml_ref_item;
-    JMenuItem                 _aptx_ref_item;
+    JMenuItem                   _about_item;
+    JMenuItem                   _help_item;
+    JMenuItem                   _website_item;
+    JMenuItem                   _phyloxml_website_item;
+    JMenuItem                   _phyloxml_ref_item;
+    JMenuItem                   _aptx_ref_item;
+    // process menu:
+    JMenu                       _process_menu;
     // Handy pointers to child components:
-    MainPanel                 _mainpanel;
-    Container                 _contentpane;
-    TextFrame                 _textframe;
-    Configuration             _configuration;
-    JMenuItem                 _remove_branch_color_item;
-    Options                   _options;
+    MainPanel                   _mainpanel;
+    Container                   _contentpane;
+    final LinkedList<TextFrame> _textframes                             = new LinkedList<TextFrame>();                                                                                                                                         ;
+    Configuration               _configuration;
+    JMenuItem                   _remove_branch_color_item;
+    Options                     _options;
+    InferenceManager            _inference_manager;
+    final ProcessPool           _process_pool;
 
     MainFrame() {
-        // Empty constructor.
+        _process_pool = ProcessPool.createInstance();
+    }
+
+    public ProcessPool getProcessPool() {
+        return _process_pool;
     }
 
     /**
@@ -381,6 +403,21 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         else if ( o == _show_branch_length_values_cbmi ) {
             updateOptions( getOptions() );
         }
+        else if ( o == _show_confidence_stddev_cbmi ) {
+            updateOptions( getOptions() );
+        }
+        else if ( o == _use_brackets_for_conf_in_nh_export_cbmi ) {
+            if ( _use_brackets_for_conf_in_nh_export_cbmi.isSelected() ) {
+                _use_internal_names_for_conf_in_nh_export_cbmi.setSelected( false );
+            }
+            updateOptions( getOptions() );
+        }
+        else if ( o == _use_internal_names_for_conf_in_nh_export_cbmi ) {
+            if ( _use_internal_names_for_conf_in_nh_export_cbmi.isSelected() ) {
+                _use_brackets_for_conf_in_nh_export_cbmi.setSelected( false );
+            }
+            updateOptions( getOptions() );
+        }
         else if ( o == _label_direction_cbmi ) {
             updateOptions( getOptions() );
         }
@@ -403,7 +440,7 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         }
         else if ( o == _website_item ) {
             try {
-                Util.openWebsite( Constants.APTX_WEB_SITE, is_applet, applet );
+                AptxUtil.openWebsite( Constants.APTX_WEB_SITE, is_applet, applet );
             }
             catch ( final IOException e1 ) {
                 ForesterUtil.printErrorMessage( Constants.PRG_NAME, e1.toString() );
@@ -411,7 +448,7 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         }
         else if ( o == _phyloxml_website_item ) {
             try {
-                Util.openWebsite( Constants.PHYLOXML_WEB_SITE, is_applet, applet );
+                AptxUtil.openWebsite( Constants.PHYLOXML_WEB_SITE, is_applet, applet );
             }
             catch ( final IOException e1 ) {
                 ForesterUtil.printErrorMessage( Constants.PRG_NAME, e1.toString() );
@@ -419,7 +456,7 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         }
         else if ( o == _aptx_ref_item ) {
             try {
-                Util.openWebsite( Constants.APTX_REFERENCE_URL, is_applet, applet );
+                AptxUtil.openWebsite( Constants.APTX_REFERENCE_URL, is_applet, applet );
             }
             catch ( final IOException e1 ) {
                 ForesterUtil.printErrorMessage( Constants.PRG_NAME, e1.toString() );
@@ -427,7 +464,7 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         }
         else if ( o == _phyloxml_ref_item ) {
             try {
-                Util.openWebsite( Constants.PHYLOXML_REFERENCE_URL, is_applet, applet );
+                AptxUtil.openWebsite( Constants.PHYLOXML_REFERENCE_URL, is_applet, applet );
             }
             catch ( final IOException e1 ) {
                 ForesterUtil.printErrorMessage( Constants.PRG_NAME, e1.toString() );
@@ -513,6 +550,43 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         _jmenubar.add( _help_jmenu );
     }
 
+    public void updateProcessMenu() {
+        // In general Swing is not thread safe.
+        // See "Swing's Threading Policy".
+        SwingUtilities.invokeLater( new Runnable() {
+
+            public void run() {
+                doUpdateProcessMenu();
+            }
+        } );
+    }
+
+    private void doUpdateProcessMenu() {
+        if ( _process_pool.size() > 0 ) {
+            if ( _process_menu == null ) {
+                _process_menu = createMenu( "", getConfiguration() );
+                _process_menu.setForeground( Color.RED );
+            }
+            _process_menu.removeAll();
+            final String text = "processes running: " + _process_pool.size();
+            _process_menu.setText( text );
+            _jmenubar.add( _process_menu );
+            for( int i = 0; i < _process_pool.size(); ++i ) {
+                final ProcessRunning p = _process_pool.getProcessByIndex( i );
+                _process_menu.add( customizeJMenuItem( new JMenuItem( p.getName() + " [" + p.getStart() + "]" ) ) );
+            }
+        }
+        else {
+            if ( _process_menu != null ) {
+                _process_menu.removeAll();
+                _jmenubar.remove( _process_menu );
+            }
+        }
+        _jmenubar.validate();
+        _jmenubar.repaint();
+        repaint();
+    }
+
     void buildTypeMenu() {
         _type_menu = createMenu( TYPE_MENU_HEADER, getConfiguration() );
         _type_menu.add( _rectangular_type_cbmi = new JCheckBoxMenuItem( MainFrame.RECTANGULAR_TYPE_CBMI_LABEL ) );
@@ -626,7 +700,7 @@ public abstract class MainFrame extends JFrame implements ActionListener {
     }
 
     void close() {
-        removeTextFrame();
+        removeAllTextFrames();
         if ( _mainpanel != null ) {
             _mainpanel.terminate();
         }
@@ -645,7 +719,7 @@ public abstract class MainFrame extends JFrame implements ActionListener {
 
     void colorRank() {
         if ( _mainpanel.getCurrentTreePanel() != null ) {
-            final String[] ranks = Util.getAllPossibleRanks();
+            final String[] ranks = AptxUtil.getAllPossibleRanks();
             final String rank = ( String ) JOptionPane
                     .showInputDialog( this,
                                       "What rank should the colorization be based on",
@@ -672,7 +746,7 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         }
     }
 
-    void customizeJMenuItem( final JMenuItem jmi ) {
+    JMenuItem customizeJMenuItem( final JMenuItem jmi ) {
         if ( jmi != null ) {
             jmi.setFont( MainFrame.menu_font );
             if ( !getConfiguration().isUseNativeUI() ) {
@@ -681,6 +755,7 @@ public abstract class MainFrame extends JFrame implements ActionListener {
             }
             jmi.addActionListener( this );
         }
+        return jmi;
     }
 
     void customizeRadioButtonMenuItem( final JRadioButtonMenuItem item, final boolean is_selected ) {
@@ -754,7 +829,7 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         return _label_direction_cbmi;
     }
 
-    MainPanel getMainPanel() {
+    public MainPanel getMainPanel() {
         return _mainpanel;
     }
 
@@ -762,7 +837,7 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         return _jmenubar;
     }
 
-    Options getOptions() {
+    public Options getOptions() {
         return _options;
     }
 
@@ -811,15 +886,33 @@ public abstract class MainFrame extends JFrame implements ActionListener {
 
     private void removeBranchColors() {
         if ( getMainPanel().getCurrentPhylogeny() != null ) {
-            Util.removeBranchColors( getMainPanel().getCurrentPhylogeny() );
+            AptxUtil.removeBranchColors( getMainPanel().getCurrentPhylogeny() );
         }
     }
 
-    void removeTextFrame() {
-        if ( _textframe != null ) {
-            _textframe.close();
-            _textframe = null;
+    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();
+            }
         }
+        _textframes.clear();
     }
 
     void setConfiguration( final Configuration configuration ) {
@@ -830,6 +923,14 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         _options = options;
     }
 
+    void setInferenceManager( final InferenceManager i ) {
+        _inference_manager = i;
+    }
+
+    public InferenceManager getInferenceManager() {
+        return _inference_manager;
+    }
+
     void setSelectedTypeInTypeMenu( final PHYLOGENY_GRAPHICS_TYPE type ) {
         setTypeMenuToAllUnselected();
         switch ( type ) {
@@ -956,6 +1057,8 @@ public abstract class MainFrame extends JFrame 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() );
         }
@@ -964,6 +1067,17 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         options.setGraphicsExportUsingActualSize( ( _graphics_export_using_actual_size_cbmi != null )
                 && ( _graphics_export_using_actual_size_cbmi.isSelected() ) );
         options.setAntialiasPrint( ( _antialias_print_cbmi != null ) && _antialias_print_cbmi.isSelected() );
+        if ( ( _use_brackets_for_conf_in_nh_export_cbmi != null )
+                && _use_brackets_for_conf_in_nh_export_cbmi.isSelected() ) {
+            options.setNhConversionSupportValueStyle( NH_CONVERSION_SUPPORT_VALUE_STYLE.IN_SQUARE_BRACKETS );
+        }
+        else if ( ( _use_internal_names_for_conf_in_nh_export_cbmi != null )
+                && _use_internal_names_for_conf_in_nh_export_cbmi.isSelected() ) {
+            options.setNhConversionSupportValueStyle( NH_CONVERSION_SUPPORT_VALUE_STYLE.AS_INTERNAL_NODE_NAMES );
+        }
+        else {
+            options.setNhConversionSupportValueStyle( NH_CONVERSION_SUPPORT_VALUE_STYLE.NONE );
+        }
         options.setPrintBlackAndWhite( ( _print_black_and_white_cbmi != null )
                 && _print_black_and_white_cbmi.isSelected() );
         options.setInternalNumberAreConfidenceForNhParsing( ( _internal_number_are_confidence_for_nh_parsing_cbmi != null )
@@ -1018,56 +1132,73 @@ public abstract class MainFrame extends JFrame implements ActionListener {
     }
 
     void displayBasicInformation() {
-        if ( ( _mainpanel.getCurrentPhylogeny() == null ) || _mainpanel.getCurrentPhylogeny().isEmpty() ) {
-            return;
+        if ( ( _mainpanel.getCurrentPhylogeny() != null ) && !_mainpanel.getCurrentPhylogeny().isEmpty() ) {
+            String title = "Basic Information";
+            if ( !ForesterUtil.isEmpty( _mainpanel.getCurrentPhylogeny().getName() ) ) {
+                title = _mainpanel.getCurrentPhylogeny().getName() + " " + title;
+            }
+            showTextFrame( AptxUtil.createBasicInformation( _mainpanel.getCurrentPhylogeny() ), title );
         }
-        _textframe = TextFrame.instantiate( Util.crateBasicInformation( _mainpanel.getCurrentPhylogeny() ) );
     }
 
     void viewAsNexus() {
-        removeTextFrame();
-        if ( ( _mainpanel.getCurrentPhylogeny() == null ) || _mainpanel.getCurrentPhylogeny().isEmpty()
-                || ( _mainpanel.getCurrentPhylogeny().getNumberOfExternalNodes() > 10000 ) ) {
-            return;
+        if ( ( _mainpanel.getCurrentPhylogeny() != null ) && !_mainpanel.getCurrentPhylogeny().isEmpty() ) {
+            String title = "Nexus";
+            if ( !ForesterUtil.isEmpty( _mainpanel.getCurrentPhylogeny().getName() ) ) {
+                title = _mainpanel.getCurrentPhylogeny().getName() + " " + title;
+            }
+            showTextFrame( _mainpanel.getCurrentPhylogeny().toNexus( getOptions().getNhConversionSupportValueStyle() ),
+                           title );
         }
-        _textframe = TextFrame.instantiate( _mainpanel.getCurrentPhylogeny().toNexus() );
     }
 
     void viewAsNH() {
-        removeTextFrame();
-        if ( ( _mainpanel.getCurrentPhylogeny() == null ) || _mainpanel.getCurrentPhylogeny().isEmpty()
-                || ( _mainpanel.getCurrentPhylogeny().getNumberOfExternalNodes() > 10000 ) ) {
-            return;
+        if ( ( _mainpanel.getCurrentPhylogeny() != null ) && !_mainpanel.getCurrentPhylogeny().isEmpty() ) {
+            String title = "New Hampshire";
+            if ( !ForesterUtil.isEmpty( _mainpanel.getCurrentPhylogeny().getName() ) ) {
+                title = _mainpanel.getCurrentPhylogeny().getName() + " " + title;
+            }
+            showTextFrame( _mainpanel.getCurrentPhylogeny()
+                                   .toNewHampshire( false, getOptions().getNhConversionSupportValueStyle() ),
+                           title );
         }
-        _textframe = TextFrame.instantiate( _mainpanel.getCurrentPhylogeny().toNewHampshire( false ) );
     }
 
     void viewAsNHX() {
-        removeTextFrame();
-        if ( ( _mainpanel.getCurrentPhylogeny() == null ) || _mainpanel.getCurrentPhylogeny().isEmpty()
-                || ( _mainpanel.getCurrentPhylogeny().getNumberOfExternalNodes() > 10000 ) ) {
-            return;
+        if ( ( _mainpanel.getCurrentPhylogeny() != null ) && !_mainpanel.getCurrentPhylogeny().isEmpty() ) {
+            String title = "NHX";
+            if ( !ForesterUtil.isEmpty( _mainpanel.getCurrentPhylogeny().getName() ) ) {
+                title = _mainpanel.getCurrentPhylogeny().getName() + " " + title;
+            }
+            showTextFrame( _mainpanel.getCurrentPhylogeny().toNewHampshireX(), title );
         }
-        _textframe = TextFrame.instantiate( _mainpanel.getCurrentPhylogeny().toNewHampshireX() );
     }
 
     void viewAsXML() {
-        removeTextFrame();
-        if ( ( _mainpanel.getCurrentPhylogeny() != null ) && !_mainpanel.getCurrentPhylogeny().isEmpty()
-                && ( _mainpanel.getCurrentPhylogeny().getNumberOfExternalNodes() <= 10000 ) ) {
-            _textframe = TextFrame.instantiate( _mainpanel.getCurrentPhylogeny().toPhyloXML( 0 ) );
+        if ( ( _mainpanel.getCurrentPhylogeny() != null ) && !_mainpanel.getCurrentPhylogeny().isEmpty() ) {
+            String title = "phyloXML";
+            if ( !ForesterUtil.isEmpty( _mainpanel.getCurrentPhylogeny().getName() ) ) {
+                title = _mainpanel.getCurrentPhylogeny().getName() + " " + title;
+            }
+            showTextFrame( _mainpanel.getCurrentPhylogeny().toPhyloXML( 0 ), title );
         }
     }
 
+    public void showTextFrame( final String s, final String title ) {
+        checkTextFrames();
+        _textframes.addLast( TextFrame.instantiate( s, title, _textframes ) );
+    }
+
     /**
      * Display the about box.
      */
     static void about() {
         final StringBuffer about = new StringBuffer( "Archaeopteryx\nVersion " + Constants.VERSION + "\n" );
-        about.append( "Copyright (C) 2007-2011 Christian Zmasek\n" );
+        about.append( "Copyright (C) 2007-2012 Christian M. Zmasek\n" );
         about.append( "All Rights Reserved\n" );
         about.append( "License: GNU Lesser General Public License (LGPL)\n" );
         about.append( "Last modified: " + Constants.PRG_DATE + "\n" );
+        about.append( "Based on: " + ForesterUtil.getForesterLibraryInformation() + "\n" );
         about.append( "phyloXML version : " + ForesterConstants.PHYLO_XML_VERSION + "\n" );
         about.append( "phyloXML location: " + ForesterConstants.PHYLO_XML_LOCATION + "\n" );
         if ( !ForesterUtil.isEmpty( ForesterUtil.JAVA_VERSION ) && !ForesterUtil.isEmpty( ForesterUtil.JAVA_VENDOR ) ) {
@@ -1168,7 +1299,7 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         }
     }
 
-    static void help( final Map<String, WebLink> weblinks ) {
+    void help( final Map<String, WebLink> weblinks ) {
         final StringBuilder sb = new StringBuilder();
         sb.append( "Display options\n" );
         sb.append( "-------------------\n" );
@@ -1263,7 +1394,7 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         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() );
+        TextFrame.instantiate( sb.toString(), "Help", _textframes );
     }
 
     static void setOvPlacementColorChooseMenuItem( final JMenuItem mi, final Options options ) {
@@ -1312,7 +1443,7 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         if ( ( current_tree_panel == null ) || ( current_tree_panel.getPhylogeny() == null ) ) {
             mi.setEnabled( true );
         }
-        else if ( ForesterUtil.isHasAtLeastOneBranchWithSupportValues( current_tree_panel.getPhylogeny() ) ) {
+        else if ( AptxUtil.isHasAtLeastOneBranchWithSupportValues( current_tree_panel.getPhylogeny() ) ) {
             mi.setEnabled( true );
         }
         else {