X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Farchaeopteryx%2FTreePanel.java;h=4d50d281098495795a77ccaad79ec4f8c1380642;hb=707e4b1534519ab13eefb8e9703822384f01b450;hp=88c4d662381bdcf153b9942891b17a74e8074db7;hpb=397137f4f105810096dc6034ccc1e1013ed11644;p=jalview.git diff --git a/forester/java/src/org/forester/archaeopteryx/TreePanel.java b/forester/java/src/org/forester/archaeopteryx/TreePanel.java index 88c4d66..4d50d28 100644 --- a/forester/java/src/org/forester/archaeopteryx/TreePanel.java +++ b/forester/java/src/org/forester/archaeopteryx/TreePanel.java @@ -30,6 +30,7 @@ import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; +import java.awt.FontMetrics; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; @@ -97,6 +98,7 @@ import org.forester.archaeopteryx.Options.CLADOGRAM_TYPE; import org.forester.archaeopteryx.Options.NODE_LABEL_DIRECTION; import org.forester.archaeopteryx.Options.PHYLOGENY_GRAPHICS_TYPE; import org.forester.archaeopteryx.phylogeny.data.RenderableDomainArchitecture; +import org.forester.archaeopteryx.phylogeny.data.RenderableMsaSequence; import org.forester.archaeopteryx.phylogeny.data.RenderableVector; import org.forester.archaeopteryx.tools.Blast; import org.forester.archaeopteryx.tools.ImageLoader; @@ -110,11 +112,12 @@ import org.forester.phylogeny.data.Accession; import org.forester.phylogeny.data.Annotation; import org.forester.phylogeny.data.BranchColor; import org.forester.phylogeny.data.Confidence; +import org.forester.phylogeny.data.DomainArchitecture; 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.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; @@ -129,122 +132,131 @@ import org.forester.util.DescriptiveStatistics; import org.forester.util.ForesterConstants; import org.forester.util.ForesterUtil; import org.forester.util.SequenceAccessionTools; +import org.forester.util.TaxonomyUtil; public final class TreePanel extends JPanel implements ActionListener, MouseWheelListener, Printable { - private static final BasicStroke STROKE_2 = new BasicStroke( 2f ); - private static final BasicStroke STROKE_1 = new BasicStroke( 1f ); - private static final BasicStroke STROKE_075 = new BasicStroke( 0.75f ); - private static final BasicStroke STROKE_05 = new BasicStroke( 0.5f ); - private static final BasicStroke STROKE_025 = new BasicStroke( 0.25f ); - private static final BasicStroke STROKE_01 = new BasicStroke( 0.1f ); - private static final BasicStroke STROKE_005 = new BasicStroke( 0.05f ); - private static final float PI = ( float ) ( Math.PI ); - private static final double TWO_PI = 2 * Math.PI; - private static final float ONEHALF_PI = ( float ) ( 1.5 * Math.PI ); - private static final float HALF_PI = ( float ) ( Math.PI / 2.0 ); - private static final float ANGLE_ROTATION_UNIT = ( float ) ( Math.PI / 32 ); - private static final short OV_BORDER = 10; - final static Cursor CUT_CURSOR = Cursor.getPredefinedCursor( Cursor.CROSSHAIR_CURSOR ); - final static Cursor MOVE_CURSOR = Cursor.getPredefinedCursor( Cursor.MOVE_CURSOR ); + public final static boolean SPECIAL_DOMAIN_COLORING = true; final static Cursor ARROW_CURSOR = Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR ); + final static Cursor CUT_CURSOR = Cursor.getPredefinedCursor( Cursor.CROSSHAIR_CURSOR ); final static Cursor HAND_CURSOR = Cursor.getPredefinedCursor( Cursor.HAND_CURSOR ); + final static Cursor MOVE_CURSOR = Cursor.getPredefinedCursor( Cursor.MOVE_CURSOR ); final static Cursor WAIT_CURSOR = Cursor.getPredefinedCursor( Cursor.WAIT_CURSOR ); - private final static long serialVersionUID = -978349745916505029L; + final private static double _180_OVER_PI = 180.0 / Math.PI; + private static final float ANGLE_ROTATION_UNIT = ( float ) ( Math.PI / 32 ); + private final static int CONFIDENCE_LEFT_MARGIN = 4; private final static int EURO_D = 10; - private final static String NODE_POPMENU_NODE_CLIENT_PROPERTY = "node"; - private final static int MIN_ROOT_LENGTH = 3; - private final static int MAX_SUBTREES = 100; + private final static NumberFormat FORMATTER_BRANCH_LENGTH; + private final static NumberFormat FORMATTER_CONFIDENCE; + private static final float HALF_PI = ( float ) ( Math.PI / 2.0 ); + private final static int LIMIT_FOR_HQ_RENDERING = 2000; private final static int MAX_NODE_FRAMES = 10; + private final static int MAX_SUBTREES = 100; + private final static int MIN_ROOT_LENGTH = 3; private final static int MOVE = 20; - private final static NumberFormat FORMATTER_CONFIDENCE; - private final static NumberFormat FORMATTER_BRANCH_LENGTH; + private final static String NODE_POPMENU_NODE_CLIENT_PROPERTY = "node"; + private static final float ONEHALF_PI = ( float ) ( 1.5 * Math.PI ); + private static final short OV_BORDER = 10; + private final static double OVERVIEW_FOUND_NODE_BOX_SIZE = 2; + private final static double OVERVIEW_FOUND_NODE_BOX_SIZE_HALF = 1; + private static final float PI = ( float ) ( Math.PI ); + final private static Font POPUP_FONT = new Font( Configuration.getDefaultFontFamilyName(), + Font.PLAIN, + 12 ); + private static final float ROUNDED_D = 8; + private final static long serialVersionUID = -978349745916505029L; + private static final BasicStroke STROKE_0025 = new BasicStroke( 0.025f ); + private static final BasicStroke STROKE_005 = new BasicStroke( 0.05f ); + private static final BasicStroke STROKE_01 = new BasicStroke( 0.1f ); + private static final BasicStroke STROKE_025 = new BasicStroke( 0.25f ); + private static final BasicStroke STROKE_05 = new BasicStroke( 0.5f ); + private static final BasicStroke STROKE_075 = new BasicStroke( 0.75f ); + private static final BasicStroke STROKE_1 = new BasicStroke( 1f ); + 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 int LIMIT_FOR_HQ_RENDERING = 2000; - private final static int CONFIDENCE_LEFT_MARGIN = 4; - private final RenderingHints _rendering_hints = new RenderingHints( RenderingHints.KEY_RENDERING, - RenderingHints.VALUE_RENDER_DEFAULT ); - private File _treefile = null; + private static final String SHOW_ONLY_THIS_CONF_TYPE = "posterior probability"; //TODO remove me + HashMap _nodeid_dist_to_leaf = new HashMap(); + final private Arc2D _arc = new Arc2D.Double(); + private AffineTransform _at; + private int _circ_max_depth; + final private Set _collapsed_external_nodeid_set = new HashSet(); + private JColorChooser _color_chooser = null; private Configuration _configuration = null; - private final NodeFrame[] _node_frames = new NodeFrame[ TreePanel.MAX_NODE_FRAMES ]; - private int _node_frame_index = 0; - private Phylogeny _phylogeny = null; - private final Phylogeny[] _sub_phylogenies = new Phylogeny[ TreePanel.MAX_SUBTREES ]; - private final PhylogenyNode[] _sub_phylogenies_temp_roots = new PhylogenyNode[ TreePanel.MAX_SUBTREES ]; - private int _subtree_index = 0; - private MainPanel _main_panel = null; - private Set _found_nodes = null; - private PhylogenyNode _highlight_node = null; - private JPopupMenu _node_popup_menu = null; - private JMenuItem _node_popup_menu_items[] = null; - private int _longest_ext_node_info = 0; - private float _x_correction_factor = 0.0f; - private float _ov_x_correction_factor = 0.0f; - private float _x_distance = 0.0f; - private float _y_distance = 0.0f; - private PHYLOGENY_GRAPHICS_TYPE _graphics_type = PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR; - private double _domain_structure_width = Constants.DOMAIN_STRUCTURE_DEFAULT_WIDTH; + private ControlPanel _control_panel = null; + private final CubicCurve2D _cubic_curve = new CubicCurve2D.Float(); + private Set _current_external_nodes = null; + private StringBuilder _current_external_nodes_data_buffer = new StringBuilder(); + private int _current_external_nodes_data_buffer_change_counter = 0; private int _domain_structure_e_value_thr_exp = Constants.DOMAIN_STRUCTURE_E_VALUE_THR_DEFAULT_EXP; + private double _domain_structure_width = Constants.DOMAIN_STRUCTURE_DEFAULT_WIDTH; + private int _dynamic_hiding_factor = 0; + private boolean _edited = false; + private final Ellipse2D _ellipse = new Ellipse2D.Float(); + private int _external_node_index = 0; + private Set _found_nodes_0 = null; + private Set _found_nodes_1 = null; + private final FontRenderContext _frc = new FontRenderContext( null, + false, + false ); + private PHYLOGENY_GRAPHICS_TYPE _graphics_type = PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR; + private PhylogenyNode _highlight_node = null; + private boolean _in_ov = false; + private boolean _in_ov_rect = false; private float _last_drag_point_x = 0; private float _last_drag_point_y = 0; - private ControlPanel _control_panel = null; - private int _external_node_index = 0; - private final Path2D.Float _polygon = new Path2D.Float(); - private final StringBuilder _sb = new StringBuilder(); - private JColorChooser _color_chooser = null; - private double _scale_distance = 0.0; - private String _scale_label = null; - private final CubicCurve2D _cubic_curve = new CubicCurve2D.Float(); - private final QuadCurve2D _quad_curve = new QuadCurve2D.Float(); private final Line2D _line = new Line2D.Float(); - private final Ellipse2D _ellipse = new Ellipse2D.Float(); - private final Rectangle2D _rectangle = new Rectangle2D.Float(); + private int _longest_ext_node_info = 0; + private PhylogenyNode _ext_node_with_longest_txt_info = null; + private MainPanel _main_panel = null; + private double _max_distance_to_root = -1; + private Popup _node_desc_popup; + private int _node_frame_index = 0; + private final NodeFrame[] _node_frames = new NodeFrame[ TreePanel.MAX_NODE_FRAMES ]; + private JPopupMenu _node_popup_menu = null; + private JMenuItem _node_popup_menu_items[] = null; + private PhylogenyNode[] _nodes_in_preorder = null; private Options _options = null; - private float _ov_max_width = 0; private float _ov_max_height = 0; + private float _ov_max_width = 0; + private boolean _ov_on = false; + private final Rectangle2D _ov_rectangle = new Rectangle2D.Float(); + private final Rectangle _ov_virtual_rectangle = new Rectangle(); + private float _ov_x_correction_factor = 0.0f; + private float _ov_x_distance = 0; private int _ov_x_position = 0; + private float _ov_y_distance = 0; private int _ov_y_position = 0; private int _ov_y_start = 0; - private float _ov_y_distance = 0; - private float _ov_x_distance = 0; - private boolean _ov_on = false; - private double _urt_starting_angle = ( float ) ( Math.PI / 2 ); - private float _urt_factor = 1; - private float _urt_factor_ov = 1; private final boolean _phy_has_branch_lengths; - private final Rectangle2D _ov_rectangle = new Rectangle2D.Float(); - private boolean _in_ov_rect = false; - private boolean _in_ov = false; - private final Rectangle _ov_virtual_rectangle = new Rectangle(); - final private static double _180_OVER_PI = 180.0 / Math.PI; - private static final float ROUNDED_D = 8; - private int _circ_max_depth; - private PhylogenyNode _root; - final private Arc2D _arc = new Arc2D.Double(); - final private HashMap _urt_nodeid_angle_map = new HashMap(); - final private HashMap _urt_nodeid_index_map = new HashMap(); - final private Set _collapsed_external_nodeid_set = new HashSet(); - HashMap _nodeid_dist_to_leaf = new HashMap(); - private AffineTransform _at; - private double _max_distance_to_root = -1; - private int _dynamic_hiding_factor = 0; - private boolean _edited = false; - private Popup _node_desc_popup; - private JTextArea _rollover_popup; + private Phylogeny _phylogeny = null; + private final Path2D.Float _polygon = new Path2D.Float(); private final StringBuffer _popup_buffer = new StringBuffer(); - final private static Font POPUP_FONT = new Font( Configuration.getDefaultFontFamilyName(), - Font.PLAIN, - 12 ); + private final QuadCurve2D _quad_curve = new QuadCurve2D.Float(); private Sequence _query_sequence = null; - private final FontRenderContext _frc = new FontRenderContext( null, - false, - false ); - // expression values menu: + private final Rectangle2D _rectangle = new Rectangle2D.Float(); + private final RenderingHints _rendering_hints = new RenderingHints( RenderingHints.KEY_RENDERING, + RenderingHints.VALUE_RENDER_DEFAULT ); + private JTextArea _rollover_popup; + private PhylogenyNode _root; + private final StringBuilder _sb = new StringBuilder(); + private double _scale_distance = 0.0; + private String _scale_label = null; private DescriptiveStatistics _statistics_for_vector_data; - private PhylogenyNode[] _nodes_in_preorder = null; - private StringBuilder _current_external_nodes_data_buffer = new StringBuilder(); - private int _current_external_nodes_data_buffer_change_counter = 0; - private Set _current_external_nodes = null; + private final Phylogeny[] _sub_phylogenies = new Phylogeny[ TreePanel.MAX_SUBTREES ]; + private final PhylogenyNode[] _sub_phylogenies_temp_roots = new PhylogenyNode[ TreePanel.MAX_SUBTREES ]; + private int _subtree_index = 0; + private File _treefile = null; + private float _urt_factor = 1; + private float _urt_factor_ov = 1; + final private HashMap _urt_nodeid_angle_map = new HashMap(); + final private HashMap _urt_nodeid_index_map = new HashMap(); + private double _urt_starting_angle = ( float ) ( Math.PI / 2 ); + private float _x_correction_factor = 0.0f; + private float _x_distance = 0.0f; + private float _y_distance = 0.0f; + private int _length_of_longest_text; + private int _longest_domain; // private Image offscreenImage; // private Graphics offscreenGraphics; // private Dimension offscreenDimension; @@ -293,7 +305,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee calculateScaleDistance(); FORMATTER_CONFIDENCE.setMaximumFractionDigits( configuration.getNumberOfDigitsAfterCommaForConfidenceValues() ); FORMATTER_BRANCH_LENGTH.setMaximumFractionDigits( configuration - .getNumberOfDigitsAfterCommaForBranchLengthValues() ); + .getNumberOfDigitsAfterCommaForBranchLengthValues() ); } @Override @@ -325,8 +337,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } /** - * Get a pointer to the phylogeny - * + * Get a pointer to the phylogeny + * * @return a pointer to the phylogeny */ public final Phylogeny getPhylogeny() { @@ -459,7 +471,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee /** * Set a phylogeny tree. - * + * * @param t * an instance of a Phylogeny */ @@ -486,34 +498,29 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee /** * Set parameters for printing the displayed tree - * + * */ - final void calcParametersForPainting( final int x, final int y, final boolean recalc_longest_ext_node_info ) { + final void calcParametersForPainting( final int x, final int y ) { // updateStyle(); not needed? if ( ( _phylogeny != null ) && !_phylogeny.isEmpty() ) { initNodeData(); - if ( recalc_longest_ext_node_info ) { - calculateLongestExtNodeInfo(); - if ( getOptions().isAllowFontSizeChange() ) { - if ( ( getLongestExtNodeInfo() > ( x * 0.6 ) ) - && ( getTreeFontSet().getLargeFont().getSize() > 2 + TreeFontSet.FONT_SIZE_CHANGE_STEP ) ) { - while ( ( getLongestExtNodeInfo() > ( x * 0.7 ) ) - && ( getTreeFontSet().getLargeFont().getSize() > 2 ) ) { - getMainPanel().getTreeFontSet().decreaseFontSize( getConfiguration().getMinBaseFontSize(), - true ); - calculateLongestExtNodeInfo(); - } - } - else { - while ( ( getLongestExtNodeInfo() < ( x * 0.6 ) ) - && ( getTreeFontSet().getLargeFont().getSize() <= getTreeFontSet().getLargeFontMemory() - .getSize() - TreeFontSet.FONT_SIZE_CHANGE_STEP ) ) { - getMainPanel().getTreeFontSet().increaseFontSize(); - calculateLongestExtNodeInfo(); - } - } + calculateLongestExtNodeInfo(); + if ( ( getLongestExtNodeInfo() > ( x * 0.6 ) ) + && ( getTreeFontSet().getLargeFont().getSize() > ( 2 + TreeFontSet.FONT_SIZE_CHANGE_STEP ) ) ) { + while ( ( getLongestExtNodeInfo() > ( x * 0.7 ) ) && ( getTreeFontSet().getLargeFont().getSize() > 2 ) ) { + getMainPanel().getTreeFontSet().decreaseFontSize( getConfiguration().getMinBaseFontSize(), true ); + calculateLongestExtNodeInfo(); } } + else { + while ( ( getLongestExtNodeInfo() < ( x * 0.6 ) ) + && ( getTreeFontSet().getLargeFont().getSize() <= ( getTreeFontSet().getLargeFontMemory() + .getSize() - TreeFontSet.FONT_SIZE_CHANGE_STEP ) ) ) { + getMainPanel().getTreeFontSet().increaseFontSize(); + calculateLongestExtNodeInfo(); + } + } + //_length_of_longest_text = calcLengthOfLongestText(); int ext_nodes = _phylogeny.getRoot().getNumberOfExternalNodes(); final int max_depth = PhylogenyMethods.calculateMaxDepth( _phylogeny ); if ( ext_nodes == 1 ) { @@ -560,24 +567,22 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _circ_max_depth = max_depth; setUpUrtFactor(); // - if ( getOptions().isAllowFontSizeChange() ) { - if ( ( getPhylogenyGraphicsType() != PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) - && ( getPhylogenyGraphicsType() != PHYLOGENY_GRAPHICS_TYPE.CIRCULAR ) ) { - // int dynamic_hiding_factor = calcDynamicHidingFactor(); - // if ( dynamic_hiding_factor > 1 ) { - // while ( dynamic_hiding_factor > 1 - // && getTreeFontSet()._fm_large.getHeight() > TreeFontSet.SMALL_FONTS_BASE ) { - // getTreeFontSet().decreaseFontSize( 1, true ); - // dynamic_hiding_factor = calcDynamicHidingFactor(); - // } - // } - // else if ( getTreeFontSet().isDecreasedSizeBySystem() ) { - // while ( dynamic_hiding_factor < 1 && getTreeFontSet()._fm_large.getHeight() < 12 ) { - // getTreeFontSet().increaseFontSize(); - // dynamic_hiding_factor = calcDynamicHidingFactor(); - // } - // } - } + if ( ( getPhylogenyGraphicsType() != PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) + && ( getPhylogenyGraphicsType() != PHYLOGENY_GRAPHICS_TYPE.CIRCULAR ) ) { + // int dynamic_hiding_factor = calcDynamicHidingFactor(); + // if ( dynamic_hiding_factor > 1 ) { + // while ( dynamic_hiding_factor > 1 + // && getTreeFontSet()._fm_large.getHeight() > TreeFontSet.SMALL_FONTS_BASE ) { + // getTreeFontSet().decreaseFontSize( 1, true ); + // dynamic_hiding_factor = calcDynamicHidingFactor(); + // } + // } + // else if ( getTreeFontSet().isDecreasedSizeBySystem() ) { + // while ( dynamic_hiding_factor < 1 && getTreeFontSet()._fm_large.getHeight() < 12 ) { + // getTreeFontSet().increaseFontSize(); + // dynamic_hiding_factor = calcDynamicHidingFactor(); + // } + // } } // } @@ -588,85 +593,86 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return; } int max_length = ForesterUtil.roundToInt( ( getSize().getWidth() - MOVE ) - * Constants.EXT_NODE_INFO_LENGTH_MAX_RATIO ); + * Constants.EXT_NODE_INFO_LENGTH_MAX_RATIO ); if ( max_length < 40 ) { max_length = 40; } int longest = 30; + int longest_txt = 0; + _longest_domain = 0; + PhylogenyNode longest_txt_node = _phylogeny.getFirstExternalNode(); for( final PhylogenyNode node : _phylogeny.getExternalNodes() ) { int sum = 0; if ( node.isCollapse() ) { continue; } - if ( getControlPanel().isShowNodeNames() ) { - sum += getTreeFontSet()._fm_large.stringWidth( node.getName() + " " ); + final StringBuilder sb = new StringBuilder(); + nodeDataAsSB( node, sb ); + if ( node.getNodeData().isHasTaxonomy() ) { + nodeTaxonomyDataAsSB( node.getNodeData().getTaxonomy(), sb ); } - if ( node.getNodeData().isHasSequence() ) { - if ( getControlPanel().isShowSequenceAcc() - && ( node.getNodeData().getSequence().getAccession() != null ) ) { - sum += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getAccession() - .getValue() - + " " ); - } - if ( getControlPanel().isShowSeqNames() && ( node.getNodeData().getSequence().getName().length() > 0 ) ) { - sum += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getName() + " " ); - } - if ( getControlPanel().isShowSeqSymbols() - && ( node.getNodeData().getSequence().getSymbol().length() > 0 ) ) { - sum += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getSymbol() + " " ); - } - if ( getControlPanel().isShowGeneNames() - && ( node.getNodeData().getSequence().getGeneName().length() > 0 ) ) { - sum += getTreeFontSet()._fm_large - .stringWidth( node.getNodeData().getSequence().getGeneName() + " " ); - } - if ( getControlPanel().isShowAnnotation() - && ( node.getNodeData().getSequence().getAnnotations() != null ) - && !node.getNodeData().getSequence().getAnnotations().isEmpty() ) { - sum += getTreeFontSet()._fm_large.stringWidth( TreePanelUtil.createAnnotationString( node - .getNodeData().getSequence().getAnnotations(), getOptions().isShowAnnotationRefSource() ) - + " " ); - } - if ( getControlPanel().isShowDomainArchitectures() - && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) { - sum += ( ( RenderableDomainArchitecture ) node.getNodeData().getSequence().getDomainArchitecture() ) - .getRenderingSize().getWidth(); - } + final int txt = sb.length(); + if ( txt > longest_txt ) { + longest_txt = txt; + longest_txt_node = node; } - if ( node.getNodeData().isHasTaxonomy() ) { - final Taxonomy tax = node.getNodeData().getTaxonomy(); - if ( getControlPanel().isShowTaxonomyCode() && !ForesterUtil.isEmpty( tax.getTaxonomyCode() ) ) { - sum += getTreeFontSet()._fm_large_italic.stringWidth( tax.getTaxonomyCode() + " " ); - } - if ( getControlPanel().isShowTaxonomyScientificNames() - && !ForesterUtil.isEmpty( tax.getScientificName() ) ) { - sum += getTreeFontSet()._fm_large_italic.stringWidth( tax.getScientificName() + " " ); + boolean use_vis = false; + final Graphics2D g = ( Graphics2D ) getGraphics(); + if ( getControlPanel().isUseVisualStyles() ) { + use_vis = setFont( g, node, false ); + } + if ( !use_vis ) { + sum = getFontMetricsForLargeDefaultFont().stringWidth( sb.toString() ); + } + else { + sum = getFontMetrics( g.getFont() ).stringWidth( sb.toString() ); + } + if ( getControlPanel().isShowBinaryCharacters() && node.getNodeData().isHasBinaryCharacters() ) { + sum += getFontMetricsForLargeDefaultFont().stringWidth( node.getNodeData().getBinaryCharacters() + .getGainedCharactersAsStringBuffer().toString() ); + } + if ( getControlPanel().isShowVectorData() && ( node.getNodeData().getVector() != null ) + && ( node.getNodeData().getVector().size() > 0 ) ) { + if ( getConfiguration() != null ) { + sum += getConfiguration().getVectorDataWidth() + 10; } - if ( getControlPanel().isShowTaxonomyCommonNames() && !ForesterUtil.isEmpty( tax.getCommonName() ) ) { - sum += getTreeFontSet()._fm_large_italic.stringWidth( tax.getCommonName() + " ()" ); + else { + sum += RenderableVector.VECTOR_DEFAULT_WIDTH + 10; } } - if ( getControlPanel().isShowProperties() && node.getNodeData().isHasProperties() ) { - sum += getTreeFontSet()._fm_large.stringWidth( propertiesToString( node ).toString() ); + if ( getControlPanel().isShowDomainArchitectures() && node.getNodeData().isHasSequence() + && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) { + // FIXME + // TODO this might need some clean up + final DomainArchitecture d = node.getNodeData().getSequence().getDomainArchitecture(); + sum += ( ( _domain_structure_width / ( ( RenderableDomainArchitecture ) d ).getOriginalSize() + .getWidth() ) * d.getTotalLength() ) + 10; + if ( d.getTotalLength() > _longest_domain ) { + _longest_domain = d.getTotalLength(); + } } - if ( getControlPanel().isShowBinaryCharacters() && node.getNodeData().isHasBinaryCharacters() ) { - sum += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getBinaryCharacters() - .getGainedCharactersAsStringBuffer().toString() ); + if ( getControlPanel().isShowMolSequences() && ( node.getNodeData().isHasSequence() ) + && ( node.getNodeData().getSequence().isMolecularSequenceAligned() ) + && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getMolecularSequence() ) ) ) { + // FIXME + sum += RenderableMsaSequence.DEFAULT_WIDTH + 30; } if ( sum >= max_length ) { - setLongestExtNodeInfo( max_length ); - return; + _longest_ext_node_info = max_length; + // return; //FIXME why? } if ( sum > longest ) { longest = sum; } } + _ext_node_with_longest_txt_info = longest_txt_node; if ( longest >= max_length ) { - setLongestExtNodeInfo( max_length ); + _longest_ext_node_info = max_length; } else { - setLongestExtNodeInfo( longest ); + _longest_ext_node_info = longest; } + _length_of_longest_text = calcLengthOfLongestText(); } final void calculateScaleDistance() { @@ -702,25 +708,60 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } final Color calculateTaxonomyBasedColor( final Taxonomy tax ) { - if ( ForesterUtil.isEmpty( tax.getTaxonomyCode() ) && ForesterUtil.isEmpty( tax.getScientificName() ) ) { + if ( getOptions().isColorByTaxonomicGroup() ) { + if ( !ForesterUtil.isEmpty( tax.getTaxonomyCode() ) ) { + boolean ex = false; + String group = null; + try { + group = TaxonomyUtil.getTaxGroupByTaxCode( tax.getTaxonomyCode() ); + } + catch ( final Exception e ) { + ex = true; + } + if ( !ex && !ForesterUtil.isEmpty( group ) ) { + final Color c = ForesterUtil.obtainColorDependingOnTaxonomyGroup( group ); + if ( c != null ) { + return c; + } + } + } return getTreeColorSet().getTaxonomyColor(); } - Color c = null; - if ( !ForesterUtil.isEmpty( tax.getTaxonomyCode() ) ) { - c = getControlPanel().getSpeciesColors().get( tax.getTaxonomyCode() ); - } - if ( ( c == null ) && !ForesterUtil.isEmpty( tax.getScientificName() ) ) { - c = getControlPanel().getSpeciesColors().get( tax.getScientificName() ); - } - if ( c == null ) { + else { + if ( ForesterUtil.isEmpty( tax.getTaxonomyCode() ) && ForesterUtil.isEmpty( tax.getScientificName() ) ) { + return getTreeColorSet().getTaxonomyColor(); + } + Color c = null; if ( !ForesterUtil.isEmpty( tax.getTaxonomyCode() ) ) { - c = TreePanelUtil.calculateColorFromString( tax.getTaxonomyCode(), true ); - getControlPanel().getSpeciesColors().put( tax.getTaxonomyCode(), c ); + c = getControlPanel().getSpeciesColors().get( tax.getTaxonomyCode() ); } - else { - c = TreePanelUtil.calculateColorFromString( tax.getScientificName(), true ); - getControlPanel().getSpeciesColors().put( tax.getScientificName(), c ); + if ( ( c == null ) && !ForesterUtil.isEmpty( tax.getScientificName() ) ) { + c = getControlPanel().getSpeciesColors().get( tax.getScientificName() ); } + if ( c == null ) { + if ( !ForesterUtil.isEmpty( tax.getTaxonomyCode() ) ) { + c = AptxUtil.calculateColorFromString( tax.getTaxonomyCode(), true ); + getControlPanel().getSpeciesColors().put( tax.getTaxonomyCode(), c ); + } + else { + c = AptxUtil.calculateColorFromString( tax.getScientificName(), true ); + getControlPanel().getSpeciesColors().put( tax.getScientificName(), c ); + } + } + return c; + } + } + + final Color calculateSequenceBasedColor( final Sequence seq ) { + if ( ForesterUtil.isEmpty( seq.getName() ) ) { + return getTreeColorSet().getSequenceColor(); + } + Color c = null; + final String seq_name = seq.getName(); + c = getControlPanel().getSequenceColors().get( seq_name ); + if ( c == null ) { + c = AptxUtil.calculateColorFromString( seq_name, false ); + getControlPanel().getSequenceColors().put( seq_name, c ); } return c; } @@ -745,7 +786,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } catch ( final NumberFormatException e ) { JOptionPane.showMessageDialog( this, "Could not parse \"" + value_str - + "\" into a decimal value", "Problem with Vector Data", JOptionPane.ERROR_MESSAGE ); + + "\" into a decimal value", "Problem with Vector Data", JOptionPane.ERROR_MESSAGE ); return; } int i = -1; @@ -755,7 +796,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee catch ( final NumberFormatException e ) { JOptionPane.showMessageDialog( this, "Could not parse \"" + index_str - + "\" into index for vector data", + + "\" into index for vector data", "Problem with Vector Data", JOptionPane.ERROR_MESSAGE ); return; @@ -790,7 +831,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee /** * Collapse the tree from the given node - * + * * @param node * a PhylogenyNode */ @@ -844,13 +885,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final int colorizations = TreePanelUtil.colorPhylogenyAccordingToRanks( _phylogeny, rank, this ); if ( colorizations > 0 ) { _control_panel.setColorBranches( true ); - if ( _control_panel.getColorBranchesCb() != null ) { - _control_panel.getColorBranchesCb().setSelected( true ); + if ( _control_panel.getUseVisualStylesCb() != null ) { + _control_panel.getUseVisualStylesCb().setSelected( true ); } if ( _control_panel.getColorAccSpeciesCb() != null ) { _control_panel.getColorAccSpeciesCb().setSelected( false ); } _options.setColorLabelsSameAsParentBranch( true ); + if ( getMainPanel().getMainFrame()._color_labels_same_as_parent_branch != null ) { + getMainPanel().getMainFrame()._color_labels_same_as_parent_branch.setSelected( true ); + } _control_panel.repaint(); } setArrowCursor(); @@ -889,8 +933,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee AptxUtil.removeBranchColors( _phylogeny ); TreePanelUtil.colorPhylogenyAccordingToConfidenceValues( _phylogeny, this ); _control_panel.setColorBranches( true ); - if ( _control_panel.getColorBranchesCb() != null ) { - _control_panel.getColorBranchesCb().setSelected( true ); + if ( _control_panel.getUseVisualStylesCb() != null ) { + _control_panel.getUseVisualStylesCb().setSelected( true ); } setArrowCursor(); repaint(); @@ -904,7 +948,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee /** * Find the node, if any, at the given location - * + * * @param x * @param y * @return pointer to the node at x,y, null if not found @@ -947,12 +991,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return _domain_structure_e_value_thr_exp; } - final Set getFoundNodes() { - return _found_nodes; + final Set getFoundNodes0() { + return _found_nodes_0; + } + + final Set getFoundNodes1() { + return _found_nodes_1; } final Color getGraphicsForNodeBoxWithColorForParentBranch( final PhylogenyNode node ) { - if ( getControlPanel().isColorBranches() && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) { + if ( getControlPanel().isUseVisualStyles() && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) { return ( PhylogenyMethods.getBranchColorValue( node ) ); } else { @@ -991,24 +1039,23 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return _statistics_for_vector_data; } - /** - * Find a color for this species name. - * - * @param species - * @return the species color - */ final Color getTaxonomyBasedColor( final PhylogenyNode node ) { - if ( node.getNodeData().isHasTaxonomy() ) { + if ( node.isExternal() && node.getNodeData().isHasTaxonomy() ) { return calculateTaxonomyBasedColor( node.getNodeData().getTaxonomy() ); } // return non-colorized color return getTreeColorSet().getTaxonomyColor(); } - /** - * @return pointer to colorset for tree drawing - */ - final TreeColorSet getTreeColorSet() { + final Color getSequenceBasedColor( final PhylogenyNode node ) { + if ( node.getNodeData().isHasSequence() ) { + return calculateSequenceBasedColor( node.getNodeData().getSequence() ); + } + // return non-colorized color + return getTreeColorSet().getSequenceColor(); + } + + public final TreeColorSet getTreeColorSet() { return getMainPanel().getTreeColorSet(); } @@ -1038,14 +1085,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( ( _phylogeny == null ) || _phylogeny.isEmpty() ) { return; } - double max_original_domain_structure_width = 0.0; + double _max_original_domain_structure_width = 0.0; for( final PhylogenyNode node : _phylogeny.getExternalNodes() ) { if ( node.getNodeData().isHasSequence() && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) { RenderableDomainArchitecture rds = null; if ( !( node.getNodeData().getSequence().getDomainArchitecture() instanceof RenderableDomainArchitecture ) ) { - rds = new RenderableDomainArchitecture( node.getNodeData().getSequence().getDomainArchitecture(), - getConfiguration() ); + if ( SPECIAL_DOMAIN_COLORING ) { + rds = new RenderableDomainArchitecture( node.getNodeData().getSequence() + .getDomainArchitecture(), node.getName() ); + } + else { + rds = new RenderableDomainArchitecture( node.getNodeData().getSequence() + .getDomainArchitecture() ); + } node.getNodeData().getSequence().setDomainArchitecture( rds ); } else { @@ -1053,14 +1106,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } if ( getControlPanel().isShowDomainArchitectures() ) { final double dsw = rds.getOriginalSize().getWidth(); - if ( dsw > max_original_domain_structure_width ) { - max_original_domain_structure_width = dsw; + if ( dsw > _max_original_domain_structure_width ) { + _max_original_domain_structure_width = dsw; } } } } if ( getControlPanel().isShowDomainArchitectures() ) { - final double ds_factor_width = _domain_structure_width / max_original_domain_structure_width; + final float ds_factor_width = ( float ) ( _domain_structure_width / _max_original_domain_structure_width ); for( final PhylogenyNode node : _phylogeny.getExternalNodes() ) { if ( node.getNodeData().isHasSequence() && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) { @@ -1077,14 +1130,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return ( ( e.getX() > ( getVisibleRect().x + getOvXPosition() + 1 ) ) && ( e.getX() < ( ( getVisibleRect().x + getOvXPosition() + getOvMaxWidth() ) - 1 ) ) && ( e.getY() > ( getVisibleRect().y + getOvYPosition() + 1 ) ) && ( e.getY() < ( ( getVisibleRect().y - + getOvYPosition() + getOvMaxHeight() ) - 1 ) ) ); + + getOvYPosition() + getOvMaxHeight() ) - 1 ) ) ); } final boolean inOvRectangle( final MouseEvent e ) { return ( ( e.getX() >= ( getOvRectangle().getX() - 1 ) ) && ( e.getX() <= ( getOvRectangle().getX() + getOvRectangle().getWidth() + 1 ) ) && ( e.getY() >= ( getOvRectangle().getY() - 1 ) ) && ( e.getY() <= ( getOvRectangle().getY() - + getOvRectangle().getHeight() + 1 ) ) ); + + getOvRectangle().getHeight() + 1 ) ) ); } final boolean isApplet() { @@ -1189,7 +1242,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee y = max_y; } getMainPanel().getCurrentScrollPane().getViewport() - .setViewPosition( new Point( ForesterUtil.roundToInt( x ), ForesterUtil.roundToInt( y ) ) ); + .setViewPosition( new Point( ForesterUtil.roundToInt( x ), ForesterUtil.roundToInt( y ) ) ); setInOvRect( true ); repaint(); } @@ -1203,10 +1256,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee // Check if shift key is down if ( ( e.getModifiers() & InputEvent.SHIFT_MASK ) != 0 ) { // Yes, so add to _found_nodes - if ( getFoundNodes() == null ) { - setFoundNodes( new HashSet() ); + if ( getFoundNodes0() == null ) { + setFoundNodes0( new HashSet() ); } - getFoundNodes().add( node.getId() ); + getFoundNodes0().add( node.getId() ); // Check if control key is down } else if ( ( e.getModifiers() & InputEvent.CTRL_MASK ) != 0 ) { @@ -1404,10 +1457,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 ); - paintNodeBox( c.getXcoord(), c.getYcoord(), c, g, to_pdf, to_graphics_file, isInFoundNodes( c ) - || isInCurrentExternalNodes( c ) ); + paintNodeBox( c.getXcoord(), c.getYcoord(), c, g, to_pdf, to_graphics_file ); if ( c.isExternal() ) { - final boolean is_in_found_nodes = isInFoundNodes( c ) || isInCurrentExternalNodes( c ); + final boolean is_in_found_nodes = isInFoundNodes0( c ) || isInFoundNodes1( c ) + || isInCurrentExternalNodes( c ); if ( ( _dynamic_hiding_factor > 1 ) && !is_in_found_nodes && ( ( _urt_nodeid_index_map.get( c.getId() ) % _dynamic_hiding_factor ) != 1 ) ) { return; @@ -1435,8 +1488,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee root_y + ( Math.sin( angle ) * parent_radius ), g ); if ( isInFoundNodes( c ) || isInCurrentExternalNodes( c ) ) { - g.setColor( getTreeColorSet().getFoundColor() ); - drawRectFilled( c.getXSecondary() - 1, c.getYSecondary() - 1, 3, 3, g ); + 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 ); } } @@ -1471,7 +1525,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } paintCirculars( phy.getRoot(), phy, center_x, center_y, radius, radial_labels, g, to_pdf, to_graphics_file ); - paintNodeBox( _root.getXcoord(), _root.getYcoord(), _root, g, to_pdf, to_graphics_file, isInFoundNodes( _root ) ); + paintNodeBox( _root.getXcoord(), _root.getYcoord(), _root, g, to_pdf, to_graphics_file ); } final void paintCircularLite( final Phylogeny phy, @@ -1526,7 +1580,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else { if ( !to_graphics_file ) { g.setPaint( new GradientPaint( r.x, r.y, getTreeColorSet().getBackgroundColor(), r.x, r.y - + r.height, getTreeColorSet().getBackgroundColorGradientBottom() ) ); + + r.height, getTreeColorSet().getBackgroundColorGradientBottom() ) ); g.fill( r ); } else { @@ -1560,7 +1614,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } // Position starting Y of tree _phylogeny.getRoot().setYcoord( ( getYdistance() * _phylogeny.getRoot().getNumberOfExternalNodes() ) - + ( TreePanel.MOVE / 2.0f ) ); + + ( TreePanel.MOVE / 2.0f ) ); final int dynamic_hiding_factor = calcDynamicHidingFactor(); if ( getControlPanel().isDynamicallyHideData() ) { if ( dynamic_hiding_factor > 1 ) { @@ -1577,14 +1631,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _nodes_in_preorder[ i++ ] = it.next(); } } - //final PhylogenyNodeIterator it; - //for( it = _phylogeny.iteratorPreorder(); it.hasNext(); ) { - // paintNodeRectangular( g, it.next(), to_pdf, getControlPanel().isDynamicallyHideData() - // && ( dynamic_hiding_factor > 1 ), dynamic_hiding_factor, to_graphics_file ); - //} + final boolean disallow_shortcutting = ( dynamic_hiding_factor < 40 ) + || getControlPanel().isUseVisualStyles() || getOptions().isShowDefaultNodeShapesForMarkedNodes() + || ( ( getFoundNodes0() != null ) && !getFoundNodes0().isEmpty() ) + || ( ( getFoundNodes1() != null ) && !getFoundNodes1().isEmpty() ) + || ( ( getCurrentExternalNodes() != null ) && !getCurrentExternalNodes().isEmpty() ) + || to_graphics_file || to_pdf; for( final PhylogenyNode element : _nodes_in_preorder ) { - paintNodeRectangular( g, element, to_pdf, getControlPanel().isDynamicallyHideData() - && ( dynamic_hiding_factor > 1 ), dynamic_hiding_factor, to_graphics_file ); + paintNodeRectangular( g, + element, + to_pdf, + getControlPanel().isDynamicallyHideData() && ( dynamic_hiding_factor > 1 ), + dynamic_hiding_factor, + to_graphics_file, + disallow_shortcutting ); } if ( getOptions().isShowScale() && getControlPanel().isDrawPhylogram() && ( getScaleDistance() > 0.0 ) ) { if ( !( to_graphics_file || to_pdf ) ) { @@ -1610,7 +1670,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final boolean radial_labels = getOptions().getNodeLabelDirection() == NODE_LABEL_DIRECTION.RADIAL; _dynamic_hiding_factor = 0; if ( getControlPanel().isDynamicallyHideData() ) { - _dynamic_hiding_factor = ( int ) ( ( getTreeFontSet()._fm_large.getHeight() * 1.5 * getPhylogeny() + _dynamic_hiding_factor = ( int ) ( ( getFontMetricsForLargeDefaultFont().getHeight() * 1.5 * getPhylogeny() .getNumberOfExternalNodes() ) / ( TWO_PI * 10 ) ); } if ( getControlPanel().getDynamicallyHideData() != null ) { @@ -1655,7 +1715,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final int d = radius + MOVE + getLongestExtNodeInfo(); _dynamic_hiding_factor = 0; if ( getControlPanel().isDynamicallyHideData() && ( radius > 0 ) ) { - _dynamic_hiding_factor = ( int ) ( ( getTreeFontSet()._fm_large.getHeight() * 1.5 * getPhylogeny() + _dynamic_hiding_factor = ( int ) ( ( getFontMetricsForLargeDefaultFont().getHeight() * 1.5 * getPhylogeny() .getNumberOfExternalNodes() ) / ( TWO_PI * radius ) ); } if ( getControlPanel().getDynamicallyHideData() != null ) { @@ -1690,7 +1750,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee y_pos + radius_ov, ( int ) ( radius_ov - ( getLongestExtNodeInfo() / ( getVisibleRect().width / getOvRectangle() .getWidth() ) ) ), - g ); + g ); g.setTransform( _at ); paintOvRectangle( g ); } @@ -1772,42 +1832,42 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee x = TreePanel.MOVE + getLongestExtNodeInfo() + ForesterUtil - .roundToInt( ( getXcorrectionFactor() * getPhylogeny().getHeight() ) + getXdistance() ); + .roundToInt( ( getXcorrectionFactor() * getPhylogeny().getHeight() ) + getXdistance() ); } else { if ( !isNonLinedUpCladogram() && !isUniformBranchLengthsForCladogram() ) { x = TreePanel.MOVE + getLongestExtNodeInfo() + ForesterUtil.roundToInt( getXdistance() - * ( getPhylogeny().getRoot().getNumberOfExternalNodes() + 2 ) ); + * ( getPhylogeny().getRoot().getNumberOfExternalNodes() + 2 ) ); } else { x = TreePanel.MOVE + getLongestExtNodeInfo() + ForesterUtil.roundToInt( getXdistance() - * ( PhylogenyMethods.calculateMaxDepth( getPhylogeny() ) + 1 ) ); + * ( PhylogenyMethods.calculateMaxDepth( getPhylogeny() ) + 1 ) ); } } setPreferredSize( new Dimension( x, y ) ); } final void selectNode( final PhylogenyNode node ) { - if ( ( getFoundNodes() != null ) && getFoundNodes().contains( node.getId() ) ) { - getFoundNodes().remove( node.getId() ); - getControlPanel().setSearchFoundCountsOnLabel( getFoundNodes().size() ); - if ( getFoundNodes().size() < 1 ) { - getControlPanel().searchReset(); + if ( ( getFoundNodes0() != null ) && getFoundNodes0().contains( node.getId() ) ) { + getFoundNodes0().remove( node.getId() ); + getControlPanel().setSearchFoundCountsOnLabel0( getFoundNodes0().size() ); + if ( getFoundNodes0().size() < 1 ) { + getControlPanel().searchReset0(); } } else { - getControlPanel().getSearchFoundCountsLabel().setVisible( true ); - getControlPanel().getSearchResetButton().setEnabled( true ); - getControlPanel().getSearchResetButton().setVisible( true ); - if ( getFoundNodes() == null ) { - setFoundNodes( new HashSet() ); + getControlPanel().getSearchFoundCountsLabel0().setVisible( true ); + getControlPanel().getSearchResetButton0().setEnabled( true ); + getControlPanel().getSearchResetButton0().setVisible( true ); + if ( getFoundNodes0() == null ) { + setFoundNodes0( new HashSet() ); } - getFoundNodes().add( node.getId() ); - getControlPanel().setSearchFoundCountsOnLabel( getFoundNodes().size() ); + getFoundNodes0().add( node.getId() ); + getControlPanel().setSearchFoundCountsOnLabel0( getFoundNodes0().size() ); } } @@ -1825,8 +1885,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _current_external_nodes_data_buffer = sb; } - final void setFoundNodes( final Set found_nodes ) { - _found_nodes = found_nodes; + final void setFoundNodes0( final Set found_nodes ) { + _found_nodes_0 = found_nodes; + } + + final void setFoundNodes1( final Set found_nodes ) { + _found_nodes_1 = found_nodes; } final void setInOvRect( final boolean in_ov_rect ) { @@ -1845,10 +1909,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _last_drag_point_y = y; } - final void setLongestExtNodeInfo( final int i ) { - _longest_ext_node_info = i; - } - final void setMediumFonts() { getTreeFontSet().mediumFonts(); } @@ -1928,16 +1988,13 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final void sortDescendants( final PhylogenyNode node ) { if ( !node.isExternal() ) { - DESCENDANT_SORT_PRIORITY pri = DESCENDANT_SORT_PRIORITY.TAXONOMY; - if ( ( !getControlPanel().isShowTaxonomyScientificNames() && !getControlPanel().isShowTaxonomyCode() && !getControlPanel() - .isShowTaxonomyCommonNames() ) ) { - if ( ( getControlPanel().isShowSequenceAcc() || getControlPanel().isShowSeqNames() || getControlPanel() - .isShowSeqSymbols() ) ) { - pri = DESCENDANT_SORT_PRIORITY.SEQUENCE; - } - else if ( getControlPanel().isShowNodeNames() ) { - pri = DESCENDANT_SORT_PRIORITY.NODE_NAME; - } + DESCENDANT_SORT_PRIORITY pri = DESCENDANT_SORT_PRIORITY.NODE_NAME; + if ( getControlPanel().isShowTaxonomyScientificNames() || getControlPanel().isShowTaxonomyCode() ) { + pri = DESCENDANT_SORT_PRIORITY.TAXONOMY; + } + else if ( getControlPanel().isShowSeqNames() || getControlPanel().isShowSeqSymbols() + || getControlPanel().isShowGeneNames() ) { + pri = DESCENDANT_SORT_PRIORITY.SEQUENCE; } PhylogenyMethods.sortNodeDescendents( node, pri ); setNodeInPreorderToNull(); @@ -2029,8 +2086,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee setWaitCursor(); TreePanelUtil.colorPhylogenyAccordingToExternalTaxonomy( _phylogeny, this ); _control_panel.setColorBranches( true ); - if ( _control_panel.getColorBranchesCb() != null ) { - _control_panel.getColorBranchesCb().setSelected( true ); + if ( _control_panel.getUseVisualStylesCb() != null ) { + _control_panel.getUseVisualStylesCb().setSelected( true ); } setEdited( true ); setArrowCursor(); @@ -2139,14 +2196,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } - private void abbreviateScientificName( final String sn ) { + private void abbreviateScientificName( final String sn, final StringBuilder sb ) { final String[] a = sn.split( "\\s+" ); - _sb.append( a[ 0 ].substring( 0, 1 ) ); - _sb.append( a[ 1 ].substring( 0, 2 ) ); + sb.append( a[ 0 ].substring( 0, 1 ) ); + sb.append( a[ 1 ].substring( 0, 2 ) ); if ( a.length > 2 ) { for( int i = 2; i < a.length; i++ ) { - _sb.append( " " ); - _sb.append( a[ i ] ); + sb.append( " " ); + sb.append( a[ i ] ); } } } @@ -2227,9 +2284,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee && ( getCopiedAndPastedNodes() != null ) && !to_pdf && !to_graphics_file && getCopiedAndPastedNodes().contains( node.getId() ) ) { - g.setColor( getTreeColorSet().getFoundColor() ); + g.setColor( getTreeColorSet().getFoundColor0() ); } - else if ( getControlPanel().isColorBranches() && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) { + else if ( getControlPanel().isUseVisualStyles() && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) { g.setColor( PhylogenyMethods.getBranchColorValue( node ) ); } else if ( to_pdf ) { @@ -2305,13 +2362,13 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } private final int calcDynamicHidingFactor() { - return ( int ) ( 0.5 + ( getTreeFontSet()._fm_large.getHeight() / ( 1.5 * getYdistance() ) ) ); + return ( int ) ( 0.5 + ( getFontMetricsForLargeDefaultFont().getHeight() / ( 1.5 * getYdistance() ) ) ); } /** * Calculate the length of the distance between the given node and its * parent. - * + * * @param node * @param ext_node_x * @factor @@ -2343,7 +2400,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( !ForesterUtil.isEmpty( ann_str ) ) { c = getControlPanel().getAnnotationColors().get( ann_str ); if ( c == null ) { - c = TreePanelUtil.calculateColorFromString( ann_str, false ); + c = AptxUtil.calculateColorFromString( ann_str, false ); getControlPanel().getAnnotationColors().put( ann_str, c ); } if ( c == null ) { @@ -2376,12 +2433,111 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee JOptionPane.WARNING_MESSAGE ); } + 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().getFont(); + } + if ( f != null ) { + fc.setFont( f ); + } + else { + fc.setFont( getMainPanel().getTreeFontSet().getLargeFont() ); + } + List nodes = new ArrayList(); + if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) { + nodes = getFoundNodesAsListOfPhylogenyNodes(); + } + if ( !nodes.contains( node ) ) { + nodes.add( node ); + } + final int count = nodes.size(); + String title = "Change the font for "; + if ( count == 1 ) { + title += "one node"; + } + else { + title += ( count + " nodes" ); + } + fc.showDialog( this, title ); + if ( ( fc.getFont() != null ) && !ForesterUtil.isEmpty( fc.getFont().getFamily().trim() ) ) { + for( final PhylogenyNode n : nodes ) { + if ( n.getNodeData().getNodeVisualData() == null ) { + n.getNodeData().setNodeVisualData( new NodeVisualData() ); + } + final NodeVisualData vd = n.getNodeData().getNodeVisualData(); + final Font ff = fc.getFont(); + vd.setFontName( ff.getFamily().trim() ); + int s = ff.getSize(); + if ( s < 0 ) { + s = 0; + } + if ( s > Byte.MAX_VALUE ) { + s = Byte.MAX_VALUE; + } + vd.setFontSize( s ); + vd.setFontStyle( ff.getStyle() ); + } + if ( _control_panel.getUseVisualStylesCb() != null ) { + getControlPanel().getUseVisualStylesCb().setSelected( true ); + } + } + setEdited( true ); + repaint(); + } + + private void colorNodeFont( final PhylogenyNode node ) { + _color_chooser.setPreviewPanel( new JPanel() ); + NodeColorizationActionListener al; + int count = 1; + if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) { + final List additional_nodes = getFoundNodesAsListOfPhylogenyNodes(); + al = new NodeColorizationActionListener( _color_chooser, node, additional_nodes ); + count = additional_nodes.size(); + if ( !additional_nodes.contains( node ) ) { + count++; + } + } + else { + al = new NodeColorizationActionListener( _color_chooser, node ); + } + String title = "Change the (node and font) color for "; + if ( count == 1 ) { + title += "one node"; + } + else { + title += ( count + " nodes" ); + } + final JDialog dialog = JColorChooser.createDialog( this, title, true, _color_chooser, al, null ); + setEdited( true ); + dialog.setVisible( true ); + } + + final private void colorizeNodes( final Color c, + final PhylogenyNode node, + final List additional_nodes ) { + _control_panel.setColorBranches( true ); + if ( _control_panel.getUseVisualStylesCb() != null ) { + _control_panel.getUseVisualStylesCb().setSelected( true ); + } + if ( node != null ) { + colorizeNodesHelper( c, node ); + } + if ( additional_nodes != null ) { + for( final PhylogenyNode n : additional_nodes ) { + colorizeNodesHelper( c, n ); + } + } + repaint(); + } + final private void colorizeSubtree( final Color c, final PhylogenyNode node, final List additional_nodes ) { _control_panel.setColorBranches( true ); - if ( _control_panel.getColorBranchesCb() != null ) { - _control_panel.getColorBranchesCb().setSelected( true ); + if ( _control_panel.getUseVisualStylesCb() != null ) { + _control_panel.getUseVisualStylesCb().setSelected( true ); } if ( node != null ) { for( final PreorderTreeIterator it = new PreorderTreeIterator( node ); it.hasNext(); ) { @@ -2389,8 +2545,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } if ( additional_nodes != null ) { - for( final PhylogenyNode n : additional_nodes ) { - n.getBranchData().setBranchColor( new BranchColor( c ) ); + for( final PhylogenyNode an : additional_nodes ) { + for( final PreorderTreeIterator it = new PreorderTreeIterator( an ); it.hasNext(); ) { + it.next().getBranchData().setBranchColor( new BranchColor( c ) ); + } } } repaint(); @@ -2406,7 +2564,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } _color_chooser.setPreviewPanel( new JPanel() ); SubtreeColorizationActionListener al; - if ( ( getFoundNodes() != null ) && !getFoundNodes().isEmpty() ) { + if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) { final List additional_nodes = getFoundNodesAsListOfPhylogenyNodes(); al = new SubtreeColorizationActionListener( _color_chooser, node, additional_nodes ); } @@ -2415,17 +2573,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } final JDialog dialog = JColorChooser .createDialog( this, "Subtree colorization", true, _color_chooser, al, null ); + setEdited( true ); dialog.setVisible( true ); } - private List getFoundNodesAsListOfPhylogenyNodes() { - final List additional_nodes = new ArrayList(); - for( final Long id : getFoundNodes() ) { - additional_nodes.add( _phylogeny.getNode( id ) ); - } - return additional_nodes; - } - final private void copySubtree( final PhylogenyNode node ) { if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) { errorMessageNoCutCopyPasteInUnrootedDisplay(); @@ -2595,22 +2746,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee g.fill( _ellipse ); } - final private void drawOvalGradient( final double x, - final double y, - final double width, - final double heigth, + final private void drawOvalGradient( final float x, + final float y, + final float width, + final float heigth, final Graphics2D g, final Color color_1, final Color color_2, final Color color_border ) { _ellipse.setFrame( x, y, width, heigth ); - g.setPaint( new GradientPaint( ( float ) x, - ( float ) y, - color_1, - ( float ) ( x + width ), - ( float ) ( y + heigth ), - color_2, - false ) ); + g.setPaint( new GradientPaint( x, y, color_1, ( x + width ), ( y + heigth ), color_2, false ) ); g.fill( _ellipse ); if ( color_border != null ) { g.setPaint( color_border ); @@ -2632,22 +2777,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee g.fill( _rectangle ); } - final private void drawRectGradient( final double x, - final double y, - final double width, - final double heigth, + final private void drawRectGradient( final float x, + final float y, + final float width, + final float heigth, final Graphics2D g, final Color color_1, final Color color_2, final Color color_border ) { _rectangle.setFrame( x, y, width, heigth ); - g.setPaint( new GradientPaint( ( float ) x, - ( float ) y, - color_1, - ( float ) ( x + width ), - ( float ) ( y + heigth ), - color_2, - false ) ); + g.setPaint( new GradientPaint( x, y, color_1, ( x + width ), ( y + heigth ), color_2, false ) ); g.fill( _rectangle ); if ( color_border != null ) { g.setPaint( color_border ); @@ -2711,6 +2850,21 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee JOptionPane.ERROR_MESSAGE ); } + private final Color getColorForFoundNode( final PhylogenyNode n ) { + if ( isInCurrentExternalNodes( n ) ) { + return getTreeColorSet().getFoundColor0(); + } + else if ( isInFoundNodes0( n ) && !isInFoundNodes1( n ) ) { + return getTreeColorSet().getFoundColor0(); + } + else if ( !isInFoundNodes0( n ) && isInFoundNodes1( n ) ) { + return getTreeColorSet().getFoundColor1(); + } + else { + return getTreeColorSet().getFoundColor0and1(); + } + } + final private Set getCopiedAndPastedNodes() { return getMainPanel().getCopiedAndPastedNodes(); } @@ -2723,6 +2877,33 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return getMainPanel().getCutOrCopiedTree(); } + private FontMetrics getFontMetricsForLargeDefaultFont() { + return getTreeFontSet().getFontMetricsLarge(); + } + + List getFoundNodesAsListOfPhylogenyNodes() { + final List additional_nodes = new ArrayList(); + if ( getFoundNodes0() != null ) { + for( final Long id : getFoundNodes0() ) { + final PhylogenyNode n = _phylogeny.getNode( id ); + if ( n != null ) { + additional_nodes.add( n ); + } + } + } + if ( getFoundNodes1() != null ) { + for( final Long id : getFoundNodes1() ) { + if ( ( getFoundNodes0() == null ) || !getFoundNodes0().contains( id ) ) { + final PhylogenyNode n = _phylogeny.getNode( id ); + if ( n != null ) { + additional_nodes.add( n ); + } + } + } + } + return additional_nodes; + } + final private float getLastDragPointX() { return _last_drag_point_x; } @@ -2781,6 +2962,22 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return _ov_y_start; } + final private List getPdbAccs( final PhylogenyNode node ) { + final List pdb_ids = new ArrayList(); + if ( node.getNodeData().isHasSequence() ) { + final Sequence seq = node.getNodeData().getSequence(); + if ( !ForesterUtil.isEmpty( seq.getCrossReferences() ) ) { + final SortedSet cross_refs = seq.getCrossReferences(); + for( final Accession acc : cross_refs ) { + if ( acc.getSource().equalsIgnoreCase( "pdb" ) ) { + pdb_ids.add( acc ); + } + } + } + } + return pdb_ids; + } + final private double getScaleDistance() { return _scale_distance; } @@ -2821,6 +3018,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; @@ -2830,6 +3033,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee case OPEN_TAX_WEB: openTaxWeb( node ); break; + case OPEN_PDB_WEB: + openPdbWeb( node ); + break; case CUT_SUBTREE: cutSubtree( node ); break; @@ -2900,7 +3106,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return ( ( x >= ( getOvVirtualRectangle().x - 1 ) ) && ( x <= ( getOvVirtualRectangle().x + getOvVirtualRectangle().width + 1 ) ) && ( y >= ( getOvVirtualRectangle().y - 1 ) ) && ( y <= ( getOvVirtualRectangle().y - + getOvVirtualRectangle().height + 1 ) ) ); + + getOvVirtualRectangle().height + 1 ) ) ); } final private boolean inOvVirtualRectangle( final MouseEvent e ) { @@ -2927,8 +3133,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee && ( ( !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getScientificName() ) ) || ( !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getTaxonomyCode() ) ) || ( !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getCommonName() ) ) || ( ( node - .getNodeData().getTaxonomy().getIdentifier() != null ) && !ForesterUtil.isEmpty( node - .getNodeData().getTaxonomy().getIdentifier().getValue() ) ) ) ) { + .getNodeData().getTaxonomy().getIdentifier() != null ) && !ForesterUtil.isEmpty( node + .getNodeData().getTaxonomy().getIdentifier().getValue() ) ) ) ) { return true; } else { @@ -2940,8 +3146,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return ( ( getCurrentExternalNodes() != null ) && getCurrentExternalNodes().contains( node.getId() ) ); } - final private boolean isInFoundNodes( final PhylogenyNode node ) { - return ( ( getFoundNodes() != null ) && getFoundNodes().contains( node.getId() ) ); + private boolean isInFoundNodes( final PhylogenyNode n ) { + return isInFoundNodes0( n ) || isInFoundNodes1( n ); + } + + final private boolean isInFoundNodes0( final PhylogenyNode node ) { + return ( ( getFoundNodes0() != null ) && getFoundNodes0().contains( node.getId() ) ); + } + + final private boolean isInFoundNodes1( final PhylogenyNode node ) { + return ( ( getFoundNodes1() != null ) && getFoundNodes1().contains( node.getId() ) ); } final private boolean isInOv() { @@ -2955,14 +3169,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } return ( ( node.getYcoord() < ( getVisibleRect().getMinY() - y_dist ) ) || ( node.getYcoord() > ( getVisibleRect().getMaxY() + y_dist ) ) || ( ( node.getParent() != null ) && ( node - .getParent().getXcoord() > getVisibleRect().getMaxX() ) ) ); + .getParent().getXcoord() > getVisibleRect().getMaxX() ) ) ); } final private boolean isNodeDataInvisibleUnrootedCirc( final PhylogenyNode node ) { return ( ( node.getYcoord() < ( getVisibleRect().getMinY() - 20 ) ) || ( node.getYcoord() > ( getVisibleRect().getMaxY() + 20 ) ) || ( node.getXcoord() < ( getVisibleRect().getMinX() - 20 ) ) || ( node.getXcoord() > ( getVisibleRect() - .getMaxX() + 20 ) ) ); + .getMaxX() + 20 ) ) ); } final private boolean isNonLinedUpCladogram() { @@ -3157,6 +3371,41 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _node_popup_menu_items[ i ].setEnabled( false ); } } + else if ( title.equals( Configuration.clickto_options[ Configuration.open_pdb_web ][ 0 ] ) ) { + final List accs = getPdbAccs( node ); + _node_popup_menu_items[ i ] = new JMenuItem( title ); + if ( !ForesterUtil.isEmpty( accs ) ) { + if ( accs.size() == 1 ) { + _node_popup_menu_items[ i ].setText( _node_popup_menu_items[ i ].getText() + " [" + + TreePanelUtil.pdbAccToString( accs, 0 ) + "]" ); + _node_popup_menu_items[ i ].setEnabled( true ); + } + else if ( accs.size() == 2 ) { + _node_popup_menu_items[ i ].setText( _node_popup_menu_items[ i ].getText() + " [" + + TreePanelUtil.pdbAccToString( accs, 0 ) + ", " + + TreePanelUtil.pdbAccToString( accs, 1 ) + "]" ); + _node_popup_menu_items[ i ].setEnabled( true ); + } + else if ( accs.size() == 3 ) { + _node_popup_menu_items[ i ].setText( _node_popup_menu_items[ i ].getText() + " [" + + TreePanelUtil.pdbAccToString( accs, 0 ) + ", " + + TreePanelUtil.pdbAccToString( accs, 1 ) + ", " + + TreePanelUtil.pdbAccToString( accs, 2 ) + "]" ); + _node_popup_menu_items[ i ].setEnabled( true ); + } + else { + _node_popup_menu_items[ i ].setText( _node_popup_menu_items[ i ].getText() + " [" + + TreePanelUtil.pdbAccToString( accs, 0 ) + ", " + + TreePanelUtil.pdbAccToString( accs, 1 ) + ", " + + TreePanelUtil.pdbAccToString( accs, 2 ) + ", + " + ( accs.size() - 3 ) + " more]" ); + _node_popup_menu_items[ i ].setEnabled( true ); + } + } + else { + _node_popup_menu_items[ i ].setEnabled( false ); + } + // + } else if ( title.equals( Configuration.clickto_options[ Configuration.open_tax_web ][ 0 ] ) ) { _node_popup_menu_items[ i ].setEnabled( isCanOpenTaxWeb( node ) ); } @@ -3220,6 +3469,110 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } + private final void nodeDataAsSB( final PhylogenyNode node, final StringBuilder sb ) { + if ( node != null ) { + if ( getControlPanel().isShowNodeNames() && ( !ForesterUtil.isEmpty( node.getName() ) ) ) { + if ( sb.length() > 0 ) { + sb.append( " " ); + } + sb.append( node.getName() ); + } + if ( node.getNodeData().isHasSequence() ) { + if ( getControlPanel().isShowSeqSymbols() + && ( node.getNodeData().getSequence().getSymbol().length() > 0 ) ) { + if ( sb.length() > 0 ) { + sb.append( " " ); + } + sb.append( node.getNodeData().getSequence().getSymbol() ); + } + if ( getControlPanel().isShowGeneNames() + && ( node.getNodeData().getSequence().getGeneName().length() > 0 ) ) { + if ( sb.length() > 0 ) { + sb.append( " " ); + } + sb.append( node.getNodeData().getSequence().getGeneName() ); + } + if ( getControlPanel().isShowSeqNames() && ( node.getNodeData().getSequence().getName().length() > 0 ) ) { + if ( sb.length() > 0 ) { + sb.append( " " ); + } + sb.append( node.getNodeData().getSequence().getName() ); + } + if ( getControlPanel().isShowSequenceAcc() + && ( node.getNodeData().getSequence().getAccession() != null ) ) { + if ( sb.length() > 0 ) { + sb.append( " " ); + } + if ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getAccession().getSource() ) ) { + sb.append( node.getNodeData().getSequence().getAccession().getSource() ); + sb.append( ":" ); + } + sb.append( node.getNodeData().getSequence().getAccession().getValue() ); + } + } + if ( getControlPanel().isShowProperties() && node.getNodeData().isHasProperties() ) { + if ( sb.length() > 0 ) { + sb.append( " " ); + } + sb.append( propertiesToString( node ) ); + } + } + } + + private final void nodeTaxonomyDataAsSB( final Taxonomy taxonomy, final StringBuilder sb ) { + if ( _control_panel.isShowTaxonomyCode() && !ForesterUtil.isEmpty( taxonomy.getTaxonomyCode() ) ) { + sb.append( taxonomy.getTaxonomyCode() ); + sb.append( " " ); + } + if ( _control_panel.isShowTaxonomyScientificNames() && _control_panel.isShowTaxonomyCommonNames() ) { + if ( !ForesterUtil.isEmpty( taxonomy.getScientificName() ) + && !ForesterUtil.isEmpty( taxonomy.getCommonName() ) ) { + if ( getOptions().isAbbreviateScientificTaxonNames() + && ( taxonomy.getScientificName().indexOf( ' ' ) > 0 ) ) { + abbreviateScientificName( taxonomy.getScientificName(), sb ); + } + else { + sb.append( taxonomy.getScientificName() ); + } + sb.append( " (" ); + sb.append( taxonomy.getCommonName() ); + sb.append( ") " ); + } + else if ( !ForesterUtil.isEmpty( taxonomy.getScientificName() ) ) { + if ( getOptions().isAbbreviateScientificTaxonNames() + && ( taxonomy.getScientificName().indexOf( ' ' ) > 0 ) ) { + abbreviateScientificName( taxonomy.getScientificName(), sb ); + } + else { + sb.append( taxonomy.getScientificName() ); + } + sb.append( " " ); + } + else if ( !ForesterUtil.isEmpty( taxonomy.getCommonName() ) ) { + sb.append( taxonomy.getCommonName() ); + sb.append( " " ); + } + } + else if ( _control_panel.isShowTaxonomyScientificNames() ) { + if ( !ForesterUtil.isEmpty( taxonomy.getScientificName() ) ) { + if ( getOptions().isAbbreviateScientificTaxonNames() + && ( taxonomy.getScientificName().indexOf( ' ' ) > 0 ) ) { + abbreviateScientificName( taxonomy.getScientificName(), sb ); + } + else { + sb.append( taxonomy.getScientificName() ); + } + sb.append( " " ); + } + } + else if ( _control_panel.isShowTaxonomyCommonNames() ) { + if ( !ForesterUtil.isEmpty( taxonomy.getCommonName() ) ) { + sb.append( taxonomy.getCommonName() ); + sb.append( " " ); + } + } + } + private final String obtainTitleForExtDescNodeData() { switch ( getOptions().getExtDescNodeDataToReturn() ) { case NODE_NAME: @@ -3250,6 +3603,36 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } + final private void openPdbWeb( final PhylogenyNode node ) { + final List pdb_ids = getPdbAccs( node ); + if ( ForesterUtil.isEmpty( pdb_ids ) ) { + cannotOpenBrowserWarningMessage( "PDB" ); + return; + } + final List uri_strs = TreePanelUtil.createUrisForPdbWeb( node, pdb_ids, getConfiguration(), this ); + if ( !ForesterUtil.isEmpty( uri_strs ) ) { + for( final String uri_str : uri_strs ) { + try { + AptxUtil.launchWebBrowser( new URI( uri_str ), + isApplet(), + isApplet() ? obtainApplet() : null, + "_aptx_seq" ); + } + catch ( final IOException e ) { + AptxUtil.showErrorMessage( this, e.toString() ); + e.printStackTrace(); + } + catch ( final URISyntaxException e ) { + AptxUtil.showErrorMessage( this, e.toString() ); + e.printStackTrace(); + } + } + } + else { + cannotOpenBrowserWarningMessage( "PDB" ); + } + } + final private void openSeqWeb( final PhylogenyNode node ) { if ( ForesterUtil.isEmpty( isCanOpenSeqWeb( node ) ) ) { cannotOpenBrowserWarningMessage( "sequence" ); @@ -3261,7 +3644,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee AptxUtil.launchWebBrowser( new URI( uri_str ), isApplet(), isApplet() ? obtainApplet() : null, - "_aptx_seq" ); + "_aptx_seq" ); } catch ( final IOException e ) { AptxUtil.showErrorMessage( this, e.toString() ); @@ -3344,7 +3727,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee AptxUtil.launchWebBrowser( new URI( uri_str ), isApplet(), isApplet() ? obtainApplet() : null, - "_aptx_tax" ); + "_aptx_tax" ); } catch ( final IOException e ) { AptxUtil.showErrorMessage( this, e.toString() ); @@ -3374,20 +3757,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( !node.isRoot() ) { if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) { TreePanel.drawString( FORMATTER_BRANCH_LENGTH.format( node.getDistanceToParent() ), node.getParent() - .getXcoord() + EURO_D, node.getYcoord() - getTreeFontSet()._small_max_descent, g ); + .getXcoord() + EURO_D, node.getYcoord() - getTreeFontSet().getSmallMaxDescent(), g ); } else if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) { TreePanel.drawString( FORMATTER_BRANCH_LENGTH.format( node.getDistanceToParent() ), node.getParent() - .getXcoord() + ROUNDED_D, node.getYcoord() - getTreeFontSet()._small_max_descent, g ); + .getXcoord() + ROUNDED_D, node.getYcoord() - getTreeFontSet().getSmallMaxDescent(), g ); } else { TreePanel.drawString( FORMATTER_BRANCH_LENGTH.format( node.getDistanceToParent() ), node.getParent() - .getXcoord() + 3, node.getYcoord() - getTreeFontSet()._small_max_descent, g ); + .getXcoord() + 3, node.getYcoord() - getTreeFontSet().getSmallMaxDescent(), g ); } } else { TreePanel.drawString( FORMATTER_BRANCH_LENGTH.format( node.getDistanceToParent() ), 3, node.getYcoord() - - getTreeFontSet()._small_max_descent, g ); + - getTreeFontSet().getSmallMaxDescent(), g ); } } @@ -3409,7 +3792,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final float dx = x2 - x1; final float dy = y2 - y1; _cubic_curve.setCurve( x1, y1, x1 + ( dx * 0.4f ), y1 + ( dy * 0.2f ), x1 + ( dx * 0.6f ), y1 - + ( dy * 0.8f ), x2, y2 ); + + ( dy * 0.8f ), x2, y2 ); ( g ).draw( _cubic_curve ); } else { @@ -3426,7 +3809,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee /** * Paint a branch which consists of a vertical and a horizontal bar - * @param is_ind_found_nodes + * @param is_ind_found_nodes */ final private void paintBranchRectangular( final Graphics2D g, final float x1, @@ -3448,7 +3831,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final float dx = x2 - x1; final float dy = y2 - y1; _cubic_curve.setCurve( x1, y1, x1 + ( dx * 0.4f ), y1 + ( dy * 0.2f ), x1 + ( dx * 0.6f ), y1 - + ( dy * 0.8f ), x2, y2 ); + + ( dy * 0.8f ), x2, y2 ); g.draw( _cubic_curve ); } else { @@ -3549,8 +3932,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } if ( node.isExternal() ) { - paintNodeBox( x2, y2, node, g, to_pdf, to_graphics_file, isInFoundNodes( node ) - || isInCurrentExternalNodes( node ) ); + paintNodeBox( x2, y2, node, g, to_pdf, to_graphics_file ); } } @@ -3635,12 +4017,15 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee c = Color.BLACK; } else if ( is_in_found_nodes ) { - c = getTreeColorSet().getFoundColor(); + c = getColorForFoundNode( node ); + } + else if ( getControlPanel().isColorAccordingToSequence() ) { + c = getSequenceBasedColor( node ); } else if ( getControlPanel().isColorAccordingToTaxonomy() ) { c = getTaxonomyBasedColor( node ); } - else if ( getOptions().isColorLabelsSameAsParentBranch() && getControlPanel().isColorBranches() + else if ( getOptions().isColorLabelsSameAsParentBranch() && getControlPanel().isUseVisualStyles() && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) { c = PhylogenyMethods.getBranchColorValue( node ); } @@ -3659,17 +4044,17 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee d = box_size; } final float xx = node.getXcoord() - ( 2 * box_size ); - final float xxx = xx > node.getParent().getXcoord() + 1 ? xx : node.getParent().getXcoord() + 1; + final float xxx = xx > ( node.getParent().getXcoord() + 1 ) ? xx : node.getParent().getXcoord() + 1; _polygon.reset(); _polygon.moveTo( xxx, node.getYcoord() ); _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 ); @@ -3690,51 +4075,41 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final boolean to_pdf, final boolean to_graphics_file ) { final List confidences = node.getBranchData().getConfidences(); - // if ( confidences.size() == 1 ) { - // final double value = node.getBranchData().getConfidence( 0 ).getValue(); - // if ( ( value == Confidence.CONFIDENCE_DEFAULT_VALUE ) || ( value < getOptions().getMinConfidenceValue() ) ) { - // return; - // } - // conf_str = FORMATTER_CONFIDENCE.format( value ); - // } - // else if ( confidences.size() > 1 ) { - boolean one_ok = false; boolean not_first = false; Collections.sort( confidences ); final StringBuilder sb = new StringBuilder(); - String conf_str = ""; for( final Confidence confidence : confidences ) { - final double value = confidence.getValue(); - if ( value != Confidence.CONFIDENCE_DEFAULT_VALUE ) { - if ( value >= getOptions().getMinConfidenceValue() ) { - one_ok = true; - } - if ( not_first ) { - sb.append( "/" ); - } - else { - not_first = true; - } - sb.append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( value, getOptions() - .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) ); - if ( getOptions().isShowConfidenceStddev() ) { - if ( confidence.getStandardDeviation() != Confidence.CONFIDENCE_DEFAULT_VALUE ) { - sb.append( "(" ); - sb.append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( confidence.getStandardDeviation(), - getOptions() - .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) ); - sb.append( ")" ); + if ( ForesterUtil.isEmpty( SHOW_ONLY_THIS_CONF_TYPE ) + || ( !ForesterUtil.isEmpty( confidence.getType() ) && confidence.getType() + .equalsIgnoreCase( SHOW_ONLY_THIS_CONF_TYPE ) ) ) { + final double value = confidence.getValue(); + if ( value != Confidence.CONFIDENCE_DEFAULT_VALUE ) { + if ( value < getOptions().getMinConfidenceValue() ) { + return; + } + if ( not_first ) { + sb.append( "/" ); + } + else { + not_first = true; + } + sb.append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( value, getOptions() + .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) ); + if ( getOptions().isShowConfidenceStddev() ) { + if ( confidence.getStandardDeviation() != Confidence.CONFIDENCE_DEFAULT_VALUE ) { + sb.append( "(" ); + sb.append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( confidence + .getStandardDeviation(), getOptions() + .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) ); + sb.append( ")" ); + } } } } - //} - if ( one_ok ) { - conf_str = sb.toString(); - } } - if ( conf_str.length() > 0 ) { - final double parent_x = node.getParent().getXcoord(); - double x = node.getXcoord(); + if ( sb.length() > 0 ) { + final float parent_x = node.getParent().getXcoord(); + float x = node.getXcoord(); g.setFont( getTreeFontSet().getSmallFont() ); if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) { x += EURO_D; @@ -3748,80 +4123,108 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else { g.setColor( getTreeColorSet().getConfidenceColor() ); } - TreePanel - .drawString( conf_str, - parent_x - + ( ( x - parent_x - getTreeFontSet()._fm_small.stringWidth( conf_str ) ) / 2 ), - ( node.getYcoord() + getTreeFontSet()._small_max_ascent ) - 1, - g ); + final String conf_str = sb.toString(); + TreePanel.drawString( conf_str, + parent_x + + ( ( x - parent_x - getTreeFontSet().getFontMetricsSmall() + .stringWidth( conf_str ) ) / 2 ), + ( node.getYcoord() + getTreeFontSet().getSmallMaxAscent() ) - 1, + g ); } } - final private void paintFoundNode( final int x, final int y, final Graphics2D g ) { - final int box_size = getOptions().getDefaultNodeShapeSize(); - final int half_box_size = getOptions().getDefaultNodeShapeSize() / 2; - g.setColor( getTreeColorSet().getFoundColor() ); - g.fillRect( x - half_box_size, y - half_box_size, box_size, box_size ); - } - final private void paintGainedAndLostCharacters( final Graphics2D g, final PhylogenyNode node, final String gained, final String lost ) { if ( node.getParent() != null ) { - final double parent_x = node.getParent().getXcoord(); - final double x = node.getXcoord(); + final float parent_x = node.getParent().getXcoord(); + final float x = node.getXcoord(); g.setFont( getTreeFontSet().getLargeFont() ); g.setColor( getTreeColorSet().getGainedCharactersColor() ); if ( Constants.SPECIAL_CUSTOM ) { g.setColor( Color.BLUE ); } TreePanel - .drawString( gained, - parent_x + ( ( x - parent_x - getTreeFontSet()._fm_large.stringWidth( gained ) ) / 2 ), - ( node.getYcoord() - getTreeFontSet()._fm_large.getMaxDescent() ), - g ); + .drawString( gained, + parent_x + + ( ( x - parent_x - getFontMetricsForLargeDefaultFont().stringWidth( gained ) ) / 2 ), + ( node.getYcoord() - getFontMetricsForLargeDefaultFont().getMaxDescent() ), + g ); g.setColor( getTreeColorSet().getLostCharactersColor() ); - TreePanel.drawString( lost, - parent_x + ( ( x - parent_x - getTreeFontSet()._fm_large.stringWidth( lost ) ) / 2 ), - ( node.getYcoord() + getTreeFontSet()._fm_large.getMaxAscent() ), - g ); + TreePanel + .drawString( lost, + parent_x + + ( ( x - parent_x - getFontMetricsForLargeDefaultFont().stringWidth( lost ) ) / 2 ), + ( node.getYcoord() + getFontMetricsForLargeDefaultFont().getMaxAscent() ), + g ); } } /** * Draw a box at the indicated node. - * + * * @param x * @param y * @param node * @param g */ - final private void paintNodeBox( final double x, - final double y, + final private void paintNodeBox( final float x, + final float y, final PhylogenyNode node, final Graphics2D g, final boolean to_pdf, - final boolean to_graphics_file, - final boolean is_in_found_nodes ) { + final boolean to_graphics_file ) { if ( node.isCollapse() ) { return; } // if this node should be highlighted, do so if ( ( _highlight_node == node ) && !to_pdf && !to_graphics_file ) { - g.setColor( getTreeColorSet().getFoundColor() ); + g.setColor( getTreeColorSet().getFoundColor0() ); drawOval( x - 8, y - 8, 16, 16, g ); drawOval( x - 9, y - 8, 17, 17, g ); drawOval( x - 9, y - 9, 18, 18, g ); } - if ( is_in_found_nodes ) { - paintFoundNode( ForesterUtil.roundToInt( x ), ForesterUtil.roundToInt( y ), g ); - } - else { + if ( ( isInFoundNodes( node ) || isInCurrentExternalNodes( node ) ) + || ( getOptions().isShowDefaultNodeShapesExternal() && node.isExternal() ) + || ( getOptions().isShowDefaultNodeShapesInternal() && node.isInternal() ) + || ( getOptions().isShowDefaultNodeShapesForMarkedNodes() + && ( node.getNodeData().getNodeVisualData() != null ) && ( !node.getNodeData() + .getNodeVisualData().isEmpty() ) ) + || ( getControlPanel().isUseVisualStyles() && ( ( node.getNodeData().getNodeVisualData() != null ) && ( ( node + .getNodeData().getNodeVisualData().getNodeColor() != null ) + || ( node.getNodeData().getNodeVisualData().getSize() != NodeVisualData.DEFAULT_SIZE ) + || ( node.getNodeData().getNodeVisualData().getFillType() != NodeFill.DEFAULT ) || ( node + .getNodeData().getNodeVisualData().getShape() != NodeShape.DEFAULT ) ) ) ) + || ( getControlPanel().isEvents() && node.isHasAssignedEvent() && ( node.getNodeData().getEvent() + .isDuplication() + || node.getNodeData().getEvent().isSpeciation() || node.getNodeData().getEvent() + .isSpeciationOrDuplication() ) ) ) { + NodeVisualData vis = null; + if ( getControlPanel().isUseVisualStyles() && ( node.getNodeData().getNodeVisualData() != null ) + && ( !node.getNodeData().getNodeVisualData().isEmpty() ) ) { + vis = node.getNodeData().getNodeVisualData(); + } + float box_size = getOptions().getDefaultNodeShapeSize(); + if ( ( vis != null ) && ( vis.getSize() != NodeVisualData.DEFAULT_SIZE ) ) { + box_size = vis.getSize(); + } + final float half_box_size = box_size / 2.0f; 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 ( vis != null ) { + if ( vis.getNodeColor() != null ) { + outline_color = vis.getNodeColor(); + } + else if ( vis.getFontColor() != null ) { + outline_color = vis.getFontColor(); + } + } else if ( getControlPanel().isEvents() && TreePanelUtil.isHasAssignedEvent( node ) ) { final Event event = node.getNodeData().getEvent(); if ( event.isDuplication() ) { @@ -3834,100 +4237,133 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee outline_color = getTreeColorSet().getDuplicationOrSpeciationColor(); } } - else if ( getOptions().isTaxonomyColorizeNodeShapes() ) { - outline_color = getTaxonomyBasedColor( node ); - } - else { + if ( outline_color == null ) { 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() ) ) { + NodeShape shape = null; + if ( vis != null ) { + if ( vis.getShape() == NodeShape.CIRCLE ) { + shape = NodeShape.CIRCLE; + } + else if ( vis.getShape() == NodeShape.RECTANGLE ) { + shape = NodeShape.RECTANGLE; + } + } + if ( shape == null ) { 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 ); + shape = NodeShape.CIRCLE; + } + else if ( getOptions().getDefaultNodeShape() == NodeShape.RECTANGLE ) { + shape = NodeShape.RECTANGLE; + } + } + NodeFill fill = null; + if ( vis != null ) { + if ( vis.getFillType() == NodeFill.SOLID ) { + fill = NodeFill.SOLID; + } + else if ( vis.getFillType() == NodeFill.NONE ) { + fill = NodeFill.NONE; + } + else if ( vis.getFillType() == NodeFill.GRADIENT ) { + fill = NodeFill.GRADIENT; + } + } + if ( fill == null ) { + if ( getOptions().getDefaultNodeFill() == NodeFill.SOLID ) { + fill = NodeFill.SOLID; + } + else if ( getOptions().getDefaultNodeFill() == NodeFill.NONE ) { + fill = NodeFill.NONE; + } + else if ( getOptions().getDefaultNodeFill() == NodeFill.GRADIENT ) { + fill = NodeFill.GRADIENT; + } + } + Color vis_fill_color = null; + if ( ( vis != null ) && ( vis.getNodeColor() != null ) ) { + vis_fill_color = vis.getNodeColor(); + } + if ( shape == NodeShape.CIRCLE ) { + if ( fill == 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 ( fill == NodeFill.NONE ) { + Color background = getBackground(); + if ( to_pdf ) { + background = Color.WHITE; } - 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 ); + drawOvalGradient( x - half_box_size, + y - half_box_size, + box_size, + box_size, + g, + background, + background, + outline_color ); + } + else if ( fill == NodeVisualData.NodeFill.SOLID ) { + if ( vis_fill_color != null ) { + g.setColor( vis_fill_color ); } - else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.SOLID ) { + else { g.setColor( outline_color ); - drawOvalFilled( x - half_box_size, y - half_box_size, box_size, box_size, g ); } + drawOvalFilled( x - half_box_size, y - half_box_size, box_size, box_size, g ); + } + } + else if ( shape == NodeVisualData.NodeShape.RECTANGLE ) { + if ( fill == 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().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 ( fill == NodeVisualData.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 ); + drawRectGradient( x - half_box_size, + y - half_box_size, + box_size, + box_size, + g, + background, + background, + outline_color ); + } + else if ( fill == NodeVisualData.NodeFill.SOLID ) { + if ( vis_fill_color != null ) { + g.setColor( vis_fill_color ); } - else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.SOLID ) { + else { g.setColor( outline_color ); - drawRectFilled( x - half_box_size, y - half_box_size, box_size, box_size, g ); } + drawRectFilled( x - half_box_size, y - half_box_size, box_size, box_size, g ); } } } } - final private void paintNodeData( final Graphics2D g, - final PhylogenyNode node, - final boolean to_graphics_file, - final boolean to_pdf, - final boolean is_in_found_nodes ) { + final private int paintNodeData( final Graphics2D g, + final PhylogenyNode node, + final boolean to_graphics_file, + final boolean to_pdf, + final boolean is_in_found_nodes ) { if ( isNodeDataInvisible( node ) && !to_graphics_file && !to_pdf ) { - return; + return 0; } - if ( getOptions().isShowBranchLengthValues() + if ( getControlPanel().isWriteBranchLengthValues() && ( ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR ) || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) ) - && ( !node.isRoot() ) && ( node.getDistanceToParent() != PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ) ) { + && ( !node.isRoot() ) && ( node.getDistanceToParent() != PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ) ) { paintBranchLength( g, node, to_pdf, to_graphics_file ); } if ( !getControlPanel().isShowInternalData() && !node.isExternal() && !node.isCollapse() ) { - return; + return 0; } _sb.setLength( 0 ); int x = 0; @@ -3944,34 +4380,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee .isShowTaxonomyCommonNames() ) && node.getNodeData().isHasTaxonomy() ) { x += paintTaxonomy( g, node, is_in_found_nodes, to_pdf, to_graphics_file, x ); } - if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) { - g.setColor( Color.BLACK ); - } - else if ( is_in_found_nodes ) { - g.setColor( getTreeColorSet().getFoundColor() ); - } - else if ( getControlPanel().isColorAccordingToTaxonomy() ) { - g.setColor( getTaxonomyBasedColor( node ) ); - } - else if ( getControlPanel().isColorAccordingToAnnotation() - && ( node.getNodeData().isHasSequence() && ( node.getNodeData().getSequence().getAnnotations() != null ) && ( !node - .getNodeData().getSequence().getAnnotations().isEmpty() ) ) ) { - g.setColor( calculateColorForAnnotation( node.getNodeData().getSequence().getAnnotations() ) ); - } - else if ( getOptions().isColorLabelsSameAsParentBranch() && getControlPanel().isColorBranches() - && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) { - g.setColor( PhylogenyMethods.getBranchColorValue( node ) ); - } - else if ( to_pdf ) { - g.setColor( Color.BLACK ); - } - else { - g.setColor( getTreeColorSet().getSequenceColor() ); - } + setColor( g, node, to_graphics_file, to_pdf, is_in_found_nodes, getTreeColorSet().getSequenceColor() ); if ( node.isCollapse() && ( ( !node.isRoot() && !node.getParent().isCollapse() ) || node.isRoot() ) ) { if ( _sb.length() > 0 ) { _sb.setLength( 0 ); - _sb.append( "(" ); + _sb.append( " (" ); _sb.append( node.getAllExternalDescendants().size() ); _sb.append( ")" ); } @@ -3979,58 +4392,20 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else { _sb.setLength( 0 ); } - if ( getControlPanel().isShowNodeNames() && ( node.getName().length() > 0 ) ) { - if ( _sb.length() > 0 ) { - _sb.append( " " ); - } - _sb.append( node.getName() ); - } - if ( node.getNodeData().isHasSequence() ) { - if ( getControlPanel().isShowSeqSymbols() && ( node.getNodeData().getSequence().getSymbol().length() > 0 ) ) { - if ( _sb.length() > 0 ) { - _sb.append( " " ); - } - _sb.append( node.getNodeData().getSequence().getSymbol() ); - } - if ( getControlPanel().isShowGeneNames() && ( node.getNodeData().getSequence().getGeneName().length() > 0 ) ) { - if ( _sb.length() > 0 ) { - _sb.append( " " ); - } - _sb.append( node.getNodeData().getSequence().getGeneName() ); - } - if ( getControlPanel().isShowSeqNames() && ( node.getNodeData().getSequence().getName().length() > 0 ) ) { - if ( _sb.length() > 0 ) { - _sb.append( " " ); - } - _sb.append( node.getNodeData().getSequence().getName() ); - } - if ( getControlPanel().isShowSequenceAcc() && ( node.getNodeData().getSequence().getAccession() != null ) ) { - if ( _sb.length() > 0 ) { - _sb.append( " " ); - } - if ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getAccession().getSource() ) ) { - _sb.append( node.getNodeData().getSequence().getAccession().getSource() ); - _sb.append( ":" ); - } - _sb.append( node.getNodeData().getSequence().getAccession().getValue() ); - } - } - if ( getControlPanel().isShowProperties() && node.getNodeData().isHasProperties() ) { - if ( _sb.length() > 0 ) { - _sb.append( " " ); - } - _sb.append( propertiesToString( node ) ); - } - g.setFont( getTreeFontSet().getLargeFont() ); - if ( is_in_found_nodes ) { - g.setFont( getTreeFontSet().getLargeFont().deriveFont( Font.BOLD ) ); - } - double down_shift_factor = 3.0; + nodeDataAsSB( node, _sb ); + final boolean using_visual_font = setFont( g, node, is_in_found_nodes ); + float down_shift_factor = 3.0f; if ( !node.isExternal() && ( node.getNumberOfDescendants() == 1 ) ) { down_shift_factor = 1; } - final double pos_x = node.getXcoord() + x + 2 + half_box_size; - final double pos_y = ( node.getYcoord() + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ) ); + final float pos_x = node.getXcoord() + x + 2 + half_box_size; + float pos_y; + if ( !using_visual_font ) { + pos_y = ( node.getYcoord() + ( getFontMetricsForLargeDefaultFont().getAscent() / down_shift_factor ) ); + } + else { + pos_y = ( node.getYcoord() + ( getFontMetrics( g.getFont() ).getAscent() / down_shift_factor ) ); + } final String sb_str = _sb.toString(); // GUILHEM_BEG ______________ if ( _control_panel.isShowSequenceRelations() && node.getNodeData().isHasSequence() @@ -4052,21 +4427,21 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final boolean fGotRelationWithQuery = ( seqRelation.getRef0().isEqual( _query_sequence ) || seqRelation .getRef1().isEqual( _query_sequence ) ) && seqRelation.getType().equals( getControlPanel().getSequenceRelationTypeBox() - .getSelectedItem() ); + .getSelectedItem() ); if ( fGotRelationWithQuery ) { // we will underline the text to show that this sequence is ortholog to the query final double linePosX = node.getXcoord() + 2 + half_box_size; final String sConfidence = ( !getControlPanel().isShowSequenceRelationConfidence() || ( seqRelation .getConfidence() == null ) ) ? null : " (" + seqRelation.getConfidence().getValue() - + ")"; + + ")"; if ( sConfidence != null ) { - double confidenceX = pos_x; + float confidenceX = pos_x; if ( sb_str.length() > 0 ) { confidenceX += new TextLayout( sb_str, g.getFont(), _frc ).getBounds().getWidth() + CONFIDENCE_LEFT_MARGIN; } - if ( confidenceX > linePosX ) { // let's only display confidence value if we are already displaying at least one of Prot/Gene Name and Taxonomy Code + if ( confidenceX > linePosX ) { // let's only display confidence value if we are already displaying at least one of Prot/Gene Name and Taxonomy Code final int confidenceWidth = ( int ) new TextLayout( sConfidence, g.getFont(), _frc ) - .getBounds().getWidth(); + .getBounds().getWidth(); TreePanel.drawString( sConfidence, confidenceX, pos_y, g ); x += CONFIDENCE_LEFT_MARGIN + confidenceWidth; } @@ -4080,7 +4455,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee nodeTextBoundsWidth += 2; } g.drawLine( ( int ) linePosX + 1, 3 + ( int ) pos_y, ( int ) linePosX + x - + nodeTextBoundsWidth, 3 + ( int ) pos_y ); + + nodeTextBoundsWidth, 3 + ( int ) pos_y ); break; } } @@ -4091,19 +4466,17 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee TreePanel.drawString( sb_str, pos_x, pos_y, g ); } // GUILHEM_END _____________ - // COMMENTED_OUT_BY_GUILHEM_BEG _______________ - // TODO FIXME need to check this one! - //if ( _sb.length() > 0 ) { - // TreePanel.drawString( _sb.toString(), node.getXcoord() + x + 2 + TreePanel.HALF_BOX_SIZE, node.getYcoord() - // + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ), g ); - //} - // COMMENTED_OUT_BY_GUILHEM_END ________________ + if ( _sb.length() > 0 ) { + if ( !using_visual_font && !is_in_found_nodes ) { + x += getFontMetricsForLargeDefaultFont().stringWidth( _sb.toString() ) + 5; + } + else { + x += getFontMetrics( g.getFont() ).stringWidth( _sb.toString() ) + 5; + } + } if ( getControlPanel().isShowAnnotation() && node.getNodeData().isHasSequence() && ( node.getNodeData().getSequence().getAnnotations() != null ) && ( !node.getNodeData().getSequence().getAnnotations().isEmpty() ) ) { - if ( _sb.length() > 0 ) { - x += getTreeFontSet()._fm_large.stringWidth( _sb.toString() ) + 5; - } final SortedSet ann = node.getNodeData().getSequence().getAnnotations(); if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) { g.setColor( Color.BLACK ); @@ -4113,18 +4486,23 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } final String ann_str = TreePanelUtil.createAnnotationString( ann, getOptions().isShowAnnotationRefSource() ); TreePanel.drawString( ann_str, node.getXcoord() + x + 3 + half_box_size, node.getYcoord() - + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ), g ); + + ( getFontMetricsForLargeDefaultFont().getAscent() / down_shift_factor ), g ); _sb.setLength( 0 ); _sb.append( ann_str ); + if ( _sb.length() > 0 ) { + if ( !using_visual_font && !is_in_found_nodes ) { + x += getFontMetricsForLargeDefaultFont().stringWidth( _sb.toString() ) + 5; + } + else { + x += getFontMetrics( g.getFont() ).stringWidth( _sb.toString() ) + 5; + } + } } if ( ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR ) || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) ) { if ( ( getControlPanel().isShowBinaryCharacters() || getControlPanel().isShowBinaryCharacterCounts() ) && node.getNodeData().isHasBinaryCharacters() ) { - if ( _sb.length() > 0 ) { - x += getTreeFontSet()._fm_large.stringWidth( _sb.toString() ) + 5; - } if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) { g.setColor( Color.BLACK ); } @@ -4133,24 +4511,26 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } if ( getControlPanel().isShowBinaryCharacters() ) { TreePanel.drawString( node.getNodeData().getBinaryCharacters().getPresentCharactersAsStringBuffer() - .toString(), node.getXcoord() + x + 1 + half_box_size, node.getYcoord() - + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ), g ); + .toString(), node.getXcoord() + x + 1 + half_box_size, node.getYcoord() + + ( getFontMetricsForLargeDefaultFont().getAscent() / down_shift_factor ), g ); paintGainedAndLostCharacters( g, node, node.getNodeData().getBinaryCharacters() - .getGainedCharactersAsStringBuffer().toString(), node.getNodeData().getBinaryCharacters() - .getLostCharactersAsStringBuffer().toString() ); + .getGainedCharactersAsStringBuffer().toString(), node.getNodeData().getBinaryCharacters() + .getLostCharactersAsStringBuffer().toString() ); } else { - TreePanel.drawString( " " + node.getNodeData().getBinaryCharacters().getPresentCount(), - node.getXcoord() + x + 4 + half_box_size, - node.getYcoord() - + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ), - g ); + TreePanel + .drawString( " " + node.getNodeData().getBinaryCharacters().getPresentCount(), + node.getXcoord() + x + 4 + half_box_size, + node.getYcoord() + + ( getFontMetricsForLargeDefaultFont().getAscent() / down_shift_factor ), + g ); paintGainedAndLostCharacters( g, node, "+" + node.getNodeData().getBinaryCharacters().getGainedCount(), "-" - + node.getNodeData().getBinaryCharacters().getLostCount() ); + + node.getNodeData().getBinaryCharacters().getLostCount() ); } } } + return x; } final private void paintNodeDataUnrootedCirc( final Graphics2D g, @@ -4163,23 +4543,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( isNodeDataInvisibleUnrootedCirc( node ) && !to_graphics_file && !to_pdf ) { return; } - if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) { - g.setColor( Color.BLACK ); - } - else if ( is_in_found_nodes ) { - g.setColor( getTreeColorSet().getFoundColor() ); - } - else if ( getControlPanel().isColorAccordingToTaxonomy() ) { - g.setColor( getTaxonomyBasedColor( node ) ); - } - else if ( getControlPanel().isColorAccordingToAnnotation() - && ( node.getNodeData().isHasSequence() && ( node.getNodeData().getSequence().getAnnotations() != null ) && ( !node - .getNodeData().getSequence().getAnnotations().isEmpty() ) ) ) { - g.setColor( calculateColorForAnnotation( node.getNodeData().getSequence().getAnnotations() ) ); - } - else { - g.setColor( getTreeColorSet().getSequenceColor() ); - } _sb.setLength( 0 ); _sb.append( " " ); if ( node.getNodeData().isHasTaxonomy() @@ -4249,11 +4612,13 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _sb.append( node.getNodeData().getSequence().getName() ); } } - g.setFont( getTreeFontSet().getLargeFont() ); - if ( is_in_found_nodes ) { - g.setFont( getTreeFontSet().getLargeFont().deriveFont( Font.BOLD ) ); - } + //g.setFont( getTreeFontSet().getLargeFont() ); + //if ( is_in_found_nodes ) { + // g.setFont( getTreeFontSet().getLargeFont().deriveFont( Font.BOLD ) ); + // } if ( _sb.length() > 1 ) { + setColor( g, node, to_graphics_file, to_pdf, is_in_found_nodes, getTreeColorSet().getSequenceColor() ); + final boolean using_visual_font = setFont( g, node, is_in_found_nodes ); final String sb_str = _sb.toString(); double m = 0; if ( _graphics_type == PHYLOGENY_GRAPHICS_TYPE.CIRCULAR ) { @@ -4265,7 +4630,13 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _at = g.getTransform(); boolean need_to_reset = false; final float x_coord = node.getXcoord(); - final float y_coord = node.getYcoord() + ( getTreeFontSet()._fm_large.getAscent() / 3.0f ); + float y_coord; + if ( !using_visual_font ) { + y_coord = node.getYcoord() + ( getFontMetricsForLargeDefaultFont().getAscent() / 3.0f ); + } + else { + y_coord = node.getYcoord() + ( getFontMetrics( g.getFont() ).getAscent() / 3.0f ); + } if ( radial_labels ) { need_to_reset = true; boolean left = false; @@ -4275,13 +4646,24 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } g.rotate( m, x_coord, node.getYcoord() ); if ( left ) { - g.translate( -( getTreeFontSet()._fm_large.getStringBounds( sb_str, g ).getWidth() ), 0 ); + if ( !using_visual_font ) { + g.translate( -( getFontMetricsForLargeDefaultFont().getStringBounds( sb_str, g ).getWidth() ), + 0 ); + } + else { + g.translate( -( getFontMetrics( g.getFont() ).getStringBounds( sb_str, g ).getWidth() ), 0 ); + } } } else { if ( ( m > HALF_PI ) && ( m < ONEHALF_PI ) ) { need_to_reset = true; - g.translate( -getTreeFontSet()._fm_large.getStringBounds( sb_str, g ).getWidth(), 0 ); + if ( !using_visual_font ) { + g.translate( -getFontMetricsForLargeDefaultFont().getStringBounds( sb_str, g ).getWidth(), 0 ); + } + else { + g.translate( -getFontMetrics( g.getFont() ).getStringBounds( sb_str, g ).getWidth(), 0 ); + } } } TreePanel.drawString( sb_str, x_coord, y_coord, g ); @@ -4299,8 +4681,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return; } if ( isInFoundNodes( node ) || isInCurrentExternalNodes( node ) ) { - g.setColor( getTreeColorSet().getFoundColor() ); - drawRectFilled( node.getXSecondary() - 1, node.getYSecondary() - 1, 3, 3, g ); + g.setColor( getColorForFoundNode( node ) ); + 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() ) { @@ -4344,7 +4727,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final boolean to_pdf, final boolean dynamically_hide, final int dynamic_hiding_factor, - final boolean to_graphics_file ) { + final boolean to_graphics_file, + final boolean disallow_shortcutting ) { final boolean is_in_found_nodes = isInFoundNodes( node ) || isInCurrentExternalNodes( node ); if ( node.isCollapse() ) { if ( ( !node.isRoot() && !node.getParent().isCollapse() ) ) { @@ -4361,7 +4745,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee && !node.isRoot() && ( ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.ROUNDED ) || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR ) || ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE ) ) - && node.getBranchData().isHasConfidences() ) { + && node.getBranchData().isHasConfidences() ) { paintConfidenceValues( g, node, to_pdf, to_graphics_file ); } // Draw a line to root: @@ -4370,10 +4754,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } float new_x = 0; float new_x_min = Float.MAX_VALUE; - final boolean disallow_shortcutting = dynamic_hiding_factor < 40; float min_dist = 1.5f; if ( !disallow_shortcutting ) { - // System.out.println( dynamic_hiding_factor ); if ( dynamic_hiding_factor > 4000 ) { min_dist = 4; } @@ -4413,7 +4795,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final float diff_y = node.getYcoord() - y2; final float diff_x = node.getXcoord() - new_x; if ( disallow_shortcutting || ( diff_y > min_dist ) || ( diff_y < -min_dist ) || ( diff_x > min_dist ) - || ( diff_x < -min_dist ) || to_graphics_file || to_pdf ) { + || ( diff_x < -min_dist ) ) { paintBranchRectangular( g, node.getXcoord(), new_x, @@ -4427,123 +4809,150 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee child_node.setYcoord( y2 ); y2 += _y_distance * child_node.getNumberOfExternalNodes(); } - paintNodeBox( node.getXcoord(), node.getYcoord(), node, g, to_pdf, to_graphics_file, isInFoundNodes( node ) - || isInCurrentExternalNodes( node ) ); + paintNodeBox( node.getXcoord(), node.getYcoord(), node, g, to_pdf, to_graphics_file ); } if ( dynamically_hide && !is_in_found_nodes && ( ( node.isExternal() && ( ( _external_node_index % dynamic_hiding_factor ) != 1 ) ) || ( !node - .isExternal() && ( ( new_x_min < 20 ) || ( ( _y_distance * node.getNumberOfExternalNodes() ) < getTreeFontSet()._fm_large - .getHeight() ) ) ) ) ) { + .isExternal() && ( ( new_x_min < 20 ) || ( ( _y_distance * node.getNumberOfExternalNodes() ) < getFontMetricsForLargeDefaultFont() + .getHeight() ) ) ) ) ) { return; } - paintNodeData( g, node, to_graphics_file, to_pdf, is_in_found_nodes ); - paintNodeWithRenderableData( g, node, to_graphics_file, to_pdf ); + final int x = paintNodeData( g, node, to_graphics_file, to_pdf, is_in_found_nodes ); + paintNodeWithRenderableData( x, g, node, to_graphics_file, to_pdf ); } - final private void paintNodeWithRenderableData( final Graphics2D g, + final private void paintNodeWithRenderableData( final int x, + final Graphics2D g, final PhylogenyNode node, final boolean to_graphics_file, final boolean to_pdf ) { - if ( isNodeDataInvisible( node ) && !to_graphics_file ) { + if ( isNodeDataInvisible( node ) && !( to_graphics_file || to_pdf ) ) { return; } if ( ( !getControlPanel().isShowInternalData() && !node.isExternal() ) ) { return; } if ( getControlPanel().isShowDomainArchitectures() && node.getNodeData().isHasSequence() - && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) { + && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) + && ( node.getNodeData().getSequence().getDomainArchitecture() instanceof RenderableDomainArchitecture ) ) { RenderableDomainArchitecture rds = null; - if ( node.getNodeData().getSequence().getDomainArchitecture() instanceof RenderableDomainArchitecture ) { - try { - rds = ( RenderableDomainArchitecture ) node.getNodeData().getSequence().getDomainArchitecture(); - } - catch ( final ClassCastException cce ) { - cce.printStackTrace(); - } - if ( rds != null ) { - rds.setRenderingHeight( 6 ); - int x = 0; - if ( node.getNodeData().isHasTaxonomy() ) { - if ( getControlPanel().isShowTaxonomyCode() - && ( !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getTaxonomyCode() ) ) ) { - x += getTreeFontSet()._fm_large_italic.stringWidth( node.getNodeData().getTaxonomy() - .getTaxonomyCode() - + " " ); - } - if ( getControlPanel().isShowTaxonomyScientificNames() - && ( !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getScientificName() ) ) ) { - x += getTreeFontSet()._fm_large_italic.stringWidth( node.getNodeData().getTaxonomy() - .getScientificName() - + " " ); + try { + rds = ( RenderableDomainArchitecture ) node.getNodeData().getSequence().getDomainArchitecture(); + } + catch ( final ClassCastException cce ) { + cce.printStackTrace(); + } + if ( rds != null ) { + final int default_height = 7; + float y = getYdistance(); + if ( getControlPanel().isDynamicallyHideData() ) { + y = getTreeFontSet().getFontMetricsLarge().getHeight(); + } + final int h = y < default_height ? ForesterUtil.roundToInt( y ) : default_height; + rds.setRenderingHeight( h > 1 ? h : 2 ); + if ( getControlPanel().isDrawPhylogram() ) { + if ( getOptions().isLineUpRendarableNodeData() ) { + if ( getOptions().isRightLineUpDomains() ) { + rds.render( ( float ) ( ( getMaxDistanceToRoot() * getXcorrectionFactor() ) + + _length_of_longest_text + ( ( _longest_domain - rds.getTotalLength() ) * rds + .getRenderingFactorWidth() ) ), node.getYcoord() - ( h / 2.0f ), g, this, to_pdf ); } - if ( getControlPanel().isShowTaxonomyCommonNames() - && ( !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getCommonName() ) ) ) { - x += getTreeFontSet()._fm_large_italic.stringWidth( node.getNodeData().getTaxonomy() - .getCommonName() - + " " ); + else { + rds.render( ( float ) ( ( getMaxDistanceToRoot() * getXcorrectionFactor() ) + _length_of_longest_text ), + node.getYcoord() - ( h / 2.0f ), + g, + this, + to_pdf ); } } - if ( node.getNodeData().isHasSequence() ) { - if ( getControlPanel().isShowSeqNames() - && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getName() ) ) ) { - x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getName() - + " " ); - } - if ( getControlPanel().isShowSeqSymbols() - && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getSymbol() ) ) ) { - x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getSymbol() - + " " ); - } - if ( getControlPanel().isShowGeneNames() - && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getGeneName() ) ) ) { - x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getGeneName() - + " " ); - } - if ( getControlPanel().isShowSequenceAcc() - && ( node.getNodeData().getSequence().getAccession() != null ) ) { - x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence() - .getAccession().toString() - + " " ); - } - if ( getControlPanel().isShowAnnotation() - && ( node.getNodeData().getSequence().getAnnotations() != null ) - && ( !node.getNodeData().getSequence().getAnnotations().isEmpty() ) ) { - x += getTreeFontSet()._fm_large.stringWidth( TreePanelUtil.createAnnotationString( node - .getNodeData().getSequence().getAnnotations(), getOptions() - .isShowAnnotationRefSource() ) - + " " ); - } + else { + rds.render( node.getXcoord() + x, node.getYcoord() - ( h / 2.0f ), g, this, to_pdf ); + } + } + else { + if ( getOptions().isRightLineUpDomains() ) { + rds.render( ( ( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text ) - 20 ) + + ( ( _longest_domain - rds.getTotalLength() ) * rds + .getRenderingFactorWidth() ), + node.getYcoord() - ( h / 2.0f ), + g, + this, + to_pdf ); } - if ( getControlPanel().isShowNodeNames() && !ForesterUtil.isEmpty( node.getName() ) ) { - x += getTreeFontSet()._fm_large.stringWidth( node.getName() + " " ); + else { + rds.render( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text, + node.getYcoord() - ( h / 2.0f ), + g, + this, + to_pdf ); } - rds.render( node.getXcoord() + x, node.getYcoord() - 3, g, this, to_pdf ); } } } - ////////////// if ( getControlPanel().isShowVectorData() && ( node.getNodeData().getVector() != null ) && ( node.getNodeData().getVector().size() > 0 ) && ( getStatisticsForExpressionValues() != null ) ) { final RenderableVector rv = RenderableVector.createInstance( node.getNodeData().getVector(), getStatisticsForExpressionValues(), getConfiguration() ); if ( rv != null ) { - int x = 0; - PhylogenyNode my_node = node; - if ( !getControlPanel().isDrawPhylogram() ) { - my_node = getPhylogeny().getFirstExternalNode(); + double domain_add = 0; + if ( getControlPanel().isShowDomainArchitectures() && node.getNodeData().isHasSequence() + && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) { + domain_add = _domain_structure_width + 10; } - if ( getControlPanel().isShowTaxonomyCode() && ( PhylogenyMethods.getSpecies( my_node ).length() > 0 ) ) { - x += getTreeFontSet()._fm_large_italic.stringWidth( PhylogenyMethods.getSpecies( my_node ) + " " ); + if ( getControlPanel().isDrawPhylogram() ) { + rv.render( ( float ) ( node.getXcoord() + x + domain_add ), node.getYcoord() - 3, g, this, to_pdf ); + } + else { + rv.render( ( float ) ( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text + domain_add ), + node.getYcoord() - 3, + g, + this, + to_pdf ); + } + } + } + if ( getControlPanel().isShowMolSequences() && ( node.getNodeData().isHasSequence() ) + && ( node.getNodeData().getSequence().isMolecularSequenceAligned() ) + && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getMolecularSequence() ) ) ) { + final RenderableMsaSequence rs = RenderableMsaSequence.createInstance( node.getNodeData().getSequence() + .getMolecularSequence(), node.getNodeData().getSequence().getType(), getConfiguration() ); + if ( rs != null ) { + final int default_height = 7; + float y = getYdistance(); + if ( getControlPanel().isDynamicallyHideData() ) { + y = getTreeFontSet().getFontMetricsLarge().getHeight(); + } + final int h = y < default_height ? ForesterUtil.roundToInt( y ) : default_height; + rs.setRenderingHeight( h > 1 ? h : 2 ); + if ( getControlPanel().isDrawPhylogram() ) { + rs.render( ( float ) ( ( getMaxDistanceToRoot() * getXcorrectionFactor() ) + _length_of_longest_text ), + node.getYcoord() - ( h / 2.0f ), + g, + this, + to_pdf ); } - if ( getControlPanel().isShowNodeNames() && ( my_node.getName().length() > 0 ) ) { - x += getTreeFontSet()._fm_large.stringWidth( my_node.getName() + " " ); + else { + rs.render( getPhylogeny().getFirstExternalNode().getXcoord() + _length_of_longest_text, + node.getYcoord() - ( h / 2.0f ), + g, + this, + to_pdf ); } - rv.render( my_node.getXcoord() + x, node.getYcoord() - 5, g, this, to_pdf ); } } - ////////////// + } + + final private int calcLengthOfLongestText() { + final StringBuilder sb = new StringBuilder(); + if ( _ext_node_with_longest_txt_info != null ) { + nodeDataAsSB( _ext_node_with_longest_txt_info, sb ); + if ( _ext_node_with_longest_txt_info.getNodeData().isHasTaxonomy() ) { + nodeTaxonomyDataAsSB( _ext_node_with_longest_txt_info.getNodeData().getTaxonomy(), sb ); + } + } + return getFontMetricsForLargeDefaultFont().stringWidth( sb.toString() ); } final private void paintOvRectangle( final Graphics2D g ) { @@ -4555,7 +4964,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final float height = getOvMaxHeight() / h_ratio; final float x = getVisibleRect().x + getOvXPosition() + ( getOvMaxWidth() / x_ratio ); final float y = getVisibleRect().y + getOvYPosition() + ( getOvMaxHeight() / y_ratio ); - g.setColor( getTreeColorSet().getFoundColor() ); + g.setColor( getTreeColorSet().getFoundColor0() ); getOvRectangle().setRect( x, y, width, height ); final Stroke s = g.getStroke(); g.setStroke( STROKE_1 ); @@ -4583,9 +4992,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final private void paintPhylogenyLite( final Graphics2D g ) { _phylogeny - .getRoot() - .setXSecondary( ( float ) ( getVisibleRect().x + getOvXPosition() + ( MOVE / ( getVisibleRect().width / getOvRectangle() - .getWidth() ) ) ) ); + .getRoot() + .setXSecondary( ( float ) ( getVisibleRect().x + getOvXPosition() + ( MOVE / ( getVisibleRect().width / getOvRectangle() + .getWidth() ) ) ) ); _phylogeny.getRoot().setYSecondary( ( getVisibleRect().y + getOvYStart() ) ); final Stroke s = g.getStroke(); g.setStroke( STROKE_05 ); @@ -4599,8 +5008,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee /** * Paint the root branch. (Differs from others because it will always be a * single horizontal line). - * @param to_graphics_file - * + * @param to_graphics_file + * * @return new x1 value */ final private void paintRootBranch( final Graphics2D g, @@ -4624,7 +5033,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final double w = PhylogenyMethods.getBranchWidthValue( root ); drawRectFilled( x1 - d, root.getYcoord() - ( w / 2 ), d, w, g ); } - paintNodeBox( x1, root.getYcoord(), root, g, to_pdf, to_graphics_file, isInFoundNodes( root ) ); + paintNodeBox( x1, root.getYcoord(), root, g, to_pdf, to_graphics_file ); } final private void paintScale( final Graphics2D g, @@ -4660,84 +5069,23 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final boolean is_in_found_nodes, final boolean to_pdf, final boolean to_graphics_file, - final double x_shift ) { + final float x_shift ) { final Taxonomy taxonomy = node.getNodeData().getTaxonomy(); - g.setFont( getTreeFontSet().getLargeItalicFont() ); - if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) { - g.setColor( Color.BLACK ); - } - else if ( is_in_found_nodes ) { - g.setFont( getTreeFontSet().getLargeItalicFont().deriveFont( TreeFontSet.BOLD_AND_ITALIC ) ); - g.setColor( getTreeColorSet().getFoundColor() ); - } - else if ( getControlPanel().isColorAccordingToTaxonomy() ) { - g.setColor( getTaxonomyBasedColor( node ) ); - } - else if ( getOptions().isColorLabelsSameAsParentBranch() && getControlPanel().isColorBranches() - && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) { - g.setColor( PhylogenyMethods.getBranchColorValue( node ) ); - } - else if ( to_pdf ) { - g.setColor( Color.BLACK ); + final boolean using_visual_font = setFont( g, node, is_in_found_nodes ); + setColor( g, node, to_graphics_file, to_pdf, is_in_found_nodes, getTreeColorSet().getTaxonomyColor() ); + final float start_x = node.getXcoord() + 3 + ( getOptions().getDefaultNodeShapeSize() / 2 ) + x_shift; + float start_y; + if ( !using_visual_font ) { + start_y = node.getYcoord() + + ( getFontMetricsForLargeDefaultFont().getAscent() / ( node.getNumberOfDescendants() == 1 ? 1 + : 3.0f ) ); } else { - g.setColor( getTreeColorSet().getTaxonomyColor() ); + start_y = node.getYcoord() + + ( getFontMetrics( g.getFont() ).getAscent() / ( node.getNumberOfDescendants() == 1 ? 1 : 3.0f ) ); } - final double start_x = node.getXcoord() + 3 + ( getOptions().getDefaultNodeShapeSize() / 2 ) + x_shift; - final double start_y = node.getYcoord() - + ( getTreeFontSet()._fm_large.getAscent() / ( node.getNumberOfDescendants() == 1 ? 1 : 3.0 ) ); _sb.setLength( 0 ); - if ( _control_panel.isShowTaxonomyCode() && !ForesterUtil.isEmpty( taxonomy.getTaxonomyCode() ) ) { - _sb.append( taxonomy.getTaxonomyCode() ); - _sb.append( " " ); - } - if ( _control_panel.isShowTaxonomyScientificNames() && _control_panel.isShowTaxonomyCommonNames() ) { - if ( !ForesterUtil.isEmpty( taxonomy.getScientificName() ) - && !ForesterUtil.isEmpty( taxonomy.getCommonName() ) ) { - if ( getOptions().isAbbreviateScientificTaxonNames() - && ( taxonomy.getScientificName().indexOf( ' ' ) > 0 ) ) { - abbreviateScientificName( taxonomy.getScientificName() ); - } - else { - _sb.append( taxonomy.getScientificName() ); - } - _sb.append( " (" ); - _sb.append( taxonomy.getCommonName() ); - _sb.append( ") " ); - } - else if ( !ForesterUtil.isEmpty( taxonomy.getScientificName() ) ) { - if ( getOptions().isAbbreviateScientificTaxonNames() - && ( taxonomy.getScientificName().indexOf( ' ' ) > 0 ) ) { - abbreviateScientificName( taxonomy.getScientificName() ); - } - else { - _sb.append( taxonomy.getScientificName() ); - } - _sb.append( " " ); - } - else if ( !ForesterUtil.isEmpty( taxonomy.getCommonName() ) ) { - _sb.append( taxonomy.getCommonName() ); - _sb.append( " " ); - } - } - else if ( _control_panel.isShowTaxonomyScientificNames() ) { - if ( !ForesterUtil.isEmpty( taxonomy.getScientificName() ) ) { - if ( getOptions().isAbbreviateScientificTaxonNames() - && ( taxonomy.getScientificName().indexOf( ' ' ) > 0 ) ) { - abbreviateScientificName( taxonomy.getScientificName() ); - } - else { - _sb.append( taxonomy.getScientificName() ); - } - _sb.append( " " ); - } - } - else if ( _control_panel.isShowTaxonomyCommonNames() ) { - if ( !ForesterUtil.isEmpty( taxonomy.getCommonName() ) ) { - _sb.append( taxonomy.getCommonName() ); - _sb.append( " " ); - } - } + nodeTaxonomyDataAsSB( taxonomy, _sb ); final String label = _sb.toString(); /* GUILHEM_BEG */ if ( _control_panel.isShowSequenceRelations() && ( label.length() > 0 ) @@ -4746,18 +5094,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final Rectangle2D nodeTextBounds = new TextLayout( label, g.getFont(), new FontRenderContext( null, false, false ) ) - .getBounds(); + .getBounds(); g.fillRect( ( int ) start_x - 1, ( int ) start_y - 8, ( int ) nodeTextBounds.getWidth() + 4, 11 ); g.setColor( getTreeColorSet().getBackgroundColor() ); } /* GUILHEM_END */ TreePanel.drawString( label, start_x, start_y, g ); - if ( is_in_found_nodes ) { - return getTreeFontSet()._fm_large_italic_bold.stringWidth( label ); - } - else { - return getTreeFontSet()._fm_large_italic.stringWidth( label ); + if ( !using_visual_font && !is_in_found_nodes ) { + return getFontMetricsForLargeDefaultFont().stringWidth( label ); } + return getFontMetrics( g.getFont() ).stringWidth( label ); } final private void paintUnrooted( final PhylogenyNode n, @@ -4826,11 +5172,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee current_angle += arc_size; assignGraphicsForBranchWithColorForParentBranch( desc, false, g, to_pdf, to_graphics_file ); drawLine( x, y, new_x, new_y, g ); - paintNodeBox( new_x, new_y, desc, g, to_pdf, to_graphics_file, isInFoundNodes( desc ) - || isInCurrentExternalNodes( desc ) ); + paintNodeBox( new_x, new_y, desc, g, to_pdf, to_graphics_file ); } if ( n.isRoot() ) { - paintNodeBox( n.getXcoord(), n.getYcoord(), n, g, to_pdf, to_graphics_file, isInFoundNodes( n ) ); + paintNodeBox( n.getXcoord(), n.getYcoord(), n, g, to_pdf, to_graphics_file ); } } @@ -4874,8 +5219,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee desc.setXSecondary( new_x ); desc.setYSecondary( new_y ); if ( isInFoundNodes( desc ) || isInCurrentExternalNodes( desc ) ) { - g.setColor( getTreeColorSet().getFoundColor() ); - drawRectFilled( desc.getXSecondary() - 1, desc.getYSecondary() - 1, 3, 3, g ); + g.setColor( getColorForFoundNode( desc ) ); + 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 ); @@ -4981,6 +5330,45 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return sb; } + private void setColor( final Graphics2D g, + final PhylogenyNode node, + final boolean to_graphics_file, + final boolean to_pdf, + final boolean is_in_found_nodes, + final Color default_color ) { + if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) { + g.setColor( Color.BLACK ); + } + else if ( is_in_found_nodes ) { + g.setColor( getColorForFoundNode( node ) ); + } + else if ( getControlPanel().isUseVisualStyles() && ( node.getNodeData().getNodeVisualData() != null ) + && ( node.getNodeData().getNodeVisualData().getFontColor() != null ) ) { + g.setColor( node.getNodeData().getNodeVisualData().getFontColor() ); + } + else if ( getControlPanel().isColorAccordingToSequence() ) { + g.setColor( getSequenceBasedColor( node ) ); + } + else if ( getControlPanel().isColorAccordingToTaxonomy() ) { + g.setColor( getTaxonomyBasedColor( node ) ); + } + else if ( getControlPanel().isColorAccordingToAnnotation() + && ( node.getNodeData().isHasSequence() && ( node.getNodeData().getSequence().getAnnotations() != null ) && ( !node + .getNodeData().getSequence().getAnnotations().isEmpty() ) ) ) { + g.setColor( calculateColorForAnnotation( node.getNodeData().getSequence().getAnnotations() ) ); + } + else if ( getOptions().isColorLabelsSameAsParentBranch() && getControlPanel().isUseVisualStyles() + && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) { + g.setColor( PhylogenyMethods.getBranchColorValue( node ) ); + } + else if ( to_pdf ) { + g.setColor( Color.BLACK ); + } + else { + g.setColor( default_color ); + } + } + final private void setCopiedAndPastedNodes( final Set nodeIds ) { getMainPanel().setCopiedAndPastedNodes( nodeIds ); } @@ -4989,6 +5377,21 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee getMainPanel().setCutOrCopiedTree( cut_or_copied_tree ); } + private boolean setFont( final Graphics2D g, final PhylogenyNode node, final boolean is_in_found_nodes ) { + Font visual_font = null; + if ( getControlPanel().isUseVisualStyles() && ( node.getNodeData().getNodeVisualData() != null ) ) { + visual_font = node.getNodeData().getNodeVisualData().getFont(); + g.setFont( visual_font != null ? visual_font : getTreeFontSet().getLargeFont() ); + } + else { + g.setFont( getTreeFontSet().getLargeFont() ); + } + if ( is_in_found_nodes ) { + g.setFont( g.getFont().deriveFont( Font.BOLD ) ); + } + return visual_font != null; + } + final private void setInOv( final boolean in_ov ) { _in_ov = in_ov; } @@ -5034,6 +5437,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } private final void setupStroke( final Graphics2D g ) { + if ( getYdistance() < 0.0001 ) { + g.setStroke( STROKE_0025 ); + } if ( getYdistance() < 0.001 ) { g.setStroke( STROKE_005 ); } @@ -5049,7 +5455,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else if ( getYdistance() < 2 ) { g.setStroke( STROKE_075 ); } - else if ( getYdistance() < 20 ) { + else if ( ( getYdistance() < 20 ) || !getConfiguration().isAllowThickStrokes() ) { g.setStroke( STROKE_1 ); } else { @@ -5086,7 +5492,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee private void showExtDescNodeData( final PhylogenyNode node ) { final List data = new ArrayList(); final List nodes = node.getAllExternalDescendants(); - if ( ( getFoundNodes() != null ) && !getFoundNodes().isEmpty() ) { + if ( ( getFoundNodes0() != null ) || ( getFoundNodes1() != null ) ) { for( final PhylogenyNode n : getFoundNodesAsListOfPhylogenyNodes() ) { if ( !nodes.contains( n ) ) { nodes.add( n ); @@ -5173,7 +5579,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee ann_str = ann.toString(); } sb.append( SequenceWriter.toFasta( ann_str, n.getNodeData().getSequence() - .getMolecularSequence(), 60 ) ); + .getMolecularSequence(), 60 ) ); data.add( sb.toString() ); } break; @@ -5226,13 +5632,13 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else if ( getConfiguration().getExtNodeDataReturnOn() == EXT_NODE_DATA_RETURN_ON.WINODW ) { if ( sb.length() < 1 ) { TreePanelUtil.showInformationMessage( this, "No Appropriate Data (" + obtainTitleForExtDescNodeData() - + ")", "Descendants of selected node do not contain selected data" ); + + ")", "Descendants of selected node do not contain selected data" ); clearCurrentExternalNodesDataBuffer(); } else { setCurrentExternalNodesDataBuffer( sb ); String title; - if ( ( getFoundNodes() != null ) && !getFoundNodes().isEmpty() ) { + if ( ( getFoundNodes0() != null ) && !getFoundNodes0().isEmpty() ) { title = ( getOptions().getExtDescNodeDataToReturn() == NODE_DATA.UNKNOWN ? "Data" : obtainTitleForExtDescNodeData() ) + " for " @@ -5268,10 +5674,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee try { if ( ( node.getName().length() > 0 ) || ( node.getNodeData().isHasTaxonomy() && !TreePanelUtil.isTaxonomyEmpty( node.getNodeData() - .getTaxonomy() ) ) - || ( node.getNodeData().isHasSequence() && !TreePanelUtil.isSequenceEmpty( node.getNodeData() - .getSequence() ) ) || ( node.getNodeData().isHasDate() ) - || ( node.getNodeData().isHasDistribution() ) || node.getBranchData().isHasConfidences() ) { + .getTaxonomy() ) ) + || ( node.getNodeData().isHasSequence() && !TreePanelUtil.isSequenceEmpty( node.getNodeData() + .getSequence() ) ) || ( node.getNodeData().isHasDate() ) + || ( node.getNodeData().isHasDistribution() ) || node.getBranchData().isHasConfidences() ) { _popup_buffer.setLength( 0 ); short lines = 0; if ( node.getName().length() > 0 ) { @@ -5435,14 +5841,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _popup_buffer.append( "] " ); } _popup_buffer - .append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( confidence.getValue(), - getOptions() - .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) ); + .append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( confidence.getValue(), + getOptions() + .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) ); if ( confidence.getStandardDeviation() != Confidence.CONFIDENCE_DEFAULT_VALUE ) { _popup_buffer.append( " (sd=" ); _popup_buffer.append( FORMATTER_CONFIDENCE.format( ForesterUtil.round( confidence - .getStandardDeviation(), getOptions() - .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) ); + .getStandardDeviation(), getOptions() + .getNumberOfDigitsAfterCommaForConfidenceValues() ) ) ); _popup_buffer.append( ")" ); } } @@ -5463,13 +5869,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( _popup_buffer.length() > 0 ) { if ( !getConfiguration().isUseNativeUI() ) { _rollover_popup - .setBorder( BorderFactory.createLineBorder( getTreeColorSet().getBranchColor() ) ); + .setBorder( BorderFactory.createLineBorder( getTreeColorSet().getBranchColor() ) ); _rollover_popup.setBackground( getTreeColorSet().getBackgroundColor() ); - if ( isInFoundNodes( node ) ) { - _rollover_popup.setForeground( getTreeColorSet().getFoundColor() ); + if ( isInFoundNodes0( node ) && !isInFoundNodes1( node ) ) { + _rollover_popup.setForeground( getTreeColorSet().getFoundColor0() ); } - else if ( getControlPanel().isColorAccordingToTaxonomy() ) { - _rollover_popup.setForeground( getTaxonomyBasedColor( node ) ); + else if ( !isInFoundNodes0( node ) && isInFoundNodes1( node ) ) { + _rollover_popup.setForeground( getTreeColorSet().getFoundColor1() ); + } + else if ( isInFoundNodes0( node ) && isInFoundNodes1( node ) ) { + _rollover_popup.setForeground( getTreeColorSet().getFoundColor0and1() ); } else { _rollover_popup.setForeground( getTreeColorSet().getSequenceColor() ); @@ -5483,7 +5892,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _rollover_popup, e.getLocationOnScreen().x + 10, e.getLocationOnScreen().y - - ( lines * 20 ) ); + - ( lines * 20 ) ); _node_desc_popup.show(); } } @@ -5569,15 +5978,22 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( getMainPanel().getMainFrame() == null ) { // Must be "E" applet version. ( ( ArchaeopteryxE ) ( ( MainPanelApplets ) getMainPanel() ).getApplet() ) - .setSelectedTypeInTypeMenu( getPhylogenyGraphicsType() ); + .setSelectedTypeInTypeMenu( getPhylogenyGraphicsType() ); } else { getMainPanel().getMainFrame().setSelectedTypeInTypeMenu( getPhylogenyGraphicsType() ); } } - final private static void drawString( final String str, final double x, final double y, final Graphics2D g ) { - g.drawString( str, ( int ) ( x + 0.5 ), ( int ) ( y + 0.5 ) ); + private final static void colorizeNodesHelper( final Color c, final PhylogenyNode node ) { + if ( node.getNodeData().getNodeVisualData() == null ) { + node.getNodeData().setNodeVisualData( new NodeVisualData() ); + } + node.getNodeData().getNodeVisualData().setFontColor( new Color( c.getRed(), c.getGreen(), c.getBlue() ) ); + } + + final private static void drawString( final String str, final float x, final float y, final Graphics2D g ) { + g.drawString( str, x, y ); } final private static boolean plusPressed( final int key_code ) { @@ -5585,11 +6001,39 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee || ( key_code == KeyEvent.VK_EQUALS ) || ( key_code == KeyEvent.VK_SEMICOLON ) || ( key_code == KeyEvent.VK_1 ) ); } - final private class SubtreeColorizationActionListener implements ActionListener { + final private class NodeColorizationActionListener implements ActionListener { + List _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 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 ); + } + } + } + + final private class SubtreeColorizationActionListener implements ActionListener { + List _additional_nodes = null; + JColorChooser _chooser = null; + PhylogenyNode _node = null; SubtreeColorizationActionListener( final JColorChooser chooser, final PhylogenyNode node ) { _chooser = chooser;