Gridarta Editor
MapFolder.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.mapfiles;
21 
22 import java.io.File;
23 import java.util.ArrayList;
24 import java.util.Collection;
25 import java.util.Collections;
26 import java.util.Iterator;
27 import java.util.List;
28 import java.util.concurrent.CopyOnWriteArrayList;
29 import java.util.regex.Pattern;
37 import org.jetbrains.annotations.NotNull;
38 import org.jetbrains.annotations.Nullable;
39 
47 public class MapFolder<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> implements Iterable<PickmapState<G, A, R>> {
48 
52  @NotNull
53  private static final Pattern PATTERN_VALID_MAP_FOLDER_NAME = Pattern.compile("[-a-zA-Z_+ 0-9,]+");
54 
58  private final Collection<MapFolderListener<G, A, R>> listeners = new CopyOnWriteArrayList<>();
59 
63  @Nullable
64  private final MapFolder<G, A, R> parent;
65 
69  @NotNull
70  private final Object sync = new Object();
71 
75  @NotNull
76  private final String name;
77 
81  @NotNull
82  private final File baseDir;
83 
87  @NotNull
89 
93  private final List<PickmapState<G, A, R>> pickmapStates = new ArrayList<>();
94 
104  public MapFolder(@Nullable final MapFolder<G, A, R> parent, @NotNull final String name, @NotNull final File baseDir, @NotNull final MapViewsManager<G, A, R> mapViewsManager) throws InvalidNameException {
105  this.baseDir = baseDir;
106  this.mapViewsManager = mapViewsManager;
107  if (parent == null ? !name.isEmpty() : !PATTERN_VALID_MAP_FOLDER_NAME.matcher(name).matches()) {
108  throw new InvalidNameException(name);
109  }
110 
111  this.parent = parent;
112  this.name = name;
113  }
114 
120  @Nullable
122  return parent;
123  }
124 
129  @NotNull
130  public String getName() {
131  if (parent == null) {
132  return "*default*";
133  }
134 
135  return parent.parent == null ? name : parent.getName() + "/" + name;
136  }
137 
142  @NotNull
143  public File getDir() {
144  return parent == null ? baseDir : new File(parent.getDir(), name);
145  }
146 
155  public PickmapState<G, A, R> addPickmap(@NotNull final String name, @NotNull final MapReaderFactory<G, A> mapReaderFactory, @NotNull final MapManager<G, A, R> pickmapManager) throws InvalidNameException {
156  final PickmapState<G, A, R> pickmapState;
157  synchronized (sync) {
158  pickmapState = new PickmapState<>(this, name, mapReaderFactory, pickmapManager, mapViewsManager);
159  pickmapStates.add(pickmapState);
160  }
161  for (final MapFolderListener<G, A, R> listenerMap : listeners) {
162  listenerMap.pickmapAdded(pickmapState);
163  }
164  return pickmapState;
165  }
166 
172  public void removePickmap(@NotNull final PickmapState<G, A, R> pickmapState, final boolean deleteFile) {
173  synchronized (sync) {
174  final int index = pickmapStates.indexOf(pickmapState);
175  if (index == -1) {
176  throw new IllegalArgumentException("pickmap is not part of this folder: " + pickmapState.getFile());
177  }
178  if (deleteFile) {
179  final File file = pickmapState.getFile();
180  file.delete();
181  }
182  pickmapStates.remove(index);
183  }
184  for (final MapFolderListener<G, A, R> listenerMap : listeners) {
185  listenerMap.pickmapRemoved(pickmapState);
186  }
187  pickmapState.freePickmap();
188  }
189 
194  public void removeAllPickmaps(final boolean deleteFile) {
195  while (true) {
196  final PickmapState<G, A, R> pickmapState;
197  synchronized (sync) {
198  if (pickmapStates.isEmpty()) {
199  break;
200  }
201  pickmapState = pickmapStates.get(pickmapStates.size() - 1);
202  }
203  removePickmap(pickmapState, deleteFile);
204  }
205  }
206 
212  @Override
213  public Iterator<PickmapState<G, A, R>> iterator() {
214  return Collections.unmodifiableList(pickmapStates).iterator();
215  }
216 
221  public int getPickmaps() {
222  return pickmapStates.size();
223  }
224 
229  public void addFolderListener(@NotNull final MapFolderListener<G, A, R> listenerMap) {
230  listeners.add(listenerMap);
231  }
232 
237  public void removeFolderListener(@NotNull final MapFolderListener<G, A, R> listenerMap) {
238  listeners.remove(listenerMap);
239  }
240 
245  public void getUnsavedPickmaps(@NotNull final Collection<MapControl<G, A, R>> unsavedPickmaps) {
246  for (final PickmapState<G, A, R> pickmapState : pickmapStates) {
247  pickmapState.getUnsavedPickmaps(unsavedPickmaps);
248  }
249  }
250 
256  public void firePickmapReverted(@NotNull final PickmapState<G, A, R> pickmapState, @NotNull final MapControl<G, A, R> oldPickmap) {
257  for (final MapFolderListener<G, A, R> listenerMap : listeners) {
258  listenerMap.pickmapReverted(pickmapState, oldPickmap);
259  }
260  }
261 
262 }
net.sf.gridarta.model.mapmanager
Definition: AbstractMapManager.java:20
net.sf.gridarta.gui.mapfiles.MapFolder.baseDir
final File baseDir
The base directory for folder file names.
Definition: MapFolder.java:82
net.sf.gridarta.model.mapmanager.MapManager
A MapManager manages all opened maps.
Definition: MapManager.java:37
net.sf.gridarta.gui.mapfiles.MapFolder.listeners
final Collection< MapFolderListener< G, A, R > > listeners
The registered event listeners.
Definition: MapFolder.java:58
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.model.io.MapReaderFactory
A factory for creating MapReader instances.
Definition: MapReaderFactory.java:32
net.sf.gridarta.gui.mapfiles.MapFolder.pickmapStates
final List< PickmapState< G, A, R > > pickmapStates
The pickmaps of this folder.
Definition: MapFolder.java:93
net.sf
net.sf.gridarta.gui.mapfiles.MapFolder.PATTERN_VALID_MAP_FOLDER_NAME
static final Pattern PATTERN_VALID_MAP_FOLDER_NAME
The Pattern that matches valid map folder names.
Definition: MapFolder.java:53
net.sf.gridarta.gui.mapfiles.MapFolder.MapFolder
MapFolder(@Nullable final MapFolder< G, A, R > parent, @NotNull final String name, @NotNull final File baseDir, @NotNull final MapViewsManager< G, A, R > mapViewsManager)
Creates a new instance.
Definition: MapFolder.java:104
net.sf.gridarta.gui.mapfiles.MapFolder.addFolderListener
void addFolderListener(@NotNull final MapFolderListener< G, A, R > listenerMap)
Adds a MapFolderListener to be notified of events.
Definition: MapFolder.java:229
net.sf.gridarta.gui.mapfiles.MapFolder.iterator
Iterator< PickmapState< G, A, R > > iterator()
Returns an Iterator returning all pickmaps of this folder in arbitrary order.
Definition: MapFolder.java:213
net.sf.gridarta.gui.mapfiles.MapFolder.removeFolderListener
void removeFolderListener(@NotNull final MapFolderListener< G, A, R > listenerMap)
Removes a MapFolderListener to be notified of events.
Definition: MapFolder.java:237
net.sf.gridarta.gui.mapfiles.MapFolderListener< G, A, R >
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.gameobject.GameObject
Reflects a game object (object on a map).
Definition: GameObject.java:36
net.sf.gridarta.model.mapcontrol
Definition: DefaultMapControl.java:20
net.sf.gridarta.gui.mapfiles.MapFolder.getParent
MapFolder< G, A, R > getParent()
Returns the parent folder.
Definition: MapFolder.java:121
net.sf.gridarta.gui.mapfiles.MapFolder.name
final String name
The folder's name.
Definition: MapFolder.java:76
net.sf.gridarta.gui
Graphical User Interface of Gridarta.
net.sf.gridarta.gui.mapfiles.MapFolder.getDir
File getDir()
Returns the base directory.
Definition: MapFolder.java:143
net.sf.gridarta.gui.mapfiles.MapFolder.sync
final Object sync
The synchronization object for accesses to pickmapStates.
Definition: MapFolder.java:70
net.sf.gridarta.model.gameobject
GameObjects are the objects based on Archetypes found on maps.
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.gui.mapfiles.MapFolder.getName
String getName()
Returns the name.
Definition: MapFolder.java:130
net.sf.gridarta.gui.mapfiles.InvalidNameException
Indicates that a folder or pickmap name is invalid.
Definition: InvalidNameException.java:28
net.sf.gridarta.gui.mapfiles.MapFolder.removeAllPickmaps
void removeAllPickmaps(final boolean deleteFile)
Removes all PickmapState from this folder.
Definition: MapFolder.java:194
net.sf.gridarta.gui.mapfiles.MapFolder.firePickmapReverted
void firePickmapReverted(@NotNull final PickmapState< G, A, R > pickmapState, @NotNull final MapControl< G, A, R > oldPickmap)
Notifies all listeners about a reverted pickmap.
Definition: MapFolder.java:256
net.sf.gridarta.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
net.sf.gridarta.gui.map.mapview
Definition: AbstractMapView.java:20
net.sf.gridarta.gui.mapfiles.MapFolder
Model class representing a folder of MapFiles.
Definition: MapFolder.java:47
net.sf.gridarta.gui.mapfiles.MapFolder.addPickmap
PickmapState< G, A, R > addPickmap(@NotNull final String name, @NotNull final MapReaderFactory< G, A > mapReaderFactory, @NotNull final MapManager< G, A, R > pickmapManager)
Adds a new PickmapState to this folder.
Definition: MapFolder.java:155
net.sf.gridarta.gui.mapfiles.MapFolder.getUnsavedPickmaps
void getUnsavedPickmaps(@NotNull final Collection< MapControl< G, A, R >> unsavedPickmaps)
Returns all unsaved MapFiles in this folder.
Definition: MapFolder.java:245
net.sf.gridarta.model.io
Reading and writing of maps, handling of paths.
Definition: AbstractAnimationObjectsReader.java:20
net.sf.gridarta.gui.mapfiles.PickmapState< G, A, R >
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.gui.mapfiles.MapFolder.parent
final MapFolder< G, A, R > parent
The parent folder, or.
Definition: MapFolder.java:64
net.sf.gridarta.gui.map
Base classes for rendering maps.
Definition: AbstractPerMapDialogManager.java:20
net.sf.gridarta.gui.mapfiles.MapFolder.removePickmap
void removePickmap(@NotNull final PickmapState< G, A, R > pickmapState, final boolean deleteFile)
Removes a PickmapState from this folder.
Definition: MapFolder.java:172
net.sf.gridarta.model.mapcontrol.MapControl
Currently nothing more than a marker interface for unification.
Definition: MapControl.java:35
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.mapfiles.MapFolder.getPickmaps
int getPickmaps()
Returns the number of pickmaps in this folder.
Definition: MapFolder.java:221
net.sf.gridarta.gui.mapfiles.MapFolder.mapViewsManager
final MapViewsManager< G, A, R > mapViewsManager
The MapViewsManager.
Definition: MapFolder.java:88
net.sf.gridarta.gui.map.mapview.MapViewsManager
Stores all existing MapViews.
Definition: MapViewsManager.java:47