/* * 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.actions; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.KeyStroke; import tiled.io.MapHelper; import tiled.io.MapWriter; import tiled.mapeditor.MapEditor; import tiled.mapeditor.Resources; import tiled.mapeditor.util.ConfirmingFileChooser; import tiled.mapeditor.util.TiledFileFilter; import tiled.util.TiledConfiguration; /** * A save action that always shows a file chooser. * * @version $Id$ */ public class SaveAsAction extends AbstractAction { /** * */ private static final long serialVersionUID = -7289014717535721608L; protected MapEditor editor; private boolean savingCancelled; private static final String ACTION_NAME = Resources.getString("action.map.saveas.name"); private static final String ACTION_TOOLTIP = Resources.getString("action.map.saveas.tooltip"); private static final String SAVEAS_ERROR_MESSAGE = Resources.getString("dialog.saveas.error.message"); private static final String SAVEAS_ERROR_TITLE = Resources.getString("dialog.saveas.error.title"); public SaveAsAction(MapEditor editor) { super(ACTION_NAME); putValue(SHORT_DESCRIPTION, ACTION_TOOLTIP); putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke("control shift S")); this.editor = editor; } public void actionPerformed(ActionEvent e) { showFileChooser(); } /** * Shows the confirming file chooser and proceeds with saving the map when * a filename was approved. */ protected void showFileChooser() { // Start at the location of the most recently loaded map file String startLocation = TiledConfiguration.node("recent").get("file0", null); TiledFileFilter byExtensionFilter = new TiledFileFilter(TiledFileFilter.FILTER_EXT); TiledFileFilter tmxFilter = new TiledFileFilter(TiledFileFilter.FILTER_TMX); JFileChooser chooser = new ConfirmingFileChooser(startLocation); chooser.setAcceptAllFileFilterUsed(false); chooser.addChoosableFileFilter(byExtensionFilter); chooser.addChoosableFileFilter(tmxFilter); MapWriter[] writers = editor.getPluginLoader().getWriters(); for (MapWriter writer : writers) { try { chooser.addChoosableFileFilter(new TiledFileFilter(writer)); } catch (Exception e) { e.printStackTrace(); } } chooser.setFileFilter(byExtensionFilter); int result = chooser.showSaveDialog(editor.getAppFrame()); if (result == JFileChooser.APPROVE_OPTION) { savingCancelled = false; TiledFileFilter saver = (TiledFileFilter) chooser.getFileFilter(); String selectedFile = chooser.getSelectedFile().getAbsolutePath(); saveFile(saver, selectedFile); } else { savingCancelled = true; } } /** * Actually saves the map. * * @param saver the file filter selected when the filename was chosen * @param filename the filename to save the map to */ protected void saveFile(TiledFileFilter saver, String filename) { try { // Either select the format by extension or use a specific format // when selected. if (saver.getType() == TiledFileFilter.FILTER_EXT) { MapHelper.saveMap(editor.getCurrentMap(), filename); } else { MapHelper.saveMap(editor.getCurrentMap(), saver.getPlugin(), filename); } // The file was saved successfully, update some things. // todo: this could probably be done a bit neater editor.getCurrentMap().setFilename(filename); editor.updateRecent(filename); editor.getUndoHandler().commitSave(); editor.updateTitle(); } catch (Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(editor.getAppFrame(), SAVEAS_ERROR_MESSAGE + " " + filename + ": " + e.getLocalizedMessage(), SAVEAS_ERROR_TITLE, JOptionPane.ERROR_MESSAGE); } } public boolean isSavingCancelled () { return savingCancelled; } }