+\r
+ static boolean writeAsNewHampshire( final TreePanel tp, final Options op, boolean exception, final File file ) {\r
+ try {\r
+ final PhylogenyWriter writer = new PhylogenyWriter();\r
+ writer.toNewHampshire( tp.getPhylogeny(), true, op.getNhConversionSupportValueStyle(), file );\r
+ }\r
+ catch ( final Exception e ) {\r
+ exception = true;\r
+ exceptionOccuredDuringSaveAs( e, tp, tp );\r
+ }\r
+ return exception;\r
+ }\r
+\r
+ static boolean writeAsNexus( final TreePanel tp, final Options op, boolean exception, final File file ) {\r
+ try {\r
+ final PhylogenyWriter writer = new PhylogenyWriter();\r
+ writer.toNexus( file, tp.getPhylogeny(), op.getNhConversionSupportValueStyle() );\r
+ }\r
+ catch ( final Exception e ) {\r
+ exception = true;\r
+ exceptionOccuredDuringSaveAs( e, tp, tp );\r
+ }\r
+ return exception;\r
+ }\r
+\r
+ static boolean writeAsPhyloXml( final TreePanel tp, final Options op, boolean exception, final File file ) {\r
+ try {\r
+ final PhylogenyWriter writer = new PhylogenyWriter();\r
+ writer.toPhyloXML( file, tp.getPhylogeny(), 0 );\r
+ }\r
+ catch ( final Exception e ) {\r
+ exception = true;\r
+ exceptionOccuredDuringSaveAs( e, tp, tp );\r
+ }\r
+ return exception;\r
+ }\r
+\r
+ static void writePhylogenyToGraphicsFile( final String file_name,\r
+ final GraphicsExportType type,\r
+ final MainPanel mp,\r
+ final Component comp,\r
+ final Container contentpane ) {\r
+ mp.getCurrentTreePanel().calcParametersForPainting( mp.getCurrentTreePanel().getWidth(),\r
+ mp.getCurrentTreePanel().getHeight() );\r
+ String file_written_to = "";\r
+ boolean error = false;\r
+ try {\r
+ file_written_to = AptxUtil.writePhylogenyToGraphicsFile( file_name,\r
+ mp.getCurrentTreePanel().getWidth(),\r
+ mp.getCurrentTreePanel().getHeight(),\r
+ mp.getCurrentTreePanel(),\r
+ mp.getControlPanel(),\r
+ type,\r
+ mp.getOptions() );\r
+ }\r
+ catch ( final IOException e ) {\r
+ error = true;\r
+ JOptionPane.showMessageDialog( comp, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE );\r
+ }\r
+ if ( !error ) {\r
+ if ( ( file_written_to != null ) && ( file_written_to.length() > 0 ) ) {\r
+ JOptionPane.showMessageDialog( comp,\r
+ "Wrote image to: " + file_written_to,\r
+ "Graphics Export",\r
+ JOptionPane.INFORMATION_MESSAGE );\r
+ }\r
+ else {\r
+ JOptionPane.showMessageDialog( comp,\r
+ "There was an unknown problem when attempting to write to an image file: \""\r
+ + file_name + "\"",\r
+ "Error",\r
+ JOptionPane.ERROR_MESSAGE );\r
+ }\r
+ }\r
+ contentpane.repaint();\r
+ }\r
+\r
+ static File writeToFile( final Phylogeny t,\r
+ final MainPanel mp,\r
+ final JFileChooser save_filechooser,\r
+ final File current_dir,\r
+ final Container contentpane,\r
+ final Component comp ) {\r
+ File new_file = null;\r
+ if ( t == null ) {\r
+ return null;\r
+ }\r
+ String initial_filename = null;\r
+ if ( mp.getCurrentTreePanel().getTreeFile() != null ) {\r
+ try {\r
+ initial_filename = mp.getCurrentTreePanel().getTreeFile().getCanonicalPath();\r
+ }\r
+ catch ( final IOException e ) {\r
+ initial_filename = null;\r
+ }\r
+ }\r
+ if ( !ForesterUtil.isEmpty( initial_filename ) ) {\r
+ save_filechooser.setSelectedFile( new File( initial_filename ) );\r
+ }\r
+ else {\r
+ save_filechooser.setSelectedFile( new File( "" ) );\r
+ }\r
+ final File my_dir = current_dir;\r
+ if ( my_dir != null ) {\r
+ save_filechooser.setCurrentDirectory( my_dir );\r
+ }\r
+ final int result = save_filechooser.showSaveDialog( contentpane );\r
+ final File file = save_filechooser.getSelectedFile();\r
+ new_file = save_filechooser.getCurrentDirectory();\r
+ boolean exception = false;\r
+ if ( ( file != null ) && ( result == JFileChooser.APPROVE_OPTION ) ) {\r
+ if ( file.exists() ) {\r
+ final int i = JOptionPane.showConfirmDialog( comp,\r
+ file + " already exists.\nOverwrite?",\r
+ "Overwrite?",\r
+ JOptionPane.OK_CANCEL_OPTION,\r
+ JOptionPane.QUESTION_MESSAGE );\r
+ if ( i != JOptionPane.OK_OPTION ) {\r
+ return null;\r
+ }\r
+ else {\r
+ final File to = new File( file.getAbsoluteFile().toString() + AptxConstants.BACKUP_FILE_SUFFIX );\r
+ try {\r
+ ForesterUtil.copyFile( file, to );\r
+ }\r
+ catch ( final Exception e ) {\r
+ JOptionPane.showMessageDialog( comp,\r
+ "Failed to create backup copy " + to,\r
+ "Failed to Create Backup Copy",\r
+ JOptionPane.WARNING_MESSAGE );\r
+ }\r
+ try {\r
+ file.delete();\r
+ }\r
+ catch ( final Exception e ) {\r
+ JOptionPane.showMessageDialog( comp,\r
+ "Failed to delete: " + file,\r
+ "Failed to Delete",\r
+ JOptionPane.WARNING_MESSAGE );\r
+ }\r
+ }\r
+ }\r
+ if ( save_filechooser.getFileFilter() == MainFrame.nhfilter ) {\r
+ exception = writeAsNewHampshire( mp.getCurrentTreePanel(), mp.getOptions(), exception, file );\r
+ }\r
+ else if ( save_filechooser.getFileFilter() == MainFrame.xmlfilter ) {\r
+ exception = writeAsPhyloXml( mp.getCurrentTreePanel(), mp.getOptions(), exception, file );\r
+ }\r
+ else if ( save_filechooser.getFileFilter() == MainFrame.nexusfilter ) {\r
+ exception = writeAsNexus( mp.getCurrentTreePanel(), mp.getOptions(), exception, file );\r
+ }\r
+ // "*.*":\r
+ else {\r
+ final String file_name = file.getName().trim().toLowerCase();\r
+ if ( file_name.endsWith( ".nh" ) || file_name.endsWith( ".newick" ) || file_name.endsWith( ".phy" )\r
+ || file_name.endsWith( ".tree" ) ) {\r
+ exception = writeAsNewHampshire( mp.getCurrentTreePanel(), mp.getOptions(), exception, file );\r
+ }\r
+ else if ( file_name.endsWith( ".nex" ) || file_name.endsWith( ".nexus" ) ) {\r
+ exception = writeAsNexus( mp.getCurrentTreePanel(), mp.getOptions(), exception, file );\r
+ }\r
+ // XML is default:\r
+ else {\r
+ exception = writeAsPhyloXml( mp.getCurrentTreePanel(), mp.getOptions(), exception, file );\r
+ }\r
+ }\r
+ if ( !exception ) {\r
+ mp.setTitleOfSelectedTab( file.getName() );\r
+ mp.getCurrentTreePanel().setTreeFile( file );\r
+ mp.getCurrentTreePanel().setEdited( false );\r
+ }\r
+ }\r
+ return new_file;\r
+ }\r
+\r
+ static File writeToGraphicsFile( final Phylogeny t,\r
+ final GraphicsExportType type,\r
+ final MainPanel mp,\r
+ final JFileChooser writetographics_filechooser,\r
+ final Component component,\r
+ final Container contentpane,\r
+ final File current_dir ) {\r
+ File new_dir = null;\r
+ if ( ( t == null ) || t.isEmpty() ) {\r
+ return null;\r
+ }\r
+ String initial_filename = "";\r
+ if ( mp.getCurrentTreePanel().getTreeFile() != null ) {\r
+ initial_filename = mp.getCurrentTreePanel().getTreeFile().toString();\r
+ }\r
+ if ( initial_filename.indexOf( '.' ) > 0 ) {\r
+ initial_filename = initial_filename.substring( 0, initial_filename.lastIndexOf( '.' ) );\r
+ }\r
+ initial_filename = initial_filename + "." + type;\r
+ writetographics_filechooser.setSelectedFile( new File( initial_filename ) );\r
+ final File my_dir = current_dir;\r
+ if ( my_dir != null ) {\r
+ writetographics_filechooser.setCurrentDirectory( my_dir );\r
+ }\r
+ final int result = writetographics_filechooser.showSaveDialog( contentpane );\r
+ File file = writetographics_filechooser.getSelectedFile();\r
+ //setCurrentDir( writetographics_filechooser.getCurrentDirectory() );\r
+ new_dir = writetographics_filechooser.getCurrentDirectory();\r
+ if ( ( file != null ) && ( result == JFileChooser.APPROVE_OPTION ) ) {\r
+ if ( !file.toString().toLowerCase().endsWith( type.toString() ) ) {\r
+ file = new File( file.toString() + "." + type );\r
+ }\r
+ if ( file.exists() ) {\r
+ final int i = JOptionPane.showConfirmDialog( component,\r
+ file + " already exists. Overwrite?",\r
+ "Warning",\r
+ JOptionPane.OK_CANCEL_OPTION,\r
+ JOptionPane.WARNING_MESSAGE );\r
+ if ( i != JOptionPane.OK_OPTION ) {\r
+ return null;\r
+ }\r
+ else {\r
+ try {\r
+ file.delete();\r
+ }\r
+ catch ( final Exception e ) {\r
+ JOptionPane.showMessageDialog( component,\r
+ "Failed to delete: " + file,\r
+ "Error",\r
+ JOptionPane.WARNING_MESSAGE );\r
+ }\r
+ }\r
+ }\r
+ writePhylogenyToGraphicsFile( file.toString(), type, mp, component, contentpane );\r
+ }\r
+ return new_dir;\r
+ }\r
+\r
+ static File writeToPdf( final Phylogeny t,\r
+ final MainPanel mp,\r
+ final JFileChooser writetopdf_filechooser,\r
+ final File curr_dir,\r
+ final Container contentpane,\r
+ final Component component ) {\r
+ if ( ( t == null ) || t.isEmpty() ) {\r
+ return null;\r
+ }\r
+ String initial_filename = "";\r
+ if ( mp.getCurrentTreePanel().getTreeFile() != null ) {\r
+ initial_filename = mp.getCurrentTreePanel().getTreeFile().toString();\r
+ }\r
+ if ( initial_filename.indexOf( '.' ) > 0 ) {\r
+ initial_filename = initial_filename.substring( 0, initial_filename.lastIndexOf( '.' ) );\r
+ }\r
+ initial_filename = initial_filename + ".pdf";\r
+ writetopdf_filechooser.setSelectedFile( new File( initial_filename ) );\r
+ final File my_dir = curr_dir;\r
+ if ( my_dir != null ) {\r
+ writetopdf_filechooser.setCurrentDirectory( my_dir );\r
+ }\r
+ final int result = writetopdf_filechooser.showSaveDialog( contentpane );\r
+ File file = writetopdf_filechooser.getSelectedFile();\r
+ // setCurrentDir( writetopdf_filechooser.getCurrentDirectory() );\r
+ final File new_current_dir = writetopdf_filechooser.getCurrentDirectory();\r
+ if ( ( file != null ) && ( result == JFileChooser.APPROVE_OPTION ) ) {\r
+ if ( !file.toString().toLowerCase().endsWith( ".pdf" ) ) {\r
+ file = new File( file.toString() + ".pdf" );\r
+ }\r
+ if ( file.exists() ) {\r
+ final int i = JOptionPane.showConfirmDialog( component,\r
+ file + " already exists. Overwrite?",\r
+ "WARNING",\r
+ JOptionPane.OK_CANCEL_OPTION,\r
+ JOptionPane.WARNING_MESSAGE );\r
+ if ( i != JOptionPane.OK_OPTION ) {\r
+ return null;\r
+ }\r
+ }\r
+ printPhylogenyToPdf( file.toString(), mp.getOptions(), mp.getCurrentTreePanel(), component );\r
+ }\r
+ return new_current_dir;\r
+ }\r
+}\r
+\r
+class DefaultFilter extends FileFilter {\r
+\r
+ @Override\r
+ public boolean accept( final File f ) {\r
+ final String file_name = f.getName().trim().toLowerCase();\r
+ return file_name.endsWith( ".nh" ) || file_name.endsWith( ".newick" ) || file_name.endsWith( ".phy" )\r
+ || file_name.endsWith( ".nwk" ) || file_name.endsWith( ".phb" ) || file_name.endsWith( ".ph" )\r
+ || file_name.endsWith( ".tr" ) || file_name.endsWith( ".dnd" ) || file_name.endsWith( ".tree" )\r
+ || file_name.endsWith( ".nhx" ) || file_name.endsWith( ".xml" ) || file_name.endsWith( ".phyloxml" )\r
+ || file_name.endsWith( "phylo.xml" ) || file_name.endsWith( ".pxml" ) || file_name.endsWith( ".nexus" )\r
+ || file_name.endsWith( ".nx" ) || file_name.endsWith( ".nex" ) || file_name.endsWith( ".tre" )\r
+ || file_name.endsWith( ".zip" ) || file_name.endsWith( ".tol" ) || file_name.endsWith( ".tolxml" )\r
+ || file_name.endsWith( ".con" ) || f.isDirectory();\r
+ }\r
+\r
+ @Override\r
+ public String getDescription() {\r
+ return "All supported files (*.xml, *.phyloxml, *phylo.xml, *.nhx, *.nh, *.newick, *.nex, *.nexus, *.phy, *.tre, *.tree, *.tol, ...)";\r
+ }\r
+}\r
+\r
+class GraphicsFileFilter extends FileFilter {\r
+\r
+ @Override\r
+ public boolean accept( final File f ) {\r
+ final String file_name = f.getName().trim().toLowerCase();\r
+ return file_name.endsWith( ".jpg" ) || file_name.endsWith( ".jpeg" ) || file_name.endsWith( ".png" )\r
+ || file_name.endsWith( ".gif" ) || file_name.endsWith( ".bmp" ) || f.isDirectory();\r
+ }\r
+\r
+ @Override\r
+ public String getDescription() {\r
+ return "Image files (*.jpg, *.jpeg, *.png, *.gif, *.bmp)";\r
+ }\r
+}\r
+\r
+class MsaFileFilter extends FileFilter {\r
+\r
+ @Override\r
+ public boolean accept( final File f ) {\r
+ final String file_name = f.getName().trim().toLowerCase();\r
+ return file_name.endsWith( ".msa" ) || file_name.endsWith( ".aln" ) || file_name.endsWith( ".fasta" )\r
+ || file_name.endsWith( ".fas" ) || file_name.endsWith( ".fa" ) || f.isDirectory();\r
+ }\r
+\r
+ @Override\r
+ public String getDescription() {\r
+ return "Multiple sequence alignment files (*.msa, *.aln, *.fasta, *.fa, *.fas)";\r
+ }\r
+}\r
+\r
+class NexusFilter extends FileFilter {\r
+\r
+ @Override\r
+ public boolean accept( final File f ) {\r
+ final String file_name = f.getName().trim().toLowerCase();\r
+ return file_name.endsWith( ".nex" ) || file_name.endsWith( ".nexus" ) || file_name.endsWith( ".nx" )\r
+ || file_name.endsWith( ".tre" ) || f.isDirectory();\r
+ }\r
+\r
+ @Override\r
+ public String getDescription() {\r
+ return "Nexus files (*.nex, *.nexus, *.nx, *.tre)";\r
+ }\r
+} // NexusFilter\r
+\r
+class NHFilter extends FileFilter {\r
+\r
+ @Override\r
+ public boolean accept( final File f ) {\r
+ final String file_name = f.getName().trim().toLowerCase();\r
+ return file_name.endsWith( ".nh" ) || file_name.endsWith( ".newick" ) || file_name.endsWith( ".phy" )\r
+ || file_name.endsWith( ".tr" ) || file_name.endsWith( ".tree" ) || file_name.endsWith( ".dnd" )\r
+ || file_name.endsWith( ".ph" ) || file_name.endsWith( ".phb" ) || file_name.endsWith( ".nwk" )\r
+ || f.isDirectory();\r
+ }\r
+\r
+ @Override\r
+ public String getDescription() {\r
+ return "New Hampshire - Newick files (*.nh, *.newick, *.phy, *.tree, *.dnd, *.tr, *.ph, *.phb, *.nwk)";\r
+ }\r
+} // NHFilter\r
+\r
+class NHXFilter extends FileFilter {\r
+\r
+ @Override\r
+ public boolean accept( final File f ) {\r
+ final String file_name = f.getName().trim().toLowerCase();\r
+ return file_name.endsWith( ".nhx" ) || f.isDirectory();\r
+ }\r
+\r
+ @Override\r
+ public String getDescription() {\r
+ return "NHX files (*.nhx) [deprecated]";\r
+ }\r