X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Farchaeopteryx%2FNodeEditPanel.java;h=21aaea9ca54b747ba402173223c87da30df032d4;hb=eb22dac14771c467104f57362e3a624d0140f897;hp=beab4f2625ea6f64418a2ab8a363157b1bd186e0;hpb=ccf4c584032d16ed0ed8d0678f01305887724f96;p=jalview.git diff --git a/forester/java/src/org/forester/archaeopteryx/NodeEditPanel.java b/forester/java/src/org/forester/archaeopteryx/NodeEditPanel.java index beab4f2..21aaea9 100644 --- a/forester/java/src/org/forester/archaeopteryx/NodeEditPanel.java +++ b/forester/java/src/org/forester/archaeopteryx/NodeEditPanel.java @@ -21,10 +21,13 @@ // 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; @@ -35,11 +38,12 @@ import java.util.HashMap; 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; @@ -48,9 +52,11 @@ import javax.swing.tree.DefaultMutableTreeNode; 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; @@ -58,6 +64,7 @@ import org.forester.phylogeny.data.Event; 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; @@ -68,6 +75,71 @@ import org.forester.util.ForesterUtil; 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; @@ -75,7 +147,9 @@ class NodeEditPanel extends JPanel { private final TreePanel _tree_panel; private final Map _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(); _my_node = phylogeny_node; _tree_panel = tree_panel; @@ -91,17 +165,32 @@ class NodeEditPanel extends JPanel { 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() { @@ -142,8 +231,14 @@ class NodeEditPanel extends JPanel { 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 ) { @@ -151,7 +246,7 @@ class NodeEditPanel extends JPanel { 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 ); @@ -182,6 +277,12 @@ class NodeEditPanel extends JPanel { "", 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 ) { @@ -220,12 +321,18 @@ class NodeEditPanel extends JPanel { 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 ); } @@ -247,14 +354,22 @@ class NodeEditPanel extends JPanel { 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 ) { @@ -275,9 +390,7 @@ class NodeEditPanel extends JPanel { 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 ); } @@ -316,6 +429,7 @@ class NodeEditPanel extends JPanel { } 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(), @@ -469,6 +583,25 @@ class NodeEditPanel extends JPanel { 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() ); + } + } + if ( ( uri != null ) && ( mu.getUris() == null ) ) { + mu.setUris( new ArrayList() ); + } + 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 ) { @@ -519,10 +652,6 @@ class NodeEditPanel extends JPanel { return getMap().get( mtn ); } - PhylogenyNode getMyNode() { - return _my_node; - } - private DefaultMutableTreeNode getSelectedTreeNode() { final TreePath selectionPath = getJTree().getSelectionPath(); if ( selectionPath != null ) { @@ -595,13 +724,6 @@ class NodeEditPanel extends JPanel { 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(); @@ -631,7 +753,7 @@ class NodeEditPanel extends JPanel { break; case NODE_BRANCH_LENGTH: if ( ForesterUtil.isEmpty( value ) ) { - getMyNode().setDistanceToParent( PhylogenyNode.DISTANCE_DEFAULT ); + getMyNode().setDistanceToParent( PhylogenyDataUtil.BRANCH_LENGTH_DEFAULT ); } else { try { @@ -646,6 +768,28 @@ class NodeEditPanel extends JPanel { } } 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 ) ) { @@ -671,7 +815,8 @@ class NodeEditPanel extends JPanel { } 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: @@ -685,7 +830,8 @@ class NodeEditPanel extends JPanel { } 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: @@ -780,7 +926,7 @@ class NodeEditPanel extends JPanel { 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() ); @@ -796,6 +942,10 @@ class NodeEditPanel extends JPanel { break; } break; + case SEQ_GENE_NAME: + ForesterUtil.ensurePresenceOfSequence( getMyNode() ); + getMyNode().getNodeData().getSequence().setGeneName( value ); + break; case SEQ_TYPE: ForesterUtil.ensurePresenceOfSequence( getMyNode() ); try { @@ -911,8 +1061,8 @@ class NodeEditPanel extends JPanel { p.getLatitude(), p.getLongitude(), new_value, - ForesterUtil.isEmpty( p.getAltiudeUnit() ) ? "?" : p - .getAltiudeUnit() ); + ForesterUtil.isEmpty( p.getAltiudeUnit() ) ? "?" + : p.getAltiudeUnit() ); ps.set( 0, p_new ); } break; @@ -927,8 +1077,11 @@ class NodeEditPanel extends JPanel { if ( !ForesterUtil.isEmpty( value ) ) { final List 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; @@ -937,8 +1090,11 @@ class NodeEditPanel extends JPanel { if ( !ForesterUtil.isEmpty( value ) ) { final List 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; @@ -962,8 +1118,11 @@ class NodeEditPanel extends JPanel { if ( new_value != null ) { final List 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; @@ -971,91 +1130,21 @@ class NodeEditPanel extends JPanel { 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() ); - } - } - if ( ( uri != null ) && ( mu.getUris() == null ) ) { - mu.setUris( new ArrayList() ); - } - 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() ); } } }