inprogress
[jalview.git] / forester / java / src / org / forester / archaeopteryx / TreePanel.java
index 7301784..f831e03 100644 (file)
@@ -112,9 +112,10 @@ import org.forester.phylogeny.data.BranchColor;
 import org.forester.phylogeny.data.Confidence;
 import org.forester.phylogeny.data.Event;
 import org.forester.phylogeny.data.NodeData.NODE_DATA;
-import org.forester.phylogeny.data.NodeVisualization;
-import org.forester.phylogeny.data.NodeVisualization.NodeFill;
-import org.forester.phylogeny.data.NodeVisualization.NodeShape;
+import org.forester.phylogeny.data.NodeVisualData;
+import org.forester.phylogeny.data.NodeVisualData.FontType;
+import org.forester.phylogeny.data.NodeVisualData.NodeFill;
+import org.forester.phylogeny.data.NodeVisualData.NodeShape;
 import org.forester.phylogeny.data.PhylogenyDataUtil;
 import org.forester.phylogeny.data.PropertiesMap;
 import org.forester.phylogeny.data.Property;
@@ -168,6 +169,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
     private static final BasicStroke     STROKE_2                                           = new BasicStroke( 2f );
     private static final double          TWO_PI                                             = 2 * Math.PI;
     private final static int             WIGGLE                                             = 2;
+    private final static double          OVERVIEW_FOUND_NODE_BOX_SIZE                       = 2;
+    private final static double          OVERVIEW_FOUND_NODE_BOX_SIZE_HALF                  = 1;
     HashMap<Long, Short>                 _nodeid_dist_to_leaf                               = new HashMap<Long, Short>();
     final private Arc2D                  _arc                                               = new Arc2D.Double();
     private AffineTransform              _at;
@@ -1461,17 +1464,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                   root_x + ( Math.cos( angle ) * parent_radius ),
                   root_y + ( Math.sin( angle ) * parent_radius ),
                   g );
-        if ( ( isInFoundNodes0( c ) && !isInFoundNodes1( c ) ) || isInCurrentExternalNodes( c ) ) {
-            g.setColor( getTreeColorSet().getFoundColor0() );
-            drawRectFilled( c.getXSecondary() - 1, c.getYSecondary() - 1, 3, 3, g );
-        }
-        else if ( ( isInFoundNodes1( c ) && !isInFoundNodes0( c ) ) ) {
-            g.setColor( getTreeColorSet().getFoundColor1() );
-            drawRectFilled( c.getXSecondary() - 1, c.getYSecondary() - 1, 3, 3, g );
-        }
-        else if ( isInFoundNodes0( c ) && isInFoundNodes1( c ) ) {
-            g.setColor( getTreeColorSet().getFoundColor0and1() );
-            drawRectFilled( c.getXSecondary() - 1, c.getYSecondary() - 1, 3, 3, g );
+        if ( isInFoundNodes( c ) || isInCurrentExternalNodes( c ) ) {
+            g.setColor( getColorForFoundNode( c ) );
+            drawRectFilled( c.getXSecondary() - OVERVIEW_FOUND_NODE_BOX_SIZE_HALF, c.getYSecondary()
+                    - OVERVIEW_FOUND_NODE_BOX_SIZE_HALF, OVERVIEW_FOUND_NODE_BOX_SIZE, OVERVIEW_FOUND_NODE_BOX_SIZE, g );
         }
     }
 
@@ -2435,6 +2431,35 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         repaint();
     }
 
+    final private void colorizeNodes( final Color c,
+                                      final PhylogenyNode node,
+                                      final List<PhylogenyNode> additional_nodes ) {
+        _control_panel.setColorBranches( true );
+        if ( _control_panel.getColorBranchesCb() != null ) {
+            _control_panel.getColorBranchesCb().setSelected( true );
+        }
+        if ( node != null ) {
+            colorizeNodesHelper( c, node );
+        }
+        if ( additional_nodes != null ) {
+            for( final PhylogenyNode n : additional_nodes ) {
+                colorizeNodesHelper( c, n );
+            }
+        }
+        repaint();
+    }
+
+    private final static void colorizeNodesHelper( final Color c, final PhylogenyNode node ) {
+        NodeVisualData v;
+        if ( node.getNodeData().getNodeVisualData() != null ) {
+            v = node.getNodeData().getNodeVisualData();
+        }
+        else {
+            v = new NodeVisualData();
+        }
+        v.setFontColor( new Color( c.getRed(), c.getGreen(), c.getBlue() ) );
+    }
+
     final private void colorSubtree( final PhylogenyNode node ) {
         if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) {
             JOptionPane.showMessageDialog( this,
@@ -2457,6 +2482,54 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         dialog.setVisible( true );
     }
 
+    private void colorNodeFont( final PhylogenyNode node ) {
+        _color_chooser.setPreviewPanel( new JPanel() );
+        NodeColorizationActionListener al;
+        if ( ( getFoundNodes0() != null ) && !getFoundNodes0().isEmpty() ) {
+            final List<PhylogenyNode> additional_nodes = getFoundNodes0AsListOfPhylogenyNodes();
+            al = new NodeColorizationActionListener( _color_chooser, node, additional_nodes );
+        }
+        else {
+            al = new NodeColorizationActionListener( _color_chooser, node );
+        }
+        final JDialog dialog = JColorChooser
+                .createDialog( this, "Subtree colorization", true, _color_chooser, al, null );
+        dialog.setVisible( true );
+    }
+
+    private void changeNodeFont( final PhylogenyNode node ) {
+        final FontChooser fc = new FontChooser();
+        Font f = null;
+        if ( node.getNodeData().getNodeVisualData() != null && !node.getNodeData().getNodeVisualData().isEmpty() ) {
+            f = node.getNodeData().getNodeVisualData().getFontObject();
+        }
+        if ( f != null ) {
+            fc.setFont( f );
+        }
+        else {
+            fc.setFont( getMainPanel().getTreeFontSet().getLargeFont() );
+        }
+        fc.showDialog( this, "Select Font" );
+        if ( fc.getFont() != null ) {
+            NodeVisualData v = node.getNodeData().getNodeVisualData();
+            Font ff = fc.getFont();
+            v.setFont( ff.getFamily() );
+            v.setFontSize( ( byte ) ( ff.getSize() ) );
+            if ( ff.getStyle() == Font.BOLD && ff.getStyle() == Font.ITALIC ) {
+                v.setFontType( FontType.BOLD_ITALIC );
+            }
+            else if ( ff.getStyle() == Font.ITALIC ) {
+                v.setFontType( FontType.ITALIC );
+            }
+            else if ( ff.getStyle() == Font.BOLD ) {
+                v.setFontType( FontType.BOLD );
+            }
+            else {
+                v.setFontType( FontType.NORMAL );
+            }
+        }
+    }
+
     final private void copySubtree( final PhylogenyNode node ) {
         if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) {
             errorMessageNoCutCopyPasteInUnrootedDisplay();
@@ -2899,6 +2972,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             case COLOR_SUBTREE:
                 colorSubtree( node );
                 break;
+            case COLOR_NODE_FONT:
+                colorNodeFont( node );
+                break;
+            case CHANGE_NODE_FONT:
+                changeNodeFont( node );
+                break;
             case OPEN_SEQ_WEB:
                 openSeqWeb( node );
                 break;
@@ -3818,11 +3897,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         _polygon.lineTo( node.getXcoord() + 1, node.getYcoord() - d );
         _polygon.lineTo( node.getXcoord() + 1, node.getYcoord() + d );
         _polygon.closePath();
-        if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.SOLID ) {
+        if ( getOptions().getDefaultNodeFill() == NodeVisualData.NodeFill.SOLID ) {
             g.setColor( c );
             g.fill( _polygon );
         }
-        else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.NONE ) {
+        else if ( getOptions().getDefaultNodeFill() == NodeVisualData.NodeFill.NONE ) {
             g.setColor( getBackground() );
             g.fill( _polygon );
             g.setColor( c );
@@ -3897,17 +3976,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
     }
 
-    final private void paintFoundNode( final PhylogenyNode n, final double x, final double y, final Graphics2D g ) {
-        final int box_size = getOptions().getDefaultNodeShapeSize();
-        final double half_box_size = getOptions().getDefaultNodeShapeSize() / 2.0;
-        g.setColor( getColorForFoundNode( n ) );
-        //g.fillRect( x - half_box_size, y - half_box_size, box_size, box_size );
-        //TODO check me
-        //FIXME
-        _rectangle.setRect( x - half_box_size, y - half_box_size, box_size, box_size );
-        g.fill( _rectangle );
-    }
-
     final private void paintGainedAndLostCharacters( final Graphics2D g,
                                                      final PhylogenyNode node,
                                                      final String gained,
@@ -3957,14 +4025,22 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             drawOval( x - 9, y - 8, 17, 17, g );
             drawOval( x - 9, y - 9, 18, 18, g );
         }
-        if ( isInFoundNodes( node ) || isInCurrentExternalNodes( node ) ) {
-            paintFoundNode( node, x, y, g );
-        }
-        else {
+        if ( ( isInFoundNodes( node ) || isInCurrentExternalNodes( node ) )
+                || ( getOptions().isShowDefaultNodeShapesExternal() && node.isExternal() )
+                || ( getOptions().isShowDefaultNodeShapesInternal() && node.isInternal() )
+                || ( getControlPanel().isEvents() && node.isHasAssignedEvent() && ( node.getNodeData().getEvent()
+                        .isDuplication()
+                        || node.getNodeData().getEvent().isSpeciation() || node.getNodeData().getEvent()
+                        .isSpeciationOrDuplication() ) ) ) {
+            final double box_size = getOptions().getDefaultNodeShapeSize();
+            final double half_box_size = box_size / 2.0;
             Color outline_color = null;
             if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) {
                 outline_color = Color.BLACK;
             }
+            else if ( isInFoundNodes( node ) || isInCurrentExternalNodes( node ) ) {
+                outline_color = getColorForFoundNode( node );
+            }
             else if ( getControlPanel().isEvents() && TreePanelUtil.isHasAssignedEvent( node ) ) {
                 final Event event = node.getNodeData().getEvent();
                 if ( event.isDuplication() ) {
@@ -3977,79 +4053,58 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                     outline_color = getTreeColorSet().getDuplicationOrSpeciationColor();
                 }
             }
-            else if ( getOptions().isTaxonomyColorizeNodeShapes() ) {
-                outline_color = getTaxonomyBasedColor( node );
-            }
             else {
                 outline_color = getGraphicsForNodeBoxWithColorForParentBranch( node );
                 if ( to_pdf && ( outline_color == getTreeColorSet().getBranchColor() ) ) {
                     outline_color = getTreeColorSet().getBranchColorForPdf();
                 }
             }
-            final int box_size = getOptions().getDefaultNodeShapeSize();
-            final int half_box_size = box_size / 2;
-            if ( ( getOptions().isShowDefaultNodeShapesExternal() && node.isExternal() )
-                    || ( getOptions().isShowDefaultNodeShapesInternal() && node.isInternal() )
-                    || ( getControlPanel().isEvents() && node.isHasAssignedEvent() ) ) {
-                if ( getOptions().getDefaultNodeShape() == NodeShape.CIRCLE ) {
-                    if ( getOptions().getDefaultNodeFill() == NodeFill.GRADIENT ) {
-                        drawOvalGradient( x - half_box_size,
-                                          y - half_box_size,
-                                          box_size,
-                                          box_size,
-                                          g,
-                                          to_pdf ? Color.WHITE : outline_color,
-                                          to_pdf ? outline_color : getBackground(),
-                                          outline_color );
-                    }
-                    else if ( getOptions().getDefaultNodeFill() == NodeFill.NONE ) {
-                        Color background = getBackground();
-                        if ( to_pdf ) {
-                            background = Color.WHITE;
-                        }
-                        drawOvalGradient( x - half_box_size,
-                                          y - half_box_size,
-                                          box_size,
-                                          box_size,
-                                          g,
-                                          background,
-                                          background,
-                                          outline_color );
-                    }
-                    else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.SOLID ) {
-                        g.setColor( outline_color );
-                        drawOvalFilled( x - half_box_size, y - half_box_size, box_size, box_size, g );
-                    }
+            if ( getOptions().getDefaultNodeShape() == NodeShape.CIRCLE ) {
+                if ( getOptions().getDefaultNodeFill() == NodeFill.GRADIENT ) {
+                    drawOvalGradient( x - half_box_size, y - half_box_size, box_size, box_size, g, to_pdf ? Color.WHITE
+                            : outline_color, to_pdf ? outline_color : getBackground(), outline_color );
                 }
-                else if ( getOptions().getDefaultNodeShape() == NodeVisualization.NodeShape.RECTANGLE ) {
-                    if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.GRADIENT ) {
-                        drawRectGradient( x - half_box_size,
-                                          y - half_box_size,
-                                          box_size,
-                                          box_size,
-                                          g,
-                                          to_pdf ? Color.WHITE : outline_color,
-                                          to_pdf ? outline_color : getBackground(),
-                                          outline_color );
+                else if ( getOptions().getDefaultNodeFill() == NodeFill.NONE ) {
+                    Color background = getBackground();
+                    if ( to_pdf ) {
+                        background = Color.WHITE;
                     }
-                    else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.NONE ) {
-                        Color background = getBackground();
-                        if ( to_pdf ) {
-                            background = Color.WHITE;
-                        }
-                        drawRectGradient( x - half_box_size,
-                                          y - half_box_size,
-                                          box_size,
-                                          box_size,
-                                          g,
-                                          background,
-                                          background,
-                                          outline_color );
-                    }
-                    else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.SOLID ) {
-                        g.setColor( outline_color );
-                        drawRectFilled( x - half_box_size, y - half_box_size, box_size, box_size, g );
+                    drawOvalGradient( x - half_box_size,
+                                      y - half_box_size,
+                                      box_size,
+                                      box_size,
+                                      g,
+                                      background,
+                                      background,
+                                      outline_color );
+                }
+                else if ( getOptions().getDefaultNodeFill() == NodeVisualData.NodeFill.SOLID ) {
+                    g.setColor( outline_color );
+                    drawOvalFilled( x - half_box_size, y - half_box_size, box_size, box_size, g );
+                }
+            }
+            else if ( getOptions().getDefaultNodeShape() == NodeVisualData.NodeShape.RECTANGLE ) {
+                if ( getOptions().getDefaultNodeFill() == NodeVisualData.NodeFill.GRADIENT ) {
+                    drawRectGradient( x - half_box_size, y - half_box_size, box_size, box_size, g, to_pdf ? Color.WHITE
+                            : outline_color, to_pdf ? outline_color : getBackground(), outline_color );
+                }
+                else if ( getOptions().getDefaultNodeFill() == NodeVisualData.NodeFill.NONE ) {
+                    Color background = getBackground();
+                    if ( to_pdf ) {
+                        background = Color.WHITE;
                     }
+                    drawRectGradient( x - half_box_size,
+                                      y - half_box_size,
+                                      box_size,
+                                      box_size,
+                                      g,
+                                      background,
+                                      background,
+                                      outline_color );
+                }
+                else if ( getOptions().getDefaultNodeFill() == NodeVisualData.NodeFill.SOLID ) {
+                    g.setColor( outline_color );
+                    drawRectFilled( x - half_box_size, y - half_box_size, box_size, box_size, g );
                 }
             }
         }
@@ -4443,7 +4498,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
         if ( isInFoundNodes( node ) || isInCurrentExternalNodes( node ) ) {
             g.setColor( getColorForFoundNode( node ) );
-            drawRectFilled( node.getXSecondary() - 1, node.getYSecondary() - 1, 3, 3, g );
+            drawRectFilled( node.getXSecondary() - OVERVIEW_FOUND_NODE_BOX_SIZE_HALF, node.getYSecondary()
+                    - OVERVIEW_FOUND_NODE_BOX_SIZE_HALF, OVERVIEW_FOUND_NODE_BOX_SIZE, OVERVIEW_FOUND_NODE_BOX_SIZE, g );
         }
         float new_x = 0;
         if ( !node.isExternal() && !node.isCollapse() ) {
@@ -5016,7 +5072,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             desc.setYSecondary( new_y );
             if ( isInFoundNodes( desc ) || isInCurrentExternalNodes( desc ) ) {
                 g.setColor( getColorForFoundNode( desc ) );
-                drawRectFilled( desc.getXSecondary() - 1, desc.getYSecondary() - 1, 3, 3, g );
+                drawRectFilled( desc.getXSecondary() - OVERVIEW_FOUND_NODE_BOX_SIZE_HALF,
+                                desc.getYSecondary() - OVERVIEW_FOUND_NODE_BOX_SIZE_HALF,
+                                OVERVIEW_FOUND_NODE_BOX_SIZE,
+                                OVERVIEW_FOUND_NODE_BOX_SIZE,
+                                g );
                 g.setColor( getTreeColorSet().getOvColor() );
             }
             paintUnrootedLite( desc, current_angle, current_angle + arc_size, g, urt_ov_factor );
@@ -5766,4 +5826,32 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             }
         }
     }
+
+    final private class NodeColorizationActionListener implements ActionListener {
+
+        List<PhylogenyNode> _additional_nodes = null;
+        JColorChooser       _chooser          = null;
+        PhylogenyNode       _node             = null;
+
+        NodeColorizationActionListener( final JColorChooser chooser, final PhylogenyNode node ) {
+            _chooser = chooser;
+            _node = node;
+        }
+
+        NodeColorizationActionListener( final JColorChooser chooser,
+                                        final PhylogenyNode node,
+                                        final List<PhylogenyNode> additional_nodes ) {
+            _chooser = chooser;
+            _node = node;
+            _additional_nodes = additional_nodes;
+        }
+
+        @Override
+        public void actionPerformed( final ActionEvent e ) {
+            final Color c = _chooser.getColor();
+            if ( c != null ) {
+                colorizeNodes( c, _node, _additional_nodes );
+            }
+        }
+    }
 }