/* * Open Source Physics software is free software as described near the bottom of this code file. * * For additional information and documentation on Open Source Physics please see: * <http://www.opensourcephysics.org/> */ package org.opensourcephysics.tools; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.Enumeration; import java.util.Hashtable; import java.util.List; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.JCheckBox; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.UIManager; import javax.swing.filechooser.FileFilter; import org.opensourcephysics.controls.OSPLog; import org.opensourcephysics.controls.XMLControlElement; import org.opensourcephysics.display.Dataset; import org.opensourcephysics.display.OSPRuntime; import org.opensourcephysics.display2d.GridData; // modified by W. Christian Jan 28, 2005 /** * An export tool which launches a Save dialog * * @author Kipton Barros * @version 1.0 */ public class ExportTool implements Tool, PropertyChangeListener { /* * TOOL is the single instance of ExportTool registered with the OSP Toolbox. */ static ExportTool TOOL; JFileChooser fc; static String exportExtension = "txt"; //$NON-NLS-1$ static Hashtable<String, ExportFormat> formats; JCheckBox[] checkBoxes; String exportName = "default"; //$NON-NLS-1$ /** * Creates a new export tool. Doesn't get activated until setXML() is called. */ public ExportTool() { createFileChooser(); fc.addPropertyChangeListener(this); } void createFileChooser() { formats = new Hashtable<String, ExportFormat>(); registerFormat(new ExportGnuplotFormat()); registerFormat(new ExportXMLFormat()); // Set the "filesOfTypeLabelText" to "File Format:" Object oldFilesOfTypeLabelText = UIManager.put("FileChooser.filesOfTypeLabelText", //$NON-NLS-1$ ToolsRes.getString("ExportTool.FileChooser.Label.FileFormat")); //$NON-NLS-1$ // Create a new FileChooser fc = new JFileChooser(OSPRuntime.chooserDir); // Reset the "filesOfTypeLabelText" to previous value UIManager.put("FileChooser.filesOfTypeLabelText", oldFilesOfTypeLabelText); //$NON-NLS-1$ fc.setDialogType(JFileChooser.SAVE_DIALOG); fc.setDialogTitle(ToolsRes.getString("ExportTool.FileChooser.Title")); //$NON-NLS-1$ fc.setApproveButtonText(ToolsRes.getString("ExportTool.FileChooser.Button.Export")); // Set export formats //$NON-NLS-1$ setChooserFormats(); } public void propertyChange(PropertyChangeEvent evt) { FileFilter filter = fc.getFileFilter(); if(filter==null) { return; } ExportFormat ef = formats.get(filter.getDescription()); if((ef==null)||exportExtension.equals(ef.extension())) { return; } exportExtension = ef.extension(); // bug in Java? This doesn't seem to work. fc.setSelectedFile(new File(exportName+'.'+exportExtension)); } /* * Builds the accessory pane for file chooser */ void buildAccessory(List<Object> data) { checkBoxes = new JCheckBox[data.size()]; JPanel checkPanel = new JPanel(new GridLayout(0, 1)); // Create the list of data objects and put it in a scroll pane. for(int i = 0; i<data.size(); i++) { String s = ToolsRes.getString("ExportTool.FileChooser.DataType.Unknown")+i; //$NON-NLS-1$ Color c = Color.BLACK; Object o = data.get(i); if(o instanceof Dataset) { Dataset d = (Dataset) o; // BUG: come up with better name s = ToolsRes.getString("ExportTool.FileChooser.DataType.Dataset")+i; //$NON-NLS-1$ c = d.getFillColor(); } else if(o instanceof GridData) { s = ToolsRes.getString("ExportTool.FileChooser.DataType.GridData")+i; //$NON-NLS-1$ } checkBoxes[i] = new JCheckBox(s); checkBoxes[i].setSelected(true); checkBoxes[i].setForeground(c); checkBoxes[i].setBackground(Color.WHITE); checkPanel.add(checkBoxes[i]); } JScrollPane scrollPane = new JScrollPane(checkPanel); scrollPane.getViewport().setBackground(Color.WHITE); JPanel p = new JPanel(new BorderLayout()); if(data.size()==0) { p.add(new JLabel(ToolsRes.getString("ExportTool.FileChooser.Heading.NoData")), //$NON-NLS-1$ BorderLayout.NORTH); } else { p.add(new JLabel(ToolsRes.getString("ExportTool.FileChooser.Heading.ExportableData")), //$NON-NLS-1$ BorderLayout.NORTH); } p.add(scrollPane, BorderLayout.CENTER); p.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); fc.setAccessory(p); // always show the exportable data } /* * Set dialog formats in file chooser */ void setChooserFormats() { fc.resetChoosableFileFilters(); fc.setAcceptAllFileFilterUsed(false); for(Enumeration<String> e = formats.keys(); e.hasMoreElements(); ) { final String desc = e.nextElement(); fc.addChoosableFileFilter(new javax.swing.filechooser.FileFilter() { public boolean accept(File f) { return f!=null; } public String getDescription() { return desc; } }); } } /* * Gets all data objects from XML */ List<Object> getDataObjects(XMLControlElement control) { List<Object> ret = new ArrayList<Object>(); ret.addAll(control.getObjects(Dataset.class)); ret.addAll(control.getObjects(GridData.class)); return ret; } /* * Filters out data objects to export based on the checkBoxes */ List<Object> filterDataObjects(List<Object> data) { Vector<Object> ret = new Vector<Object>(); for(int i = 0; i<data.size(); i++) { if(checkBoxes[i].isSelected()) { ret.add(data.get(i)); } } return ret; } /** * Register a new export format. */ static public void registerFormat(ExportFormat format) { formats.put(format.description(), format); } /* * Displays the export dialog with a given XML file. */ public void send(Job job, Tool replyTo) throws RemoteException { XMLControlElement control = new XMLControlElement(); try { control.readXML(job.getXML()); } catch(RemoteException ex) {} OSPLog.finest(control.toXML()); // Load all data objects into 'data' List<Object> data = getDataObjects(control); // Set export dialog to list appropriate data objects buildAccessory(data); // Set selected file in home directory fc.setSelectedFile(new File(exportName+'.'+exportExtension)); // Show the export dialog, and wait for user input int returnVal = fc.showSaveDialog(null); // If user clicked export, write the file if(returnVal==JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); // Check to see if file already exists if(file.exists()) { int selected = JOptionPane.showConfirmDialog(null, ToolsRes.getString("Tool.Dialog.ReplaceFile.Message")+" "+file.getName()+"?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ ToolsRes.getString("Tool.Dialog.ReplaceFile.Title"), //$NON-NLS-1$ JOptionPane.YES_NO_CANCEL_OPTION); if(selected!=JOptionPane.YES_OPTION) { return; } } String description = fc.getFileFilter().getDescription(); formats.get(description).export(file, filterDataObjects(data)); if(file.getName().endsWith(exportExtension)) { exportName = file.getName().substring(0, file.getName().length()-1-exportExtension.length()); // System.out.println("new name="+exportName); } } } /** * Gets the shared Tool. * * @return the shared ExportTool */ public static ExportTool getTool() { if(TOOL==null) { TOOL = new ExportTool(); Toolbox.addTool("ExportTool", TOOL); //$NON-NLS-1$ } return TOOL; } } /* * Open Source Physics software is free software; you can redistribute * it and/or modify it under the terms of the GNU General Public License (GPL) as * published by the Free Software Foundation; either version 2 of the License, * or(at your option) any later version. * Code that uses any portion of the code in the org.opensourcephysics package * or any subpackage (subdirectory) of this package must must also be be released * under the GNU GPL license. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA * or view the license online at http://www.gnu.org/copyleft/gpl.html * * Copyright (c) 2007 The Open Source Physics project * http://www.opensourcephysics.org */