JAL-2805 made needed color set methods public
[jalview.git] / forester / java / src / org / forester / archaeopteryx / NodeEditPanel.java
index f4bbca8..21aaea9 100644 (file)
 // 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;
@@ -60,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;
@@ -70,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;
@@ -77,7 +147,9 @@ class NodeEditPanel extends JPanel {
     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;
@@ -93,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() {
 
@@ -144,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 ) {
@@ -153,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 );
@@ -336,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(),
@@ -489,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<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 ) {
@@ -539,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 ) {
@@ -615,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();
@@ -651,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 {
@@ -713,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:
@@ -727,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:
@@ -822,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() );
@@ -838,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 {
@@ -1022,92 +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<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,
-        NODE_BRANCH_WIDTH,
-        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() );
         }
     }
 }