changed order
[jalview.git] / forester / java / src / org / forester / archaeopteryx / MainFrame.java
index 4127698..80555c0 100644 (file)
@@ -24,6 +24,7 @@
 
 package org.forester.archaeopteryx;
 
+import java.awt.Component;
 import java.awt.Container;
 import java.awt.Font;
 import java.awt.event.ActionEvent;
@@ -46,49 +47,55 @@ import org.forester.archaeopteryx.Options.CLADOGRAM_TYPE;
 import org.forester.archaeopteryx.Options.NODE_LABEL_DIRECTION;
 import org.forester.archaeopteryx.Options.PHYLOGENY_GRAPHICS_TYPE;
 import org.forester.phylogeny.Phylogeny;
+import org.forester.phylogeny.data.NodeVisualization.NodeFill;
+import org.forester.phylogeny.data.NodeVisualization.NodeShape;
 import org.forester.util.ForesterConstants;
 import org.forester.util.ForesterUtil;
 
 public abstract class MainFrame extends JFrame implements ActionListener {
 
-    static final String       USE_MOUSEWHEEL_SHIFT_TO_ROTATE     = "In this display type, use mousewheel + Shift to rotate [or A and S]";
-    static final String       PHYLOXML_REF_TOOL_TIP              = Constants.PHYLOXML_REFERENCE;                                                                                                                                       //TODO //FIXME
-    static final String       APTX_REF_TOOL_TIP                  = Constants.APTX_REFERENCE;
-    private static final long serialVersionUID                   = 3655000897845508358L;
-    final static Font         menu_font                          = new Font( Configuration.getDefaultFontFamilyName(),
-                                                                             Font.PLAIN,
-                                                                             10 );
-    static final String       TYPE_MENU_HEADER                   = "Type";
-    static final String       RECTANGULAR_TYPE_CBMI_LABEL        = "Rectangular";
-    static final String       EURO_TYPE_CBMI_LABEL               = "Euro Type";
-    static final String       CURVED_TYPE_CBMI_LABEL             = "Curved";
-    static final String       TRIANGULAR_TYPE_CBMI_LABEL         = "Triangular";
-    static final String       CONVEX_TYPE_CBMI_LABEL             = "Convex";
-    static final String       ROUNDED_TYPE_CBMI_LABEL            = "Rounded";
-    static final String       UNROOTED_TYPE_CBMI_LABEL           = "Unrooted (alpha)";                                                                                                                                                 //TODO
-    static final String       CIRCULAR_TYPE_CBMI_LABEL           = "Circular (alpha)";                                                                                                                                                 //TODO
-    static final String       OPTIONS_HEADER                     = "Options";
-    static final String       SEARCH_SUBHEADER                   = "Search:";
-    static final String       DISPLAY_SUBHEADER                  = "Display:";
-    static final String       SEARCH_TERMS_ONLY_LABEL            = "Match Complete Terms Only";
-    static final String       SEARCH_CASE_SENSITIVE_LABEL        = "Case Sensitive";
-    static final String       INVERSE_SEARCH_RESULT_LABEL        = "Negate Result";
-    static final String       DISPLAY_BRANCH_LENGTH_VALUES_LABEL = "Display Branch Length Values";
-    static final String       DISPLAY_SCALE_LABEL                = "Display Scale";
-    static final String       NON_LINED_UP_CLADOGRAMS_LABEL      = "Non-Lined Up Cladograms";
-    static final String       UNIFORM_CLADOGRAMS_LABEL           = "Total Node Sum Dependent Cladograms";
-    static final String       LABEL_DIRECTION_LABEL              = "Radial Labels";
-    static final String       LABEL_DIRECTION_TIP                = "To use radial node labels in radial and unrooted display types";
-    static final String       SCREEN_ANTIALIAS_LABEL             = "Antialias";
-    static final String       COLOR_LABELS_LABEL                 = "Colorize Labels Same as Parent Branch";
-    static final String       BG_GRAD_LABEL                      = "Background Color Gradient";
-    static final String       DISPLAY_NODE_BOXES_LABEL           = "Display Node Boxes";
-    static final String       SHOW_OVERVIEW_LABEL                = "Show Overview";
-    static final String       FONT_SIZE_MENU_LABEL               = "Font Size";
-    static final String       NONUNIFORM_CLADOGRAMS_LABEL        = "External Node Sum Dependent Cladograms";
-    static final String       SHOW_DOMAIN_LABELS_LABEL           = "Show Domain Labels";
-    static final String       COLOR_LABELS_TIP                   = "To use parent branch colors for node labels as well, need to turn off taxonomy dependent colorization and turn on branch colorization for this to become apparent";
-    static final String       ABBREV_SN_LABEL                    = "Abbreviate Scientific Taxonomic Names";
+    static final String       USE_MOUSEWHEEL_SHIFT_TO_ROTATE      = "In this display type, use mousewheel + Shift to rotate [or A and S]";
+    static final String       PHYLOXML_REF_TOOL_TIP               = Constants.PHYLOXML_REFERENCE;                                                                                                                                       //TODO //FIXME
+    static final String       APTX_REF_TOOL_TIP                   = Constants.APTX_REFERENCE;
+    private static final long serialVersionUID                    = 3655000897845508358L;
+    final static Font         menu_font                           = new Font( Configuration.getDefaultFontFamilyName(),
+                                                                              Font.PLAIN,
+                                                                              10 );
+    static final String       TYPE_MENU_HEADER                    = "Type";
+    static final String       RECTANGULAR_TYPE_CBMI_LABEL         = "Rectangular";
+    static final String       EURO_TYPE_CBMI_LABEL                = "Euro Type";
+    static final String       CURVED_TYPE_CBMI_LABEL              = "Curved";
+    static final String       TRIANGULAR_TYPE_CBMI_LABEL          = "Triangular";
+    static final String       CONVEX_TYPE_CBMI_LABEL              = "Convex";
+    static final String       ROUNDED_TYPE_CBMI_LABEL             = "Rounded";
+    static final String       UNROOTED_TYPE_CBMI_LABEL            = "Unrooted (alpha)";                                                                                                                                                 //TODO
+    static final String       CIRCULAR_TYPE_CBMI_LABEL            = "Circular (alpha)";                                                                                                                                                 //TODO
+    static final String       OPTIONS_HEADER                      = "Options";
+    static final String       SEARCH_SUBHEADER                    = "Search:";
+    static final String       DISPLAY_SUBHEADER                   = "Display:";
+    static final String       SEARCH_TERMS_ONLY_LABEL             = "Match Complete Terms Only";
+    static final String       SEARCH_CASE_SENSITIVE_LABEL         = "Case Sensitive";
+    static final String       INVERSE_SEARCH_RESULT_LABEL         = "Negate Result";
+    static final String       DISPLAY_BRANCH_LENGTH_VALUES_LABEL  = "Display Branch Length Values";
+    static final String       DISPLAY_SCALE_LABEL                 = "Display Scale";
+    static final String       NON_LINED_UP_CLADOGRAMS_LABEL       = "Non-Lined Up Cladograms";
+    static final String       UNIFORM_CLADOGRAMS_LABEL            = "Total Node Sum Dependent Cladograms";
+    static final String       LABEL_DIRECTION_LABEL               = "Radial Labels";
+    static final String       LABEL_DIRECTION_TIP                 = "To use radial node labels in radial and unrooted display types";
+    static final String       SCREEN_ANTIALIAS_LABEL              = "Antialias";
+    static final String       COLOR_LABELS_LABEL                  = "Colorize Labels Same as Parent Branch";
+    static final String       BG_GRAD_LABEL                       = "Background Color Gradient";
+    static final String       DISPLAY_NODE_BOXES_LABEL            = "Display Node Shapes";
+    static final String       SHOW_OVERVIEW_LABEL                 = "Show Overview";
+    static final String       FONT_SIZE_MENU_LABEL                = "Font Size";
+    static final String       NONUNIFORM_CLADOGRAMS_LABEL         = "External Node Sum Dependent Cladograms";
+    static final String       SHOW_DOMAIN_LABELS_LABEL            = "Show Domain Labels";
+    static final String       COLOR_LABELS_TIP                    = "To use parent branch colors for node labels as well, need to turn off taxonomy dependent colorization and turn on branch colorization for this to become apparent";
+    static final String       ABBREV_SN_LABEL                     = "Abbreviate Scientific Taxonomic Names";
+    static final String       TAXONOMY_COLORIZE_NODE_SHAPES_LABEL = "Colorize Node Shapes According to Taxonomy";
+    static final String       CYCLE_NODE_SHAPE_LABEL              = "Cycle Node Shapes";
+    static final String       CYCLE_NODE_FILL_LABEL               = "Cycle Node Fill Type";
+    static final String       CHOOSE_NODE_SIZE_LABEL              = "Choose Node Shape Size";
     JMenuBar                  _jmenubar;
     JMenu                     _file_jmenu;
     JMenu                     _tools_menu;
@@ -111,8 +118,9 @@ public abstract class MainFrame extends JFrame implements ActionListener {
     JMenuItem                 _confcolor_item;
     JMenuItem                 _infer_common_sn_names_item;
     JMenuItem                 _collapse_species_specific_subtrees;
-    JMenuItem                 _collapse_below_threshold;                                                                                                                                                                               //TODO implememt me
+    JMenuItem                 _collapse_below_threshold;                                                                                                                                                                                //TODO implememt me
     JMenuItem                 _obtain_detailed_taxonomic_information_jmi;
+    JMenuItem                 _obtain_uniprot_seq_information_jmi;
     JMenuItem                 _move_node_names_to_tax_sn_jmi;
     JMenuItem                 _move_node_names_to_seq_names_jmi;
     JMenuItem                 _extract_tax_code_from_node_names_jmi;
@@ -130,18 +138,22 @@ public abstract class MainFrame extends JFrame implements ActionListener {
     // _  screen display
     JCheckBoxMenuItem         _screen_antialias_cbmi;
     JCheckBoxMenuItem         _background_gradient_cbmi;
-    JCheckBoxMenuItem         _show_node_boxes_cbmi;
     JRadioButtonMenuItem      _non_lined_up_cladograms_rbmi;
     JRadioButtonMenuItem      _uniform_cladograms_rbmi;
     JRadioButtonMenuItem      _ext_node_dependent_cladogram_rbmi;
     JCheckBoxMenuItem         _show_branch_length_values_cbmi;
-    JCheckBoxMenuItem         _show_scale_cbmi;                                                                                                                                                                                        //TODO fix me
+    JCheckBoxMenuItem         _show_scale_cbmi;                                                                                                                                                                                         //TODO fix me
     JCheckBoxMenuItem         _show_overview_cbmi;
     JCheckBoxMenuItem         _show_domain_labels;
     JCheckBoxMenuItem         _abbreviate_scientific_names;
     JCheckBoxMenuItem         _color_labels_same_as_parent_branch;
     JMenuItem                 _overview_placment_mi;
     JMenuItem                 _choose_minimal_confidence_mi;
+    JCheckBoxMenuItem         _show_default_node_shapes_cbmi;
+    JMenuItem                 _cycle_node_shape_mi;
+    JMenuItem                 _cycle_node_fill_mi;
+    JMenuItem                 _choose_node_size_mi;
+    JCheckBoxMenuItem         _taxonomy_colorize_node_shapes_cbmi;
     // _  print
     JCheckBoxMenuItem         _graphics_export_visible_only_cbmi;
     JCheckBoxMenuItem         _antialias_print_cbmi;
@@ -300,9 +312,18 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         else if ( o == _choose_minimal_confidence_mi ) {
             chooseMinimalConfidence();
         }
+        else if ( o == _choose_node_size_mi ) {
+            chooseNodeSize( getOptions(), this );
+        }
         else if ( o == _overview_placment_mi ) {
             MainFrame.cycleOverview( getOptions(), getCurrentTreePanel() );
         }
+        else if ( o == _cycle_node_fill_mi ) {
+            MainFrame.cycleNodeFill( getOptions(), getCurrentTreePanel() );
+        }
+        else if ( o == _cycle_node_shape_mi ) {
+            MainFrame.cycleNodeShape( getOptions(), getCurrentTreePanel() );
+        }
         else if ( o == _screen_antialias_cbmi ) {
             updateOptions( getOptions() );
             updateScreenTextAntialias( getMainPanel().getTreePanels() );
@@ -319,7 +340,10 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         else if ( o == _color_labels_same_as_parent_branch ) {
             updateOptions( getOptions() );
         }
-        else if ( o == _show_node_boxes_cbmi ) {
+        else if ( o == _show_default_node_shapes_cbmi ) {
+            updateOptions( getOptions() );
+        }
+        else if ( o == _taxonomy_colorize_node_shapes_cbmi ) {
             updateOptions( getOptions() );
         }
         else if ( o == _non_lined_up_cladograms_rbmi ) {
@@ -417,13 +441,15 @@ public abstract class MainFrame extends JFrame implements ActionListener {
     }
 
     boolean isSubtreeDisplayed() {
-        if ( getCurrentTreePanel().isCurrentTreeIsSubtree() ) {
-            JOptionPane
-                    .showMessageDialog( this,
-                                        "This operation can only be performed on a complete tree, not on the currently displayed sub-tree only.",
-                                        "Operation can not be exectuted on a sub-tree",
-                                        JOptionPane.WARNING_MESSAGE );
-            return true;
+        if ( getCurrentTreePanel() != null ) {
+            if ( getCurrentTreePanel().isCurrentTreeIsSubtree() ) {
+                JOptionPane
+                        .showMessageDialog( this,
+                                            "This operation can only be performed on a complete tree, not on the currently displayed sub-tree only.",
+                                            "Operation can not be exectuted on a sub-tree",
+                                            JOptionPane.WARNING_MESSAGE );
+                return true;
+            }
         }
         return false;
     }
@@ -508,11 +534,12 @@ public abstract class MainFrame extends JFrame implements ActionListener {
 
     void buildViewMenu() {
         _view_jmenu = createMenu( "View", getConfiguration() );
+        _view_jmenu.add( _display_basic_information_item = new JMenuItem( "Display Basic Information" ) );
+        _view_jmenu.addSeparator();
         _view_jmenu.add( _view_as_XML_item = new JMenuItem( "View as phyloXML" ) );
         _view_jmenu.add( _view_as_NH_item = new JMenuItem( "View as Newick" ) );
         _view_jmenu.add( _view_as_NHX_item = new JMenuItem( "View as NHX" ) );
         _view_jmenu.add( _view_as_nexus_item = new JMenuItem( "View as Nexus" ) );
-        _view_jmenu.add( _display_basic_information_item = new JMenuItem( "Display Basic Information" ) );
         customizeJMenuItem( _display_basic_information_item );
         customizeJMenuItem( _view_as_NH_item );
         customizeJMenuItem( _view_as_NHX_item );
@@ -559,6 +586,40 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         }
     }
 
+    static void chooseNodeSize( final Options options, final Component parent ) {
+        final String s = ( String ) JOptionPane.showInputDialog( parent,
+                                                                 "Please enter the default size for node shapes.\n"
+                                                                         + "[current value: "
+                                                                         + options.getDefaultNodeShapeSize() + "]\n",
+                                                                 "Node Shape Size",
+                                                                 JOptionPane.QUESTION_MESSAGE,
+                                                                 null,
+                                                                 null,
+                                                                 options.getDefaultNodeShapeSize() );
+        if ( !ForesterUtil.isEmpty( s ) ) {
+            boolean success = true;
+            double m = 0.0;
+            final String m_str = s.trim();
+            if ( !ForesterUtil.isEmpty( m_str ) ) {
+                try {
+                    m = Double.parseDouble( m_str );
+                }
+                catch ( final Exception ex ) {
+                    success = false;
+                }
+            }
+            else {
+                success = false;
+            }
+            if ( success && ( m >= 0.0 ) ) {
+                final short size = ForesterUtil.roundToShort( m );
+                if ( size >= 0.0 ) {
+                    options.setDefaultNodeShapeSize( size );
+                }
+            }
+        }
+    }
+
     void close() {
         removeTextFrame();
         if ( _mainpanel != null ) {
@@ -655,7 +716,7 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         }
     }
 
-    Configuration getConfiguration() {
+    public Configuration getConfiguration() {
         return _configuration;
     }
 
@@ -790,7 +851,7 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         _circular_type_cbmi.setSelected( false );
     }
 
-    void showWhole() {
+    public void showWhole() {
         _mainpanel.getControlPanel().showWhole();
     }
 
@@ -846,7 +907,10 @@ public abstract class MainFrame extends JFrame implements ActionListener {
                 && _abbreviate_scientific_names.isSelected() );
         options.setColorLabelsSameAsParentBranch( ( _color_labels_same_as_parent_branch != null )
                 && _color_labels_same_as_parent_branch.isSelected() );
-        options.setShowNodeBoxes( ( _show_node_boxes_cbmi != null ) && _show_node_boxes_cbmi.isSelected() );
+        options.setShowDefaultNodeShapes( ( _show_default_node_shapes_cbmi != null )
+                && _show_default_node_shapes_cbmi.isSelected() );
+        options.setTaxonomyColorizeNodeShapes( ( _taxonomy_colorize_node_shapes_cbmi != null )
+                && _taxonomy_colorize_node_shapes_cbmi.isSelected() );
         if ( ( _non_lined_up_cladograms_rbmi != null ) && ( _non_lined_up_cladograms_rbmi.isSelected() ) ) {
             options.setCladogramType( CLADOGRAM_TYPE.NON_LINED_UP );
         }
@@ -1048,7 +1112,38 @@ public abstract class MainFrame extends JFrame implements ActionListener {
             default:
                 throw new RuntimeException( "unknown placement: " + op.getOvPlacement() );
         }
-        tree_panel.updateOvSettings();
+        if ( tree_panel != null ) {
+            tree_panel.updateOvSettings();
+        }
+    }
+
+    static void cycleNodeFill( final Options op, final TreePanel tree_panel ) {
+        switch ( op.getDefaultNodeFill() ) {
+            case GRADIENT:
+                op.setDefaultNodeFill( NodeFill.SOLID );
+                break;
+            case NONE:
+                op.setDefaultNodeFill( NodeFill.GRADIENT );
+                break;
+            case SOLID:
+                op.setDefaultNodeFill( NodeFill.NONE );
+                break;
+            default:
+                throw new RuntimeException( "unknown fill: " + op.getDefaultNodeFill() );
+        }
+    }
+
+    static void cycleNodeShape( final Options op, final TreePanel tree_panel ) {
+        switch ( op.getDefaultNodeShape() ) {
+            case CIRCLE:
+                op.setDefaultNodeShape( NodeShape.RECTANGLE );
+                break;
+            case RECTANGLE:
+                op.setDefaultNodeShape( NodeShape.CIRCLE );
+                break;
+            default:
+                throw new RuntimeException( "unknown shape: " + op.getDefaultNodeShape() );
+        }
     }
 
     static void help( final Map<String, WebLink> weblinks ) {
@@ -1149,12 +1244,32 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         TextFrame.instantiate( sb.toString() );
     }
 
-    static void setOvPlacementColorChooseMenuItem( final JMenuItem mi, final TreePanel tree_panel ) {
-        if ( ( tree_panel != null ) && ( tree_panel.getTreeColorSet() != null ) ) {
-            mi.setText( "Overview Placement... (current: " + tree_panel.getOptions().getOvPlacement() + ")" );
+    static void setOvPlacementColorChooseMenuItem( final JMenuItem mi, final Options options ) {
+        if ( ( options != null ) && ( options.getOvPlacement() != null ) ) {
+            mi.setText( "Cycle Overview Placement... (current: " + options.getOvPlacement() + ")" );
+        }
+        else {
+            mi.setText( "Cycle Overview Placement..." );
+        }
+    }
+
+    static void setCycleNodeFillMenuItem( final JMenuItem mi, final Options options ) {
+        if ( ( options != null ) && ( options.getDefaultNodeFill() != null ) ) {
+            mi.setText( "Cycle Node Shape Fill Type... (current: "
+                    + options.getDefaultNodeFill().toString().toLowerCase() + ")" );
         }
         else {
-            mi.setText( "Overview Placement..." );
+            mi.setText( "Cycle Node Shape Fill Type..." );
+        }
+    }
+
+    static void setCycleNodeShapeMenuItem( final JMenuItem mi, final Options options ) {
+        if ( ( options != null ) && ( options.getDefaultNodeShape() != null ) ) {
+            mi.setText( "Cycle Node Shape Fill Type... (current: "
+                    + options.getDefaultNodeShape().toString().toLowerCase() + ")" );
+        }
+        else {
+            mi.setText( "Cycle Node Shape Fill Type..." );
         }
     }
 
@@ -1184,6 +1299,10 @@ public abstract class MainFrame extends JFrame implements ActionListener {
         mi.setText( "Enter Min Confidence Value... (current: " + options.getMinConfidenceValue() + ")" );
     }
 
+    static void setTextNodeSizeMenuItem( final JMenuItem mi, final Options options ) {
+        mi.setText( "Enter Default Node Shape Size... (current: " + options.getDefaultNodeShapeSize() + ")" );
+    }
+
     static void updateOptionsMenuDependingOnPhylogenyType( final MainPanel main_panel,
                                                            final JCheckBoxMenuItem scale,
                                                            final JCheckBoxMenuItem branch_lengths,