X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Farchaeopteryx%2FTreePanel.java;h=e5510daad651c6ba0ff5a238a18c65168c07c994;hb=7359853f540f8d2704930c90e0ea9b6969bde51b;hp=6d793c8d8db710fe322a53a55df922c410222002;hpb=f8ecfc1d254f7f413ee5c47fbb012b609f7f4fd1;p=jalview.git diff --git a/forester/java/src/org/forester/archaeopteryx/TreePanel.java b/forester/java/src/org/forester/archaeopteryx/TreePanel.java index 6d793c8..e5510da 100644 --- a/forester/java/src/org/forester/archaeopteryx/TreePanel.java +++ b/forester/java/src/org/forester/archaeopteryx/TreePanel.java @@ -106,6 +106,7 @@ import org.forester.phylogeny.Phylogeny; import org.forester.phylogeny.PhylogenyMethods; import org.forester.phylogeny.PhylogenyMethods.DESCENDANT_SORT_PRIORITY; import org.forester.phylogeny.PhylogenyNode; +import org.forester.phylogeny.data.Accession; import org.forester.phylogeny.data.Annotation; import org.forester.phylogeny.data.BranchColor; import org.forester.phylogeny.data.Confidence; @@ -127,123 +128,127 @@ import org.forester.util.BasicDescriptiveStatistics; import org.forester.util.DescriptiveStatistics; import org.forester.util.ForesterConstants; import org.forester.util.ForesterUtil; -import org.forester.util.SequenceIdParser; +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 ); 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 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_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 final static double OVERVIEW_FOUND_NODE_BOX_SIZE = 2; + private final static double OVERVIEW_FOUND_NODE_BOX_SIZE_HALF = 1; + 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 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 ); + 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; // expression values menu: 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 Image offscreenImage; // private Graphics offscreenGraphics; // private Dimension offscreenDimension; @@ -701,27 +706,48 @@ 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 = TreePanelUtil.calculateColorFromString( tax.getTaxonomyCode(), true ); + getControlPanel().getSpeciesColors().put( tax.getTaxonomyCode(), c ); + } + else { + c = TreePanelUtil.calculateColorFromString( tax.getScientificName(), true ); + getControlPanel().getSpeciesColors().put( tax.getScientificName(), c ); + } + } + return c; } - return c; } void checkForVectorProperties( final Phylogeny phy ) { @@ -946,8 +972,12 @@ 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 ) { @@ -1202,10 +1232,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 ) { @@ -1403,10 +1433,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; @@ -1434,8 +1464,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 ); } } @@ -1470,7 +1501,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, @@ -1791,22 +1822,22 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } 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() ); } } @@ -1824,8 +1855,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 ) { @@ -2226,7 +2261,7 @@ 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 ) ) { g.setColor( PhylogenyMethods.getBranchColorValue( node ) ); @@ -2272,7 +2307,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } if ( type == '?' ) { - if ( SequenceIdParser.isProtein( query ) ) { + if ( SequenceAccessionTools.isProteinDbQuery( query ) ) { type = 'p'; } else { @@ -2405,8 +2440,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } _color_chooser.setPreviewPanel( new JPanel() ); SubtreeColorizationActionListener al; - if ( ( getFoundNodes() != null ) && !getFoundNodes().isEmpty() ) { - final List additional_nodes = getFoundNodesAsListOfPhylogenyNodes(); + if ( ( getFoundNodes0() != null ) && !getFoundNodes0().isEmpty() ) { + final List additional_nodes = getFoundNodes0AsListOfPhylogenyNodes(); al = new SubtreeColorizationActionListener( _color_chooser, node, additional_nodes ); } else { @@ -2417,14 +2452,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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(); @@ -2710,6 +2737,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(); } @@ -2722,6 +2764,22 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return getMainPanel().getCutOrCopiedTree(); } + private List getFoundNodes0AsListOfPhylogenyNodes() { + final List additional_nodes = new ArrayList(); + for( final Long id : getFoundNodes0() ) { + additional_nodes.add( _phylogeny.getNode( id ) ); + } + return additional_nodes; + } + + private List getFoundNodes1AsListOfPhylogenyNodes() { + final List additional_nodes = new ArrayList(); + for( final Long id : getFoundNodes1() ) { + additional_nodes.add( _phylogeny.getNode( id ) ); + } + return additional_nodes; + } + final private float getLastDragPointX() { return _last_drag_point_x; } @@ -2780,6 +2838,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; } @@ -2829,6 +2903,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; @@ -2914,17 +2991,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } final private String isCanOpenSeqWeb( final PhylogenyNode node ) { - String v = ForesterUtil.extractUniProtKbProteinSeqIdentifier( node ); - if ( ForesterUtil.isEmpty( v ) ) { - v = ForesterUtil.extractGenbankAccessor( node ); - } - if ( ForesterUtil.isEmpty( v ) ) { - v = ForesterUtil.extractRefSeqAccessorAccessor( node ); + final Accession a = SequenceAccessionTools.obtainAccessorFromDataFields( node ); + if ( a != null ) { + return a.getValue(); } - if ( ForesterUtil.isEmpty( v ) ) { - v = ForesterUtil.extractGInumber( node ); - } - return v; + return null; } final private boolean isCanOpenTaxWeb( final PhylogenyNode node ) { @@ -2945,8 +3016,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() { @@ -3162,6 +3241,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 ) ); } @@ -3255,6 +3369,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" ); @@ -3554,8 +3698,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 ); } } @@ -3640,7 +3783,7 @@ 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().isColorAccordingToTaxonomy() ) { c = getTaxonomyBasedColor( node ); @@ -3695,24 +3838,14 @@ 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 ( value < getOptions().getMinConfidenceValue() ) { + return; } if ( not_first ) { sb.append( "/" ); @@ -3732,12 +3865,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } } - //} - if ( one_ok ) { - conf_str = sb.toString(); - } } - if ( conf_str.length() > 0 ) { + if ( sb.length() > 0 ) { final double parent_x = node.getParent().getXcoord(); double x = node.getXcoord(); g.setFont( getTreeFontSet().getSmallFont() ); @@ -3753,6 +3882,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else { g.setColor( getTreeColorSet().getConfidenceColor() ); } + final String conf_str = sb.toString(); TreePanel .drawString( conf_str, parent_x @@ -3762,13 +3892,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } - 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, @@ -3807,26 +3930,33 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee 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() ) + || ( getControlPanel().isEvents() && node.isHasAssignedEvent() && ( node.getNodeData().getEvent() + .isDuplication() + || node.getNodeData().getEvent().isSpeciation() || node.getNodeData().getEvent() + .isSpeciationOrDuplication() ) ) ) { + final double box_size = getOptions().getDefaultNodeShapeSize(); + final double half_box_size = box_size / 2.0; Color outline_color = null; if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) { outline_color = Color.BLACK; } + else if ( isInFoundNodes( node ) || isInCurrentExternalNodes( node ) ) { + outline_color = getColorForFoundNode( node ); + } else if ( getControlPanel().isEvents() && TreePanelUtil.isHasAssignedEvent( node ) ) { final Event event = node.getNodeData().getEvent(); if ( event.isDuplication() ) { @@ -3839,79 +3969,58 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee outline_color = getTreeColorSet().getDuplicationOrSpeciationColor(); } } - else if ( getOptions().isTaxonomyColorizeNodeShapes() ) { - outline_color = getTaxonomyBasedColor( node ); - } else { outline_color = getGraphicsForNodeBoxWithColorForParentBranch( node ); if ( to_pdf && ( outline_color == getTreeColorSet().getBranchColor() ) ) { outline_color = getTreeColorSet().getBranchColorForPdf(); } } - final int box_size = getOptions().getDefaultNodeShapeSize(); - final int half_box_size = box_size / 2; - if ( ( getOptions().isShowDefaultNodeShapesExternal() && node.isExternal() ) - || ( getOptions().isShowDefaultNodeShapesInternal() && node.isInternal() ) - || ( getControlPanel().isEvents() && node.isHasAssignedEvent() ) ) { - if ( getOptions().getDefaultNodeShape() == NodeShape.CIRCLE ) { - if ( getOptions().getDefaultNodeFill() == NodeFill.GRADIENT ) { - drawOvalGradient( x - half_box_size, - y - half_box_size, - box_size, - box_size, - g, - to_pdf ? Color.WHITE : outline_color, - to_pdf ? outline_color : getBackground(), - outline_color ); - } - else if ( getOptions().getDefaultNodeFill() == NodeFill.NONE ) { - Color background = getBackground(); - if ( to_pdf ) { - background = Color.WHITE; - } - drawOvalGradient( x - half_box_size, - y - half_box_size, - box_size, - box_size, - g, - background, - background, - outline_color ); - } - else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.SOLID ) { - g.setColor( outline_color ); - drawOvalFilled( x - half_box_size, y - half_box_size, box_size, box_size, g ); - } + if ( getOptions().getDefaultNodeShape() == NodeShape.CIRCLE ) { + if ( getOptions().getDefaultNodeFill() == NodeFill.GRADIENT ) { + drawOvalGradient( x - half_box_size, y - half_box_size, box_size, box_size, g, to_pdf ? Color.WHITE + : outline_color, to_pdf ? outline_color : getBackground(), outline_color ); } - else if ( getOptions().getDefaultNodeShape() == NodeVisualization.NodeShape.RECTANGLE ) { - if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.GRADIENT ) { - drawRectGradient( x - half_box_size, - y - half_box_size, - box_size, - box_size, - g, - to_pdf ? Color.WHITE : outline_color, - to_pdf ? outline_color : getBackground(), - outline_color ); - } - else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.NONE ) { - Color background = getBackground(); - if ( to_pdf ) { - background = Color.WHITE; - } - drawRectGradient( x - half_box_size, - y - half_box_size, - box_size, - box_size, - g, - background, - background, - outline_color ); + else if ( getOptions().getDefaultNodeFill() == NodeFill.NONE ) { + Color background = getBackground(); + if ( to_pdf ) { + background = Color.WHITE; } - else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.SOLID ) { - g.setColor( outline_color ); - drawRectFilled( x - half_box_size, y - half_box_size, box_size, box_size, g ); + drawOvalGradient( x - half_box_size, + y - half_box_size, + box_size, + box_size, + g, + background, + background, + outline_color ); + } + else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.SOLID ) { + g.setColor( outline_color ); + drawOvalFilled( x - half_box_size, y - half_box_size, box_size, box_size, g ); + } + } + else if ( getOptions().getDefaultNodeShape() == NodeVisualization.NodeShape.RECTANGLE ) { + if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.GRADIENT ) { + drawRectGradient( x - half_box_size, y - half_box_size, box_size, box_size, g, to_pdf ? Color.WHITE + : outline_color, to_pdf ? outline_color : getBackground(), outline_color ); + } + else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.NONE ) { + Color background = getBackground(); + if ( to_pdf ) { + background = Color.WHITE; } + drawRectGradient( x - half_box_size, + y - half_box_size, + box_size, + box_size, + g, + background, + background, + outline_color ); + } + else if ( getOptions().getDefaultNodeFill() == NodeVisualization.NodeFill.SOLID ) { + g.setColor( outline_color ); + drawRectFilled( x - half_box_size, y - half_box_size, box_size, box_size, g ); } } } @@ -3953,7 +4062,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee g.setColor( Color.BLACK ); } else if ( is_in_found_nodes ) { - g.setColor( getTreeColorSet().getFoundColor() ); + g.setColor( getColorForFoundNode( node ) ); } else if ( getControlPanel().isColorAccordingToTaxonomy() ) { g.setColor( getTaxonomyBasedColor( node ) ); @@ -4172,7 +4281,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee g.setColor( Color.BLACK ); } else if ( is_in_found_nodes ) { - g.setColor( getTreeColorSet().getFoundColor() ); + g.setColor( getColorForFoundNode( node ) ); } else if ( getControlPanel().isColorAccordingToTaxonomy() ) { g.setColor( getTaxonomyBasedColor( node ) ); @@ -4304,8 +4413,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() ) { @@ -4432,8 +4542,7 @@ 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 @@ -4560,7 +4669,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 ); @@ -4629,7 +4738,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, @@ -4673,7 +4782,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } else if ( is_in_found_nodes ) { g.setFont( getTreeFontSet().getLargeItalicFont().deriveFont( TreeFontSet.BOLD_AND_ITALIC ) ); - g.setColor( getTreeColorSet().getFoundColor() ); + g.setColor( getColorForFoundNode( node ) ); } else if ( getControlPanel().isColorAccordingToTaxonomy() ) { g.setColor( getTaxonomyBasedColor( node ) ); @@ -4831,11 +4940,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 ); } } @@ -4879,8 +4987,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 ); @@ -5091,8 +5203,15 @@ 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() ) { - for( final PhylogenyNode n : getFoundNodesAsListOfPhylogenyNodes() ) { + if ( ( getFoundNodes0() != null ) && !getFoundNodes0().isEmpty() ) { + for( final PhylogenyNode n : getFoundNodes0AsListOfPhylogenyNodes() ) { + if ( !nodes.contains( n ) ) { + nodes.add( n ); + } + } + } + if ( ( getFoundNodes1() != null ) && !getFoundNodes1().isEmpty() ) { + for( final PhylogenyNode n : getFoundNodes1AsListOfPhylogenyNodes() ) { if ( !nodes.contains( n ) ) { nodes.add( n ); } @@ -5237,7 +5356,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee else { setCurrentExternalNodesDataBuffer( sb ); String title; - if ( ( getFoundNodes() != null ) && !getFoundNodes().isEmpty() ) { + if ( ( getFoundNodes0() != null ) && !getFoundNodes0().isEmpty() ) { title = ( getOptions().getExtDescNodeDataToReturn() == NODE_DATA.UNKNOWN ? "Data" : obtainTitleForExtDescNodeData() ) + " for " @@ -5470,8 +5589,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee _rollover_popup .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 ( !isInFoundNodes0( node ) && isInFoundNodes1( node ) ) { + _rollover_popup.setForeground( getTreeColorSet().getFoundColor1() ); + } + else if ( isInFoundNodes0( node ) && isInFoundNodes1( node ) ) { + _rollover_popup.setForeground( getTreeColorSet().getFoundColor0and1() ); } else if ( getControlPanel().isColorAccordingToTaxonomy() ) { _rollover_popup.setForeground( getTaxonomyBasedColor( node ) ); @@ -5592,9 +5717,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final private class SubtreeColorizationActionListener implements ActionListener { + List _additional_nodes = null; JColorChooser _chooser = null; PhylogenyNode _node = null; - List _additional_nodes = null; SubtreeColorizationActionListener( final JColorChooser chooser, final PhylogenyNode node ) { _chooser = chooser;