X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Farchaeopteryx%2FTreePanel.java;h=7301784f0233450889dbd58cef7eb60b6664014a;hb=5ea47511ea9c077b4b4709bed68ac31d6eee0477;hp=fdd4c774a2fe50a7da8ed2d83d9448acf35faffe;hpb=36cad5d7aee97eedcf1e42889ba4a1384b887777;p=jalview.git diff --git a/forester/java/src/org/forester/archaeopteryx/TreePanel.java b/forester/java/src/org/forester/archaeopteryx/TreePanel.java index fdd4c77..7301784 100644 --- a/forester/java/src/org/forester/archaeopteryx/TreePanel.java +++ b/forester/java/src/org/forester/archaeopteryx/TreePanel.java @@ -133,119 +133,120 @@ 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; + 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; @@ -703,19 +704,21 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } final Color calculateTaxonomyBasedColor( final Taxonomy tax ) { - if ( getOptions().isColorByTaxonomicGroup() && !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; + 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(); @@ -967,8 +970,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 ) { @@ -1223,10 +1230,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 ) { @@ -1424,10 +1431,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; @@ -1454,8 +1461,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee root_x + ( Math.cos( angle ) * parent_radius ), root_y + ( Math.sin( angle ) * parent_radius ), g ); - if ( isInFoundNodes( c ) || isInCurrentExternalNodes( c ) ) { - g.setColor( getTreeColorSet().getFoundColor() ); + if ( ( isInFoundNodes0( c ) && !isInFoundNodes1( c ) ) || isInCurrentExternalNodes( c ) ) { + g.setColor( getTreeColorSet().getFoundColor0() ); + drawRectFilled( c.getXSecondary() - 1, c.getYSecondary() - 1, 3, 3, g ); + } + else if ( ( isInFoundNodes1( c ) && !isInFoundNodes0( c ) ) ) { + g.setColor( getTreeColorSet().getFoundColor1() ); + drawRectFilled( c.getXSecondary() - 1, c.getYSecondary() - 1, 3, 3, g ); + } + else if ( isInFoundNodes0( c ) && isInFoundNodes1( c ) ) { + g.setColor( getTreeColorSet().getFoundColor0and1() ); drawRectFilled( c.getXSecondary() - 1, c.getYSecondary() - 1, 3, 3, g ); } } @@ -1491,7 +1506,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, @@ -1812,22 +1827,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() ); } } @@ -1845,8 +1860,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 ) { @@ -2247,7 +2266,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 ) ); @@ -2426,8 +2445,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 { @@ -2438,14 +2457,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(); @@ -2731,6 +2742,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(); } @@ -2743,6 +2769,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; } @@ -2801,6 +2843,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; } @@ -2945,22 +3003,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return null; } - 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 boolean isCanOpenTaxWeb( final PhylogenyNode node ) { if ( node.getNodeData().isHasTaxonomy() && ( ( !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getScientificName() ) ) @@ -2979,8 +3021,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() { @@ -3324,33 +3374,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } - final private void openSeqWeb( final PhylogenyNode node ) { - if ( ForesterUtil.isEmpty( isCanOpenSeqWeb( node ) ) ) { - cannotOpenBrowserWarningMessage( "sequence" ); - return; - } - final String uri_str = TreePanelUtil.createUriForSeqWeb( node, getConfiguration(), this ); - if ( !ForesterUtil.isEmpty( uri_str ) ) { - 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( "sequence" ); - } - } - final private void openPdbWeb( final PhylogenyNode node ) { final List pdb_ids = getPdbAccs( node ); if ( ForesterUtil.isEmpty( pdb_ids ) ) { @@ -3381,6 +3404,33 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } + final private void openSeqWeb( final PhylogenyNode node ) { + if ( ForesterUtil.isEmpty( isCanOpenSeqWeb( node ) ) ) { + cannotOpenBrowserWarningMessage( "sequence" ); + return; + } + final String uri_str = TreePanelUtil.createUriForSeqWeb( node, getConfiguration(), this ); + if ( !ForesterUtil.isEmpty( uri_str ) ) { + 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( "sequence" ); + } + } + final private void openTaxWeb( final PhylogenyNode node ) { if ( !isCanOpenTaxWeb( node ) ) { cannotOpenBrowserWarningMessage( "taxonomic" ); @@ -3653,8 +3703,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 ); } } @@ -3739,7 +3788,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 ); @@ -3848,11 +3897,15 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } } - final private void paintFoundNode( final int x, final int y, final Graphics2D g ) { + final private void paintFoundNode( final PhylogenyNode n, final double x, final double 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 double half_box_size = getOptions().getDefaultNodeShapeSize() / 2.0; + g.setColor( getColorForFoundNode( n ) ); + //g.fillRect( x - half_box_size, y - half_box_size, box_size, box_size ); + //TODO check me + //FIXME + _rectangle.setRect( x - half_box_size, y - half_box_size, box_size, box_size ); + g.fill( _rectangle ); } final private void paintGainedAndLostCharacters( final Graphics2D g, @@ -3893,20 +3946,19 @@ 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 ); + if ( isInFoundNodes( node ) || isInCurrentExternalNodes( node ) ) { + paintFoundNode( node, x, y, g ); } else { Color outline_color = null; @@ -4039,7 +4091,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 ) ); @@ -4258,7 +4310,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 ) ); @@ -4390,7 +4442,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee return; } if ( isInFoundNodes( node ) || isInCurrentExternalNodes( node ) ) { - g.setColor( getTreeColorSet().getFoundColor() ); + g.setColor( getColorForFoundNode( node ) ); drawRectFilled( node.getXSecondary() - 1, node.getYSecondary() - 1, 3, 3, g ); } float new_x = 0; @@ -4518,8 +4570,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 @@ -4646,7 +4697,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 ); @@ -4715,7 +4766,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, @@ -4759,7 +4810,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 ) ); @@ -4917,11 +4968,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 ); } } @@ -4965,7 +5015,7 @@ 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() ); + g.setColor( getColorForFoundNode( desc ) ); drawRectFilled( desc.getXSecondary() - 1, desc.getYSecondary() - 1, 3, 3, g ); g.setColor( getTreeColorSet().getOvColor() ); } @@ -5177,8 +5227,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 ); } @@ -5323,7 +5380,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 " @@ -5556,8 +5613,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 ) ); @@ -5678,9 +5741,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;