/* * Tiled Map Editor, (c) 2004-2006 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Adam Turk <aturk@biggeruniverse.com> * Bjorn Lindeijer <bjorn@lindeijer.nl> */ package tiled.mapeditor.util; import java.awt.Component; import java.awt.HeadlessException; import java.io.File; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import tiled.mapeditor.Resources; /** * This file chooser extends the {@link javax.swing.JFileChooser} in a number * of ways. * <ul> * <li>Adds an extention to the filename based on the file filter, when * the user didn't specify any.</li> * <li>If the file to be saved is not accepted by the chosen file filter, * it confirms that the user really wants to do this. This is done * because the same file filter is used to determine with which * plugin to load the file.</li> * <li>Confirms before overwriting an existing file.</li> * </ul> * Automatic adding of file extension only works with * {@link tiled.mapeditor.util.ConfirmableFileFilter}. */ public final class ConfirmingFileChooser extends JFileChooser { /** * */ private static final long serialVersionUID = 2357564573322872373L; private static final String UNKNOWN_TYPE_MESSAGE = Resources.getString("dialog.saveas.unknown-type.message"); private static final String CONFIRM_MISMATCH = Resources.getString("dialog.saveas.confirm.mismatch"); private static final String CONFIRM_MISMATCH_TITLE = Resources.getString("dialog.saveas.confirm.mismatch.title"); private static final String FILE_EXISTS_MESSAGE = Resources.getString("general.file.exists.message"); private static final String FILE_EXISTS_TITLE = Resources.getString("general.file.exists.title"); public ConfirmingFileChooser(String currentDirectoryPath) { super(currentDirectoryPath); } @Override public int showSaveDialog(Component component) throws HeadlessException { setDialogTitle(Resources.getString("dialog.saveas.title")); return super.showSaveDialog(component); } public ConfirmingFileChooser() { this(null); } @Override public void approveSelection () { // When it's an open dialog, we don't need the extension or overwrite // checks. Probably you should just be using JFileChooser. if (getDialogType() == OPEN_DIALOG) { super.approveSelection(); return; } File file = new File(getSelectedFile().getAbsolutePath()); // If the file does not have an extention, append the default // extension specified by the file filter. String filename = file.getName(); int lastDot = filename.lastIndexOf('.'); if ((lastDot == -1 || lastDot == filename.length() - 1) && getFileFilter() instanceof ConfirmableFileFilter) { ConfirmableFileFilter filter = (ConfirmableFileFilter) getFileFilter(); String extension = filter.getDefaultExtension(); if (extension == null) { // Impossible to determine extension with this filter JOptionPane.showMessageDialog(this, UNKNOWN_TYPE_MESSAGE); return; } String newFilePath = file.getAbsolutePath(); // Add a dot if it wasn't at the end already if (lastDot != filename.length() - 1) { newFilePath += "."; } file = new File(newFilePath + extension); setSelectedFile(file); } // Check that chosen plugin accepts the file. It is a good idea to // warn the user when this is not the case, because loading the map // becomes a problem. if (!getFileFilter().accept(file)) { int result = JOptionPane.showConfirmDialog( this, CONFIRM_MISMATCH, CONFIRM_MISMATCH_TITLE, JOptionPane.YES_NO_OPTION); if (result != JOptionPane.OK_OPTION) { return; } } // Confirm overwrite if the file happens to exist already if (file.exists()) { int answer = JOptionPane.showConfirmDialog( this, FILE_EXISTS_MESSAGE, FILE_EXISTS_TITLE, JOptionPane.YES_NO_OPTION); if (answer == JOptionPane.YES_OPTION) { super.approveSelection(); } } else { super.approveSelection(); } } }