Gridarta Editor
DefaultFileControl.java
Go to the documentation of this file.
1 /*
2  * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
3  * Copyright (C) 2000-2015 The Gridarta Developers.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 package net.sf.gridarta.gui.misc;
21 
22 import java.awt.Component;
23 import java.io.File;
24 import java.io.IOException;
25 import javax.swing.JFileChooser;
26 import javax.swing.JOptionPane;
27 import javax.swing.filechooser.FileFilter;
46 import net.sf.japi.swing.action.ActionBuilder;
47 import net.sf.japi.swing.action.ActionBuilderFactory;
48 import org.jetbrains.annotations.NotNull;
49 import org.jetbrains.annotations.Nullable;
50 
55 public class DefaultFileControl<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> implements FileControl<G, A, R> {
56 
60  @NotNull
61  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
62 
66  @NotNull
68 
72  @NotNull
74 
78  @NotNull
80 
84  @NotNull
86 
90  @NotNull
92 
96  @NotNull
97  private final Component parent;
98 
102  @NotNull
103  private final FileFilter mapFileFilter;
104 
108  @NotNull
109  private final FileFilter scriptFileFilter;
110 
114  @NotNull
116 
120  @NotNull
121  private final String scriptExtension;
122 
126  @NotNull
128 
132  @NotNull
133  private final PathManager pathManager;
134 
139  @Nullable
140  private JFileChooser fileChooser;
141 
157  public DefaultFileControl(@NotNull final ProjectSettings projectSettings, @NotNull final VolatileSettings volatileSettings, @NotNull final MapImageCache<G, A, R> mapImageCache, @NotNull final MapManager<G, A, R> mapManager, @NotNull final MapViewsManager<G, A, R> mapViewsManager, @NotNull final Component parent, @NotNull final FileFilter mapFileFilter, @NotNull final FileFilter scriptFileFilter, @NotNull final NewMapDialogFactory<G, A, R> newMapDialogFactory, @NotNull final String scriptExtension, @NotNull final ScriptEditControl scriptEditControl, @NotNull final PathManager pathManager) {
158  this.projectSettings = projectSettings;
159  this.volatileSettings = volatileSettings;
160  this.mapImageCache = mapImageCache;
161  this.mapManager = mapManager;
162  this.mapViewsManager = mapViewsManager;
163  this.parent = parent;
164  this.mapFileFilter = mapFileFilter;
165  this.scriptFileFilter = scriptFileFilter;
166  this.newMapDialogFactory = newMapDialogFactory;
167  this.scriptExtension = scriptExtension;
168  this.scriptEditControl = scriptEditControl;
169  this.pathManager = pathManager;
170  }
171 
176  @NotNull
177  private JFileChooser createFileChooser() {
178  final JFileChooser tmpFileChooser = new JFileChooser();
179  tmpFileChooser.setDialogTitle(ActionBuilderUtils.getString(ACTION_BUILDER, "fileDialog.title"));
180  tmpFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
181  tmpFileChooser.setMultiSelectionEnabled(true);
182  tmpFileChooser.addChoosableFileFilter(scriptFileFilter);
183  tmpFileChooser.addChoosableFileFilter(mapFileFilter);
184  if (projectSettings.getMapsDirectory().exists()) {
186  }
187  tmpFileChooser.setAccessory(new MapPreviewAccessory(mapImageCache, tmpFileChooser));
188  return tmpFileChooser;
189  }
190 
191  @Override
192  public void openFile(final boolean mapFile) {
193  if (fileChooser == null) {
195  }
196  final JFileChooser tmpFileChooser = fileChooser;
197  tmpFileChooser.setFileFilter(mapFile ? mapFileFilter : scriptFileFilter);
199  final int returnVal = tmpFileChooser.showOpenDialog(parent);
200  if (returnVal != JFileChooser.APPROVE_OPTION) {
201  return;
202  }
203 
204  final File[] files = tmpFileChooser.getSelectedFiles();
205  for (final File file : files) {
206  final boolean isScriptFile = file.getName().toLowerCase().endsWith(scriptExtension);
207  if (file.isFile()) {
208  if (isScriptFile) {
210  } else {
211  try {
212  mapViewsManager.openMapFileWithView(file, null, null);
213  } catch (final IOException ex) {
214  reportLoadError(file, ex.getMessage());
215  }
216  }
217  } else if (!file.exists()) {
218  if (isScriptFile) {
219  scriptEditControl.newScript(); // TODO: pass filename
220  } else {
221  newMapDialogFactory.showNewMapDialog(); // XXX: pass file
222  }
223  } // If neither branch matches, it's a directory - what to do with directories?
224  }
225  }
226 
227  @Override
228  public boolean save(@NotNull final MapControl<G, A, R> mapControl) {
229  final MapFile mapFile = mapControl.getMapModel().getMapFile();
230  if (mapFile != null) {
231  try {
232  mapControl.save();
233  } catch (final IOException ex) {
234  reportSaveError(mapFile.getFile(), ex.getMessage());
235  return false;
236  }
237  return true;
238  }
239 
240  return saveAs(mapControl);
241  }
242 
243  @Override
244  public void saveAllMaps() {
245  for (final MapControl<G, A, R> mapControl : mapManager.getOpenedMaps()) {
246  if (mapControl.getMapModel().isModified() && !save(mapControl)) {
247  return;
248  }
249  }
250  }
251 
252  @Override
253  public boolean closeAllMaps() {
254  while (true) {
255  final MapControl<G, A, R> mapControl = mapManager.getOpenMap();
256  if (mapControl == null) {
257  break;
258  }
259 
260  if (!confirmSaveChanges(mapControl)) {
261  return false;
262  }
263 
264  mapManager.closeMap(mapControl);
265  }
266 
267  return true;
268  }
269 
270  @Override
271  public boolean saveAs(@NotNull final MapControl<G, A, R> mapControl) {
272  final File file = saveMapAs(mapControl);
273  if (file == null) {
274  return false;
275  }
276 
277  try {
278  mapControl.saveAs(pathManager.getMapFile(file));
279  } catch (final IOException ex) {
280  reportSaveError(file, ex.getMessage());
281  return false;
282  }
283 
284  return true;
285  }
286 
292  @Nullable
293  private File saveMapAs(@NotNull final MapControl<G, A, R> mapControl) {
294  final JFileChooser saveFileChooser = new JFileChooser();
295  saveFileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
296  saveFileChooser.setDialogTitle("Save Map Or Script As");
297  saveFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
298  saveFileChooser.setMultiSelectionEnabled(false);
299  saveFileChooser.resetChoosableFileFilters();
300  saveFileChooser.addChoosableFileFilter(scriptFileFilter);
301  saveFileChooser.setFileFilter(mapFileFilter);
302 
303  final MapFile mapFile = mapControl.getMapModel().getMapFile();
304  final File defaultDir = mapFile == null ? null : mapFile.getFile().getParentFile();
305  if (defaultDir != null && defaultDir.exists()) {
306  FileChooserUtils.setCurrentDirectory(saveFileChooser, defaultDir);
307  saveFileChooser.setSelectedFile(mapFile.getFile());
308  } else {
309  final File currentSaveMapDirectory = volatileSettings.getCurrentSaveMapDirectory();
310  FileChooserUtils.setCurrentDirectory(saveFileChooser, currentSaveMapDirectory);
311  saveFileChooser.setSelectedFile(new File(currentSaveMapDirectory, mapFile == null ? CommonConstants.DEFAULT_MAP_FILENAME : mapFile.getFile().getName()));
312  }
313 
314  final int returnVal = saveFileChooser.showSaveDialog(parent);
315  if (returnVal != JFileChooser.APPROVE_OPTION) {
316  return null;
317  }
318 
319  volatileSettings.setCurrentSaveMapDirectory(saveFileChooser.getCurrentDirectory());
320  final File file = saveFileChooser.getSelectedFile();
321  if (file.exists() && ACTION_BUILDER.showConfirmDialog(parent, JOptionPane.WARNING_MESSAGE, JOptionPane.OK_CANCEL_OPTION, "overwriteOtherFile", file.getName()) != JOptionPane.OK_OPTION) {
322  return null;
323  }
324 
325  return file;
326  }
327 
328  @Override
329  public boolean confirmSaveChanges(@NotNull final MapControl<G, A, R> mapControl) {
330  if (mapControl.getMapModel().isModified()) {
331  final int result = ACTION_BUILDER.showConfirmDialog(parent, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, "confirmSaveChanges", mapControl.getMapModel().getMapArchObject().getMapName());
332  if (result == JOptionPane.YES_OPTION) {
333  if (!save(mapControl)) {
334  return false;
335  }
336  } else if (result == JOptionPane.CANCEL_OPTION || result == JOptionPane.CLOSED_OPTION) {
337  return false;
338  }
339  }
340 
341  return true;
342  }
343 
344  @Override
345  public void reportSaveError(@NotNull final MapControl<G, A, R> mapControl, @NotNull final String message) {
346  final MapFile mapFile = mapControl.getMapModel().getMapFile();
347  assert mapFile != null;
348  reportSaveError(mapFile.getFile(), message);
349  }
350 
351  @Override
352  public void reportSaveError(@NotNull final File mapFile, @NotNull final String message) {
353  ACTION_BUILDER.showMessageDialog(parent, "encodeMapFile", mapFile, message);
354  }
355 
356  @Override
357  public void reportLoadError(@Nullable final File file, @NotNull final String message) {
358  ACTION_BUILDER.showMessageDialog(parent, "openFileLoadMap", file == null ? "<unknown>" : file, message);
359  }
360 
361  @Override
362  public void reportOutOfMapBoundsDeleted(@NotNull final File file, final int outOfMapBoundsDeleted, @NotNull final StringBuilder outOfMapBoundsObjects) {
363  ACTION_BUILDER.showMessageDialog(parent, "openFileOutOfMapBoundsDeleted", file, outOfMapBoundsDeleted, outOfMapBoundsObjects);
364  }
365 
366  @Override
367  public void reportOutOfMemory(@NotNull final File file) {
368  ACTION_BUILDER.showMessageDialog(parent, "mapOutOfMemory", file);
369  }
370 
371  @Override
372  public void reportTeleportCharacterError(@NotNull final String mapPath, @NotNull final String message) {
373  ACTION_BUILDER.showMessageDialog(parent, "teleportCharacterError", mapPath, message);
374  }
375 
376 }
net.sf.gridarta.gui.mapimagecache
Definition: ImageType.java:20
net.sf.gridarta.gui.misc.DefaultFileControl.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Definition: DefaultFileControl.java:61
net.sf.gridarta.model.mapmanager
Definition: AbstractMapManager.java:20
net.sf.gridarta.textedit.scripteditor
Definition: Actions.java:20
net.sf.gridarta.model.mapmanager.MapManager
Definition: MapManager.java:37
net.sf.gridarta.gui.misc.DefaultFileControl.closeAllMaps
boolean closeAllMaps()
Definition: DefaultFileControl.java:253
net.sf.gridarta
net.sf.gridarta.utils.FileChooserUtils.setCurrentDirectory
static void setCurrentDirectory(@NotNull final JFileChooser fileChooser, @Nullable final File dir)
Definition: FileChooserUtils.java:48
net.sf.gridarta.gui.map.MapPreviewAccessory
Definition: MapPreviewAccessory.java:53
net.sf.gridarta.gui.misc.DefaultFileControl.openFile
void openFile(final boolean mapFile)
Definition: DefaultFileControl.java:192
net.sf.gridarta.gui.misc.DefaultFileControl.volatileSettings
final VolatileSettings volatileSettings
Definition: DefaultFileControl.java:73
net.sf.gridarta.gui.misc.DefaultFileControl.mapImageCache
final MapImageCache< G, A, R > mapImageCache
Definition: DefaultFileControl.java:79
net.sf
net.sf.gridarta.model.mapmanager.FileControl
Definition: FileControl.java:30
net.sf.gridarta.model.io.PathManager
Definition: PathManager.java:39
net.sf.gridarta.model.mapmodel
Definition: AboveFloorInsertionMode.java:20
net.sf.gridarta.utils.CommonConstants
Definition: CommonConstants.java:28
net.sf.gridarta.gui.misc.DefaultFileControl.scriptFileFilter
final FileFilter scriptFileFilter
Definition: DefaultFileControl.java:109
net.sf.gridarta.utils.FileChooserUtils.sanitizeCurrentDirectory
static void sanitizeCurrentDirectory(@NotNull final JFileChooser fileChooser)
Definition: FileChooserUtils.java:56
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.gameobject.GameObject
Definition: GameObject.java:36
net.sf.gridarta.model.mapcontrol
Definition: DefaultMapControl.java:20
net.sf.gridarta.textedit
net.sf.gridarta.gui
net.sf.gridarta.gui.misc.DefaultFileControl.projectSettings
final ProjectSettings projectSettings
Definition: DefaultFileControl.java:67
net.sf.gridarta.gui.misc.DefaultFileControl.reportTeleportCharacterError
void reportTeleportCharacterError(@NotNull final String mapPath, @NotNull final String message)
Definition: DefaultFileControl.java:372
net.sf.gridarta.model.mapmanager.MapManager.getOpenedMaps
List< MapControl< G, A, R > > getOpenedMaps()
net.sf.gridarta.gui.misc.DefaultFileControl.pathManager
final PathManager pathManager
Definition: DefaultFileControl.java:133
net.sf.gridarta.gui.misc.DefaultFileControl.reportSaveError
void reportSaveError(@NotNull final MapControl< G, A, R > mapControl, @NotNull final String message)
Definition: DefaultFileControl.java:345
net.sf.gridarta.gui.misc.DefaultFileControl.scriptExtension
final String scriptExtension
Definition: DefaultFileControl.java:121
net.sf.gridarta.gui.misc.DefaultFileControl.newMapDialogFactory
final NewMapDialogFactory< G, A, R > newMapDialogFactory
Definition: DefaultFileControl.java:115
net.sf.gridarta.gui.mapimagecache.MapImageCache
Definition: MapImageCache.java:54
net.sf.gridarta.model.gameobject
Definition: AbstractGameObject.java:20
net.sf.gridarta.gui.dialog.newmap.NewMapDialogFactory.showNewMapDialog
void showNewMapDialog()
Definition: NewMapDialogFactory.java:143
net
net.sf.gridarta.gui.misc.DefaultFileControl.scriptEditControl
final ScriptEditControl scriptEditControl
Definition: DefaultFileControl.java:127
net.sf.gridarta.gui.misc.DefaultFileControl.saveMapAs
File saveMapAs(@NotNull final MapControl< G, A, R > mapControl)
Definition: DefaultFileControl.java:293
net.sf.gridarta.gui.misc.DefaultFileControl.confirmSaveChanges
boolean confirmSaveChanges(@NotNull final MapControl< G, A, R > mapControl)
Definition: DefaultFileControl.java:329
net.sf.gridarta.gui.misc.DefaultFileControl.save
boolean save(@NotNull final MapControl< G, A, R > mapControl)
Definition: DefaultFileControl.java:228
net.sf.gridarta.model.maparchobject.MapArchObject
Definition: MapArchObject.java:40
net.sf.gridarta.model.io.PathManager.getMapFile
MapFile getMapFile(@NotNull final AbsoluteMapPath mapPath)
Definition: PathManager.java:72
net.sf.gridarta.gui.map.mapview
Definition: AbstractMapView.java:20
net.sf.gridarta.model.mapmodel.MapFile.getFile
File getFile()
Definition: MapFile.java:102
net.sf.gridarta.gui.misc.DefaultFileControl.mapFileFilter
final FileFilter mapFileFilter
Definition: DefaultFileControl.java:103
net.sf.gridarta.gui.misc.DefaultFileControl.saveAs
boolean saveAs(@NotNull final MapControl< G, A, R > mapControl)
Definition: DefaultFileControl.java:271
net.sf.gridarta.gui.misc.DefaultFileControl.fileChooser
JFileChooser fileChooser
Definition: DefaultFileControl.java:140
net.sf.gridarta.gui.dialog.newmap
Definition: AbstractMapsizeNewMapDialog.java:20
net.sf.gridarta.gui.dialog.newmap.NewMapDialogFactory
Definition: NewMapDialogFactory.java:39
net.sf.gridarta.gui.misc.DefaultFileControl.mapViewsManager
final MapViewsManager< G, A, R > mapViewsManager
Definition: DefaultFileControl.java:91
net.sf.gridarta.gui.misc.DefaultFileControl.createFileChooser
JFileChooser createFileChooser()
Definition: DefaultFileControl.java:177
net.sf.gridarta.utils.ActionBuilderUtils.getString
static String getString(@NotNull final ActionBuilder actionBuilder, @NotNull final String key, @NotNull final String defaultValue)
Definition: ActionBuilderUtils.java:71
net.sf.gridarta.gui.dialog
net.sf.gridarta.model.mapmodel.MapFile
Definition: MapFile.java:31
net.sf.gridarta.textedit.scripteditor.ScriptEditControl.openScriptFile
void openScriptFile(@NotNull final File file)
Definition: ScriptEditControl.java:155
net.sf.gridarta.model.io
Definition: AbstractArchetypeParser.java:20
net.sf.gridarta.model.settings.ProjectSettings
Definition: ProjectSettings.java:29
net.sf.gridarta.gui.misc.DefaultFileControl.mapManager
final MapManager< G, A, R > mapManager
Definition: DefaultFileControl.java:85
net.sf.gridarta.textedit.scripteditor.ScriptEditControl
Definition: ScriptEditControl.java:59
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Definition: Archetype.java:41
net.sf.gridarta.gui.misc.DefaultFileControl.reportSaveError
void reportSaveError(@NotNull final File mapFile, @NotNull final String message)
Definition: DefaultFileControl.java:352
net.sf.gridarta.model.settings.VolatileSettings
Definition: VolatileSettings.java:29
net.sf.gridarta.gui.map
Definition: AbstractPerMapDialogManager.java:20
net.sf.gridarta.utils.FileChooserUtils
Definition: FileChooserUtils.java:31
net.sf.gridarta.model.settings.VolatileSettings.setCurrentSaveMapDirectory
void setCurrentSaveMapDirectory(@NotNull File currentSaveMapDirectory)
net.sf.gridarta.gui.misc.DefaultFileControl.DefaultFileControl
DefaultFileControl(@NotNull final ProjectSettings projectSettings, @NotNull final VolatileSettings volatileSettings, @NotNull final MapImageCache< G, A, R > mapImageCache, @NotNull final MapManager< G, A, R > mapManager, @NotNull final MapViewsManager< G, A, R > mapViewsManager, @NotNull final Component parent, @NotNull final FileFilter mapFileFilter, @NotNull final FileFilter scriptFileFilter, @NotNull final NewMapDialogFactory< G, A, R > newMapDialogFactory, @NotNull final String scriptExtension, @NotNull final ScriptEditControl scriptEditControl, @NotNull final PathManager pathManager)
Definition: DefaultFileControl.java:157
net.sf.gridarta.gui.misc.DefaultFileControl.reportOutOfMemory
void reportOutOfMemory(@NotNull final File file)
Definition: DefaultFileControl.java:367
net.sf.gridarta.model.mapmanager.MapManager.getOpenMap
MapControl< G, A, R > getOpenMap()
net.sf.gridarta.model.mapcontrol.MapControl
Definition: MapControl.java:35
net.sf.gridarta.utils.ActionBuilderUtils
Definition: ActionBuilderUtils.java:31
net.sf.gridarta.gui.misc.DefaultFileControl
Definition: DefaultFileControl.java:55
net.sf.gridarta.utils.CommonConstants.DEFAULT_MAP_FILENAME
static final String DEFAULT_MAP_FILENAME
Definition: CommonConstants.java:54
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.misc.DefaultFileControl.saveAllMaps
void saveAllMaps()
Definition: DefaultFileControl.java:244
net.sf.gridarta.gui.misc.DefaultFileControl.parent
final Component parent
Definition: DefaultFileControl.java:97
net.sf.gridarta.model.settings.ProjectSettings.getMapsDirectory
File getMapsDirectory()
net.sf.gridarta.gui.map.mapview.MapViewsManager.openMapFileWithView
MapView< G, A, R > openMapFileWithView(@NotNull final MapFile mapFile, @Nullable final Point viewPosition)
Definition: MapViewsManager.java:333
net.sf.gridarta.gui.misc.DefaultFileControl.reportLoadError
void reportLoadError(@Nullable final File file, @NotNull final String message)
Definition: DefaultFileControl.java:357
net.sf.gridarta.gui.map.mapview.MapViewsManager
Definition: MapViewsManager.java:47
net.sf.gridarta.model.settings.VolatileSettings.getCurrentSaveMapDirectory
File getCurrentSaveMapDirectory()
net.sf.gridarta.gui.misc.DefaultFileControl.reportOutOfMapBoundsDeleted
void reportOutOfMapBoundsDeleted(@NotNull final File file, final int outOfMapBoundsDeleted, @NotNull final StringBuilder outOfMapBoundsObjects)
Definition: DefaultFileControl.java:362
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.textedit.scripteditor.ScriptEditControl.newScript
void newScript()
Definition: ScriptEditControl.java:146
net.sf.gridarta.model.settings
Definition: AbstractDefaultProjectSettings.java:20
net.sf.gridarta.model.mapmanager.MapManager.closeMap
void closeMap(@NotNull MapControl< G, A, R > mapControl)