// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
//
// Contact: phylosoft @ gmail . com
-// WWW: www.phylosoft.org/
+// WWW: https://sites.google.com/site/cmzmasek/home/software/forester
package org.forester.archaeopteryx;
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
+import org.forester.archaeopteryx.tools.ImageLoader;
import org.forester.io.parsers.phyloxml.PhyloXmlDataFormatException;
import org.forester.phylogeny.PhylogenyNode;
import org.forester.phylogeny.data.Accession;
+import org.forester.phylogeny.data.BranchWidth;
import org.forester.phylogeny.data.Confidence;
import org.forester.phylogeny.data.Date;
import org.forester.phylogeny.data.Distribution;
import org.forester.phylogeny.data.Identifier;
import org.forester.phylogeny.data.MultipleUris;
import org.forester.phylogeny.data.PhylogenyData;
+import org.forester.phylogeny.data.PhylogenyDataUtil;
import org.forester.phylogeny.data.Point;
import org.forester.phylogeny.data.Reference;
import org.forester.phylogeny.data.Sequence;
class NodeEditPanel extends JPanel {
+ private enum PHYLOXML_TAG {
+ NODE_NAME,
+ NODE_BRANCH_LENGTH,
+ NODE_BRANCH_WIDTH,
+ TAXONOMY_CODE,
+ TAXONOMY_SCIENTIFIC_NAME,
+ TAXONOMY_AUTHORITY,
+ TAXONOMY_COMMON_NAME,
+ TAXONOMY_SYNONYM,
+ TAXONOMY_RANK,
+ TAXONOMY_URI,
+ SEQ_SYMBOL,
+ SEQ_NAME,
+ SEQ_GENE_NAME,
+ SEQ_LOCATION,
+ SEQ_TYPE,
+ SEQ_MOL_SEQ,
+ SEQ_URI,
+ DATE_DESCRIPTION,
+ DATE_VALUE,
+ DATE_MIN,
+ DATE_MAX,
+ DATE_UNIT,
+ TAXONOMY_ID_VALUE,
+ TAXONOMY_ID_PROVIDER,
+ SEQ_ACC_VALUE,
+ SEQ_ACC_SOURCE,
+ CONFIDENCE_VALUE,
+ CONFIDENCE_TYPE,
+ LIT_REFERENCE_DESC,
+ LIT_REFERENCE_DOI,
+ EVENTS_DUPLICATIONS,
+ EVENTS_SPECIATIONS,
+ EVENTS_GENE_LOSSES,
+ DIST_DESC,
+ DIST_GEODETIC,
+ DIST_LAT,
+ DIST_LONG,
+ DIST_ALT,
+ DIST_ALT_UNIT
+ }
+
+ private class TagNumber {
+
+ final private PHYLOXML_TAG _tag;
+ final private int _number;
+
+ TagNumber( final PHYLOXML_TAG tag, final int number ) {
+ _tag = tag;
+ _number = number;
+ }
+
+ @Override
+ public String toString() {
+ return getTag() + "_" + getNumber();
+ }
+
+ int getNumber() {
+ return _number;
+ }
+
+ PHYLOXML_TAG getTag() {
+ return _tag;
+ }
+ }
private static final long serialVersionUID = 5120159904388100771L;
private final JTree _tree;
private final JEditorPane _pane;
private final TreePanel _tree_panel;
private final Map<DefaultMutableTreeNode, TagNumber> _map;
- public NodeEditPanel( final PhylogenyNode phylogeny_node, final TreePanel tree_panel ) {
+ public NodeEditPanel( final PhylogenyNode phylogeny_node,
+ final TreePanel tree_panel,
+ final NodeFrame parent ) {
_map = new HashMap<DefaultMutableTreeNode, TagNumber>();
_my_node = phylogeny_node;
_tree_panel = tree_panel;
getJTree().setToggleClickCount( 1 );
getJTree().setInvokesStopCellEditing( true );
final JScrollPane tree_view = new JScrollPane( getJTree() );
+
+ final JButton close_button = new JButton( "Close" );
+ close_button.setToolTipText( "This only closes this window; to write values back to the phylogeny, press ENTER after editing a field." );
+ close_button.setEnabled( true );
+
+ close_button.addActionListener( new ActionListener() {
+ public void actionPerformed( final ActionEvent e ) {
+ writeAll();
+ parent.close();
+ }
+ } );
+
_pane = new JEditorPane();
_pane.setEditable( true );
- final JScrollPane data_view = new JScrollPane( _pane );
- final JSplitPane split_pane = new JSplitPane( JSplitPane.VERTICAL_SPLIT );
- split_pane.setTopComponent( tree_view );
- // split_pane.setBottomComponent( data_view );
- data_view.setMinimumSize( Constants.NODE_PANEL_SPLIT_MINIMUM_SIZE );
- tree_view.setMinimumSize( Constants.NODE_PANEL_SPLIT_MINIMUM_SIZE );
- // split_pane.setDividerLocation( 400 );
- split_pane.setPreferredSize( Constants.NODE_PANEL_SIZE );
- add( split_pane );
+ tree_view.setMinimumSize( AptxConstants.NODE_PANEL_SPLIT_MINIMUM_SIZE );
+ tree_view.setPreferredSize( AptxConstants.NODE_PANEL_SIZE );
+
+ close_button.setAlignmentX( Component.CENTER_ALIGNMENT );
+ tree_view.setAlignmentX( Component.CENTER_ALIGNMENT );
+
+ final JPanel panel = new JPanel();
+ panel.setLayout( new BoxLayout( panel, BoxLayout.Y_AXIS ) );
+ panel.add( tree_view );
+ panel.add( close_button );
+ add( panel );
+
getJTree().getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION );
getJTree().addKeyListener( new KeyListener() {
if ( old_path != null ) {
writeBack( ( DefaultMutableTreeNode ) old_path.getLastPathComponent() );
}
+ AptxUtil.lookAtRealBranchLengthsForAptxControlSettings( tree_panel.getPhylogeny(),
+ tree_panel.getControlPanel() );
+ getTreePanel().repaint();
}
} );
+
+
+
}
private void addBasics( final DefaultMutableTreeNode top, final PhylogenyNode phylogeny_node, final String name ) {
top.add( category );
addSubelementEditable( category, NodePanel.NODE_NAME, phylogeny_node.getName(), PHYLOXML_TAG.NODE_NAME );
String bl = "";
- if ( phylogeny_node.getDistanceToParent() != PhylogenyNode.DISTANCE_DEFAULT ) {
+ if ( phylogeny_node.getDistanceToParent() != PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ) {
bl = ForesterUtil.FORMATTER_6.format( phylogeny_node.getDistanceToParent() );
}
addSubelementEditable( category, NodePanel.NODE_BRANCH_LENGTH, bl, PHYLOXML_TAG.NODE_BRANCH_LENGTH );
"",
PHYLOXML_TAG.CONFIDENCE_TYPE,
counter );
+ String bw = "1";
+ if ( ( phylogeny_node.getBranchData().getBranchWidth() != null )
+ && ( phylogeny_node.getBranchData().getBranchWidth().getValue() != BranchWidth.BRANCH_WIDTH_DEFAULT_VALUE ) ) {
+ bw = ForesterUtil.FORMATTER_3.format( phylogeny_node.getBranchData().getBranchWidth().getValue() );
+ }
+ addSubelementEditable( category, NodePanel.NODE_BRANCH_WIDTH, bw, PHYLOXML_TAG.NODE_BRANCH_WIDTH );
}
// private void addAnnotation( final DefaultMutableTreeNode top, final Annotation ann, final String name ) {
category = new DefaultMutableTreeNode( name );
top.add( category );
addSubelementEditable( category, NodePanel.DATE_DESCRIPTION, date.getDesc(), PHYLOXML_TAG.DATE_DESCRIPTION );
- addSubelementEditable( category, NodePanel.DATE_VALUE, String.valueOf( date.getValue() != null ? date
- .getValue() : "" ), PHYLOXML_TAG.DATE_VALUE );
- addSubelementEditable( category, NodePanel.DATE_MIN, String
- .valueOf( date.getMin() != null ? date.getMin() : "" ), PHYLOXML_TAG.DATE_MIN );
- addSubelementEditable( category, NodePanel.DATE_MAX, String
- .valueOf( date.getMax() != null ? date.getMax() : "" ), PHYLOXML_TAG.DATE_MAX );
+ addSubelementEditable( category,
+ NodePanel.DATE_VALUE,
+ String.valueOf( date.getValue() != null ? date.getValue() : "" ),
+ PHYLOXML_TAG.DATE_VALUE );
+ addSubelementEditable( category,
+ NodePanel.DATE_MIN,
+ String.valueOf( date.getMin() != null ? date.getMin() : "" ),
+ PHYLOXML_TAG.DATE_MIN );
+ addSubelementEditable( category,
+ NodePanel.DATE_MAX,
+ String.valueOf( date.getMax() != null ? date.getMax() : "" ),
+ PHYLOXML_TAG.DATE_MAX );
addSubelementEditable( category, NodePanel.DATE_UNIT, date.getUnit(), PHYLOXML_TAG.DATE_UNIT );
}
NodePanel.DIST_GEODETIC_DATUM,
p0.getGeodeticDatum(),
PHYLOXML_TAG.DIST_GEODETIC );
- addSubelementEditable( category, NodePanel.DIST_LATITUDE, String.valueOf( p0.getLatitude() != null ? p0
- .getLatitude() : "" ), PHYLOXML_TAG.DIST_LAT );
- addSubelementEditable( category, NodePanel.DIST_LONGITUDE, String.valueOf( p0.getLongitude() != null ? p0
- .getLongitude() : "" ), PHYLOXML_TAG.DIST_LONG );
- addSubelementEditable( category, NodePanel.DIST_ALTITUDE, String.valueOf( p0.getAltitude() != null ? p0
- .getAltitude() : "" ), PHYLOXML_TAG.DIST_ALT );
- addSubelementEditable( category, NodePanel.DIST_ALT_UNIT, String.valueOf( p0.getAltiudeUnit() != null ? p0
- .getAltiudeUnit() : "" ), PHYLOXML_TAG.DIST_ALT_UNIT );
+ addSubelementEditable( category,
+ NodePanel.DIST_LATITUDE,
+ String.valueOf( p0.getLatitude() != null ? p0.getLatitude() : "" ),
+ PHYLOXML_TAG.DIST_LAT );
+ addSubelementEditable( category,
+ NodePanel.DIST_LONGITUDE,
+ String.valueOf( p0.getLongitude() != null ? p0.getLongitude() : "" ),
+ PHYLOXML_TAG.DIST_LONG );
+ addSubelementEditable( category,
+ NodePanel.DIST_ALTITUDE,
+ String.valueOf( p0.getAltitude() != null ? p0.getAltitude() : "" ),
+ PHYLOXML_TAG.DIST_ALT );
+ addSubelementEditable( category,
+ NodePanel.DIST_ALT_UNIT,
+ String.valueOf( p0.getAltiudeUnit() != null ? p0.getAltiudeUnit() : "" ),
+ PHYLOXML_TAG.DIST_ALT_UNIT );
}
private void addEvents( final DefaultMutableTreeNode top, Event events, final String name ) {
PHYLOXML_TAG.EVENTS_SPECIATIONS );
addSubelementEditable( category,
NodePanel.EVENTS_GENE_LOSSES,
- String
- .valueOf( events.getNumberOfGeneLosses() >= 0 ? events.getNumberOfGeneLosses()
- : 0 ),
+ String.valueOf( events.getNumberOfGeneLosses() >= 0 ? events.getNumberOfGeneLosses() : 0 ),
PHYLOXML_TAG.EVENTS_GENE_LOSSES );
}
}
addSubelementEditable( category, NodePanel.SEQ_NAME, seq.getName(), PHYLOXML_TAG.SEQ_NAME );
addSubelementEditable( category, NodePanel.SEQ_SYMBOL, seq.getSymbol(), PHYLOXML_TAG.SEQ_SYMBOL );
+ addSubelementEditable( category, NodePanel.SEQ_GENE_NAME, seq.getGeneName(), PHYLOXML_TAG.SEQ_GENE_NAME );
addSubelementEditable( category,
NodePanel.SEQ_ACCESSION,
acc.getValue(),
uri_counter );
}
+ private void addUri( final DefaultMutableTreeNode mtn, final Uri uri, final int number, final MultipleUris mu ) {
+ if ( uri != null ) {
+ if ( mu.getUris() == null ) {
+ mu.setUris( new ArrayList<Uri>() );
+ }
+ }
+ if ( ( uri != null ) && ( mu.getUris() == null ) ) {
+ mu.setUris( new ArrayList<Uri>() );
+ }
+ if ( ( uri != null ) && ( mu.getUris().size() == number ) ) {
+ mu.getUris().add( uri );
+ }
+ if ( ( mu.getUris() != null ) && ( mu.getUris().size() != number ) ) {
+ mu.getUris().set( number, uri );
+ }
+ final ImageLoader il = new ImageLoader( getTreePanel() );
+ new Thread( il ).start();
+ }
+
private void collapsePath( final String name ) {
final TreePath tp = getJTree().getNextMatch( name, 0, Position.Bias.Forward );
if ( tp != null ) {
return getMap().get( mtn );
}
- PhylogenyNode getMyNode() {
- return _my_node;
- }
-
private DefaultMutableTreeNode getSelectedTreeNode() {
final TreePath selectionPath = getJTree().getSelectionPath();
if ( selectionPath != null ) {
return i;
}
- void writeAll() {
- for( int i = 0; i < getJTree().getRowCount(); i++ ) {
- final TreePath p = getJTree().getPathForRow( i );
- writeBack( ( DefaultMutableTreeNode ) p.getLastPathComponent() );
- }
- }
-
private void writeBack( final DefaultMutableTreeNode mtn ) {
if ( !getMap().containsKey( mtn ) ) {
final DefaultMutableTreeNode parent = ( DefaultMutableTreeNode ) mtn.getParent();
break;
case NODE_BRANCH_LENGTH:
if ( ForesterUtil.isEmpty( value ) ) {
- getMyNode().setDistanceToParent( PhylogenyNode.DISTANCE_DEFAULT );
+ getMyNode().setDistanceToParent( PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT );
}
else {
try {
}
}
break;
+ case NODE_BRANCH_WIDTH:
+ if ( ForesterUtil.isEmpty( value ) || value.equals( "1" ) ) {
+ if ( getMyNode().getBranchData().getBranchWidth() != null ) {
+ getMyNode().getBranchData().setBranchWidth( new BranchWidth() );
+ }
+ }
+ else {
+ try {
+ final double bw = ForesterUtil.parseDouble( value );
+ if ( bw >= 0 ) {
+ getMyNode().getBranchData().setBranchWidth( new BranchWidth( bw ) );
+ }
+ }
+ catch ( final ParseException e ) {
+ JOptionPane.showMessageDialog( this,
+ "failed to parse branch width from: " + value,
+ "Error",
+ JOptionPane.ERROR_MESSAGE );
+ mtn.setUserObject( "" );
+ }
+ }
+ break;
case CONFIDENCE_VALUE:
double confidence = Confidence.CONFIDENCE_DEFAULT_VALUE;
if ( !ForesterUtil.isEmpty( value ) ) {
}
else {
final String type = getMyNode().getBranchData().getConfidences().get( number ).getType();
- getMyNode().getBranchData().getConfidences().set( number, new Confidence( confidence, type ) );
+ final double sd = getMyNode().getBranchData().getConfidences().get( number ).getStandardDeviation();
+ getMyNode().getBranchData().getConfidences().set( number, new Confidence( confidence, type, sd ) );
}
break;
case CONFIDENCE_TYPE:
}
else {
final double v = getMyNode().getBranchData().getConfidences().get( number ).getValue();
- getMyNode().getBranchData().getConfidences().set( number, new Confidence( v, value ) );
+ final double sd = getMyNode().getBranchData().getConfidences().get( number ).getStandardDeviation();
+ getMyNode().getBranchData().getConfidences().set( number, new Confidence( v, value, sd ) );
}
break;
case TAXONOMY_CODE:
break;
case SEQ_MOL_SEQ:
ForesterUtil.ensurePresenceOfSequence( getMyNode() );
- getMyNode().getNodeData().getSequence().setMolecularSequence( value );
+ getMyNode().getNodeData().getSequence().setMolecularSequence( value.replaceAll( "[^a-zA-Z-]", "" ) );
break;
case SEQ_NAME:
ForesterUtil.ensurePresenceOfSequence( getMyNode() );
break;
}
break;
+ case SEQ_GENE_NAME:
+ ForesterUtil.ensurePresenceOfSequence( getMyNode() );
+ getMyNode().getNodeData().getSequence().setGeneName( value );
+ break;
case SEQ_TYPE:
ForesterUtil.ensurePresenceOfSequence( getMyNode() );
try {
p.getLatitude(),
p.getLongitude(),
new_value,
- ForesterUtil.isEmpty( p.getAltiudeUnit() ) ? "?" : p
- .getAltiudeUnit() );
+ ForesterUtil.isEmpty( p.getAltiudeUnit() ) ? "?"
+ : p.getAltiudeUnit() );
ps.set( 0, p_new );
}
break;
if ( !ForesterUtil.isEmpty( value ) ) {
final List<Point> ps = obtainPoints();
final Point p = ps.get( 0 );
- final Point p_new = new Point( value, p.getLatitude(), p.getLongitude(), p.getAltitude(), p
- .getAltiudeUnit() );
+ final Point p_new = new Point( value,
+ p.getLatitude(),
+ p.getLongitude(),
+ p.getAltitude(),
+ p.getAltiudeUnit() );
ps.set( 0, p_new );
}
break;
if ( !ForesterUtil.isEmpty( value ) ) {
final List<Point> ps = obtainPoints();
final Point p = ps.get( 0 );
- final Point p_new = new Point( p.getGeodeticDatum(), p.getLatitude(), p.getLongitude(), p
- .getAltitude(), value );
+ final Point p_new = new Point( p.getGeodeticDatum(),
+ p.getLatitude(),
+ p.getLongitude(),
+ p.getAltitude(),
+ value );
ps.set( 0, p_new );
}
break;
if ( new_value != null ) {
final List<Point> ps = obtainPoints();
final Point p = ps.get( 0 );
- final Point p_new = new Point( p.getGeodeticDatum(), p.getLatitude(), new_value, p.getAltitude(), p
- .getAltiudeUnit() );
+ final Point p_new = new Point( p.getGeodeticDatum(),
+ p.getLatitude(),
+ new_value,
+ p.getAltitude(),
+ p.getAltiudeUnit() );
ps.set( 0, p_new );
}
break;
default:
throw new IllegalArgumentException( "unknown: " + tag );
}
+
getJTree().repaint();
getTreePanel().setEdited( true );
getTreePanel().repaint();
}
- private void addUri( final DefaultMutableTreeNode mtn, final Uri uri, final int number, final MultipleUris mu ) {
- if ( uri != null ) {
- if ( mu.getUris() == null ) {
- mu.setUris( new ArrayList<Uri>() );
- }
- }
- if ( ( uri != null ) && ( mu.getUris() == null ) ) {
- mu.setUris( new ArrayList<Uri>() );
- }
- if ( ( uri != null ) && ( mu.getUris().size() == number ) ) {
- mu.getUris().add( uri );
- }
- if ( ( mu.getUris() != null ) && ( mu.getUris().size() != number ) ) {
- mu.getUris().set( number, uri );
- }
- final ImageLoader il = new ImageLoader( getTreePanel() );
- new Thread( il ).start();
- }
-
- private enum PHYLOXML_TAG {
- NODE_NAME,
- NODE_BRANCH_LENGTH,
- TAXONOMY_CODE,
- TAXONOMY_SCIENTIFIC_NAME,
- TAXONOMY_AUTHORITY,
- TAXONOMY_COMMON_NAME,
- TAXONOMY_SYNONYM,
- TAXONOMY_RANK,
- TAXONOMY_URI,
- SEQ_SYMBOL,
- SEQ_NAME,
- SEQ_LOCATION,
- SEQ_TYPE,
- SEQ_MOL_SEQ,
- SEQ_URI,
- DATE_DESCRIPTION,
- DATE_VALUE,
- DATE_MIN,
- DATE_MAX,
- DATE_UNIT,
- TAXONOMY_ID_VALUE,
- TAXONOMY_ID_PROVIDER,
- SEQ_ACC_VALUE,
- SEQ_ACC_SOURCE,
- CONFIDENCE_VALUE,
- CONFIDENCE_TYPE,
- LIT_REFERENCE_DESC,
- LIT_REFERENCE_DOI,
- EVENTS_DUPLICATIONS,
- EVENTS_SPECIATIONS,
- EVENTS_GENE_LOSSES,
- DIST_DESC,
- DIST_GEODETIC,
- DIST_LAT,
- DIST_LONG,
- DIST_ALT,
- DIST_ALT_UNIT
+ PhylogenyNode getMyNode() {
+ return _my_node;
}
- private class TagNumber {
-
- final private PHYLOXML_TAG _tag;
- final private int _number;
-
- TagNumber( final PHYLOXML_TAG tag, final int number ) {
- _tag = tag;
- _number = number;
- }
-
- int getNumber() {
- return _number;
- }
-
- PHYLOXML_TAG getTag() {
- return _tag;
- }
-
- @Override
- public String toString() {
- return getTag() + "_" + getNumber();
+ void writeAll() {
+ //TODO this does not do what it should do.
+ for( int i = 0; i < getJTree().getRowCount(); i++ ) {
+ final TreePath p = getJTree().getPathForRow( i );
+ writeBack( ( DefaultMutableTreeNode ) p.getLastPathComponent() );
}
}
}