JAL-2797 added constructor including embedded/standalone boolean
[jalview.git] / forester / java / src / org / forester / archaeopteryx / MainFrameApplication.java
index 40fc4bc..9a9c233 100644 (file)
@@ -42,7 +42,6 @@ import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
 import javax.swing.ButtonGroup;
@@ -58,6 +57,8 @@ import javax.swing.UnsupportedLookAndFeelException;
 import javax.swing.WindowConstants;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
+import javax.swing.event.InternalFrameAdapter;
+import javax.swing.event.InternalFrameEvent;
 
 import org.forester.analysis.TaxonomyDataManager;
 import org.forester.archaeopteryx.Options.CLADOGRAM_TYPE;
@@ -78,7 +79,6 @@ import org.forester.io.parsers.nhx.NHXParser;
 import org.forester.io.parsers.nhx.NHXParser.TAXONOMY_EXTRACTION;
 import org.forester.io.parsers.phyloxml.PhyloXmlDataFormatException;
 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.SequenceWriter;
@@ -104,8 +104,8 @@ import org.forester.util.ForesterUtil;
 
 public final class MainFrameApplication extends MainFrame {
 
-    private final static int             FRAME_X_SIZE                    = 800;
-    private final static int             FRAME_Y_SIZE                    = 800;
+    private final static int             FRAME_X_SIZE                    = 900;
+    private final static int             FRAME_Y_SIZE                    = 900;
     // Filters for the file-open dialog (classes defined in this file)
     private static final long            serialVersionUID                = -799735726778865234L;
     private static final boolean         PREPROCESS_TREES                = false;
@@ -118,7 +118,6 @@ public final class MainFrameApplication extends MainFrame {
     // Application-only print menu items
     private JMenuItem                    _collapse_below_threshold;
     private JMenuItem                    _collapse_below_branch_length;
-    private JMenuItem                    _collapse_by_taxonomic_rank;
     private ButtonGroup                  _radio_group_1;
     private ButtonGroup                  _radio_group_2;
     // Others:
@@ -164,10 +163,11 @@ public final class MainFrameApplication extends MainFrame {
         setSize( MainFrameApplication.FRAME_X_SIZE, MainFrameApplication.FRAME_Y_SIZE );
         // The window listener
         setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );
-        addWindowListener( new WindowAdapter() {
+        addFrameListener( new FrameAdapter() {
 
             @Override
-            public void windowClosing( final WindowEvent e ) {
+            public void FrameClosing () {
+             
                 exit();
             }
         } );
@@ -183,15 +183,18 @@ public final class MainFrameApplication extends MainFrame {
         _contentpane.repaint();
     }
 
+
     private MainFrameApplication( final Phylogeny[] phys, final Configuration config, final String title ) {
         this( phys, config, title, null );
     }
-
-    private MainFrameApplication( final Phylogeny[] phys,
+    
+    private MainFrameApplication(final Phylogeny[] phys,
                                   final Configuration config,
                                   final String title,
-                                  final File current_dir ) {
-        super();
+                                  final File current_dir,
+                                  final boolean isEmbedded) {
+        super(isEmbedded);
         _configuration = config;
         if ( _configuration == null ) {
             throw new IllegalArgumentException( "configuration is null" );
@@ -305,14 +308,16 @@ public final class MainFrameApplication extends MainFrame {
         //        } );
         // The window listener
         setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );
-        addWindowListener( new WindowAdapter() {
+        addFrameListener( new FrameAdapter() {
 
             @Override
-            public void windowClosing( final WindowEvent e ) {
+            public void FrameClosing(  ) {
+                if (MainFrameApplication.this.getParent() == null) {
                 if ( isUnsavedDataPresent() ) {
-                    final int r = JOptionPane.showConfirmDialog( null,
-                                                                 "Exit despite potentially unsaved changes?",
-                                                                 "Exit?",
+                    final int r = JOptionPane.showConfirmDialog( _mainpanel,
+                                                                 "Close Archaeopteryx despite potentially unsaved changes?",
+                                                                 "Close viewer?",
                                                                  JOptionPane.YES_NO_OPTION );
                     if ( r != JOptionPane.YES_OPTION ) {
                         return;
@@ -324,10 +329,10 @@ public final class MainFrameApplication extends MainFrame {
                     if ( r != JOptionPane.YES_OPTION ) {
                         return;
                     }
-                }
+                }}
                 exit();
-            }
-        } );
+            
+        } });
         // The component listener
         addComponentListener( new ComponentAdapter() {
 
@@ -353,6 +358,14 @@ public final class MainFrameApplication extends MainFrame {
         // ...and its children
         _contentpane.repaint();
         System.gc();
+    
+    }
+
+    private MainFrameApplication( final Phylogeny[] phys,
+                                  final Configuration config,
+                                  final String title,
+                                  final File current_dir ) {
+        this(phys,config,title,current_dir,false);
     }
 
     private MainFrameApplication( final Phylogeny[] phys, final String config_file, final String title ) {
@@ -435,12 +448,7 @@ public final class MainFrameApplication extends MainFrame {
                 }
                 collapseBelowThreshold();
             }
-            else if ( o == _collapse_by_taxonomic_rank ) {
-                if ( isSubtreeDisplayed() ) {
-                    return;
-                }
-                collapseByTaxonomicRank();
-            }
+           
             else if ( o == _collapse_below_branch_length ) {
                 if ( isSubtreeDisplayed() ) {
                     return;
@@ -523,12 +531,12 @@ public final class MainFrameApplication extends MainFrame {
                     msa = FastaParser.parseMsa( is );
                 }
                 else {
-                    msa = GeneralMsaParser.parse( is );
+                    msa = GeneralMsaParser.parseMsa( is );
                 }
             }
             catch ( final MsaFormatException e ) {
                 setArrowCursor();
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                e.getLocalizedMessage(),
                                                "Multiple sequence alignment format error",
                                                JOptionPane.ERROR_MESSAGE );
@@ -536,7 +544,7 @@ public final class MainFrameApplication extends MainFrame {
             }
             catch ( final IOException e ) {
                 setArrowCursor();
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                e.getLocalizedMessage(),
                                                "Failed to read multiple sequence alignment",
                                                JOptionPane.ERROR_MESSAGE );
@@ -544,7 +552,7 @@ public final class MainFrameApplication extends MainFrame {
             }
             catch ( final IllegalArgumentException e ) {
                 setArrowCursor();
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                e.getLocalizedMessage(),
                                                "Unexpected error during reading of multiple sequence alignment",
                                                JOptionPane.ERROR_MESSAGE );
@@ -553,28 +561,28 @@ public final class MainFrameApplication extends MainFrame {
             catch ( final Exception e ) {
                 setArrowCursor();
                 e.printStackTrace();
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                e.getLocalizedMessage(),
                                                "Unexpected error during reading of multiple sequence alignment",
                                                JOptionPane.ERROR_MESSAGE );
                 return;
             }
             if ( ( msa == null ) || ( msa.getNumberOfSequences() < 1 ) ) {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "Multiple sequence alignment is empty",
                                                "Illegal Multiple Sequence Alignment",
                                                JOptionPane.ERROR_MESSAGE );
                 return;
             }
             if ( msa.getNumberOfSequences() < 4 ) {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "Multiple sequence alignment needs to contain at least 3 sequences",
                                                "Illegal multiple sequence alignment",
                                                JOptionPane.ERROR_MESSAGE );
                 return;
             }
             if ( msa.getLength() < 2 ) {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "Multiple sequence alignment needs to contain at least 2 residues",
                                                "Illegal multiple sequence alignment",
                                                JOptionPane.ERROR_MESSAGE );
@@ -615,7 +623,7 @@ public final class MainFrameApplication extends MainFrame {
             }
             catch ( final MsaFormatException e ) {
                 setArrowCursor();
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                e.getLocalizedMessage(),
                                                "Multiple sequence file format error",
                                                JOptionPane.ERROR_MESSAGE );
@@ -623,7 +631,7 @@ public final class MainFrameApplication extends MainFrame {
             }
             catch ( final IOException e ) {
                 setArrowCursor();
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                e.getLocalizedMessage(),
                                                "Failed to read multiple sequence file",
                                                JOptionPane.ERROR_MESSAGE );
@@ -631,7 +639,7 @@ public final class MainFrameApplication extends MainFrame {
             }
             catch ( final IllegalArgumentException e ) {
                 setArrowCursor();
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                e.getLocalizedMessage(),
                                                "Unexpected error during reading of multiple sequence file",
                                                JOptionPane.ERROR_MESSAGE );
@@ -640,21 +648,21 @@ public final class MainFrameApplication extends MainFrame {
             catch ( final Exception e ) {
                 setArrowCursor();
                 e.printStackTrace();
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                e.getLocalizedMessage(),
                                                "Unexpected error during reading of multiple sequence file",
                                                JOptionPane.ERROR_MESSAGE );
                 return;
             }
             if ( ( seqs == null ) || ( seqs.size() < 1 ) ) {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "Multiple sequence file is empty",
                                                "Illegal multiple sequence file",
                                                JOptionPane.ERROR_MESSAGE );
                 return;
             }
             if ( seqs.size() < 4 ) {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "Multiple sequence file needs to contain at least 3 sequences",
                                                "Illegal multiple sequence file",
                                                JOptionPane.ERROR_MESSAGE );
@@ -675,7 +683,7 @@ public final class MainFrameApplication extends MainFrame {
 
     private void addExpressionValuesFromFile() {
         if ( ( getCurrentTreePanel() == null ) || ( getCurrentTreePanel().getPhylogeny() == null ) ) {
-            JOptionPane.showMessageDialog( this,
+            JOptionPane.showMessageDialog( getThisFrame(),
                                            "Need to load evolutionary tree first",
                                            "Can Not Read Expression Values",
                                            JOptionPane.WARNING_MESSAGE );
@@ -699,21 +707,21 @@ public final class MainFrameApplication extends MainFrame {
                 }
             }
             catch ( final IOException e ) {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                e.getMessage(),
                                                "Could Not Read Expression Value Table",
                                                JOptionPane.ERROR_MESSAGE );
                 return;
             }
             if ( t.getNumberOfColumns() < 2 ) {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "Table contains " + t.getNumberOfColumns() + " column(s)",
                                                "Problem with Expression Value Table",
                                                JOptionPane.ERROR_MESSAGE );
                 return;
             }
             if ( t.getNumberOfRows() < 1 ) {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "Table contains zero rows",
                                                "Problem with Expression Value Table",
                                                JOptionPane.ERROR_MESSAGE );
@@ -721,7 +729,7 @@ public final class MainFrameApplication extends MainFrame {
             }
             final Phylogeny phy = getCurrentTreePanel().getPhylogeny();
             if ( t.getNumberOfRows() != phy.getNumberOfExternalNodes() ) {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "Table contains " + t.getNumberOfRows() + " rows, but tree contains "
                                                        + phy.getNumberOfExternalNodes() + " external nodes",
                                                "Warning",
@@ -738,7 +746,7 @@ public final class MainFrameApplication extends MainFrame {
                         row = t.findRow( node_name );
                     }
                     catch ( final IllegalArgumentException e ) {
-                        JOptionPane.showMessageDialog( this,
+                        JOptionPane.showMessageDialog( getThisFrame(),
                                                        e.getMessage(),
                                                        "Error Mapping Node Identifiers to Expression Value Identifiers",
                                                        JOptionPane.ERROR_MESSAGE );
@@ -757,7 +765,7 @@ public final class MainFrameApplication extends MainFrame {
                             d = Double.parseDouble( t.getValueAsString( col, row ) );
                         }
                         catch ( final NumberFormatException e ) {
-                            JOptionPane.showMessageDialog( this,
+                            JOptionPane.showMessageDialog( getThisFrame(),
                                                            "Could not parse \"" + t.getValueAsString( col, row )
                                                                    + "\" into a decimal value",
                                                            "Issue with Expression Value Table",
@@ -768,17 +776,14 @@ public final class MainFrameApplication extends MainFrame {
                         l.add( d );
                     }
                     if ( !l.isEmpty() ) {
-                        if ( node.getNodeData().getProperties() != null ) {
-                            node.getNodeData().getProperties()
-                                    .removePropertiesWithGivenReferencePrefix( PhyloXmlUtil.VECTOR_PROPERTY_REF );
-                        }
+                       
                         node.getNodeData().setVector( l );
                     }
                 }
             }
             if ( not_found > 0 ) {
                 JOptionPane
-                        .showMessageDialog( this,
+                        .showMessageDialog( getThisFrame(),
                                             "Could not fine expression values for " + not_found + " external node(s)",
                                             "Warning",
                                             JOptionPane.WARNING_MESSAGE );
@@ -789,7 +794,7 @@ public final class MainFrameApplication extends MainFrame {
 
     private void addSequencesFromFile() {
         if ( ( getCurrentTreePanel() == null ) || ( getCurrentTreePanel().getPhylogeny() == null ) ) {
-            JOptionPane.showMessageDialog( this,
+            JOptionPane.showMessageDialog( getThisFrame(),
                                            "Need to load evolutionary tree first",
                                            "Can Not Read Sequences",
                                            JOptionPane.WARNING_MESSAGE );
@@ -816,7 +821,7 @@ public final class MainFrameApplication extends MainFrame {
                     }
                 }
                 else {
-                    JOptionPane.showMessageDialog( this,
+                    JOptionPane.showMessageDialog( getThisFrame(),
                                                    "Format does not appear to be Fasta",
                                                    "Multiple sequence file format error",
                                                    JOptionPane.ERROR_MESSAGE );
@@ -831,7 +836,7 @@ public final class MainFrameApplication extends MainFrame {
             }
             catch ( final MsaFormatException e ) {
                 setArrowCursor();
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                e.getLocalizedMessage(),
                                                "Multiple sequence file format error",
                                                JOptionPane.ERROR_MESSAGE );
@@ -839,7 +844,7 @@ public final class MainFrameApplication extends MainFrame {
             }
             catch ( final IOException e ) {
                 setArrowCursor();
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                e.getLocalizedMessage(),
                                                "Failed to read multiple sequence file",
                                                JOptionPane.ERROR_MESSAGE );
@@ -848,14 +853,14 @@ public final class MainFrameApplication extends MainFrame {
             catch ( final Exception e ) {
                 setArrowCursor();
                 e.printStackTrace();
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                e.getLocalizedMessage(),
                                                "Unexpected error during reading of multiple sequence file",
                                                JOptionPane.ERROR_MESSAGE );
                 return;
             }
             if ( ( seqs == null ) || ( seqs.size() < 1 ) ) {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "Multiple sequence file is empty",
                                                "Empty multiple sequence file",
                                                JOptionPane.ERROR_MESSAGE );
@@ -885,7 +890,7 @@ public final class MainFrameApplication extends MainFrame {
                         nodes = phy.getNodes( seq_name );
                     }
                     if ( nodes.size() > 1 ) {
-                        JOptionPane.showMessageDialog( this,
+                        JOptionPane.showMessageDialog( getThisFrame(),
                                                        "Sequence name \"" + seq_name + "\" is not unique",
                                                        "Sequence name not unique",
                                                        JOptionPane.ERROR_MESSAGE );
@@ -903,7 +908,7 @@ public final class MainFrameApplication extends MainFrame {
                             nodes = phy.getNodes( seq_name_split );
                         }
                         if ( nodes.size() > 1 ) {
-                            JOptionPane.showMessageDialog( this,
+                            JOptionPane.showMessageDialog( getThisFrame(),
                                                            "Split sequence name \"" + seq_name_split
                                                                    + "\" is not unique",
                                                            "Sequence name not unique",
@@ -945,13 +950,13 @@ public final class MainFrameApplication extends MainFrame {
                             + " external nodes now have a molecular sequence attached to them.";
                 }
                 if ( ( attached_counter == total_counter ) && ( ext_nodes == ext_nodes_with_seq ) ) {
-                    JOptionPane.showMessageDialog( this,
+                    JOptionPane.showMessageDialog( getThisFrame(),
                                                    "Attached all " + total_counter + " sequences to tree nodes.\n" + s,
                                                    "All sequences attached",
                                                    JOptionPane.INFORMATION_MESSAGE );
                 }
                 else {
-                    JOptionPane.showMessageDialog( this,
+                    JOptionPane.showMessageDialog( getThisFrame(),
                                                    "Attached " + attached_counter + " sequences out of a total of "
                                                            + total_counter + " sequences.\n" + s,
                                                    attached_counter + " sequences attached",
@@ -959,7 +964,7 @@ public final class MainFrameApplication extends MainFrame {
                 }
             }
             else {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "No maching tree node for any of the " + total_counter + " sequences",
                                                "Could not attach any sequences",
                                                JOptionPane.ERROR_MESSAGE );
@@ -970,7 +975,7 @@ public final class MainFrameApplication extends MainFrame {
     private void closeCurrentPane() {
         if ( getMainPanel().getCurrentTreePanel() != null ) {
             if ( getMainPanel().getCurrentTreePanel().isEdited() ) {
-                final int r = JOptionPane.showConfirmDialog( this,
+                final int r = JOptionPane.showConfirmDialog( getThisFrame(),
                                                              "Close tab despite potentially unsaved changes?",
                                                              "Close Tab?",
                                                              JOptionPane.YES_NO_OPTION );
@@ -983,7 +988,7 @@ public final class MainFrameApplication extends MainFrame {
         }
     }
 
-    private void collapse( final Phylogeny phy ) {
+    private void collapseBelowThreshold( final Phylogeny phy ) {
         final PhylogenyNodeIterator it = phy.iteratorPostorder();
         final List<PhylogenyNode> to_be_removed = new ArrayList<PhylogenyNode>();
         double min_support = Double.MAX_VALUE;
@@ -1028,7 +1033,7 @@ public final class MainFrameApplication extends MainFrame {
                 repaint();
             }
             if ( to_be_removed.size() > 0 ) {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "Collapsed " + to_be_removed.size()
                                                        + " branches with\nconfidence values below "
                                                        + getMinNotCollapseConfidenceValue(),
@@ -1036,7 +1041,7 @@ public final class MainFrameApplication extends MainFrame {
                                                JOptionPane.INFORMATION_MESSAGE );
             }
             else {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "No branch collapsed,\nminimum confidence value per branch is "
                                                        + min_support,
                                                "No branch collapsed",
@@ -1044,39 +1049,18 @@ public final class MainFrameApplication extends MainFrame {
             }
         }
         else {
-            JOptionPane.showMessageDialog( this,
+            JOptionPane.showMessageDialog( getThisFrame(),
                                            "No branch collapsed because no confidence values present",
                                            "No confidence values present",
                                            JOptionPane.INFORMATION_MESSAGE );
         }
     }
 
-    private void collapseByTaxonomicRank() {
-        if ( _mainpanel.getCurrentTreePanel() != null ) {
-            final Map<String, Integer> present_ranks = AptxUtil.getRankCounts( _mainpanel.getCurrentTreePanel().getPhylogeny());
-            final String[] ranks = AptxUtil.getAllPossibleRanks(present_ranks);
-             String rank = ( String ) JOptionPane
-                    .showInputDialog( this,
-                                      "What rank should the collapsing be based on",
-                                      "Rank Selection",
-                                      JOptionPane.QUESTION_MESSAGE,
-                                      null,
-                                      ranks,
-                                      null );
-            if ( !ForesterUtil.isEmpty( rank ) ) {
-                if ( rank.indexOf( '(' ) > 0 ) {
-                    rank = rank.substring( 0, rank.indexOf( '(' ) ).trim();
-                }
-                _mainpanel.getCurrentTreePanel().collapseByTaxonomicRank( rank );
-            }
-        }
-    }
-
     private void collapseBelowBranchLengthThreshold() {
         if ( getCurrentTreePanel() != null ) {
             final Phylogeny phy = getCurrentTreePanel().getPhylogeny();
             if ( ( phy != null ) && !phy.isEmpty() ) {
-                final String s = ( String ) JOptionPane.showInputDialog( this,
+                final String s = ( String ) JOptionPane.showInputDialog( getThisFrame(),
                                                                          "Please enter the minimum branch length value\n",
                                                                          "Minimal Branch Length Value",
                                                                          JOptionPane.QUESTION_MESSAGE,
@@ -1111,7 +1095,7 @@ public final class MainFrameApplication extends MainFrame {
         if ( getCurrentTreePanel() != null ) {
             final Phylogeny phy = getCurrentTreePanel().getPhylogeny();
             if ( ( phy != null ) && !phy.isEmpty() ) {
-                final String s = ( String ) JOptionPane.showInputDialog( this,
+                final String s = ( String ) JOptionPane.showInputDialog( getThisFrame(),
                                                                          "Please enter the minimum confidence value\n",
                                                                          "Minimal Confidence Value",
                                                                          JOptionPane.QUESTION_MESSAGE,
@@ -1135,7 +1119,7 @@ public final class MainFrameApplication extends MainFrame {
                     }
                     if ( success && ( m >= 0.0 ) ) {
                         setMinNotCollapseConfidenceValue( m );
-                        collapse( phy );
+                        collapseBelowThreshold( phy );
                     }
                 }
             }
@@ -1181,7 +1165,7 @@ public final class MainFrameApplication extends MainFrame {
                 repaint();
             }
             if ( to_be_removed.size() > 0 ) {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "Collapsed " + to_be_removed.size()
                                                        + " branches with\nbranch length values below "
                                                        + getMinNotCollapseBlValue(),
@@ -1189,14 +1173,14 @@ public final class MainFrameApplication extends MainFrame {
                                                JOptionPane.INFORMATION_MESSAGE );
             }
             else {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "No branch collapsed,\nminimum branch length is " + min_bl,
                                                "No branch collapsed",
                                                JOptionPane.INFORMATION_MESSAGE );
             }
         }
         else {
-            JOptionPane.showMessageDialog( this,
+            JOptionPane.showMessageDialog( getThisFrame(),
                                            "No branch collapsed because no branch length values present",
                                            "No branch length values present",
                                            JOptionPane.INFORMATION_MESSAGE );
@@ -1210,7 +1194,7 @@ public final class MainFrameApplication extends MainFrame {
                 xml_parser = PhyloXmlParser.createPhyloXmlParserXsdValidating();
             }
             catch ( final Exception e ) {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                e.getLocalizedMessage(),
                                                "failed to create validating XML parser",
                                                JOptionPane.WARNING_MESSAGE );
@@ -1237,7 +1221,7 @@ public final class MainFrameApplication extends MainFrame {
                     new Thread( inferrer ).start();
                 }
                 else {
-                    JOptionPane.showMessageDialog( this,
+                    JOptionPane.showMessageDialog( getThisFrame(),
                                                    "No multiple sequence alignment selected",
                                                    "Phylogenetic Inference Not Launched",
                                                    JOptionPane.WARNING_MESSAGE );
@@ -1252,7 +1236,7 @@ public final class MainFrameApplication extends MainFrame {
                     new Thread( inferrer ).start();
                 }
                 else {
-                    JOptionPane.showMessageDialog( this,
+                    JOptionPane.showMessageDialog( getThisFrame(),
                                                    "No input sequences selected",
                                                    "Phylogenetic Inference Not Launched",
                                                    JOptionPane.WARNING_MESSAGE );
@@ -1304,7 +1288,7 @@ public final class MainFrameApplication extends MainFrame {
                         failed = "\nCould not extract taxonomic data for " + counter_failed + " named external nodes:\n"
                                 + sb_failed;
                     }
-                    JOptionPane.showMessageDialog( this,
+                    JOptionPane.showMessageDialog( getThisFrame(),
                                                    "Extracted taxonomic data from " + all + counter
                                                            + " named external nodes:\n" + sb.toString() + failed,
                                                    "Taxonomic Data Extraction Completed",
@@ -1312,7 +1296,7 @@ public final class MainFrameApplication extends MainFrame {
                                                            : JOptionPane.INFORMATION_MESSAGE );
                 }
                 else {
-                    JOptionPane.showMessageDialog( this,
+                    JOptionPane.showMessageDialog( getThisFrame(),
                                                    "Could not extract any taxonomic data.\nMaybe node names are empty\n"
                                                            + "or not in the forms \"XYZ_CAEEL\", \"XYZ_6239\", or \"XYZ_Caenorhabditis_elegans\"\n"
                                                            + "or nodes already have taxonomic data?\n",
@@ -1381,14 +1365,9 @@ public final class MainFrameApplication extends MainFrame {
         _mainpanel.getControlPanel().showWhole();
         _mainpanel.getCurrentTreePanel().setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR );
         _mainpanel.getOptions().setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR );
-        if ( getMainPanel().getMainFrame() == null ) {
-            // Must be "E" applet version.
-            ( ( ArchaeopteryxE ) ( ( MainPanelApplets ) getMainPanel() ).getApplet() )
-                    .setSelectedTypeInTypeMenu( PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR );
-        }
-        else {
-            getMainPanel().getMainFrame().setSelectedTypeInTypeMenu( PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR );
-        }
+       
+        getMainPanel().getMainFrame().setSelectedTypeInTypeMenu( PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR );
+       
         activateSaveAllIfNeeded();
         System.gc();
     }
@@ -1581,7 +1560,7 @@ public final class MainFrameApplication extends MainFrame {
                                                        getMainPanel() );
                         _mainpanel.getControlPanel().showWhole();
                         if ( nhx_or_nexus && one_desc ) {
-                            JOptionPane.showMessageDialog( this,
+                            JOptionPane.showMessageDialog( getThisFrame(),
                                                            "One or more trees contain (a) node(s) with one descendant, "
                                                                    + ForesterUtil.LINE_SEPARATOR
                                                                    + "possibly indicating illegal parentheses within node names.",
@@ -1643,7 +1622,7 @@ public final class MainFrameApplication extends MainFrame {
             if ( !exception && ( t != null ) && !t.isRooted() ) {
                 exception = true;
                 t = null;
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "Species tree is not rooted",
                                                "Species tree not loaded",
                                                JOptionPane.ERROR_MESSAGE );
@@ -1655,7 +1634,7 @@ public final class MainFrameApplication extends MainFrame {
                     if ( !node.getNodeData().isHasTaxonomy() ) {
                         exception = true;
                         t = null;
-                        JOptionPane.showMessageDialog( this,
+                        JOptionPane.showMessageDialog( getThisFrame(),
                                                        "Species tree contains external node(s) without taxonomy information",
                                                        "Species tree not loaded",
                                                        JOptionPane.ERROR_MESSAGE );
@@ -1666,7 +1645,7 @@ public final class MainFrameApplication extends MainFrame {
                             exception = true;
                             t = null;
                             JOptionPane
-                                    .showMessageDialog( this,
+                                    .showMessageDialog( getThisFrame(),
                                                         "Taxonomy [" + node.getNodeData().getTaxonomy().asSimpleText()
                                                                 + "] is not unique in species tree",
                                                         "Species tree not loaded",
@@ -1681,7 +1660,7 @@ public final class MainFrameApplication extends MainFrame {
             }
             if ( !exception && ( t != null ) ) {
                 setSpeciesTree( t );
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "Species tree successfully loaded",
                                                "Species tree loaded",
                                                JOptionPane.INFORMATION_MESSAGE );
@@ -1844,12 +1823,10 @@ public final class MainFrameApplication extends MainFrame {
         _options_jmenu.add( customizeMenuItemAsLabel( new JMenuItem( DISPLAY_SUBHEADER ), getConfiguration() ) );
         _options_jmenu
                 .add( _ext_node_dependent_cladogram_rbmi = new JRadioButtonMenuItem( MainFrame.NONUNIFORM_CLADOGRAMS_LABEL ) );
-        _options_jmenu.add( _uniform_cladograms_rbmi = new JRadioButtonMenuItem( MainFrame.UNIFORM_CLADOGRAMS_LABEL ) );
         _options_jmenu.add( _non_lined_up_cladograms_rbmi = new JRadioButtonMenuItem( NON_LINED_UP_CLADOGRAMS_LABEL ) );
         _radio_group_1 = new ButtonGroup();
         _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 );
+         _radio_group_1.add( _non_lined_up_cladograms_rbmi );
         _options_jmenu.add( _show_overview_cbmi = new JCheckBoxMenuItem( SHOW_OVERVIEW_LABEL ) );
         _options_jmenu.add( _show_scale_cbmi = new JCheckBoxMenuItem( DISPLAY_SCALE_LABEL ) );
         _options_jmenu
@@ -1858,8 +1835,21 @@ public final class MainFrameApplication extends MainFrame {
                 .add( _show_default_node_shapes_external_cbmi = new JCheckBoxMenuItem( DISPLAY_NODE_BOXES_LABEL_EXT ) );
         _options_jmenu
                 .add( _show_default_node_shapes_for_marked_cbmi = new JCheckBoxMenuItem( MainFrame.DISPLAY_NODE_BOXES_LABEL_MARKED ) );
+      
+        _options_jmenu
+        .add( _collapsed_with_average_height_cbmi = new JCheckBoxMenuItem( "Proportional Height of Collapsed Subtrees" ) );
+
+        
+        _options_jmenu
+        .add( _show_abbreviated_labels_for_collapsed_nodes_cbmi = new JCheckBoxMenuItem( "Add Abbreviated Labels to Collapsed Subtrees" ) );
+
+     
+        
         _options_jmenu
                 .add( _line_up_renderable_data_cbmi = new JCheckBoxMenuItem( MainFrame.LINE_UP_RENDERABLE_DATA ) );
+        
+       
+        
         if ( getConfiguration().doDisplayOption( Configuration.show_domain_architectures ) ) {
             _options_jmenu
                     .add( _right_line_up_domains_cbmi = new JCheckBoxMenuItem( MainFrame.RIGHT_LINE_UP_DOMAINS ) );
@@ -1962,12 +1952,13 @@ public final class MainFrameApplication extends MainFrame {
         customizeCheckBoxMenuItem( _abbreviate_scientific_names, getOptions().isAbbreviateScientificTaxonNames() );
         customizeCheckBoxMenuItem( _search_case_senstive_cbmi, getOptions().isSearchCaseSensitive() );
         customizeCheckBoxMenuItem( _show_scale_cbmi, getOptions().isShowScale() );
+        customizeCheckBoxMenuItem( _collapsed_with_average_height_cbmi, getOptions().isCollapsedWithAverageHeigh() );
+        customizeCheckBoxMenuItem( _show_abbreviated_labels_for_collapsed_nodes_cbmi, getOptions().isShowAbbreviatedLabelsForCollapsedNodes() );
+        
         customizeRadioButtonMenuItem( _non_lined_up_cladograms_rbmi,
                                       getOptions().getCladogramType() == CLADOGRAM_TYPE.NON_LINED_UP );
-        customizeRadioButtonMenuItem( _uniform_cladograms_rbmi,
-                                      getOptions().getCladogramType() == CLADOGRAM_TYPE.TOTAL_NODE_SUM_DEP );
         customizeRadioButtonMenuItem( _ext_node_dependent_cladogram_rbmi,
-                                      getOptions().getCladogramType() == CLADOGRAM_TYPE.EXT_NODE_SUM_DEP );
+                                      getOptions().getCladogramType() == CLADOGRAM_TYPE.LINED_UP );
         customizeCheckBoxMenuItem( _show_overview_cbmi, getOptions().isShowOverview() );
         customizeCheckBoxMenuItem( _label_direction_cbmi,
                                    getOptions().getNodeLabelDirection() == NODE_LABEL_DIRECTION.RADIAL );
@@ -2058,12 +2049,9 @@ public final class MainFrameApplication extends MainFrame {
         _delete_not_selected_nodes_item.setToolTipText( "To delete all not selected external nodes" );
         customizeJMenuItem( _delete_not_selected_nodes_item );
         _tools_menu.addSeparator();
-        _tools_menu.add( _collapse_species_specific_subtrees = new JMenuItem( "Collapse Species-Specific Subtrees" ) );
+        _tools_menu.add( _collapse_species_specific_subtrees = new JMenuItem( "Collapse Single Taxonomy-Subtrees" ) );
         customizeJMenuItem( _collapse_species_specific_subtrees );
-        _collapse_species_specific_subtrees.setToolTipText( "To (reversibly) collapse species-specific subtrees" );
-        _tools_menu.add( _collapse_by_taxonomic_rank = new JMenuItem( "Collapse By Taxonomic Rank" ) );
-        customizeJMenuItem( _collapse_by_taxonomic_rank );
-        _collapse_by_taxonomic_rank.setToolTipText( "To (reversibly) collapse subtrees by taxonomic rank" );
+        _collapse_species_specific_subtrees.setToolTipText( "To (reversibly) collapse subtrees associated with only one taxonomy (such as species specific subtrees)" );
         _tools_menu
                 .add( _collapse_below_threshold = new JMenuItem( "Collapse Branches with Confidence Below Threshold into Multifurcations" ) );
         customizeJMenuItem( _collapse_below_threshold );
@@ -2118,7 +2106,7 @@ public final class MainFrameApplication extends MainFrame {
     @Override
     void close() {
         if ( isUnsavedDataPresent() ) {
-            final int r = JOptionPane.showConfirmDialog( this,
+            final int r = JOptionPane.showConfirmDialog( getThisFrame(),
                                                          "Exit despite potentially unsaved changes?",
                                                          "Exit?",
                                                          JOptionPane.YES_NO_OPTION );
@@ -2143,7 +2131,7 @@ public final class MainFrameApplication extends MainFrame {
         Phylogeny[] phys = null;
         final String message = "Please enter a complete URL, for example \"http://purl.org/phylo/treebase/phylows/study/TB2:S15480?format=nexus\"";
         final String url_string = JOptionPane
-                .showInputDialog( this,
+                .showInputDialog( getThisFrame(),
                                   message,
                                   "Use URL/webservice to obtain a phylogeny",
                                   JOptionPane.QUESTION_MESSAGE );
@@ -2176,20 +2164,20 @@ public final class MainFrameApplication extends MainFrame {
                 phys = factory.create( url.openStream(), parser );
             }
             catch ( final MalformedURLException e ) {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "Malformed URL: " + url + "\n" + e.getLocalizedMessage(),
                                                "Malformed URL",
                                                JOptionPane.ERROR_MESSAGE );
             }
             catch ( final IOException e ) {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                "Could not read from " + url + "\n"
                                                        + ForesterUtil.wordWrap( e.getLocalizedMessage(), 80 ),
                                                "Failed to read URL",
                                                JOptionPane.ERROR_MESSAGE );
             }
             catch ( final Exception e ) {
-                JOptionPane.showMessageDialog( this,
+                JOptionPane.showMessageDialog( getThisFrame(),
                                                ForesterUtil.wordWrap( e.getLocalizedMessage(), 80 ),
                                                "Unexpected Exception",
                                                JOptionPane.ERROR_MESSAGE );