package org.osm2world.viewer.control.actions; import java.awt.Cursor; import java.awt.event.ActionEvent; import java.io.File; import java.util.Observable; import java.util.Observer; import javax.swing.AbstractAction; import javax.swing.JFileChooser; import javax.swing.filechooser.FileNameExtensionFilter; import org.osm2world.viewer.model.Data; import org.osm2world.viewer.model.MessageManager; import org.osm2world.viewer.model.RenderOptions; import org.osm2world.viewer.view.ProgressDialog; import org.osm2world.viewer.view.ViewerFrame; public abstract class AbstractExportAction extends AbstractAction implements Observer { private static final long serialVersionUID = 76411168278378356L; //generated serialVersionUID protected final ViewerFrame viewerFrame; protected final Data data; protected final MessageManager messageManager; protected final RenderOptions renderOptions; private File lastPath = null; protected AbstractExportAction(String name, ViewerFrame viewerFrame, Data data, MessageManager messageManager, RenderOptions renderOptions) { super(name); this.viewerFrame = viewerFrame; this.messageManager = messageManager; this.data = data; this.renderOptions = renderOptions; setEnabled(false); data.addObserver(this); } @Override public void update(Observable o, Object arg) { setEnabled(data.getConversionResults() != null); } protected boolean chooseDirectory() { return false; } abstract protected FileNameExtensionFilter getFileNameExtensionFilter(); abstract protected void performExport(File file); @Override public void actionPerformed(ActionEvent arg0) { File file = askFile(); if (file != null) { new ExportFileThread(file).start(); } } private File askFile() { JFileChooser chooser = new JFileChooser(lastPath); chooser.setDialogTitle("Export file"); if (chooseDirectory()) { chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); } else { chooser.setFileFilter(getFileNameExtensionFilter()); } int returnVal = chooser.showSaveDialog(null); if (returnVal == JFileChooser.APPROVE_OPTION) { File selectedFile = chooser.getSelectedFile(); lastPath = selectedFile.getParentFile(); /* make sure that file uses correct extension */ if (getFileNameExtensionFilter() != null && getFileNameExtensionFilter().getExtensions().length == 1) { String extension = getFileNameExtensionFilter().getExtensions()[0]; if (!selectedFile.getPath().endsWith("." + extension)) { selectedFile = new File(selectedFile.getPath() + "." + extension); } } return selectedFile; } else { return null; } } private class ExportFileThread extends Thread { private final File file; private ProgressDialog progressDialog; public ExportFileThread(File file) { super("ExportFileThread"); this.file = file; } @Override public void run() { viewerFrame.setCursor(Cursor .getPredefinedCursor(Cursor.WAIT_CURSOR)); viewerFrame.setEnabled(false); String progressDescription = "Export file"; if (getFileNameExtensionFilter() != null) { progressDescription += " of type " + getFileNameExtensionFilter().getDescription(); } progressDialog = new ProgressDialog(viewerFrame, progressDescription); progressDialog.setProgress(null); progressDialog.setText("Writing file: " + file.getAbsolutePath()); performExport(file); progressDialog.dispose(); viewerFrame.setCursor(Cursor .getPredefinedCursor(Cursor.DEFAULT_CURSOR)); viewerFrame.setEnabled(true); } } }