in progress
[jalview.git] / forester / java / src / org / forester / archaeopteryx / ArchaeopteryxE.java
1
2 package org.forester.archaeopteryx;
3
4 import java.awt.BorderLayout;
5 import java.awt.Container;
6 import java.awt.Font;
7 import java.awt.event.ActionEvent;
8 import java.awt.event.ActionListener;
9 import java.awt.event.ComponentAdapter;
10 import java.awt.event.ComponentEvent;
11 import java.io.ByteArrayOutputStream;
12 import java.io.File;
13 import java.io.IOException;
14 import java.net.URL;
15 import java.util.LinkedList;
16 import java.util.List;
17 import java.util.NoSuchElementException;
18
19 import javax.swing.ButtonGroup;
20 import javax.swing.JApplet;
21 import javax.swing.JCheckBoxMenuItem;
22 import javax.swing.JFileChooser;
23 import javax.swing.JMenu;
24 import javax.swing.JMenuBar;
25 import javax.swing.JMenuItem;
26 import javax.swing.JOptionPane;
27 import javax.swing.JRadioButtonMenuItem;
28 import javax.swing.UIManager;
29 import javax.swing.UnsupportedLookAndFeelException;
30 import javax.swing.event.ChangeEvent;
31 import javax.swing.event.ChangeListener;
32
33 import org.apache.commons.codec.binary.Base64;
34 import org.forester.archaeopteryx.AptxUtil.GraphicsExportType;
35 import org.forester.archaeopteryx.Options.CLADOGRAM_TYPE;
36 import org.forester.archaeopteryx.Options.NODE_LABEL_DIRECTION;
37 import org.forester.archaeopteryx.Options.PHYLOGENY_GRAPHICS_TYPE;
38 import org.forester.archaeopteryx.webservices.PhylogeniesWebserviceClient;
39 import org.forester.archaeopteryx.webservices.WebservicesManager;
40 import org.forester.io.parsers.nhx.NHXParser.TAXONOMY_EXTRACTION;
41 import org.forester.phylogeny.Phylogeny;
42 import org.forester.phylogeny.PhylogenyMethods;
43 import org.forester.phylogeny.PhylogenyMethods.DESCENDANT_SORT_PRIORITY;
44 import org.forester.phylogeny.data.SequenceRelation;
45 import org.forester.sdi.GSDI;
46 import org.forester.sdi.GSDIR;
47 import org.forester.sdi.SDIException;
48 import org.forester.util.ForesterConstants;
49 import org.forester.util.ForesterUtil;
50
51 // Use like this:
52 // <applet archive="forester.jar"
53 // code="org.forester.archaeopteryx.ArchaeopteryxE.class"
54 // codebase="http://www.myserver.org/path/to/forester"
55 // width="600"
56 // height="500"
57 // alt="ArchaeopteryxE is not working on your system (requires at least Sun Java 1.5)!">
58 // <param name="url_of_tree_to_load"
59 // value="http://www.myserver.org/examples/data/apaf.xml">
60 // <param name="config_file"
61 // value="http://www.myserver.org/examples/config/config_file.txt">
62 // </applet>
63 public class ArchaeopteryxE extends JApplet implements ActionListener {
64
65     private final static String         NAME             = "ArchaeopteryxE";
66     private static final long           serialVersionUID = -1220055577935759443L;
67     private Configuration               _configuration;
68     private MainPanelApplets            _mainpanel;
69     private JMenuBar                    _jmenubar;
70     private JMenu                       _options_jmenu;
71     private JMenu                       _font_size_menu;
72     private JMenuItem                   _super_tiny_fonts_mi;
73     private JMenuItem                   _tiny_fonts_mi;
74     private JMenuItem                   _small_fonts_mi;
75     private JMenuItem                   _medium_fonts_mi;
76     private JMenuItem                   _large_fonts_mi;
77     private JMenu                       _tools_menu;
78     private JMenuItem                   _taxcolor_item;
79     private JMenuItem                   _confcolor_item;
80     private JMenuItem                   _midpoint_root_item;
81     private JMenu                       _view_jmenu;
82     private JMenuItem                   _view_as_XML_item;
83     private JMenuItem                   _view_as_NH_item;
84     private JMenuItem                   _view_as_nexus_item;
85     private JMenuItem                   _display_basic_information_item;
86     private JMenu                       _type_menu;
87     private JCheckBoxMenuItem           _rectangular_type_cbmi;
88     private JCheckBoxMenuItem           _triangular_type_cbmi;
89     private JCheckBoxMenuItem           _curved_type_cbmi;
90     private JCheckBoxMenuItem           _convex_type_cbmi;
91     private JCheckBoxMenuItem           _euro_type_cbmi;
92     private JCheckBoxMenuItem           _rounded_type_cbmi;
93     private JCheckBoxMenuItem           _unrooted_type_cbmi;
94     private JCheckBoxMenuItem           _circular_type_cbmi;
95     private JMenuItem                   _help_item;
96     private JMenuItem                   _about_item;
97     private JMenu                       _help_jmenu;
98     private JMenuItem                   _website_item;
99     private JMenuItem                   _phyloxml_website_item;
100     private JMenuItem                   _phyloxml_ref_item;
101     private JMenuItem                   _aptx_ref_item;
102     private JMenuItem                   _remove_branch_color_item;
103     private JMenuItem                   _remove_visual_styles_item;
104     private JCheckBoxMenuItem           _show_domain_labels;
105     private JCheckBoxMenuItem           _show_annotation_ref_source;
106     private JCheckBoxMenuItem           _color_labels_same_as_parent_branch;
107     private JCheckBoxMenuItem           _abbreviate_scientific_names;
108     private JCheckBoxMenuItem           _screen_antialias_cbmi;
109     private JCheckBoxMenuItem           _background_gradient_cbmi;
110     private JCheckBoxMenuItem           _color_by_taxonomic_group_cbmi;
111     private JRadioButtonMenuItem        _non_lined_up_cladograms_rbmi;
112     private JRadioButtonMenuItem        _uniform_cladograms_rbmi;
113     private JRadioButtonMenuItem        _ext_node_dependent_cladogram_rbmi;
114     private Options                     _options;
115     private JMenuItem                   _choose_font_mi;
116     private JMenuItem                   _switch_colors_mi;
117     JCheckBoxMenuItem                   _label_direction_cbmi;
118     private JCheckBoxMenuItem           _show_scale_cbmi;
119     private JCheckBoxMenuItem           _search_case_senstive_cbmi;
120     private JCheckBoxMenuItem           _search_whole_words_only_cbmi;
121     private JCheckBoxMenuItem           _inverse_search_result_cbmi;
122     private JCheckBoxMenuItem           _search_with_regex_cbmi;
123     private JCheckBoxMenuItem           _show_overview_cbmi;
124     private JMenuItem                   _choose_minimal_confidence_mi;
125     private JMenuItem                   _collapse_species_specific_subtrees;
126     private JMenuItem                   _overview_placment_mi;
127     private ButtonGroup                 _radio_group_1;
128     private JCheckBoxMenuItem           _show_default_node_shapes_internal_cbmi;
129     private JCheckBoxMenuItem           _show_default_node_shapes_external_cbmi;
130     private JCheckBoxMenuItem           _show_default_node_shapes_for_marked_cbmi;
131     private JMenuItem                   _cycle_node_shape_mi;
132     private JMenuItem                   _cycle_node_fill_mi;
133     private JMenuItem                   _choose_node_size_mi;
134     private JCheckBoxMenuItem           _show_confidence_stddev_cbmi;
135     private final LinkedList<TextFrame> _textframes      = new LinkedList<TextFrame>();
136     private JMenu                       _analysis_menu;
137     private JMenuItem                   _gsdi_item;
138     private JMenuItem                   _gsdir_item;
139     private Phylogeny                   _species_tree;
140     private JCheckBoxMenuItem           _right_line_up_domains_cbmi;
141     private JCheckBoxMenuItem           _line_up_renderable_data_cbmi;
142     // file menu:
143     JMenuItem                        _open_item;
144     JMenuItem                        _open_url_item;
145     JMenuItem                        _save_item;
146     JMenuItem                        _save_all_item;
147     JMenuItem                        _close_item;
148     JMenuItem                        _exit_item;
149     JMenuItem                        _new_item;
150     JMenuItem                        _print_item;
151     JMenuItem                        _write_to_pdf_item;
152     JMenuItem                        _write_to_jpg_item;
153     JMenuItem                        _write_to_gif_item;
154     JMenuItem                        _write_to_tif_item;
155     JMenuItem                        _write_to_png_item;
156     JMenuItem                        _write_to_bmp_item;
157     JMenu                            _file_jmenu;
158
159     
160     void writePhylogenyToGraphicsFile( final String file_name, final GraphicsExportType type ) {
161         _mainpanel.getCurrentTreePanel().calcParametersForPainting( _mainpanel.getCurrentTreePanel().getWidth(),
162                                                                     _mainpanel.getCurrentTreePanel().getHeight() );
163         String file_written_to = "";
164         boolean error = false;
165         try {
166             file_written_to = AptxUtil.writePhylogenyToGraphicsFile( file_name,
167                                                                      _mainpanel.getCurrentTreePanel().getWidth(),
168                                                                      _mainpanel.getCurrentTreePanel().getHeight(),
169                                                                      _mainpanel.getCurrentTreePanel(),
170                                                                      _mainpanel.getControlPanel(),
171                                                                      type,
172                                                                      getOptions() );
173         }
174         catch ( final IOException e ) {
175             error = true;
176             JOptionPane.showMessageDialog( this, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE );
177         }
178         if ( !error ) {
179             if ( ( file_written_to != null ) && ( file_written_to.length() > 0 ) ) {
180                 JOptionPane.showMessageDialog( this,
181                                                "Wrote image to: " + file_written_to,
182                                                "Graphics Export",
183                                                JOptionPane.INFORMATION_MESSAGE );
184             }
185             else {
186                 JOptionPane.showMessageDialog( this,
187                                                "There was an unknown problem when attempting to write to an image file: \""
188                                                        + file_name + "\"",
189                                                "Error",
190                                                JOptionPane.ERROR_MESSAGE );
191             }
192         }
193         _contentpane.repaint();
194     }
195
196   
197     void buildFileMenu() {
198         _file_jmenu = MainFrame.createMenu( "File", getConfiguration() );
199         _file_jmenu.add( _save_item = new JMenuItem( "Save Tree As..." ) );
200         _file_jmenu.addSeparator();
201         _file_jmenu.add( _write_to_pdf_item = new JMenuItem( "Export to PDF file ..." ) );
202         if ( AptxUtil.canWriteFormat( "tif" ) || AptxUtil.canWriteFormat( "tiff" ) || AptxUtil.canWriteFormat( "TIF" ) ) {
203             _file_jmenu.add( _write_to_tif_item = new JMenuItem( "Export to TIFF file..." ) );
204         }
205         _file_jmenu.add( _write_to_png_item = new JMenuItem( "Export to PNG file..." ) );
206         _file_jmenu.add( _write_to_jpg_item = new JMenuItem( "Export to JPG file..." ) );
207         if ( AptxUtil.canWriteFormat( "gif" ) ) {
208             _file_jmenu.add( _write_to_gif_item = new JMenuItem( "Export to GIF file..." ) );
209         }
210         if ( AptxUtil.canWriteFormat( "bmp" ) ) {
211             _file_jmenu.add( _write_to_bmp_item = new JMenuItem( "Export to BMP file..." ) );
212         }
213         _file_jmenu.addSeparator();
214         _file_jmenu.add( _print_item = new JMenuItem( "Print..." ) );
215         _file_jmenu.addSeparator();
216         _file_jmenu.add( _exit_item = new JMenuItem( "Exit" ) );
217         customizeJMenuItem( _save_item );
218         customizeJMenuItem( _write_to_pdf_item );
219         customizeJMenuItem( _write_to_png_item );
220         customizeJMenuItem( _write_to_jpg_item );
221         customizeJMenuItem( _write_to_gif_item );
222         customizeJMenuItem( _write_to_tif_item );
223         customizeJMenuItem( _write_to_bmp_item );
224         customizeJMenuItem( _print_item );
225         customizeJMenuItem( _exit_item );
226         _jmenubar.add( _file_jmenu );
227     }
228     
229     @Override
230     public void actionPerformed( final ActionEvent e ) {
231         final Object o = e.getSource();
232         if ( o == _midpoint_root_item ) {
233             getMainPanel().getCurrentTreePanel().midpointRoot();
234         }
235         else if ( o == _gsdi_item ) {
236             if ( isSubtreeDisplayed() ) {
237                 return;
238             }
239             executeGSDI();
240         }
241         else if ( o == _gsdir_item ) {
242             if ( isSubtreeDisplayed() ) {
243                 return;
244             }
245             executeGSDIR();
246         }
247         else if ( o == _taxcolor_item ) {
248             getMainPanel().getCurrentTreePanel().taxColor();
249         }
250         else if ( o == _confcolor_item ) {
251             getMainPanel().getCurrentTreePanel().confColor();
252         }
253         else if ( o == _collapse_species_specific_subtrees ) {
254             if ( getCurrentTreePanel() != null ) {
255                 getCurrentTreePanel().collapseSpeciesSpecificSubtrees();
256             }
257         }
258         else if ( o == _remove_branch_color_item ) {
259             removeBranchColors();
260         }
261         else if ( o == _remove_visual_styles_item ) {
262             removeVisualStyles();
263         }
264         else if ( o == _switch_colors_mi ) {
265             switchColors();
266         }
267         else if ( o == _display_basic_information_item ) {
268             displayBasicInformation();
269         }
270         else if ( o == _view_as_NH_item ) {
271             viewAsNH();
272         }
273         else if ( o == _view_as_XML_item ) {
274             viewAsXML();
275         }
276         else if ( o == _view_as_nexus_item ) {
277             viewAsNexus();
278         }
279         else if ( o == _super_tiny_fonts_mi ) {
280             if ( getCurrentTreePanel() != null ) {
281                 getCurrentTreePanel().setSuperTinyFonts();
282                 getCurrentTreePanel().repaint();
283             }
284         }
285         else if ( o == _tiny_fonts_mi ) {
286             if ( getCurrentTreePanel() != null ) {
287                 getCurrentTreePanel().setTinyFonts();
288                 getCurrentTreePanel().repaint();
289             }
290         }
291         else if ( o == _small_fonts_mi ) {
292             if ( getCurrentTreePanel() != null ) {
293                 getCurrentTreePanel().setSmallFonts();
294                 getCurrentTreePanel().repaint();
295             }
296         }
297         else if ( o == _medium_fonts_mi ) {
298             if ( getCurrentTreePanel() != null ) {
299                 getCurrentTreePanel().setMediumFonts();
300                 getCurrentTreePanel().repaint();
301             }
302         }
303         else if ( o == _large_fonts_mi ) {
304             if ( getCurrentTreePanel() != null ) {
305                 getCurrentTreePanel().setLargeFonts();
306                 getCurrentTreePanel().repaint();
307             }
308         }
309         else if ( o == _choose_font_mi ) {
310             chooseFont();
311         }
312         else if ( o == _choose_minimal_confidence_mi ) {
313             chooseMinimalConfidence();
314         }
315         else if ( o == _choose_node_size_mi ) {
316             MainFrame.chooseNodeSize( getOptions(), this );
317         }
318         else if ( o == _overview_placment_mi ) {
319             MainFrame.cycleOverview( getOptions(), getCurrentTreePanel() );
320         }
321         else if ( o == _cycle_node_fill_mi ) {
322             MainFrame.cycleNodeFill( getOptions() );
323         }
324         else if ( o == _cycle_node_shape_mi ) {
325             MainFrame.cycleNodeShape( getOptions() );
326         }
327         else if ( o == _non_lined_up_cladograms_rbmi ) {
328             updateOptions( getOptions() );
329             _mainpanel.getControlPanel().showWhole();
330         }
331         else if ( o == _uniform_cladograms_rbmi ) {
332             updateOptions( getOptions() );
333             _mainpanel.getControlPanel().showWhole();
334         }
335         else if ( o == _ext_node_dependent_cladogram_rbmi ) {
336             updateOptions( getOptions() );
337             _mainpanel.getControlPanel().showWhole();
338         }
339         else if ( o == _search_case_senstive_cbmi ) {
340             updateOptions( getOptions() );
341             getMainPanel().getControlPanel().search0();
342             getMainPanel().getControlPanel().search1();
343         }
344         else if ( o == _search_whole_words_only_cbmi ) {
345             if ( ( _search_with_regex_cbmi != null ) && _search_whole_words_only_cbmi.isSelected() ) {
346                 _search_with_regex_cbmi.setSelected( false );
347             }
348             updateOptions( getOptions() );
349             getMainPanel().getControlPanel().search0();
350             getMainPanel().getControlPanel().search1();
351         }
352         else if ( o == _inverse_search_result_cbmi ) {
353             updateOptions( getOptions() );
354             getMainPanel().getControlPanel().search0();
355             getMainPanel().getControlPanel().search1();
356         }
357         else if ( o == _search_with_regex_cbmi ) {
358             if ( ( _search_whole_words_only_cbmi != null ) && _search_with_regex_cbmi.isSelected() ) {
359                 _search_whole_words_only_cbmi.setSelected( false );
360             }
361             if ( ( _search_case_senstive_cbmi != null ) && _search_with_regex_cbmi.isSelected() ) {
362                 _search_case_senstive_cbmi.setSelected( true );
363             }
364             updateOptions( getOptions() );
365             getMainPanel().getControlPanel().search0();
366             getMainPanel().getControlPanel().search1();
367         }
368         else if ( o == _show_scale_cbmi ) {
369             updateOptions( getOptions() );
370         }
371         else if ( o == _show_confidence_stddev_cbmi ) {
372             updateOptions( getOptions() );
373         }
374         else if ( o == _label_direction_cbmi ) {
375             updateOptions( getOptions() );
376         }
377         else if ( o == _abbreviate_scientific_names ) {
378             updateOptions( getOptions() );
379         }
380         else if ( o == _show_overview_cbmi ) {
381             updateOptions( getOptions() );
382             if ( getCurrentTreePanel() != null ) {
383                 getCurrentTreePanel().updateOvSizes();
384             }
385         }
386         else if ( ( o == _rectangular_type_cbmi ) || ( o == _triangular_type_cbmi ) || ( o == _curved_type_cbmi )
387                 || ( o == _convex_type_cbmi ) || ( o == _rounded_type_cbmi ) || ( o == _euro_type_cbmi )
388                 || ( o == _unrooted_type_cbmi ) || ( o == _circular_type_cbmi ) ) {
389             typeChanged( o );
390         }
391         else if ( o == _screen_antialias_cbmi ) {
392             updateOptions( getOptions() );
393             setupScreenTextAntialias( getMainPanel().getTreePanels(), isScreenAntialias() );
394         }
395         else if ( o == _background_gradient_cbmi ) {
396             updateOptions( getOptions() );
397         }
398         else if ( o == _show_domain_labels ) {
399             updateOptions( getOptions() );
400         }
401         else if ( o == _color_labels_same_as_parent_branch ) {
402             updateOptions( getOptions() );
403         }
404         else if ( o == _show_default_node_shapes_internal_cbmi ) {
405             updateOptions( getOptions() );
406         }
407         else if ( o == _show_default_node_shapes_external_cbmi ) {
408             updateOptions( getOptions() );
409         }
410         else if ( o == _about_item ) {
411             MainFrame.about();
412         }
413         else if ( o == _help_item ) {
414             try {
415                 AptxUtil.openWebsite( Constants.APTX_DOC_SITE, true, this );
416             }
417             catch ( final IOException e1 ) {
418                 ForesterUtil.printErrorMessage( Constants.PRG_NAME, e1.toString() );
419             }
420         }
421         else if ( o == _website_item ) {
422             try {
423                 AptxUtil.openWebsite( Constants.APTX_WEB_SITE, true, this );
424             }
425             catch ( final IOException e1 ) {
426                 ForesterUtil.printErrorMessage( Constants.PRG_NAME, e1.toString() );
427             }
428         }
429         else if ( o == _phyloxml_website_item ) {
430             try {
431                 AptxUtil.openWebsite( Constants.PHYLOXML_WEB_SITE, true, this );
432             }
433             catch ( final IOException e1 ) {
434                 ForesterUtil.printErrorMessage( Constants.PRG_NAME, e1.toString() );
435             }
436         }
437         else if ( o == _aptx_ref_item ) {
438             try {
439                 AptxUtil.openWebsite( Constants.APTX_REFERENCE_URL, true, this );
440             }
441             catch ( final IOException e1 ) {
442                 ForesterUtil.printErrorMessage( Constants.PRG_NAME, e1.toString() );
443             }
444         }
445         else if ( o == _phyloxml_ref_item ) {
446             try {
447                 AptxUtil.openWebsite( Constants.PHYLOXML_REFERENCE_URL, true, this );
448             }
449             catch ( final IOException e1 ) {
450                 ForesterUtil.printErrorMessage( Constants.PRG_NAME, e1.toString() );
451             }
452         }
453         else if ( o == _color_by_taxonomic_group_cbmi ) {
454             updateOptions( getOptions() );
455         }
456         else if ( o == _line_up_renderable_data_cbmi ) {
457             if ( !_line_up_renderable_data_cbmi.isSelected() ) {
458                 _right_line_up_domains_cbmi.setSelected( false );
459             }
460             updateOptions( getOptions() );
461         }
462         else if ( o == _right_line_up_domains_cbmi ) {
463             if ( _right_line_up_domains_cbmi.isSelected() ) {
464                 _line_up_renderable_data_cbmi.setSelected( true );
465             }
466             updateOptions( getOptions() );
467         }
468         //
469         else if ( o == _write_to_pdf_item ) {
470             writeToPdf( _mainpanel.getCurrentPhylogeny() );
471         }
472         
473         else if ( o == _write_to_jpg_item ) {
474             writeToGraphicsFile( _mainpanel.getCurrentPhylogeny(), GraphicsExportType.JPG );
475         }
476         else if ( o == _write_to_gif_item ) {
477             writeToGraphicsFile( _mainpanel.getCurrentPhylogeny(), GraphicsExportType.GIF );
478         }
479         else if ( o == _write_to_tif_item ) {
480             writeToGraphicsFile( _mainpanel.getCurrentPhylogeny(), GraphicsExportType.TIFF );
481         }
482         else if ( o == _write_to_bmp_item ) {
483             writeToGraphicsFile( _mainpanel.getCurrentPhylogeny(), GraphicsExportType.BMP );
484         }
485         else if ( o == _write_to_png_item ) {
486             writeToGraphicsFile( _mainpanel.getCurrentPhylogeny(), GraphicsExportType.PNG );
487         }
488         else if ( o == _print_item ) {
489             MainFrame.print( getCurrentTreePanel(),
490                              getOptions(),
491                              
492                              this );
493                   
494         }
495         else if ( o == _save_item ) {
496             writeToFile( _mainpanel.getCurrentPhylogeny() );
497         }
498        
499 //        else if ( o == _graphics_export_visible_only_cbmi ) {
500 //            updateOptions( getOptions() );
501 //        }
502 //        else if ( o == _antialias_print_cbmi ) {
503 //            updateOptions( getOptions() );
504 //        }
505 //        else if ( o == _print_black_and_white_cbmi ) {
506 //            updateOptions( getOptions() );
507 //        }
508 //        else if ( o == _print_using_actual_size_cbmi ) {
509 //            updateOptions( getOptions() );
510 //        }
511 //        else if ( o == _graphics_export_using_actual_size_cbmi ) {
512 //            updateOptions( getOptions() );
513 //        }
514 //        else if ( o == _print_size_mi ) {
515 //            choosePrintSize();
516 //        }
517 //        else if ( o == _choose_pdf_width_mi ) {
518 //            choosePdfWidth();
519 //        }
520         
521         repaint();
522     }
523
524     @Override
525     public void destroy() {
526         AptxUtil.printAppletMessage( NAME, "going to be destroyed " );
527         removeAllTextFrames();
528         if ( getMainPanel() != null ) {
529             getMainPanel().terminate();
530         }
531     }
532
533     /**
534      * This method returns the current external node data which
535      * has been selected by the user by clicking the "Return ..."
536      * menu item. This method is expected to be called from Javascript or
537      * something like it.
538      *
539      * @return current external node data as String
540      */
541     public String getCurrentExternalNodesDataBuffer() {
542         return getCurrentTreePanel().getCurrentExternalNodesDataBufferAsString();
543     }
544
545     public int getCurrentExternalNodesDataBufferChangeCounter() {
546         return getCurrentTreePanel().getCurrentExternalNodesDataBufferChangeCounter();
547     }
548
549     public int getCurrentExternalNodesDataBufferLength() {
550         return getCurrentTreePanel().getCurrentExternalNodesDataBufferAsString().length();
551     }
552
553     /**
554      * This method returns the current phylogeny as a string in the chosen format
555      *
556      * @param format must be NH, NHX, NEXUS or PHYLOXML
557      * @return the phylogeny string
558      * @author Herve Menager
559      */
560     public String getCurrentPhylogeny( final String format ) {
561         removeAllTextFrames();
562         if ( ( getMainPanel().getCurrentPhylogeny() == null ) || getMainPanel().getCurrentPhylogeny().isEmpty()
563                 || ( getMainPanel().getCurrentPhylogeny().getNumberOfExternalNodes() > 10000 ) ) {
564             return new String();
565         }
566         switch ( ForesterConstants.PhylogeneticTreeFormats.valueOf( format ) ) {
567             case NH:
568                 return getMainPanel().getCurrentPhylogeny().toNewHampshire();
569             case NHX:
570                 return getMainPanel().getCurrentPhylogeny().toNewHampshireX();
571             case NEXUS:
572                 return getMainPanel().getCurrentPhylogeny().toNexus();
573             case PHYLOXML:
574                 return getMainPanel().getCurrentPhylogeny().toPhyloXML( -1 );
575             default:
576                 break;
577         }
578         return new String();
579     }
580
581     /**
582      * This method returns a view of the current phylogeny in a chosen
583      * graphics format, base64-encoded in a string so that in can be used
584      * from javascript.
585      *
586      * @param format must be GraphicsExportType (gif, jpg, pdf, png, tif, bmp)
587      * @return the phylogeny string
588      * @author Herve Menager
589      */
590     public String getCurrentPhylogenyGraphicsAsBase64EncodedString( final String format ) {
591         final ByteArrayOutputStream baos = new ByteArrayOutputStream();
592         try {
593             AptxUtil.writePhylogenyToGraphicsByteArrayOutputStream( baos,
594                                                                     _mainpanel.getWidth(),
595                                                                     _mainpanel.getHeight(),
596                                                                     getCurrentTreePanel(),
597                                                                     getCurrentTreePanel().getControlPanel(),
598                                                                     GraphicsExportType.valueOf( format ),
599                                                                     getOptions() );
600         }
601         catch ( final IOException ioe ) {
602             ForesterUtil.printErrorMessage( NAME, ioe.toString() );
603             ioe.printStackTrace();
604             JOptionPane.showMessageDialog( this,
605                                            NAME + ": Failed to generate graphics: " + "\nException: " + ioe,
606                                            "Failed to generate graphics",
607                                            JOptionPane.ERROR_MESSAGE );
608             return null;
609         }
610         final byte[] bytes = baos.toByteArray();
611         final String dataImg = Base64.encodeBase64String( bytes );
612         return dataImg;
613     }
614
615     public Options getOptions() {
616         return _options;
617     }
618
619     @Override
620     public void init() {
621         final String config_filename = getParameter( Constants.APPLET_PARAM_NAME_FOR_CONFIG_FILE_URL );
622         AptxUtil.printAppletMessage( NAME, "URL for configuration file is: " + config_filename );
623         final Configuration configuration = new Configuration( config_filename, true, true, true );
624         setConfiguration( configuration );
625         setOptions( Options.createInstance( configuration ) );
626         setupUI();
627         final String tree_url_str = getParameter( Constants.APPLET_PARAM_NAME_FOR_URL_OF_TREE_TO_LOAD );
628         if ( ForesterUtil.isEmpty( tree_url_str ) ) {
629             ForesterUtil.printErrorMessage( NAME, "could not get tree URL from "
630                     + Constants.APPLET_PARAM_NAME_FOR_URL_OF_TREE_TO_LOAD );
631             JOptionPane.showMessageDialog( this, NAME + ": could not get tree URL from "
632                     + Constants.APPLET_PARAM_NAME_FOR_URL_OF_TREE_TO_LOAD, "Failed get URL", JOptionPane.ERROR_MESSAGE );
633             return;
634         }
635         AptxUtil.printAppletMessage( NAME, "URL for phylogenies is " + tree_url_str );
636         // Get URL to tree file
637         URL phys_url = null;
638         try {
639             phys_url = new URL( tree_url_str );
640         }
641         catch ( final Exception e ) {
642             ForesterUtil.printErrorMessage( NAME, "error: " + e );
643             e.printStackTrace();
644             JOptionPane.showMessageDialog( this, NAME + ": Could not create URL from: \"" + tree_url_str
645                     + "\"\nException: " + e, "Failed to create URL", JOptionPane.ERROR_MESSAGE );
646         }
647         if ( phys_url == null ) {
648             ForesterUtil.printErrorMessage( NAME, "failed to get tree URL from "
649                     + Constants.APPLET_PARAM_NAME_FOR_URL_OF_TREE_TO_LOAD );
650             JOptionPane.showMessageDialog( this,
651                                            NAME + ": Could not create URL from: \"" + tree_url_str,
652                                            "Failed to create URL",
653                                            JOptionPane.ERROR_MESSAGE );
654             return;
655         }
656         // Load the tree from URL
657         Phylogeny[] phys = null;
658         try {
659             phys = AptxUtil.readPhylogeniesFromUrl( phys_url,
660                                                     getConfiguration().isValidatePhyloXmlAgainstSchema(),
661                                                     getConfiguration().isReplaceUnderscoresInNhParsing(),
662                                                     getConfiguration().isInternalNumberAreConfidenceForNhParsing(),
663                                                     getConfiguration().getTaxonomyExtraction(),
664                                                     getConfiguration().isMidpointReroot() );
665         }
666         catch ( final Exception e ) {
667             ForesterUtil.printErrorMessage( NAME, e.toString() );
668             e.printStackTrace();
669             JOptionPane.showMessageDialog( this,
670                                            NAME + ": Failed to read phylogenies: " + "\nException: " + e,
671                                            "Failed to read phylogenies",
672                                            JOptionPane.ERROR_MESSAGE );
673         }
674         if ( phys == null ) {
675             ForesterUtil.printErrorMessage( NAME, "phylogenies from [" + phys_url + "] are null" );
676             JOptionPane.showMessageDialog( this,
677                                            NAME + ": phylogenies from [" + phys_url + "] are null",
678                                            "Failed to read phylogenies",
679                                            JOptionPane.ERROR_MESSAGE );
680             return;
681         }
682         else if ( phys.length < 1 ) {
683             ForesterUtil.printErrorMessage( NAME, "phylogenies from [" + phys_url + "] are empty" );
684             JOptionPane.showMessageDialog( this,
685                                            NAME + ": phylogenies from [" + phys_url + "] are empty",
686                                            "Failed to read phylogenies",
687                                            JOptionPane.ERROR_MESSAGE );
688             return;
689         }
690         else {
691             AptxUtil.printAppletMessage( NAME, "loaded " + phys.length + " phylogenies from: " + phys_url );
692         }
693         //
694         final String species_tree_url_str = getParameter( Constants.APPLET_PARAM_NAME_FOR_URL_OF_SPECIES_TREE_TO_LOAD );
695         if ( !ForesterUtil.isEmpty( species_tree_url_str ) ) {
696             AptxUtil.printAppletMessage( NAME, "URL of species tree to load: \"" + species_tree_url_str + "\"" );
697             Phylogeny[] species_trees = null;
698             try {
699                 final URL species_tree_url = new URL( species_tree_url_str );
700                 species_trees = AptxUtil.readPhylogeniesFromUrl( species_tree_url,
701                                                                  configuration.isValidatePhyloXmlAgainstSchema(),
702                                                                  configuration.isReplaceUnderscoresInNhParsing(),
703                                                                  false,
704                                                                  TAXONOMY_EXTRACTION.NO,
705                                                                  false );
706             }
707             catch ( final IOException e ) {
708                 ForesterUtil.printErrorMessage( NAME, "could not read species tree from  [" + species_tree_url_str
709                         + "]" );
710                 JOptionPane.showMessageDialog( this, NAME + ": could not read species tree from  ["
711                         + species_tree_url_str + "]", "Failed to read species tree", JOptionPane.ERROR_MESSAGE );
712             }
713             if ( ( species_trees != null ) && ( species_trees.length > 0 ) ) {
714                 AptxUtil.printAppletMessage( NAME, "successfully read species tree" );
715                 if ( species_trees[ 0 ].isEmpty() ) {
716                     ForesterUtil.printErrorMessage( NAME, "species tree is empty" );
717                 }
718                 else if ( !species_trees[ 0 ].isRooted() ) {
719                     ForesterUtil.printErrorMessage( NAME, "species tree is not rooted" );
720                 }
721                 else {
722                     setSpeciesTree( species_trees[ 0 ] );
723                     AptxUtil.printAppletMessage( NAME, "species tree OK" );
724                 }
725             }
726         }
727         //
728         try {
729             setVisible( false );
730             setMainPanel( new MainPanelApplets( getConfiguration(), this ) );
731             _jmenubar = new JMenuBar();
732             if ( !getConfiguration().isHideControlPanelAndMenubar() ) {
733                 buildFileMenu();
734                 if ( !getConfiguration().isUseNativeUI() ) {
735                     _jmenubar.setBackground( getConfiguration().getGuiMenuBackgroundColor() );
736                 }
737                 if ( getSpeciesTree() != null ) {
738                     buildAnalysisMenu();
739                 }
740                 buildToolsMenu();
741                 buildViewMenu();
742                 buildFontSizeMenu();
743                 buildOptionsMenu();
744                 buildTypeMenu();
745                 buildHelpMenu();
746                 setJMenuBar( _jmenubar );
747             }
748             final Container contentpane = getContentPane();
749             contentpane.setLayout( new BorderLayout() );
750             contentpane.add( getMainPanel(), BorderLayout.CENTER );
751             addComponentListener( new ComponentAdapter() {
752
753                 @Override
754                 public void componentResized( final ComponentEvent e ) {
755                     if ( getMainPanel().getCurrentTreePanel() != null ) {
756                         getMainPanel().getCurrentTreePanel().calcParametersForPainting( getMainPanel()
757                                                                                         .getCurrentTreePanel()
758                                                                                         .getWidth(),
759                                                                                         getMainPanel()
760                                                                                         .getCurrentTreePanel()
761                                                                                         .getHeight() );
762                     }
763                 }
764             } );
765             if ( getConfiguration().isUseTabbedDisplay() ) {
766                 try {
767                     AptxUtil.printAppletMessage( NAME, "using tabbed display" );
768                     AptxUtil.addPhylogeniesToTabs( phys,
769                                                    new File( phys_url.getFile() ).getName(),
770                                                    phys_url.toString(),
771                                                    getConfiguration(),
772                                                    getMainPanel() );
773                 }
774                 catch ( final Exception e ) {
775                     ForesterUtil.printErrorMessage( NAME, e.toString() );
776                     e.printStackTrace();
777                 }
778             }
779             else {
780                 AptxUtil.printAppletMessage( NAME, "not using tabbed display" );
781                 if ( getSpeciesTree() != null ) {
782                     AptxUtil.printAppletMessage( NAME,
783                                                  "Warning: gsdi (gene duplication inference) only available tabbed display" );
784                 }
785                 AptxUtil.addPhylogenyToPanel( phys, getConfiguration(), getMainPanel() );
786             }
787             validate();
788             setName( NAME );
789             getMainPanel().getControlPanel().showWholeAll();
790             getMainPanel().getControlPanel().showWhole();
791             /* GUILHEM_BEG */
792             getCurrentTreePanel().getControlPanel().getSequenceRelationTypeBox().removeAllItems();
793             for( final SequenceRelation.SEQUENCE_RELATION_TYPE type : getMainPanel().getCurrentPhylogeny()
794                     .getRelevantSequenceRelationTypes() ) {
795                 getCurrentTreePanel().getControlPanel().getSequenceRelationTypeBox().addItem( type );
796             }
797             final String default_relation = getParameter( Constants.APPLET_PARAM_NAME_FOR_DEFAULT_SEQUENCE_RELATION_TYPE );
798             if ( default_relation != null ) {
799                 getCurrentTreePanel().getControlPanel().getSequenceRelationTypeBox().setSelectedItem( default_relation );
800             }
801             final String default_sequence = getParameter( Constants.APPLET_PARAM_NAME_FOR_DEFAULT_QUERY_SEQUENCE );
802             if ( default_sequence != null ) {
803                 getCurrentTreePanel().getControlPanel().getSequenceRelationBox().setSelectedItem( default_sequence );
804             }
805             /* GUILHEM_END */
806             System.gc();
807             AptxUtil.printAppletMessage( NAME, "successfully initialized" );
808             setVisible( true );
809         }
810         catch ( final Exception e ) {
811             ForesterUtil.printErrorMessage( NAME, e.toString() );
812             e.printStackTrace();
813         }
814     }
815
816     public void showTextFrame( final String s, final String title ) {
817         checkTextFrames();
818         _textframes.addLast( TextFrame.instantiate( s, title, _textframes ) );
819     }
820
821     @Override
822     public void start() {
823         if ( getMainPanel() != null ) {
824             getMainPanel().validate();
825         }
826         requestFocus();
827         requestFocusInWindow();
828         requestFocus();
829         AptxUtil.printAppletMessage( NAME, "started" );
830     }
831
832     void buildAnalysisMenu() {
833         _analysis_menu = MainFrame.createMenu( "Analysis", getConfiguration() );
834         _analysis_menu.add( _gsdi_item = new JMenuItem( "GSDI (Generalized Speciation Duplication Inference)" ) );
835         _analysis_menu.add( _gsdir_item = new JMenuItem( "GSDIR (GSDI with re-rooting)" ) );
836         customizeJMenuItem( _gsdi_item );
837         customizeJMenuItem( _gsdir_item );
838         //  _analysis_menu.addSeparator();
839         //  _analysis_menu.add( _lineage_inference = new JMenuItem( INFER_ANCESTOR_TAXONOMIES ) );
840         //  customizeJMenuItem( _lineage_inference );
841         //  _lineage_inference.setToolTipText( "Inference of ancestor taxonomies/lineages" );
842         _jmenubar.add( _analysis_menu );
843     }
844
845     void buildFontSizeMenu() {
846         _font_size_menu = MainFrame.createMenu( MainFrame.FONT_SIZE_MENU_LABEL, getConfiguration() );
847         _font_size_menu.add( _super_tiny_fonts_mi = new JMenuItem( "Super tiny fonts" ) );
848         _font_size_menu.add( _tiny_fonts_mi = new JMenuItem( "Tiny fonts" ) );
849         _font_size_menu.add( _small_fonts_mi = new JMenuItem( "Small fonts" ) );
850         _font_size_menu.add( _medium_fonts_mi = new JMenuItem( "Medium fonts" ) );
851         _font_size_menu.add( _large_fonts_mi = new JMenuItem( "Large fonts" ) );
852         customizeJMenuItem( _super_tiny_fonts_mi );
853         customizeJMenuItem( _tiny_fonts_mi );
854         customizeJMenuItem( _small_fonts_mi );
855         customizeJMenuItem( _medium_fonts_mi );
856         customizeJMenuItem( _large_fonts_mi );
857         _jmenubar.add( _font_size_menu );
858     }
859
860     void buildHelpMenu() {
861         _help_jmenu = MainFrame.createMenu( "Help", getConfiguration() );
862         _help_jmenu.add( _help_item = new JMenuItem( "Documentation" ) );
863         _help_jmenu.addSeparator();
864         _help_jmenu.add( _website_item = new JMenuItem( "Archaeopteryx Home" ) );
865         _aptx_ref_item = new JMenuItem( "Archaeopteryx Reference" );
866         _help_jmenu.add( _phyloxml_website_item = new JMenuItem( "phyloXML Home" ) );
867         _help_jmenu.add( _phyloxml_ref_item = new JMenuItem( "phyloXML Reference" ) );
868         _help_jmenu.addSeparator();
869         _help_jmenu.add( _about_item = new JMenuItem( "About" ) );
870         customizeJMenuItem( _help_item );
871         customizeJMenuItem( _website_item );
872         customizeJMenuItem( _phyloxml_website_item );
873         customizeJMenuItem( _aptx_ref_item );
874         customizeJMenuItem( _phyloxml_ref_item );
875         customizeJMenuItem( _about_item );
876         _phyloxml_ref_item.setToolTipText( MainFrame.PHYLOXML_REF_TOOL_TIP );
877         _aptx_ref_item.setToolTipText( MainFrame.APTX_REF_TOOL_TIP );
878         _jmenubar.add( _help_jmenu );
879     }
880
881     void buildOptionsMenu() {
882         _options_jmenu = MainFrame.createMenu( MainFrame.OPTIONS_HEADER, getConfiguration() );
883         _options_jmenu.addChangeListener( new ChangeListener() {
884
885             @Override
886             public void stateChanged( final ChangeEvent e ) {
887                 MainFrame.setOvPlacementColorChooseMenuItem( _overview_placment_mi, getOptions() );
888                 MainFrame.setTextColorChooseMenuItem( _switch_colors_mi, getCurrentTreePanel() );
889                 MainFrame
890                         .setTextMinSupportMenuItem( _choose_minimal_confidence_mi, getOptions(), getCurrentTreePanel() );
891                 MainFrame.setTextForFontChooserMenuItem( _choose_font_mi, MainFrame
892                         .createCurrentFontDesc( getMainPanel().getTreeFontSet() ) );
893                 MainFrame.setCycleNodeFillMenuItem( _cycle_node_fill_mi, getOptions() );
894                 MainFrame.setCycleNodeShapeMenuItem( _cycle_node_shape_mi, getOptions() );
895                 MainFrame.setTextNodeSizeMenuItem( _choose_node_size_mi, getOptions() );
896                 try {
897                     getMainPanel().getControlPanel().setVisibilityOfDomainStrucureCB();
898                     getMainPanel().getControlPanel().setVisibilityOfX();
899                 }
900                 catch ( final Exception ignore ) {
901                     // do nothing, not important.
902                 }
903             }
904         } );
905         _options_jmenu.add( MainFrame.customizeMenuItemAsLabel( new JMenuItem( MainFrame.DISPLAY_SUBHEADER ),
906                                                                 getConfiguration() ) );
907         _options_jmenu
908                 .add( _ext_node_dependent_cladogram_rbmi = new JRadioButtonMenuItem( MainFrame.NONUNIFORM_CLADOGRAMS_LABEL ) );
909         _options_jmenu.add( _uniform_cladograms_rbmi = new JRadioButtonMenuItem( MainFrame.UNIFORM_CLADOGRAMS_LABEL ) );
910         _options_jmenu
911                 .add( _non_lined_up_cladograms_rbmi = new JRadioButtonMenuItem( MainFrame.NON_LINED_UP_CLADOGRAMS_LABEL ) );
912         _radio_group_1 = new ButtonGroup();
913         _radio_group_1.add( _ext_node_dependent_cladogram_rbmi );
914         _radio_group_1.add( _uniform_cladograms_rbmi );
915         _radio_group_1.add( _non_lined_up_cladograms_rbmi );
916         _options_jmenu.add( _show_overview_cbmi = new JCheckBoxMenuItem( MainFrame.SHOW_OVERVIEW_LABEL ) );
917         _options_jmenu.add( _show_scale_cbmi = new JCheckBoxMenuItem( MainFrame.DISPLAY_SCALE_LABEL ) );
918         _options_jmenu
919                 .add( _show_default_node_shapes_internal_cbmi = new JCheckBoxMenuItem( MainFrame.DISPLAY_NODE_BOXES_LABEL_INT ) );
920         _options_jmenu
921                 .add( _show_default_node_shapes_external_cbmi = new JCheckBoxMenuItem( MainFrame.DISPLAY_NODE_BOXES_LABEL_EXT ) );
922         _options_jmenu
923                 .add( _show_default_node_shapes_for_marked_cbmi = new JCheckBoxMenuItem( MainFrame.DISPLAY_NODE_BOXES_LABEL_MARKED ) );
924         _options_jmenu.add( _line_up_renderable_data_cbmi = new JCheckBoxMenuItem( MainFrame.LINE_UP_RENDERABLE_DATA ) );
925         if ( getConfiguration().doDisplayOption( Configuration.show_domain_architectures ) ) {
926             _options_jmenu.add( _right_line_up_domains_cbmi = new JCheckBoxMenuItem( MainFrame.RIGHT_LINE_UP_DOMAINS ) );
927             _options_jmenu.add( _show_domain_labels = new JCheckBoxMenuItem( MainFrame.SHOW_DOMAIN_LABELS_LABEL ) );
928         }
929         _options_jmenu.add( _show_annotation_ref_source = new JCheckBoxMenuItem( MainFrame.SHOW_ANN_REF_SOURCE_LABEL ) );
930         _options_jmenu.add( _show_confidence_stddev_cbmi = new JCheckBoxMenuItem( MainFrame.SHOW_CONF_STDDEV_LABEL ) );
931         _options_jmenu
932                 .add( _color_by_taxonomic_group_cbmi = new JCheckBoxMenuItem( MainFrame.COLOR_BY_TAXONOMIC_GROUP ) );
933         _options_jmenu
934                 .add( _color_labels_same_as_parent_branch = new JCheckBoxMenuItem( MainFrame.COLOR_LABELS_LABEL ) );
935         _color_labels_same_as_parent_branch.setToolTipText( MainFrame.COLOR_LABELS_TIP );
936         _options_jmenu.add( _abbreviate_scientific_names = new JCheckBoxMenuItem( MainFrame.ABBREV_SN_LABEL ) );
937         _options_jmenu.add( _label_direction_cbmi = new JCheckBoxMenuItem( MainFrame.LABEL_DIRECTION_LABEL ) );
938         _label_direction_cbmi.setToolTipText( MainFrame.LABEL_DIRECTION_TIP );
939         _options_jmenu.add( _screen_antialias_cbmi = new JCheckBoxMenuItem( MainFrame.SCREEN_ANTIALIAS_LABEL ) );
940         _options_jmenu.add( _background_gradient_cbmi = new JCheckBoxMenuItem( MainFrame.BG_GRAD_LABEL ) );
941         _options_jmenu.add( _cycle_node_shape_mi = new JMenuItem( MainFrame.CYCLE_NODE_SHAPE_LABEL ) );
942         _options_jmenu.add( _cycle_node_fill_mi = new JMenuItem( MainFrame.CYCLE_NODE_FILL_LABEL ) );
943         _options_jmenu.add( _choose_node_size_mi = new JMenuItem( MainFrame.CHOOSE_NODE_SIZE_LABEL ) );
944         _options_jmenu.add( _choose_minimal_confidence_mi = new JMenuItem( "" ) );
945         _options_jmenu.add( _overview_placment_mi = new JMenuItem( "" ) );
946         _options_jmenu.add( _switch_colors_mi = new JMenuItem( "" ) );
947         _options_jmenu.add( _choose_font_mi = new JMenuItem( "" ) );
948         _options_jmenu.addSeparator();
949         _options_jmenu.add( MainFrame.customizeMenuItemAsLabel( new JMenuItem( MainFrame.SEARCH_SUBHEADER ),
950                                                                 getConfiguration() ) );
951         _options_jmenu
952                 .add( _search_case_senstive_cbmi = new JCheckBoxMenuItem( MainFrame.SEARCH_CASE_SENSITIVE_LABEL ) );
953         _options_jmenu.add( _search_whole_words_only_cbmi = new JCheckBoxMenuItem( MainFrame.SEARCH_TERMS_ONLY_LABEL ) );
954         _options_jmenu.add( _search_with_regex_cbmi = new JCheckBoxMenuItem( MainFrame.SEARCH_REGEX_LABEL ) );
955         _search_with_regex_cbmi.setToolTipText( MainFrame.SEARCH_WITH_REGEX_TIP );
956         _options_jmenu
957                 .add( _inverse_search_result_cbmi = new JCheckBoxMenuItem( MainFrame.INVERSE_SEARCH_RESULT_LABEL ) );
958         customizeJMenuItem( _choose_font_mi );
959         customizeJMenuItem( _choose_minimal_confidence_mi );
960         customizeJMenuItem( _switch_colors_mi );
961         customizeJMenuItem( _overview_placment_mi );
962         customizeCheckBoxMenuItem( _color_by_taxonomic_group_cbmi, getOptions().isColorByTaxonomicGroup() );
963         customizeCheckBoxMenuItem( _label_direction_cbmi,
964                                    getOptions().getNodeLabelDirection() == NODE_LABEL_DIRECTION.RADIAL );
965         customizeCheckBoxMenuItem( _screen_antialias_cbmi, getOptions().isAntialiasScreen() );
966         customizeCheckBoxMenuItem( _background_gradient_cbmi, getOptions().isBackgroundColorGradient() );
967         customizeCheckBoxMenuItem( _show_domain_labels, getOptions().isShowDomainLabels() );
968         customizeCheckBoxMenuItem( _show_annotation_ref_source, getOptions().isShowAnnotationRefSource() );
969         customizeCheckBoxMenuItem( _abbreviate_scientific_names, getOptions().isAbbreviateScientificTaxonNames() );
970         customizeCheckBoxMenuItem( _show_default_node_shapes_external_cbmi, getOptions()
971                 .isShowDefaultNodeShapesExternal() );
972         customizeCheckBoxMenuItem( _show_default_node_shapes_internal_cbmi, getOptions()
973                 .isShowDefaultNodeShapesInternal() );
974         customizeCheckBoxMenuItem( _show_default_node_shapes_for_marked_cbmi, getOptions()
975                 .isShowDefaultNodeShapesForMarkedNodes() );
976         customizeJMenuItem( _cycle_node_shape_mi );
977         customizeJMenuItem( _cycle_node_fill_mi );
978         customizeJMenuItem( _choose_node_size_mi );
979         customizeCheckBoxMenuItem( _color_labels_same_as_parent_branch, getOptions().isColorLabelsSameAsParentBranch() );
980         customizeCheckBoxMenuItem( _search_case_senstive_cbmi, getOptions().isSearchCaseSensitive() );
981         customizeCheckBoxMenuItem( _show_scale_cbmi, getOptions().isShowScale() );
982         customizeRadioButtonMenuItem( _non_lined_up_cladograms_rbmi,
983                                       getOptions().getCladogramType() == CLADOGRAM_TYPE.NON_LINED_UP );
984         customizeRadioButtonMenuItem( _uniform_cladograms_rbmi,
985                                       getOptions().getCladogramType() == CLADOGRAM_TYPE.TOTAL_NODE_SUM_DEP );
986         customizeRadioButtonMenuItem( _ext_node_dependent_cladogram_rbmi,
987                                       getOptions().getCladogramType() == CLADOGRAM_TYPE.EXT_NODE_SUM_DEP );
988         customizeCheckBoxMenuItem( _show_overview_cbmi, getOptions().isShowOverview() );
989         customizeCheckBoxMenuItem( _search_with_regex_cbmi, getOptions().isSearchWithRegex() );
990         customizeCheckBoxMenuItem( _search_whole_words_only_cbmi, getOptions().isMatchWholeTermsOnly() );
991         customizeCheckBoxMenuItem( _inverse_search_result_cbmi, getOptions().isInverseSearchResult() );
992         customizeCheckBoxMenuItem( _show_confidence_stddev_cbmi, getOptions().isShowConfidenceStddev() );
993         customizeCheckBoxMenuItem( _line_up_renderable_data_cbmi, getOptions().isLineUpRendarableNodeData() );
994         customizeCheckBoxMenuItem( _right_line_up_domains_cbmi, getOptions().isRightLineUpDomains() );
995         _jmenubar.add( _options_jmenu );
996     }
997
998     void buildToolsMenu() {
999         _tools_menu = MainFrame.createMenu( "Tools", getConfiguration() );
1000         _tools_menu.add( _confcolor_item = new JMenuItem( "Colorize Branches Depending on Confidence" ) );
1001         customizeJMenuItem( _confcolor_item );
1002         _tools_menu.add( _taxcolor_item = new JMenuItem( "Taxonomy Colorize Branches" ) );
1003         customizeJMenuItem( _taxcolor_item );
1004         _tools_menu.addSeparator();
1005         _tools_menu.add( _remove_visual_styles_item = new JMenuItem( "Delete All Visual Styles From Nodes" ) );
1006         _remove_visual_styles_item
1007                 .setToolTipText( "To remove all node visual styles (fonts, colors) from the current phylogeny." );
1008         customizeJMenuItem( _remove_visual_styles_item );
1009         _tools_menu.add( _remove_branch_color_item = new JMenuItem( "Delete All Colors From Branches" ) );
1010         _remove_branch_color_item.setToolTipText( "To remove all branch color values from the current phylogeny." );
1011         customizeJMenuItem( _remove_branch_color_item );
1012         _tools_menu.addSeparator();
1013         _tools_menu.add( _midpoint_root_item = new JMenuItem( "Midpoint-Root" ) );
1014         customizeJMenuItem( _midpoint_root_item );
1015         _tools_menu.addSeparator();
1016         _tools_menu.add( _collapse_species_specific_subtrees = new JMenuItem( "Collapse Species-Specific Subtrees" ) );
1017         customizeJMenuItem( _collapse_species_specific_subtrees );
1018         _jmenubar.add( _tools_menu );
1019     }
1020
1021     void buildTypeMenu() {
1022         _type_menu = MainFrame.createMenu( MainFrame.TYPE_MENU_HEADER, getConfiguration() );
1023         _type_menu.add( _rectangular_type_cbmi = new JCheckBoxMenuItem( MainFrame.RECTANGULAR_TYPE_CBMI_LABEL ) );
1024         _type_menu.add( _euro_type_cbmi = new JCheckBoxMenuItem( MainFrame.EURO_TYPE_CBMI_LABEL ) );
1025         _type_menu.add( _rounded_type_cbmi = new JCheckBoxMenuItem( MainFrame.ROUNDED_TYPE_CBMI_LABEL ) );
1026         _type_menu.add( _curved_type_cbmi = new JCheckBoxMenuItem( MainFrame.CURVED_TYPE_CBMI_LABEL ) );
1027         _type_menu.add( _triangular_type_cbmi = new JCheckBoxMenuItem( MainFrame.TRIANGULAR_TYPE_CBMI_LABEL ) );
1028         _type_menu.add( _convex_type_cbmi = new JCheckBoxMenuItem( MainFrame.CONVEX_TYPE_CBMI_LABEL ) );
1029         _type_menu.add( _unrooted_type_cbmi = new JCheckBoxMenuItem( MainFrame.UNROOTED_TYPE_CBMI_LABEL ) );
1030         _type_menu.add( _circular_type_cbmi = new JCheckBoxMenuItem( MainFrame.CIRCULAR_TYPE_CBMI_LABEL ) );
1031         customizeCheckBoxMenuItem( _rectangular_type_cbmi, false );
1032         customizeCheckBoxMenuItem( _triangular_type_cbmi, false );
1033         customizeCheckBoxMenuItem( _euro_type_cbmi, false );
1034         customizeCheckBoxMenuItem( _rounded_type_cbmi, false );
1035         customizeCheckBoxMenuItem( _curved_type_cbmi, false );
1036         customizeCheckBoxMenuItem( _convex_type_cbmi, false );
1037         customizeCheckBoxMenuItem( _unrooted_type_cbmi, false );
1038         customizeCheckBoxMenuItem( _circular_type_cbmi, false );
1039         _unrooted_type_cbmi.setToolTipText( MainFrame.USE_MOUSEWHEEL_SHIFT_TO_ROTATE );
1040         _circular_type_cbmi.setToolTipText( MainFrame.USE_MOUSEWHEEL_SHIFT_TO_ROTATE );
1041         initializeTypeMenu( getOptions() );
1042         _jmenubar.add( _type_menu );
1043     }
1044
1045     void buildViewMenu() {
1046         _view_jmenu = MainFrame.createMenu( "View", getConfiguration() );
1047         _view_jmenu
1048                 .add( _display_basic_information_item = new JMenuItem( MainFrame.SHOW_BASIC_TREE_INFORMATION_LABEL ) );
1049         _view_jmenu.addSeparator();
1050         _view_jmenu.add( _view_as_XML_item = new JMenuItem( "as phyloXML" ) );
1051         _view_jmenu.add( _view_as_NH_item = new JMenuItem( "as Newick" ) );
1052         _view_jmenu.add( _view_as_nexus_item = new JMenuItem( "as Nexus" ) );
1053         customizeJMenuItem( _display_basic_information_item );
1054         customizeJMenuItem( _view_as_NH_item );
1055         customizeJMenuItem( _view_as_XML_item );
1056         customizeJMenuItem( _view_as_nexus_item );
1057         _jmenubar.add( _view_jmenu );
1058     }
1059
1060     void checkTextFrames() {
1061         if ( _textframes.size() > 5 ) {
1062             try {
1063                 if ( _textframes.getFirst() != null ) {
1064                     _textframes.getFirst().removeMe();
1065                 }
1066                 else {
1067                     _textframes.removeFirst();
1068                 }
1069             }
1070             catch ( final NoSuchElementException e ) {
1071                 // Ignore.
1072             }
1073         }
1074     }
1075
1076     void clearCurrentExternalNodesDataBuffer() {
1077         getCurrentTreePanel().clearCurrentExternalNodesDataBuffer();
1078     }
1079
1080     void customizeCheckBoxMenuItem( final JCheckBoxMenuItem item, final boolean is_selected ) {
1081         if ( item != null ) {
1082             item.setFont( MainFrame.menu_font );
1083             if ( !getConfiguration().isUseNativeUI() ) {
1084                 item.setBackground( getConfiguration().getGuiMenuBackgroundColor() );
1085                 item.setForeground( getConfiguration().getGuiMenuTextColor() );
1086             }
1087             item.setSelected( is_selected );
1088             item.addActionListener( this );
1089         }
1090     }
1091
1092     void customizeJMenuItem( final JMenuItem jmi ) {
1093         if ( jmi != null ) {
1094         jmi.setFont( MainFrame.menu_font );
1095         if ( !getConfiguration().isUseNativeUI() ) {
1096             jmi.setBackground( getConfiguration().getGuiMenuBackgroundColor() );
1097             jmi.setForeground( getConfiguration().getGuiMenuTextColor() );
1098         }
1099         jmi.addActionListener( this );
1100         }
1101     }
1102
1103     void displayBasicInformation() {
1104         if ( ( getMainPanel() != null ) && ( getMainPanel().getCurrentPhylogeny() != null )
1105                 && !getMainPanel().getCurrentPhylogeny().isEmpty() ) {
1106             String title = "Basic Information";
1107             if ( !ForesterUtil.isEmpty( getMainPanel().getCurrentPhylogeny().getName() ) ) {
1108                 title = title + " for \"" + _mainpanel.getCurrentPhylogeny().getName() + "\"";
1109             }
1110             showTextFrame( AptxUtil.createBasicInformation( getMainPanel().getCurrentPhylogeny(), null ), title );
1111         }
1112     }
1113
1114     void executeGSDI() {
1115         if ( !isOKforSDI( false, true ) ) {
1116             return;
1117         }
1118         if ( !_mainpanel.getCurrentPhylogeny().isRooted() ) {
1119             JOptionPane.showMessageDialog( this,
1120                                            "Gene tree is not rooted.",
1121                                            "Cannot execute GSDI",
1122                                            JOptionPane.ERROR_MESSAGE );
1123             return;
1124         }
1125         final Phylogeny gene_tree = _mainpanel.getCurrentPhylogeny().copy();
1126         gene_tree.setAllNodesToNotCollapse();
1127         gene_tree.recalculateNumberOfExternalDescendants( false );
1128         GSDI gsdi = null;
1129         final Phylogeny species_tree = _species_tree.copy();
1130         try {
1131             gsdi = new GSDI( gene_tree, species_tree, false, true, true, true );
1132         }
1133         catch ( final SDIException e ) {
1134             JOptionPane.showMessageDialog( this,
1135                                            e.getLocalizedMessage(),
1136                                            "Error during GSDI",
1137                                            JOptionPane.ERROR_MESSAGE );
1138             return;
1139         }
1140         catch ( final Exception e ) {
1141             AptxUtil.unexpectedException( e );
1142             return;
1143         }
1144         gene_tree.setRerootable( false );
1145         gene_tree.clearHashIdToNodeMap();
1146         gene_tree.recalculateNumberOfExternalDescendants( true );
1147         _mainpanel.addPhylogenyInNewTab( gene_tree, getConfiguration(), "gene tree", null );
1148         getMainPanel().getControlPanel().setShowEvents( true );
1149         showWhole();
1150         final int selected = _mainpanel.getTabbedPane().getSelectedIndex();
1151         _mainpanel.addPhylogenyInNewTab( species_tree, getConfiguration(), "species tree", null );
1152         showWhole();
1153         _mainpanel.getTabbedPane().setSelectedIndex( selected );
1154         showWhole();
1155         _mainpanel.getCurrentTreePanel().setEdited( true );
1156         final int poly = PhylogenyMethods.countNumberOfPolytomies( species_tree );
1157         if ( gsdi.getStrippedExternalGeneTreeNodes().size() > 0 ) {
1158             JOptionPane.showMessageDialog( this,
1159                                            "Duplications: " + gsdi.getDuplicationsSum() + "\n"
1160                                                    + "Potential duplications: "
1161                                                    + gsdi.getSpeciationOrDuplicationEventsSum() + "\n"
1162                                                    + "Speciations: " + gsdi.getSpeciationsSum() + "\n"
1163                                                    + "Stripped gene tree nodes: "
1164                                                    + gsdi.getStrippedExternalGeneTreeNodes().size() + "\n"
1165                                                    + "Taxonomy linkage based on: " + gsdi.getTaxCompBase() + "\n"
1166                                                    + "Number of polytomies in species tree used: " + poly + "\n",
1167                                            "GSDI successfully completed",
1168                                            JOptionPane.WARNING_MESSAGE );
1169         }
1170         else {
1171             JOptionPane.showMessageDialog( this,
1172                                            "Duplications: " + gsdi.getDuplicationsSum() + "\n"
1173                                                    + "Potential duplications: "
1174                                                    + gsdi.getSpeciationOrDuplicationEventsSum() + "\n"
1175                                                    + "Speciations: " + gsdi.getSpeciationsSum() + "\n"
1176                                                    + "Stripped gene tree nodes: "
1177                                                    + gsdi.getStrippedExternalGeneTreeNodes().size() + "\n"
1178                                                    + "Taxonomy linkage based on: " + gsdi.getTaxCompBase() + "\n"
1179                                                    + "Number of polytomies in species tree used: " + poly + "\n",
1180                                            "GSDI successfully completed",
1181                                            JOptionPane.INFORMATION_MESSAGE );
1182         }
1183     }
1184
1185     void executeGSDIR() {
1186         if ( !isOKforSDI( false, false ) ) {
1187             return;
1188         }
1189         final int p = PhylogenyMethods.countNumberOfPolytomies( _mainpanel.getCurrentPhylogeny() );
1190         if ( ( p > 0 )
1191                 && !( ( p == 1 ) && ( _mainpanel.getCurrentPhylogeny().getRoot().getNumberOfDescendants() == 3 ) ) ) {
1192             JOptionPane.showMessageDialog( this,
1193                                            "Gene tree is not completely binary",
1194                                            "Cannot execute GSDI",
1195                                            JOptionPane.ERROR_MESSAGE );
1196             return;
1197         }
1198         final Phylogeny gene_tree = _mainpanel.getCurrentPhylogeny().copy();
1199         gene_tree.setAllNodesToNotCollapse();
1200         gene_tree.recalculateNumberOfExternalDescendants( false );
1201         GSDIR gsdir = null;
1202         final Phylogeny species_tree = _species_tree.copy();
1203         try {
1204             gsdir = new GSDIR( gene_tree, species_tree, true, true, true );
1205         }
1206         catch ( final SDIException e ) {
1207             JOptionPane.showMessageDialog( this,
1208                                            e.getLocalizedMessage(),
1209                                            "Error during GSDIR",
1210                                            JOptionPane.ERROR_MESSAGE );
1211             return;
1212         }
1213         catch ( final Exception e ) {
1214             AptxUtil.unexpectedException( e );
1215             return;
1216         }
1217         final Phylogeny result_gene_tree = gsdir.getMinDuplicationsSumGeneTree();
1218         result_gene_tree.setRerootable( false );
1219         result_gene_tree.clearHashIdToNodeMap();
1220         result_gene_tree.recalculateNumberOfExternalDescendants( true );
1221         PhylogenyMethods.orderAppearance( result_gene_tree.getRoot(), true, true, DESCENDANT_SORT_PRIORITY.NODE_NAME );
1222         _mainpanel.addPhylogenyInNewTab( result_gene_tree, getConfiguration(), "gene tree", null );
1223         getMainPanel().getControlPanel().setShowEvents( true );
1224         showWhole();
1225         final int selected = _mainpanel.getTabbedPane().getSelectedIndex();
1226         _mainpanel.addPhylogenyInNewTab( species_tree, getConfiguration(), "species tree", null );
1227         showWhole();
1228         _mainpanel.getTabbedPane().setSelectedIndex( selected );
1229         showWhole();
1230         _mainpanel.getCurrentTreePanel().setEdited( true );
1231         final int poly = PhylogenyMethods.countNumberOfPolytomies( species_tree );
1232         if ( gsdir.getStrippedExternalGeneTreeNodes().size() > 0 ) {
1233             JOptionPane.showMessageDialog( this,
1234                                            "Minimal duplications: " + gsdir.getMinDuplicationsSum() + "\n"
1235                                                    + "Speciations: " + gsdir.getSpeciationsSum() + "\n"
1236                                                    + "Stripped gene tree nodes: "
1237                                                    + gsdir.getStrippedExternalGeneTreeNodes().size() + "\n"
1238                                                    + "Taxonomy linkage based on: " + gsdir.getTaxCompBase() + "\n"
1239                                                    + "Number of polytomies in species tree used: " + poly + "\n",
1240                                            "GSDIR successfully completed",
1241                                            JOptionPane.WARNING_MESSAGE );
1242         }
1243         else {
1244             JOptionPane.showMessageDialog( this,
1245                                            "Minimal duplications: " + gsdir.getMinDuplicationsSum() + "\n"
1246                                                    + "Speciations: " + gsdir.getSpeciationsSum() + "\n"
1247                                                    + "Stripped gene tree nodes: "
1248                                                    + gsdir.getStrippedExternalGeneTreeNodes().size() + "\n"
1249                                                    + "Taxonomy linkage based on: " + gsdir.getTaxCompBase() + "\n"
1250                                                    + "Number of polytomies in species tree used: " + poly + "\n",
1251                                            "GSDIR successfully completed",
1252                                            JOptionPane.INFORMATION_MESSAGE );
1253         }
1254     }
1255
1256     Configuration getConfiguration() {
1257         return _configuration;
1258     }
1259
1260     TreePanel getCurrentTreePanel() {
1261         return getMainPanel().getCurrentTreePanel();
1262     }
1263
1264     JCheckBoxMenuItem getlabelDirectionCbmi() {
1265         return _label_direction_cbmi;
1266     }
1267
1268     Options getOtions() {
1269         return _options;
1270     }
1271
1272     void initializeTypeMenu( final Options options ) {
1273         setTypeMenuToAllUnselected();
1274         try {
1275             switch ( options.getPhylogenyGraphicsType() ) {
1276                 case CONVEX:
1277                     _convex_type_cbmi.setSelected( true );
1278                     break;
1279                 case CURVED:
1280                     _curved_type_cbmi.setSelected( true );
1281                     break;
1282                 case EURO_STYLE:
1283                     _euro_type_cbmi.setSelected( true );
1284                     break;
1285                 case ROUNDED:
1286                     _rounded_type_cbmi.setSelected( true );
1287                     break;
1288                 case TRIANGULAR:
1289                     _triangular_type_cbmi.setSelected( true );
1290                     break;
1291                 case UNROOTED:
1292                     _unrooted_type_cbmi.setSelected( true );
1293                     break;
1294                 case CIRCULAR:
1295                     _circular_type_cbmi.setSelected( true );
1296                     break;
1297                 default:
1298                     _rectangular_type_cbmi.setSelected( true );
1299                     break;
1300             }
1301         }
1302         catch ( final NullPointerException np ) {
1303             // In all likelihood, this is caused by menu-less display.
1304         }
1305     }
1306
1307     boolean isOKforSDI( final boolean species_tree_has_to_binary, final boolean gene_tree_has_to_binary ) {
1308         if ( ( _mainpanel.getCurrentPhylogeny() == null ) || _mainpanel.getCurrentPhylogeny().isEmpty() ) {
1309             return false;
1310         }
1311         else if ( ( _species_tree == null ) || _species_tree.isEmpty() ) {
1312             JOptionPane.showMessageDialog( this,
1313                                            "No species tree loaded",
1314                                            "Cannot execute GSDI",
1315                                            JOptionPane.ERROR_MESSAGE );
1316             return false;
1317         }
1318         else if ( species_tree_has_to_binary && !_species_tree.isCompletelyBinary() ) {
1319             JOptionPane.showMessageDialog( this,
1320                                            "Species tree is not completely binary",
1321                                            "Cannot execute GSDI",
1322                                            JOptionPane.ERROR_MESSAGE );
1323             return false;
1324         }
1325         else if ( gene_tree_has_to_binary && !_mainpanel.getCurrentPhylogeny().isCompletelyBinary() ) {
1326             JOptionPane.showMessageDialog( this,
1327                                            "Gene tree is not completely binary",
1328                                            "Cannot execute GSDI",
1329                                            JOptionPane.ERROR_MESSAGE );
1330             return false;
1331         }
1332         else {
1333             return true;
1334         }
1335     }
1336
1337     boolean isSubtreeDisplayed() {
1338         if ( getCurrentTreePanel() != null ) {
1339             if ( getCurrentTreePanel().isCurrentTreeIsSubtree() ) {
1340                 JOptionPane
1341                         .showMessageDialog( this,
1342                                             "This operation can only be performed on a complete tree, not on the currently displayed sub-tree only.",
1343                                             "Operation can not be exectuted on a sub-tree",
1344                                             JOptionPane.WARNING_MESSAGE );
1345                 return true;
1346             }
1347         }
1348         return false;
1349     }
1350
1351     void removeAllTextFrames() {
1352         for( final TextFrame tf : _textframes ) {
1353             if ( tf != null ) {
1354                 tf.close();
1355             }
1356         }
1357         _textframes.clear();
1358     }
1359
1360     void setConfiguration( final Configuration configuration ) {
1361         _configuration = configuration;
1362     }
1363
1364     void setOptions( final Options options ) {
1365         _options = options;
1366     }
1367
1368     void setSelectedTypeInTypeMenu( final PHYLOGENY_GRAPHICS_TYPE type ) {
1369         setTypeMenuToAllUnselected();
1370         try {
1371             switch ( type ) {
1372                 case CIRCULAR:
1373                     _circular_type_cbmi.setSelected( true );
1374                     break;
1375                 case CONVEX:
1376                     _convex_type_cbmi.setSelected( true );
1377                     break;
1378                 case CURVED:
1379                     _curved_type_cbmi.setSelected( true );
1380                     break;
1381                 case EURO_STYLE:
1382                     _euro_type_cbmi.setSelected( true );
1383                     break;
1384                 case ROUNDED:
1385                     _rounded_type_cbmi.setSelected( true );
1386                     break;
1387                 case RECTANGULAR:
1388                     _rectangular_type_cbmi.setSelected( true );
1389                     break;
1390                 case TRIANGULAR:
1391                     _triangular_type_cbmi.setSelected( true );
1392                     break;
1393                 case UNROOTED:
1394                     _unrooted_type_cbmi.setSelected( true );
1395                     break;
1396                 default:
1397                     throw new IllegalArgumentException( "unknown type: " + type );
1398             }
1399         }
1400         catch ( final NullPointerException np ) {
1401             // In all likelihood, this is caused by menu-less display.
1402         }
1403     }
1404
1405     void setTypeMenuToAllUnselected() {
1406         if ( _convex_type_cbmi != null ) {
1407             _convex_type_cbmi.setSelected( false );
1408         }
1409         if ( _curved_type_cbmi != null ) {
1410             _curved_type_cbmi.setSelected( false );
1411         }
1412         if ( _euro_type_cbmi != null ) {
1413             _euro_type_cbmi.setSelected( false );
1414         }
1415         if ( _rounded_type_cbmi != null ) {
1416             _rounded_type_cbmi.setSelected( false );
1417         }
1418         if ( _triangular_type_cbmi != null ) {
1419             _triangular_type_cbmi.setSelected( false );
1420         }
1421         if ( _rectangular_type_cbmi != null ) {
1422             _rectangular_type_cbmi.setSelected( false );
1423         }
1424         if ( _unrooted_type_cbmi != null ) {
1425             _unrooted_type_cbmi.setSelected( false );
1426         }
1427         if ( _circular_type_cbmi != null ) {
1428             _circular_type_cbmi.setSelected( false );
1429         }
1430     }
1431
1432     void showWhole() {
1433         _mainpanel.getControlPanel().showWhole();
1434     }
1435
1436     void switchColors() {
1437         final TreeColorSet colorset = getMainPanel().getCurrentTreePanel().getTreeColorSet();
1438         final ColorSchemeChooser csc = new ColorSchemeChooser( getMainPanel(), colorset );
1439         csc.setVisible( true );
1440         getMainPanel().setTreeColorSet( colorset );
1441     }
1442
1443     void typeChanged( final Object o ) {
1444         updateTypeCheckboxes( getOptions(), o );
1445         updateOptions( getOptions() );
1446         if ( getCurrentTreePanel() != null ) {
1447             final PHYLOGENY_GRAPHICS_TYPE previous_type = getCurrentTreePanel().getPhylogenyGraphicsType();
1448             final PHYLOGENY_GRAPHICS_TYPE new_type = getOptions().getPhylogenyGraphicsType();
1449             if ( ( ( previous_type == PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) && ( new_type != PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) )
1450                     || ( ( previous_type == PHYLOGENY_GRAPHICS_TYPE.CIRCULAR ) && ( new_type != PHYLOGENY_GRAPHICS_TYPE.CIRCULAR ) )
1451                     || ( ( previous_type != PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) && ( new_type == PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) )
1452                     || ( ( previous_type != PHYLOGENY_GRAPHICS_TYPE.CIRCULAR ) && ( new_type == PHYLOGENY_GRAPHICS_TYPE.CIRCULAR ) ) ) {
1453                 getCurrentTreePanel().getControlPanel().showWhole();
1454             }
1455             if ( getCurrentTreePanel().isPhyHasBranchLengths() && ( new_type != PHYLOGENY_GRAPHICS_TYPE.CIRCULAR ) ) {
1456                 getCurrentTreePanel().getControlPanel().setDrawPhylogramEnabled( true );
1457             }
1458             else {
1459                 getCurrentTreePanel().getControlPanel().setDrawPhylogramEnabled( false );
1460             }
1461             getCurrentTreePanel().setPhylogenyGraphicsType( getOptions().getPhylogenyGraphicsType() );
1462             MainFrame.updateScreenTextAntialias( getMainPanel().getTreePanels() );
1463         }
1464     }
1465
1466     void updateOptions( final Options options ) {
1467         options.setAntialiasScreen( ( _screen_antialias_cbmi != null ) && _screen_antialias_cbmi.isSelected() );
1468         options.setBackgroundColorGradient( ( _background_gradient_cbmi != null )
1469                 && _background_gradient_cbmi.isSelected() );
1470         options.setShowDomainLabels( ( _show_domain_labels != null ) && _show_domain_labels.isSelected() );
1471         options.setShowAnnotationRefSource( ( _show_annotation_ref_source != null )
1472                 && _show_annotation_ref_source.isSelected() );
1473         options.setAbbreviateScientificTaxonNames( ( _abbreviate_scientific_names != null )
1474                 && _abbreviate_scientific_names.isSelected() );
1475         options.setColorLabelsSameAsParentBranch( ( _color_labels_same_as_parent_branch != null )
1476                 && _color_labels_same_as_parent_branch.isSelected() );
1477         options.setShowDefaultNodeShapesInternal( ( _show_default_node_shapes_internal_cbmi != null )
1478                 && _show_default_node_shapes_internal_cbmi.isSelected() );
1479         options.setShowDefaultNodeShapesExternal( ( _show_default_node_shapes_external_cbmi != null )
1480                 && _show_default_node_shapes_external_cbmi.isSelected() );
1481         options.setShowDefaultNodeShapesForMarkedNodes( ( _show_default_node_shapes_for_marked_cbmi != null )
1482                 && _show_default_node_shapes_for_marked_cbmi.isSelected() );
1483         if ( ( _non_lined_up_cladograms_rbmi != null ) && ( _non_lined_up_cladograms_rbmi.isSelected() ) ) {
1484             options.setCladogramType( CLADOGRAM_TYPE.NON_LINED_UP );
1485         }
1486         else if ( ( _uniform_cladograms_rbmi != null ) && ( _uniform_cladograms_rbmi.isSelected() ) ) {
1487             options.setCladogramType( CLADOGRAM_TYPE.TOTAL_NODE_SUM_DEP );
1488         }
1489         else if ( ( _ext_node_dependent_cladogram_rbmi != null ) && ( _ext_node_dependent_cladogram_rbmi.isSelected() ) ) {
1490             options.setCladogramType( CLADOGRAM_TYPE.EXT_NODE_SUM_DEP );
1491         }
1492         options.setSearchCaseSensitive( ( _search_case_senstive_cbmi != null )
1493                 && _search_case_senstive_cbmi.isSelected() );
1494         if ( ( _show_scale_cbmi != null ) && _show_scale_cbmi.isEnabled() ) {
1495             options.setShowScale( _show_scale_cbmi.isSelected() );
1496         }
1497         if ( _label_direction_cbmi != null ) {
1498             if ( _label_direction_cbmi.isSelected() ) {
1499                 options.setNodeLabelDirection( NODE_LABEL_DIRECTION.RADIAL );
1500             }
1501             else {
1502                 options.setNodeLabelDirection( NODE_LABEL_DIRECTION.HORIZONTAL );
1503             }
1504         }
1505         options.setShowOverview( ( _show_overview_cbmi != null ) && _show_overview_cbmi.isSelected() );
1506         options.setShowConfidenceStddev( ( _show_confidence_stddev_cbmi != null )
1507                 && _show_confidence_stddev_cbmi.isSelected() );
1508         options.setMatchWholeTermsOnly( ( _search_whole_words_only_cbmi != null )
1509                 && _search_whole_words_only_cbmi.isSelected() );
1510         options.setSearchWithRegex( ( _search_with_regex_cbmi != null ) && _search_with_regex_cbmi.isSelected() );
1511         options.setInverseSearchResult( ( _inverse_search_result_cbmi != null )
1512                 && _inverse_search_result_cbmi.isSelected() );
1513         if ( ( _rectangular_type_cbmi != null ) && _rectangular_type_cbmi.isSelected() ) {
1514             options.setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR );
1515         }
1516         else if ( ( _triangular_type_cbmi != null ) && _triangular_type_cbmi.isSelected() ) {
1517             options.setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.TRIANGULAR );
1518         }
1519         else if ( ( _curved_type_cbmi != null ) && _curved_type_cbmi.isSelected() ) {
1520             options.setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.CURVED );
1521         }
1522         else if ( ( _convex_type_cbmi != null ) && _convex_type_cbmi.isSelected() ) {
1523             options.setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.CONVEX );
1524         }
1525         else if ( ( _euro_type_cbmi != null ) && _euro_type_cbmi.isSelected() ) {
1526             options.setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE );
1527         }
1528         else if ( ( _rounded_type_cbmi != null ) && _rounded_type_cbmi.isSelected() ) {
1529             options.setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.ROUNDED );
1530         }
1531         else if ( ( _unrooted_type_cbmi != null ) && _unrooted_type_cbmi.isSelected() ) {
1532             options.setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.UNROOTED );
1533         }
1534         else if ( ( _circular_type_cbmi != null ) && _circular_type_cbmi.isSelected() ) {
1535             options.setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.CIRCULAR );
1536         }
1537         if ( ( _color_by_taxonomic_group_cbmi != null ) && _color_by_taxonomic_group_cbmi.isEnabled() ) {
1538             options.setColorByTaxonomicGroup( _color_by_taxonomic_group_cbmi.isSelected() );
1539         }
1540         if ( ( _right_line_up_domains_cbmi != null ) && _right_line_up_domains_cbmi.isEnabled() ) {
1541             options.setRightLineUpDomains( _right_line_up_domains_cbmi.isSelected() );
1542         }
1543         if ( ( _line_up_renderable_data_cbmi != null ) && _line_up_renderable_data_cbmi.isEnabled() ) {
1544             options.setLineUpRendarableNodeData( _line_up_renderable_data_cbmi.isSelected() );
1545         }
1546     }
1547
1548     void updateTypeCheckboxes( final Options options, final Object o ) {
1549         setTypeMenuToAllUnselected();
1550         ( ( JCheckBoxMenuItem ) o ).setSelected( true );
1551     }
1552
1553     void viewAsNexus() {
1554         if ( ( getMainPanel().getCurrentPhylogeny() != null ) && !getMainPanel().getCurrentPhylogeny().isEmpty() ) {
1555             String title = "Nexus";
1556             if ( !ForesterUtil.isEmpty( getMainPanel().getCurrentPhylogeny().getName() ) ) {
1557                 title = "\"" + getMainPanel().getCurrentPhylogeny().getName() + "\" in " + title;
1558             }
1559             showTextFrame( getMainPanel().getCurrentPhylogeny().toNexus( getOptions()
1560                                    .getNhConversionSupportValueStyle() ),
1561                            title );
1562         }
1563     }
1564
1565     void viewAsNH() {
1566         if ( ( getMainPanel().getCurrentPhylogeny() != null ) && !getMainPanel().getCurrentPhylogeny().isEmpty() ) {
1567             String title = "New Hampshire";
1568             if ( !ForesterUtil.isEmpty( getMainPanel().getCurrentPhylogeny().getName() ) ) {
1569                 title = "\"" + getMainPanel().getCurrentPhylogeny().getName() + "\" in " + title;
1570             }
1571             showTextFrame( getMainPanel().getCurrentPhylogeny().toNewHampshire( getOptions()
1572                                    .getNhConversionSupportValueStyle() ),
1573                            title );
1574         }
1575     }
1576
1577     void viewAsXML() {
1578         if ( ( getMainPanel().getCurrentPhylogeny() != null ) && !getMainPanel().getCurrentPhylogeny().isEmpty() ) {
1579             String title = "phyloXML";
1580             if ( !ForesterUtil.isEmpty( getMainPanel().getCurrentPhylogeny().getName() ) ) {
1581                 title = "\"" + getMainPanel().getCurrentPhylogeny().getName() + "\" in " + title;
1582             }
1583             showTextFrame( getMainPanel().getCurrentPhylogeny().toPhyloXML( 0 ), title );
1584         }
1585     }
1586
1587     private void chooseFont() {
1588         final FontChooser fc = new FontChooser();
1589         fc.setFont( getMainPanel().getTreeFontSet().getLargeFont() );
1590         fc.showDialog( this, "Select the Base Font" );
1591         getMainPanel().getTreeFontSet().setBaseFont( fc.getFont() );
1592     }
1593
1594     private void chooseMinimalConfidence() {
1595         final String s = ( String ) JOptionPane
1596                 .showInputDialog( this,
1597                                   "Please the minimum for confidence values to be displayed.\n" + "[current value: "
1598                                           + getOptions().getMinConfidenceValue() + "]\n",
1599                                   "Minimal Confidence Value",
1600                                   JOptionPane.QUESTION_MESSAGE,
1601                                   null,
1602                                   null,
1603                                   getOptions().getMinConfidenceValue() );
1604         if ( !ForesterUtil.isEmpty( s ) ) {
1605             boolean success = true;
1606             double m = 0.0;
1607             final String m_str = s.trim();
1608             if ( !ForesterUtil.isEmpty( m_str ) ) {
1609                 try {
1610                     m = Double.parseDouble( m_str );
1611                 }
1612                 catch ( final Exception ex ) {
1613                     success = false;
1614                 }
1615             }
1616             else {
1617                 success = false;
1618             }
1619             if ( success && ( m >= 0.0 ) ) {
1620                 getOptions().setMinConfidenceValue( m );
1621             }
1622         }
1623     }
1624
1625     private void customizeRadioButtonMenuItem( final JRadioButtonMenuItem item, final boolean is_selected ) {
1626         if ( item != null ) {
1627             item.setFont( MainFrame.menu_font );
1628             if ( !getConfiguration().isUseNativeUI() ) {
1629                 item.setBackground( getConfiguration().getGuiMenuBackgroundColor() );
1630                 item.setForeground( getConfiguration().getGuiMenuTextColor() );
1631             }
1632             item.setSelected( is_selected );
1633             item.addActionListener( this );
1634         }
1635     }
1636
1637     MainPanel getMainPanel() {
1638         return _mainpanel;
1639     }
1640
1641     private Phylogeny getSpeciesTree() {
1642         return _species_tree;
1643     }
1644
1645     private boolean isScreenAntialias() {
1646         return true;
1647     }
1648
1649     private void removeBranchColors() {
1650         if ( getMainPanel().getCurrentPhylogeny() != null ) {
1651             AptxUtil.removeBranchColors( getMainPanel().getCurrentPhylogeny() );
1652         }
1653     }
1654
1655     private void removeVisualStyles() {
1656         if ( getMainPanel().getCurrentPhylogeny() != null ) {
1657             AptxUtil.removeVisualStyles( getMainPanel().getCurrentPhylogeny() );
1658         }
1659     }
1660
1661     private void setMainPanel( final MainPanelApplets main_panel ) {
1662         _mainpanel = main_panel;
1663     }
1664
1665     private void setSpeciesTree( final Phylogeny species_tree ) {
1666         _species_tree = species_tree;
1667     }
1668
1669     private void setupUI() {
1670         try {
1671             if ( getConfiguration().isUseNativeUI() ) {
1672                 UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
1673             }
1674             else {
1675                 UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );
1676             }
1677         }
1678         catch ( final UnsupportedLookAndFeelException e ) {
1679             AptxUtil.dieWithSystemError( "UnsupportedLookAndFeelException: " + e.toString() );
1680         }
1681         catch ( final ClassNotFoundException e ) {
1682             AptxUtil.dieWithSystemError( "ClassNotFoundException: " + e.toString() );
1683         }
1684         catch ( final InstantiationException e ) {
1685             AptxUtil.dieWithSystemError( "InstantiationException: " + e.toString() );
1686         }
1687         catch ( final IllegalAccessException e ) {
1688             AptxUtil.dieWithSystemError( "IllegalAccessException: " + e.toString() );
1689         }
1690         catch ( final Exception e ) {
1691             AptxUtil.dieWithSystemError( e.toString() );
1692         }
1693     }
1694
1695     static void setupScreenTextAntialias( final List<TreePanel> treepanels, final boolean antialias ) {
1696         for( final TreePanel tree_panel : treepanels ) {
1697             tree_panel.setTextAntialias();
1698         }
1699     }
1700 }