+ public Configuration getConfiguration() {\r
+ return _configuration;\r
+ }\r
+\r
+ /**\r
+ * This method returns the current external node data which\r
+ * has been selected by the user by clicking the "Return ..."\r
+ * menu item. This method is expected to be called from Javascript or\r
+ * something like it.\r
+ *\r
+ * @return current external node data as String\r
+ */\r
+ public String getCurrentExternalNodesDataBuffer() {\r
+ return getCurrentTreePanel().getCurrentExternalNodesDataBufferAsString();\r
+ }\r
+\r
+ public int getCurrentExternalNodesDataBufferChangeCounter() {\r
+ return getCurrentTreePanel().getCurrentExternalNodesDataBufferChangeCounter();\r
+ }\r
+\r
+ public int getCurrentExternalNodesDataBufferLength() {\r
+ return getCurrentTreePanel().getCurrentExternalNodesDataBufferAsString().length();\r
+ }\r
+\r
+ public InferenceManager getInferenceManager() {\r
+ return _inference_manager;\r
+ }\r
+\r
+ public MainPanel getMainPanel() {\r
+ return _mainpanel;\r
+ }\r
+\r
+ public Options getOptions() {\r
+ return _options;\r
+ }\r
+\r
+ public ProcessPool getProcessPool() {\r
+ return _process_pool;\r
+ }\r
+\r
+ public void showTextFrame( final String s, final String title ) {\r
+ checkTextFrames();\r
+ _textframes.addLast( TextFrame.instantiate( s, title, _textframes ) );\r
+ }\r
+\r
+ public void showWhole() {\r
+ _mainpanel.getControlPanel().showWhole();\r
+ }\r
+\r
+ public void updateProcessMenu() {\r
+ // In general Swing is not thread safe.\r
+ // See "Swing's Threading Policy".\r
+ SwingUtilities.invokeLater( new Runnable() {\r
+\r
+ @Override\r
+ public void run() {\r
+ doUpdateProcessMenu();\r
+ }\r
+ } );\r
+ }\r
+\r
+ private void annotateSequences() {\r
+ if ( getCurrentTreePanel() != null ) {\r
+ List<PhylogenyNode> nodes = null;\r
+ if ( ( getCurrentTreePanel().getFoundNodes0() != null )\r
+ || ( getCurrentTreePanel().getFoundNodes1() != null ) ) {\r
+ nodes = getCurrentTreePanel().getFoundNodesAsListOfPhylogenyNodes();\r
+ }\r
+ if ( ( nodes == null ) || nodes.isEmpty() ) {\r
+ JOptionPane\r
+ .showMessageDialog( this,\r
+ "Need to select nodes, either via direct selection or via the \"Search\" function",\r
+ "No nodes selected for annotation",\r
+ JOptionPane.ERROR_MESSAGE );\r
+ return;\r
+ }\r
+ final Phylogeny phy = getMainPanel().getCurrentPhylogeny();\r
+ if ( ( phy != null ) && !phy.isEmpty() ) {\r
+ final JTextField ref_field = new JTextField( 10 );\r
+ final JTextField desc_filed = new JTextField( 20 );\r
+ ref_field.setText( ForesterUtil.isEmpty( getPreviousNodeAnnotationReference() ) ? ""\r
+ : getPreviousNodeAnnotationReference() );\r
+ final JPanel my_panel = new JPanel();\r
+ my_panel.add( new JLabel( "Reference " ) );\r
+ my_panel.add( ref_field );\r
+ my_panel.add( Box.createHorizontalStrut( 15 ) );\r
+ my_panel.add( new JLabel( "Description " ) );\r
+ my_panel.add( desc_filed );\r
+ final int result = JOptionPane.showConfirmDialog( null,\r
+ my_panel,\r
+ "Enter the sequence annotation(s) for the "\r
+ + nodes.size() + " selected nodes",\r
+ JOptionPane.OK_CANCEL_OPTION );\r
+ if ( result == JOptionPane.OK_OPTION ) {\r
+ String ref = ref_field.getText();\r
+ String desc = desc_filed.getText();\r
+ if ( !ForesterUtil.isEmpty( ref ) ) {\r
+ ref = ref.trim();\r
+ ref = ref.replaceAll( "\\s+", " " );\r
+ if ( ( ref.indexOf( ':' ) < 1 ) || ( ref.indexOf( ':' ) > ( ref.length() - 2 ) )\r
+ || ( ref.length() < 3 ) ) {\r
+ JOptionPane.showMessageDialog( this,\r
+ "Reference needs to be in the form of \"GO:1234567\"",\r
+ "Illegal Format for Annotation Reference",\r
+ JOptionPane.ERROR_MESSAGE );\r
+ return;\r
+ }\r
+ }\r
+ if ( ref != null ) {\r
+ setPreviousNodeAnnotationReference( ref );\r
+ }\r
+ if ( desc != null ) {\r
+ desc = desc.trim();\r
+ desc = desc.replaceAll( "\\s+", " " );\r
+ }\r
+ if ( !ForesterUtil.isEmpty( ref ) || !ForesterUtil.isEmpty( desc ) ) {\r
+ for( final PhylogenyNode n : nodes ) {\r
+ ForesterUtil.ensurePresenceOfSequence( n );\r
+ final Annotation ann = ForesterUtil.isEmpty( ref ) ? new Annotation()\r
+ : new Annotation( ref );\r
+ if ( !ForesterUtil.isEmpty( desc ) ) {\r
+ ann.setDesc( desc );\r
+ }\r
+ n.getNodeData().getSequence().addAnnotation( ann );\r
+ }\r
+ }\r
+ getMainPanel().getControlPanel().showAnnotations();\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ private void chooseFont() {\r
+ final FontChooser fc = new FontChooser();\r
+ fc.setFont( getMainPanel().getTreeFontSet().getLargeFont() );\r
+ fc.showDialog( this, "Select the Base Font" );\r
+ getMainPanel().getTreeFontSet().setBaseFont( fc.getFont() );\r
+ }\r
+\r
+ private void chooseMinimalConfidence() {\r
+ final String s = ( String ) JOptionPane\r
+ .showInputDialog( this,\r
+ "Please enter the minimum for confidence values to be displayed.\n"\r
+ + "[current value: " + getOptions().getMinConfidenceValue() + "]\n",\r
+ "Minimal Confidence Value",\r
+ JOptionPane.QUESTION_MESSAGE,\r
+ null,\r
+ null,\r
+ getOptions().getMinConfidenceValue() );\r
+ if ( !ForesterUtil.isEmpty( s ) ) {\r
+ boolean success = true;\r
+ double m = 0.0;\r
+ final String m_str = s.trim();\r
+ if ( !ForesterUtil.isEmpty( m_str ) ) {\r
+ try {\r
+ m = Double.parseDouble( m_str );\r
+ }\r
+ catch ( final Exception ex ) {\r
+ success = false;\r
+ }\r
+ }\r
+ else {\r
+ success = false;\r
+ }\r
+ if ( success && ( m >= 0.0 ) ) {\r
+ getOptions().setMinConfidenceValue( m );\r
+ }\r
+ }\r
+ }\r
+\r
+ private void deleteSelectedNodes( final boolean delete ) {\r