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-2023 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.misc.DefaultFileControl.reportTeleportCharacterError
void reportTeleportCharacterError(@NotNull final String mapPath, @NotNull final String message)
Definition: DefaultFileControl.java:372
net.sf.gridarta.gui.mapimagecache
Definition: ImageType.java:20
net.sf.gridarta.model.mapmodel.MapFile
Definition: MapFile.java:31
net.sf.gridarta.model.mapmanager
Definition: AbstractMapManager.java:20
net.sf.gridarta.gui.dialog.newmap.NewMapDialogFactory.showNewMapDialog
void showNewMapDialog()
Definition: NewMapDialogFactory.java:143
net.sf.gridarta.model.mapmanager.MapManager.getOpenedMaps
List< MapControl< G, A, R > > getOpenedMaps()
net.sf.gridarta.gui.map.mapview.MapViewsManager
Definition: MapViewsManager.java:47
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.utils.FileChooserUtils.setCurrentDirectory
static void setCurrentDirectory(@NotNull final JFileChooser fileChooser, @Nullable final File dir)
Definition: FileChooserUtils.java:48
net.sf.gridarta.textedit.scripteditor
Definition: Actions.java:20
net.sf.gridarta.gui.misc.DefaultFileControl.pathManager
final PathManager pathManager
Definition: DefaultFileControl.java:133
net.sf.gridarta.gui.misc.DefaultFileControl.scriptFileFilter
final FileFilter scriptFileFilter
Definition: DefaultFileControl.java:109
net.sf.gridarta
net.sf.gridarta.model.mapmanager.FileControl
Definition: FileControl.java:30
net.sf.gridarta.model.mapmanager.MapManager.getOpenMap
MapControl< G, A, R > getOpenMap()
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.gui.misc.DefaultFileControl.reportLoadError
void reportLoadError(@Nullable final File file, @NotNull final String message)
Definition: DefaultFileControl.java:357
net.sf.gridarta.textedit.scripteditor.ScriptEditControl.openScriptFile
void openScriptFile(@NotNull final File file)
Definition: ScriptEditControl.java:155
files
Standard Edition Runtime Environment README Import and export control rules on cryptographic software vary from country to country The Java Cryptography Java provides two different sets of cryptographic policy files
Definition: README.txt:26
net.sf
net.sf.gridarta.gui.misc.DefaultFileControl
Definition: DefaultFileControl.java:55
net.sf.gridarta.model.mapmodel
Definition: AboveFloorInsertionMode.java:20
net.sf.gridarta.gui.misc.DefaultFileControl.parent
final Component parent
Definition: DefaultFileControl.java:97
net.sf.gridarta.textedit.scripteditor.ScriptEditControl
Definition: ScriptEditControl.java:59
net.sf.gridarta.gui.misc.DefaultFileControl.scriptExtension
final String scriptExtension
Definition: DefaultFileControl.java:121
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.mapcontrol
Definition: DefaultMapControl.java:20
net.sf.gridarta.gui.misc.DefaultFileControl.newMapDialogFactory
final NewMapDialogFactory< G, A, R > newMapDialogFactory
Definition: DefaultFileControl.java:115
net.sf.gridarta.textedit
net.sf.gridarta.model.mapmanager.MapManager.closeMap
void closeMap(@NotNull MapControl< G, A, R > mapControl)
net.sf.gridarta.gui.misc.DefaultFileControl.projectSettings
final ProjectSettings projectSettings
Definition: DefaultFileControl.java:67
net.sf.gridarta.gui.misc.DefaultFileControl.saveAs
boolean saveAs(@NotNull final MapControl< G, A, R > mapControl)
Definition: DefaultFileControl.java:271
net.sf.gridarta.utils.FileChooserUtils.sanitizeCurrentDirectory
static void sanitizeCurrentDirectory(@NotNull final JFileChooser fileChooser)
Definition: FileChooserUtils.java:56
net.sf.gridarta.gui
net.sf.gridarta.model.gameobject.GameObject
Definition: GameObject.java:36
net.sf.gridarta.model.gameobject
Definition: AbstractGameObject.java:20
net
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.mapFileFilter
final FileFilter mapFileFilter
Definition: DefaultFileControl.java:103
net.sf.gridarta.utils.CommonConstants
Definition: CommonConstants.java:28
net.sf.gridarta.gui.map.mapview
Definition: AbstractMapView.java:20
net.sf.gridarta.gui.dialog.newmap
Definition: AbstractMapsizeNewMapDialog.java:20
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.model.io.PathManager
Definition: PathManager.java:39
net.sf.gridarta.model.mapmanager.MapManager
Definition: MapManager.java:37
net.sf.gridarta.gui.misc.DefaultFileControl.fileChooser
JFileChooser fileChooser
Definition: DefaultFileControl.java:140
net.sf.gridarta.utils.CommonConstants.DEFAULT_MAP_FILENAME
static final String DEFAULT_MAP_FILENAME
Definition: CommonConstants.java:54
net.sf.gridarta.gui.dialog.newmap.NewMapDialogFactory
Definition: NewMapDialogFactory.java:39
net.sf.gridarta.model.mapcontrol.MapControl
Definition: MapControl.java:35
net.sf.gridarta.gui.dialog
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.model.io
Definition: AbstractArchetypeParser.java:20
net.sf.gridarta.gui.misc.DefaultFileControl.openFile
void openFile(final boolean mapFile)
Definition: DefaultFileControl.java:192
net.sf.gridarta.utils.FileChooserUtils
Definition: FileChooserUtils.java:31
net.sf.gridarta.gui.misc.DefaultFileControl.mapManager
final MapManager< G, A, R > mapManager
Definition: DefaultFileControl.java:85
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.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.model.settings.ProjectSettings
Definition: ProjectSettings.java:29
net.sf.gridarta.model.settings.VolatileSettings.setCurrentSaveMapDirectory
void setCurrentSaveMapDirectory(@NotNull File currentSaveMapDirectory)
net.sf.gridarta.model
net.sf.gridarta.model.io.PathManager.getMapFile
MapFile getMapFile(@NotNull final AbsoluteMapPath mapPath)
Definition: PathManager.java:72
net.sf.gridarta.textedit.scripteditor.ScriptEditControl.newScript
void newScript()
Definition: ScriptEditControl.java:146
net.sf.gridarta.gui.map
Definition: AbstractPerMapDialogManager.java:20
net.sf.gridarta.gui.misc.DefaultFileControl.createFileChooser
JFileChooser createFileChooser()
Definition: DefaultFileControl.java:177
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.scriptEditControl
final ScriptEditControl scriptEditControl
Definition: DefaultFileControl.java:127
net.sf.gridarta.gui.map.MapPreviewAccessory
Definition: MapPreviewAccessory.java:52
net.sf.gridarta.model.settings.ProjectSettings.getMapsDirectory
File getMapsDirectory()
net.sf.gridarta.gui.misc.DefaultFileControl.closeAllMaps
boolean closeAllMaps()
Definition: DefaultFileControl.java:253
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.model.mapmodel.MapFile.getFile
File getFile()
Definition: MapFile.java:102
net.sf.gridarta.utils.ActionBuilderUtils
Definition: ActionBuilderUtils.java:31
net.sf.gridarta.gui.misc.DefaultFileControl.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Definition: DefaultFileControl.java:61
net.sf.gridarta.model.settings.VolatileSettings
Definition: VolatileSettings.java:29
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.model.archetype.Archetype
Definition: Archetype.java:41
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.gui.misc.DefaultFileControl.reportOutOfMemory
void reportOutOfMemory(@NotNull final File file)
Definition: DefaultFileControl.java:367
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
Definition: AbstractDefaultProjectSettings.java:20
net.sf.gridarta.gui.mapimagecache.MapImageCache
Definition: MapImageCache.java:53
net.sf.gridarta.model.settings.VolatileSettings.getCurrentSaveMapDirectory
File getCurrentSaveMapDirectory()
net.sf.gridarta.gui.misc.DefaultFileControl.saveAllMaps
void saveAllMaps()
Definition: DefaultFileControl.java:244
net.sf.gridarta.gui.misc.DefaultFileControl.mapViewsManager
final MapViewsManager< G, A, R > mapViewsManager
Definition: DefaultFileControl.java:91