in progress
[jalview.git] / forester / java / src / org / forester / archaeopteryx / MainFrameApplication.java
index f37e8a7..5053d83 100644 (file)
@@ -57,11 +57,12 @@ import javax.swing.WindowConstants;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 import javax.swing.filechooser.FileFilter;
+import javax.swing.plaf.synth.SynthLookAndFeel;
 
+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.archaeopteryx.Util.GraphicsExportType;
 import org.forester.archaeopteryx.tools.AncestralTaxonomyInferrer;
 import org.forester.archaeopteryx.tools.GoAnnotation;
 import org.forester.archaeopteryx.tools.PhyloInferenceDialog;
@@ -79,6 +80,7 @@ import org.forester.io.parsers.nhx.NHXParser;
 import org.forester.io.parsers.phyloxml.PhyloXmlParser;
 import org.forester.io.parsers.phyloxml.PhyloXmlUtil;
 import org.forester.io.parsers.tol.TolParser;
+import org.forester.io.parsers.util.ParserUtils;
 import org.forester.io.writers.PhylogenyWriter;
 import org.forester.io.writers.SequenceWriter;
 import org.forester.msa.Msa;
@@ -101,8 +103,6 @@ import org.forester.util.BasicTable;
 import org.forester.util.BasicTableParser;
 import org.forester.util.DescriptiveStatistics;
 import org.forester.util.ForesterUtil;
-import org.forester.util.ForesterUtil.PhylogenyNodeField;
-import org.forester.util.ForesterUtil.TAXONOMY_EXTRACTION;
 import org.forester.util.WindowsUtils;
 
 class DefaultFilter extends FileFilter {
@@ -173,20 +173,22 @@ class SequencesFileFilter extends FileFilter {
 
 public final class MainFrameApplication extends MainFrame {
 
-    private final static int                 FRAME_X_SIZE                    = 800;
-    private final static int                 FRAME_Y_SIZE                    = 800;
+    static final String                      INFER_ANCESTOR_TAXONOMIES             = "Infer Ancestor Taxonomies";
+    static final String                      OBTAIN_DETAILED_TAXONOMIC_INFORMATION = "Obtain Detailed Taxonomic Information";
+    private final static int                 FRAME_X_SIZE                          = 800;
+    private final static int                 FRAME_Y_SIZE                          = 800;
     // Filters for the file-open dialog (classes defined in this file)
-    private final static NHFilter            nhfilter                        = new NHFilter();
-    private final static NHXFilter           nhxfilter                       = new NHXFilter();
-    private final static XMLFilter           xmlfilter                       = new XMLFilter();
-    private final static TolFilter           tolfilter                       = new TolFilter();
-    private final static NexusFilter         nexusfilter                     = new NexusFilter();
-    private final static PdfFilter           pdffilter                       = new PdfFilter();
-    private final static GraphicsFileFilter  graphicsfilefilter              = new GraphicsFileFilter();
-    private final static MsaFileFilter       msafilter                       = new MsaFileFilter();
-    private final static SequencesFileFilter seqsfilter                      = new SequencesFileFilter();
-    private final static DefaultFilter       defaultfilter                   = new DefaultFilter();
-    private static final long                serialVersionUID                = -799735726778865234L;
+    private final static NHFilter            nhfilter                              = new NHFilter();
+    private final static NHXFilter           nhxfilter                             = new NHXFilter();
+    private final static XMLFilter           xmlfilter                             = new XMLFilter();
+    private final static TolFilter           tolfilter                             = new TolFilter();
+    private final static NexusFilter         nexusfilter                           = new NexusFilter();
+    private final static PdfFilter           pdffilter                             = new PdfFilter();
+    private final static GraphicsFileFilter  graphicsfilefilter                    = new GraphicsFileFilter();
+    private final static MsaFileFilter       msafilter                             = new MsaFileFilter();
+    private final static SequencesFileFilter seqsfilter                            = new SequencesFileFilter();
+    private final static DefaultFilter       defaultfilter                         = new DefaultFilter();
+    private static final long                serialVersionUID                      = -799735726778865234L;
     private final JFileChooser               _values_filechooser;
     private final JFileChooser               _open_filechooser;
     private final JFileChooser               _msa_filechooser;
@@ -216,17 +218,17 @@ public final class MainFrameApplication extends MainFrame {
     private File                             _current_dir;
     private ButtonGroup                      _radio_group_1;
     // Others:
-    double                                   _min_not_collapse               = Constants.MIN_NOT_COLLAPSE_DEFAULT;
+    double                                   _min_not_collapse                     = Constants.MIN_NOT_COLLAPSE_DEFAULT;
     // Phylogeny Inference menu
     private JMenu                            _inference_menu;
     private JMenuItem                        _inference_from_msa_item;
     private JMenuItem                        _inference_from_seqs_item;
     // Phylogeny Inference
-    private PhylogeneticInferenceOptions     _phylogenetic_inference_options = null;
-    private Msa                              _msa                            = null;
-    private File                             _msa_file                       = null;
-    private List<Sequence>                   _seqs                           = null;
-    private File                             _seqs_file                      = null;
+    private PhylogeneticInferenceOptions     _phylogenetic_inference_options       = null;
+    private Msa                              _msa                                  = null;
+    private File                             _msa_file                             = null;
+    private List<Sequence>                   _seqs                                 = null;
+    private File                             _seqs_file                            = null;
     // expression values menu:
     JMenuItem                                _read_values_jmi;
 
@@ -236,28 +238,45 @@ public final class MainFrameApplication extends MainFrame {
             throw new IllegalArgumentException( "configuration is null" );
         }
         try {
-            if ( _configuration.isUseNativeUI() ) {
-                UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
+            boolean synth_exception = false;
+            if ( Constants.__SYNTH_LF ) {
+                try {
+                    final SynthLookAndFeel synth = new SynthLookAndFeel();
+                    synth.load( MainFrameApplication.class.getResourceAsStream( "/resources/synth_look_and_feel_1.xml" ),
+                                MainFrameApplication.class );
+                    UIManager.setLookAndFeel( synth );
+                }
+                catch ( final Exception ex ) {
+                    synth_exception = true;
+                    ForesterUtil.printWarningMessage( Constants.PRG_NAME,
+                                                      "could not create synth look and feel: "
+                                                              + ex.getLocalizedMessage() );
+                }
             }
-            else {
-                UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );
+            if ( !Constants.__SYNTH_LF || synth_exception ) {
+                if ( _configuration.isUseNativeUI() ) {
+                    UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
+                }
+                else {
+                    UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );
+                }
             }
             //UIManager.setLookAndFeel( "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel" );
         }
         catch ( final UnsupportedLookAndFeelException e ) {
-            Util.dieWithSystemError( "UnsupportedLookAndFeelException: " + e.toString() );
+            AptxUtil.dieWithSystemError( "unsupported look and feel: " + e.toString() );
         }
         catch ( final ClassNotFoundException e ) {
-            Util.dieWithSystemError( "ClassNotFoundException: " + e.toString() );
+            AptxUtil.dieWithSystemError( "class not found exception: " + e.toString() );
         }
         catch ( final InstantiationException e ) {
-            Util.dieWithSystemError( "InstantiationException: " + e.toString() );
+            AptxUtil.dieWithSystemError( "instantiation exception: " + e.toString() );
         }
         catch ( final IllegalAccessException e ) {
-            Util.dieWithSystemError( "IllegalAccessException: " + e.toString() );
+            AptxUtil.dieWithSystemError( "illegal access exception: " + e.toString() );
         }
         catch ( final Exception e ) {
-            Util.dieWithSystemError( e.toString() );
+            AptxUtil.dieWithSystemError( e.toString() );
         }
         // hide until everything is ready
         setVisible( false );
@@ -390,7 +409,7 @@ public final class MainFrameApplication extends MainFrame {
         // addKeyListener( this );
         setVisible( true );
         if ( ( phys != null ) && ( phys.length > 0 ) ) {
-            Util.addPhylogeniesToTabs( phys, title, null, _configuration, _mainpanel );
+            AptxUtil.addPhylogeniesToTabs( phys, title, null, _configuration, _mainpanel );
             validate();
             getMainPanel().getControlPanel().showWholeAll();
             getMainPanel().getControlPanel().showWhole();
@@ -401,9 +420,54 @@ public final class MainFrameApplication extends MainFrame {
         System.gc();
     }
 
+    private MainFrameApplication( final Phylogeny[] phys, final Configuration config ) {
+        _configuration = config;
+        if ( _configuration == null ) {
+            throw new IllegalArgumentException( "configuration is null" );
+        }
+        setVisible( false );
+        setOptions( Options.createInstance( _configuration ) );
+        _mainpanel = new MainPanel( _configuration, this );
+        _open_filechooser = null;
+        _open_filechooser_for_species_tree = null;
+        _save_filechooser = null;
+        _writetopdf_filechooser = null;
+        _writetographics_filechooser = null;
+        _msa_filechooser = null;
+        _seqs_filechooser = null;
+        _values_filechooser = null;
+        _jmenubar = new JMenuBar();
+        buildFileMenu();
+        buildTypeMenu();
+        _contentpane = getContentPane();
+        _contentpane.setLayout( new BorderLayout() );
+        _contentpane.add( _mainpanel, BorderLayout.CENTER );
+        // App is this big
+        setSize( MainFrameApplication.FRAME_X_SIZE, MainFrameApplication.FRAME_Y_SIZE );
+        // The window listener
+        setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );
+        addWindowListener( new WindowAdapter() {
+
+            @Override
+            public void windowClosing( final WindowEvent e ) {
+                exit();
+            }
+        } );
+        //   setVisible( true );
+        if ( ( phys != null ) && ( phys.length > 0 ) ) {
+            AptxUtil.addPhylogeniesToTabs( phys, "", null, _configuration, _mainpanel );
+            validate();
+            getMainPanel().getControlPanel().showWholeAll();
+            getMainPanel().getControlPanel().showWhole();
+        }
+        //activateSaveAllIfNeeded();
+        // ...and its children
+        _contentpane.repaint();
+    }
+
     private MainFrameApplication( final Phylogeny[] phys, final String config_file, final String title ) {
         // Reads the config file (false, false => not url, not applet):
-        this( phys, new Configuration( config_file, false, false ), title );
+        this( phys, new Configuration( config_file, false, false, true ), title );
     }
 
     @Override
@@ -478,6 +542,12 @@ public final class MainFrameApplication extends MainFrame {
                 }
                 obtainDetailedTaxonomicInformation();
             }
+            else if ( o == _obtain_detailed_taxonomic_information_deleting_jmi ) {
+                if ( isSubtreeDisplayed() ) {
+                    return;
+                }
+                obtainDetailedTaxonomicInformationDelete();
+            }
             else if ( o == _obtain_uniprot_seq_information_jmi ) {
                 obtainUniProtSequenceInformation();
             }
@@ -565,10 +635,10 @@ public final class MainFrameApplication extends MainFrame {
             _contentpane.repaint();
         }
         catch ( final Exception ex ) {
-            Util.unexpectedException( ex );
+            AptxUtil.unexpectedException( ex );
         }
         catch ( final Error err ) {
-            Util.unexpectedError( err );
+            AptxUtil.unexpectedError( err );
         }
     }
 
@@ -589,7 +659,7 @@ public final class MainFrameApplication extends MainFrame {
         customizeJMenuItem( _root_min_cost_l_item );
         customizeJMenuItem( _load_species_tree_item );
         _analysis_menu.addSeparator();
-        _analysis_menu.add( _lineage_inference = new JMenuItem( "Infer Ancestor Taxonomies" ) );
+        _analysis_menu.add( _lineage_inference = new JMenuItem( INFER_ANCESTOR_TAXONOMIES ) );
         customizeJMenuItem( _lineage_inference );
         _lineage_inference.setToolTipText( "Inference of ancestor taxonomies/lineages" );
         _jmenubar.add( _analysis_menu );
@@ -635,15 +705,15 @@ public final class MainFrameApplication extends MainFrame {
         _save_all_item.setEnabled( false );
         _file_jmenu.addSeparator();
         _file_jmenu.add( _write_to_pdf_item = new JMenuItem( "Export to PDF file ..." ) );
-        if ( Util.canWriteFormat( "tif" ) || Util.canWriteFormat( "tiff" ) || Util.canWriteFormat( "TIF" ) ) {
+        if ( AptxUtil.canWriteFormat( "tif" ) || AptxUtil.canWriteFormat( "tiff" ) || AptxUtil.canWriteFormat( "TIF" ) ) {
             _file_jmenu.add( _write_to_tif_item = new JMenuItem( "Export to TIFF file..." ) );
         }
         _file_jmenu.add( _write_to_png_item = new JMenuItem( "Export to PNG file..." ) );
         _file_jmenu.add( _write_to_jpg_item = new JMenuItem( "Export to JPG file..." ) );
-        if ( Util.canWriteFormat( "gif" ) ) {
+        if ( AptxUtil.canWriteFormat( "gif" ) ) {
             _file_jmenu.add( _write_to_gif_item = new JMenuItem( "Export to GIF file..." ) );
         }
-        if ( Util.canWriteFormat( "bmp" ) ) {
+        if ( AptxUtil.canWriteFormat( "bmp" ) ) {
             _file_jmenu.add( _write_to_bmp_item = new JMenuItem( "Export to BMP file..." ) );
         }
         _file_jmenu.addSeparator();
@@ -685,7 +755,7 @@ public final class MainFrameApplication extends MainFrame {
 
             @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() );
@@ -700,6 +770,9 @@ public final class MainFrameApplication extends MainFrame {
                                                                      _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( customizeMenuItemAsLabel( new JMenuItem( DISPLAY_SUBHEADER ), getConfiguration() ) );
@@ -711,14 +784,12 @@ public final class MainFrameApplication extends MainFrame {
         _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_default_node_shapes_cbmi = new JCheckBoxMenuItem( DISPLAY_NODE_BOXES_LABEL ) );
         _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( _show_scale_cbmi = new JCheckBoxMenuItem( DISPLAY_SCALE_LABEL ) );
         _options_jmenu
                 .add( _show_branch_length_values_cbmi = new JCheckBoxMenuItem( DISPLAY_BRANCH_LENGTH_VALUES_LABEL ) );
@@ -769,13 +840,11 @@ public final class MainFrameApplication extends MainFrame {
         customizeJMenuItem( _print_size_mi );
         customizeJMenuItem( _choose_pdf_width_mi );
         customizeJMenuItem( _overview_placment_mi );
-        //TODO FIXME ~~
         customizeCheckBoxMenuItem( _show_default_node_shapes_cbmi, getOptions().isShowDefaultNodeShapes() );
         customizeCheckBoxMenuItem( _taxonomy_colorize_node_shapes_cbmi, getOptions().isTaxonomyColorizeNodeShapes() );
         customizeJMenuItem( _cycle_node_shape_mi );
         customizeJMenuItem( _cycle_node_fill_mi );
         customizeJMenuItem( _choose_node_size_mi );
-        //TODO FIXME ~~
         customizeCheckBoxMenuItem( _color_labels_same_as_parent_branch, getOptions().isColorLabelsSameAsParentBranch() );
         customizeCheckBoxMenuItem( _screen_antialias_cbmi, getOptions().isAntialiasScreen() );
         customizeCheckBoxMenuItem( _background_gradient_cbmi, getOptions().isBackgroundColorGradient() );
@@ -813,6 +882,9 @@ public final class MainFrameApplication extends MainFrame {
         _tools_menu = createMenu( "Tools", getConfiguration() );
         _tools_menu.add( _confcolor_item = new JMenuItem( "Colorize Branches Depending on Confidence" ) );
         customizeJMenuItem( _confcolor_item );
+        _tools_menu.add( _color_rank_jmi = new JMenuItem( "Colorize Subtrees via Taxonomic Rank" ) );
+        customizeJMenuItem( _color_rank_jmi );
+        _color_rank_jmi.setToolTipText( "for example, at \"Class\" level, colorize mammal specific subtree red" );
         _tools_menu.add( _taxcolor_item = new JMenuItem( "Taxonomy Colorize Branches" ) );
         customizeJMenuItem( _taxcolor_item );
         _tools_menu.add( _remove_branch_color_item = new JMenuItem( "Delete Branch Colors" ) );
@@ -848,11 +920,16 @@ public final class MainFrameApplication extends MainFrame {
         customizeJMenuItem( _infer_common_sn_names_item );
         _tools_menu.addSeparator();
         _tools_menu
-                .add( _obtain_detailed_taxonomic_information_jmi = new JMenuItem( "Obtain Detailed Taxonomic Information" ) );
+                .add( _obtain_detailed_taxonomic_information_jmi = new JMenuItem( OBTAIN_DETAILED_TAXONOMIC_INFORMATION ) );
         customizeJMenuItem( _obtain_detailed_taxonomic_information_jmi );
         _obtain_detailed_taxonomic_information_jmi
                 .setToolTipText( "To add additional taxonomic information (from UniProt Taxonomy)" );
         _tools_menu
+                .add( _obtain_detailed_taxonomic_information_deleting_jmi = new JMenuItem( "Obtain Detailed Taxonomic Information (deletes nodes!)" ) );
+        customizeJMenuItem( _obtain_detailed_taxonomic_information_deleting_jmi );
+        _obtain_detailed_taxonomic_information_deleting_jmi
+                .setToolTipText( "To add additional taxonomic information, deletes nodes for which taxonomy cannot found (from UniProt Taxonomy)" );
+        _tools_menu
                 .add( _obtain_uniprot_seq_information_jmi = new JMenuItem( "Obtain Sequence Information (from UniProt)" ) );
         customizeJMenuItem( _obtain_uniprot_seq_information_jmi );
         _obtain_uniprot_seq_information_jmi.setToolTipText( "To add additional sequence information (from UniProt)" );
@@ -1143,10 +1220,10 @@ public final class MainFrameApplication extends MainFrame {
                                            JOptionPane.ERROR_MESSAGE );
             return;
         }
-        final Phylogeny phy = _mainpanel.getCurrentPhylogeny().copy();
         final AncestralTaxonomyInferrer inferrer = new AncestralTaxonomyInferrer( this,
                                                                                   _mainpanel.getCurrentTreePanel(),
-                                                                                  phy );
+                                                                                  _mainpanel.getCurrentPhylogeny()
+                                                                                          .copy() );
         new Thread( inferrer ).start();
     }
 
@@ -1261,6 +1338,13 @@ public final class MainFrameApplication extends MainFrame {
         System.exit( 0 );
     }
 
+    public void end() {
+        _mainpanel.terminate();
+        _contentpane.removeAll();
+        setVisible( false );
+        dispose();
+    }
+
     private void extractTaxCodeFromNodeNames() {
         if ( getCurrentTreePanel() != null ) {
             final Phylogeny phy = getCurrentTreePanel().getPhylogeny();
@@ -1270,9 +1354,8 @@ public final class MainFrameApplication extends MainFrame {
                     final PhylogenyNode n = it.next();
                     final String name = n.getName().trim();
                     if ( !ForesterUtil.isEmpty( name ) ) {
-                        final String code = ForesterUtil.extractTaxonomyCodeFromNodeName( name,
-                                                                                          false,
-                                                                                          TAXONOMY_EXTRACTION.YES );
+                        final String code = ParserUtils
+                                .extractTaxonomyCodeFromNodeName( name, false, PhylogenyMethods.TAXONOMY_EXTRACTION.YES );
                         if ( !ForesterUtil.isEmpty( code ) ) {
                             PhylogenyMethods.setTaxonomyCode( n, code );
                         }
@@ -1361,7 +1444,7 @@ public final class MainFrameApplication extends MainFrame {
         if ( getCurrentTreePanel() != null ) {
             final Phylogeny phy = getCurrentTreePanel().getPhylogeny();
             if ( ( phy != null ) && !phy.isEmpty() ) {
-                ForesterUtil.transferNodeNameToField( phy, PhylogenyNodeField.SEQUENCE_NAME );
+                PhylogenyMethods.transferNodeNameToField( phy, PhylogenyMethods.PhylogenyNodeField.SEQUENCE_NAME );
             }
         }
     }
@@ -1370,7 +1453,8 @@ public final class MainFrameApplication extends MainFrame {
         if ( getCurrentTreePanel() != null ) {
             final Phylogeny phy = getCurrentTreePanel().getPhylogeny();
             if ( ( phy != null ) && !phy.isEmpty() ) {
-                ForesterUtil.transferNodeNameToField( phy, PhylogenyNodeField.TAXONOMY_SCIENTIFIC_NAME );
+                PhylogenyMethods.transferNodeNameToField( phy,
+                                                          PhylogenyMethods.PhylogenyNodeField.TAXONOMY_SCIENTIFIC_NAME );
             }
         }
     }
@@ -1382,7 +1466,7 @@ public final class MainFrameApplication extends MainFrame {
         phy.setRoot( node );
         phy.setRooted( true );
         phys[ 0 ] = phy;
-        Util.addPhylogeniesToTabs( phys, "", "", getConfiguration(), getMainPanel() );
+        AptxUtil.addPhylogeniesToTabs( phys, "", "", getConfiguration(), getMainPanel() );
         _mainpanel.getControlPanel().showWhole();
         _mainpanel.getCurrentTreePanel().setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR );
         _mainpanel.getOptions().setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR );
@@ -1410,6 +1494,19 @@ public final class MainFrameApplication extends MainFrame {
         }
     }
 
+    private void obtainDetailedTaxonomicInformationDelete() {
+        if ( getCurrentTreePanel() != null ) {
+            final Phylogeny phy = getCurrentTreePanel().getPhylogeny();
+            if ( ( phy != null ) && !phy.isEmpty() ) {
+                final TaxonomyDataObtainer t = new TaxonomyDataObtainer( this,
+                                                                         _mainpanel.getCurrentTreePanel(),
+                                                                         phy.copy(),
+                                                                         true );
+                new Thread( t ).start();
+            }
+        }
+    }
+
     private void obtainUniProtSequenceInformation() {
         if ( getCurrentTreePanel() != null ) {
             final Phylogeny phy = getCurrentTreePanel().getPhylogeny();
@@ -1643,7 +1740,7 @@ public final class MainFrameApplication extends MainFrame {
                         try {
                             final NHXParser nhx = new NHXParser();
                             setSpecialOptionsForNhxParser( nhx );
-                            phys = ForesterUtil.readPhylogenies( nhx, file );
+                            phys = PhylogenyMethods.readPhylogenies( nhx, file );
                             nhx_or_nexus = true;
                         }
                         catch ( final Exception e ) {
@@ -1655,7 +1752,7 @@ public final class MainFrameApplication extends MainFrame {
                         warnIfNotPhyloXmlValidation( getConfiguration() );
                         try {
                             final PhyloXmlParser xml_parser = createPhyloXmlParser();
-                            phys = ForesterUtil.readPhylogenies( xml_parser, file );
+                            phys = PhylogenyMethods.readPhylogenies( xml_parser, file );
                         }
                         catch ( final Exception e ) {
                             exception = true;
@@ -1664,7 +1761,7 @@ public final class MainFrameApplication extends MainFrame {
                     }
                     else if ( _open_filechooser.getFileFilter() == MainFrameApplication.tolfilter ) {
                         try {
-                            phys = ForesterUtil.readPhylogenies( new TolParser(), file );
+                            phys = PhylogenyMethods.readPhylogenies( new TolParser(), file );
                         }
                         catch ( final Exception e ) {
                             exception = true;
@@ -1675,7 +1772,7 @@ public final class MainFrameApplication extends MainFrame {
                         try {
                             final NexusPhylogeniesParser nex = new NexusPhylogeniesParser();
                             setSpecialOptionsForNexParser( nex );
-                            phys = ForesterUtil.readPhylogenies( nex, file );
+                            phys = PhylogenyMethods.readPhylogenies( nex, file );
                             nhx_or_nexus = true;
                         }
                         catch ( final Exception e ) {
@@ -1686,7 +1783,7 @@ public final class MainFrameApplication extends MainFrame {
                     // "*.*":
                     else {
                         try {
-                            final PhylogenyParser parser = ForesterUtil
+                            final PhylogenyParser parser = ParserUtils
                                     .createParserDependingOnFileType( file, getConfiguration()
                                             .isValidatePhyloXmlAgainstSchema() );
                             if ( parser instanceof NexusPhylogeniesParser ) {
@@ -1702,7 +1799,7 @@ public final class MainFrameApplication extends MainFrame {
                             else if ( parser instanceof PhyloXmlParser ) {
                                 warnIfNotPhyloXmlValidation( getConfiguration() );
                             }
-                            phys = ForesterUtil.readPhylogenies( parser, file );
+                            phys = PhylogenyMethods.readPhylogenies( parser, file );
                         }
                         catch ( final Exception e ) {
                             exception = true;
@@ -1720,7 +1817,7 @@ public final class MainFrameApplication extends MainFrame {
                         if ( nhx_or_nexus ) {
                             for( final Phylogeny phy : phys ) {
                                 if ( getOptions().isInternalNumberAreConfidenceForNhParsing() ) {
-                                    ForesterUtil.transferInternalNodeNamesToConfidence( phy );
+                                    PhylogenyMethods.transferInternalNodeNamesToConfidence( phy );
                                 }
                                 if ( PhylogenyMethods.getMinimumDescendentsPerInternalNodes( phy ) == 1 ) {
                                     one_desc = true;
@@ -1728,11 +1825,11 @@ public final class MainFrameApplication extends MainFrame {
                                 }
                             }
                         }
-                        Util.addPhylogeniesToTabs( phys,
-                                                   file.getName(),
-                                                   file.getAbsolutePath(),
-                                                   getConfiguration(),
-                                                   getMainPanel() );
+                        AptxUtil.addPhylogeniesToTabs( phys,
+                                                       file.getName(),
+                                                       file.getAbsolutePath(),
+                                                       getConfiguration(),
+                                                       getMainPanel() );
                         _mainpanel.getControlPanel().showWhole();
                         if ( nhx_or_nexus && one_desc ) {
                             JOptionPane
@@ -1981,7 +2078,7 @@ public final class MainFrameApplication extends MainFrame {
                     parser = new TolParser();
                 }
                 else {
-                    parser = ForesterUtil.createParserDependingOnUrlContents( url, getConfiguration()
+                    parser = ParserUtils.createParserDependingOnUrlContents( url, getConfiguration()
                             .isValidatePhyloXmlAgainstSchema() );
                 }
                 if ( parser instanceof NexusPhylogeniesParser ) {
@@ -2029,14 +2126,14 @@ public final class MainFrameApplication extends MainFrame {
             if ( ( phys != null ) && ( phys.length > 0 ) ) {
                 if ( nhx_or_nexus && getOptions().isInternalNumberAreConfidenceForNhParsing() ) {
                     for( final Phylogeny phy : phys ) {
-                        ForesterUtil.transferInternalNodeNamesToConfidence( phy );
+                        PhylogenyMethods.transferInternalNodeNamesToConfidence( phy );
                     }
                 }
-                Util.addPhylogeniesToTabs( phys,
-                                           new File( url.getFile() ).getName(),
-                                           new File( url.getFile() ).toString(),
-                                           getConfiguration(),
-                                           getMainPanel() );
+                AptxUtil.addPhylogeniesToTabs( phys,
+                                               new File( url.getFile() ).getName(),
+                                               new File( url.getFile() ).toString(),
+                                               getConfiguration(),
+                                               getMainPanel() );
                 _mainpanel.getControlPanel().showWhole();
             }
         }
@@ -2057,7 +2154,7 @@ public final class MainFrameApplication extends MainFrame {
         if ( ( file != null ) && ( result == JFileChooser.APPROVE_OPTION ) ) {
             if ( _open_filechooser_for_species_tree.getFileFilter() == MainFrameApplication.xmlfilter ) {
                 try {
-                    final Phylogeny[] trees = ForesterUtil.readPhylogenies( new PhyloXmlParser(), file );
+                    final Phylogeny[] trees = PhylogenyMethods.readPhylogenies( new PhyloXmlParser(), file );
                     t = trees[ 0 ];
                 }
                 catch ( final Exception e ) {
@@ -2067,7 +2164,7 @@ public final class MainFrameApplication extends MainFrame {
             }
             else if ( _open_filechooser_for_species_tree.getFileFilter() == MainFrameApplication.tolfilter ) {
                 try {
-                    final Phylogeny[] trees = ForesterUtil.readPhylogenies( new TolParser(), file );
+                    final Phylogeny[] trees = PhylogenyMethods.readPhylogenies( new TolParser(), file );
                     t = trees[ 0 ];
                 }
                 catch ( final Exception e ) {
@@ -2078,7 +2175,7 @@ public final class MainFrameApplication extends MainFrame {
             // "*.*":
             else {
                 try {
-                    final Phylogeny[] trees = ForesterUtil.readPhylogenies( new PhyloXmlParser(), file );
+                    final Phylogeny[] trees = PhylogenyMethods.readPhylogenies( new PhyloXmlParser(), file );
                     t = trees[ 0 ];
                 }
                 catch ( final Exception e ) {
@@ -2152,9 +2249,9 @@ public final class MainFrameApplication extends MainFrame {
 
     private void setSpecialOptionsForNhxParser( final NHXParser nhx ) {
         nhx.setReplaceUnderscores( getOptions().isReplaceUnderscoresInNhParsing() );
-        ForesterUtil.TAXONOMY_EXTRACTION te = ForesterUtil.TAXONOMY_EXTRACTION.NO;
+        PhylogenyMethods.TAXONOMY_EXTRACTION te = PhylogenyMethods.TAXONOMY_EXTRACTION.NO;
         if ( getOptions().isExtractPfamTaxonomyCodesInNhParsing() ) {
-            te = ForesterUtil.TAXONOMY_EXTRACTION.YES;
+            te = PhylogenyMethods.TAXONOMY_EXTRACTION.YES;
         }
         nhx.setTaxonomyExtraction( te );
     }
@@ -2260,20 +2357,20 @@ public final class MainFrameApplication extends MainFrame {
         return exception;
     }
 
-    private void writePhylogenyToGraphicsFile( final String file_name, final GraphicsExportType type ) {
+    void writePhylogenyToGraphicsFile( final String file_name, final GraphicsExportType type ) {
         _mainpanel.getCurrentTreePanel().setParametersForPainting( _mainpanel.getCurrentTreePanel().getWidth(),
                                                                    _mainpanel.getCurrentTreePanel().getHeight(),
                                                                    true );
         String file_written_to = "";
         boolean error = false;
         try {
-            file_written_to = Util.writePhylogenyToGraphicsFile( file_name,
-                                                                 _mainpanel.getCurrentTreePanel().getWidth(),
-                                                                 _mainpanel.getCurrentTreePanel().getHeight(),
-                                                                 _mainpanel.getCurrentTreePanel(),
-                                                                 _mainpanel.getControlPanel(),
-                                                                 type,
-                                                                 getOptions() );
+            file_written_to = AptxUtil.writePhylogenyToGraphicsFile( file_name,
+                                                                     _mainpanel.getCurrentTreePanel().getWidth(),
+                                                                     _mainpanel.getCurrentTreePanel().getHeight(),
+                                                                     _mainpanel.getCurrentTreePanel(),
+                                                                     _mainpanel.getControlPanel(),
+                                                                     type,
+                                                                     getOptions() );
         }
         catch ( final IOException e ) {
             error = true;
@@ -2485,6 +2582,10 @@ public final class MainFrameApplication extends MainFrame {
         return new MainFrameApplication( phys, config, title );
     }
 
+    public static MainFrameApplication createInstance( final Phylogeny[] phys, final Configuration config ) {
+        return new MainFrameApplication( phys, config );
+    }
+
     static MainFrame createInstance( final Phylogeny[] phys, final String config_file_name, final String title ) {
         return new MainFrameApplication( phys, config_file_name, title );
     }