Gridarta Editor
MapFolderTree.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.Collection;
24 import java.util.Collections;
25 import java.util.Iterator;
26 import java.util.Map.Entry;
27 import java.util.TreeMap;
28 import java.util.concurrent.CopyOnWriteArrayList;
33 import org.jetbrains.annotations.NotNull;
34 import org.jetbrains.annotations.Nullable;
35 
42 public class MapFolderTree<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> implements Iterable<MapFolder<G, A, R>> {
43 
47  private final Collection<MapFolderTreeListener<G, A, R>> listeners = new CopyOnWriteArrayList<>();
48 
52  @NotNull
53  private final File baseDir;
54 
58  @Nullable
60 
64  private final TreeMap<String, MapFolder<G, A, R>> mapFolders = new TreeMap<>();
65 
70  public MapFolderTree(@NotNull final File baseDir) {
71  this.baseDir = baseDir;
72  }
73 
78  @NotNull
79  public File getBaseDir() {
80  return baseDir;
81  }
82 
90  public synchronized void addMapFolder(@NotNull final MapFolder<G, A, R> mapFolder) throws DuplicateMapFolderException {
91  final MapFolder<G, A, R> parent = mapFolder.getParent();
92  if (parent != null && !mapFolders.containsKey(parent.getName())) {
93  throw new IllegalArgumentException("parent is not part of this folder: " + parent.getName());
94  }
95  final String folderName = mapFolder.getName();
96  if (mapFolders.containsKey(folderName)) {
97  throw new DuplicateMapFolderException(folderName);
98  }
99  mapFolders.put(folderName, mapFolder);
100  for (final MapFolderTreeListener<G, A, R> listener : listeners) {
101  listener.folderAdded(mapFolder);
102  }
103  }
104 
113  public synchronized void removeMapFolder(@NotNull final MapFolder<G, A, R> mapFolder, final boolean deleteFile) throws MapFolderNotEmptyException {
114  if (mapFolders.get(mapFolder.getName()) != mapFolder) {
115  throw new IllegalArgumentException("folder is not part of this folder: " + mapFolder.getName());
116  }
117  for (final MapFolder<G, A, R> child : mapFolders.values()) {
118  if (child.getParent() == mapFolder) {
119  throw new MapFolderNotEmptyException(mapFolder.getName());
120  }
121  }
122  mapFolder.removeAllPickmaps(true);
123  if (deleteFile) {
124  mapFolder.getDir().delete();
125  }
126  if (mapFolder == activeMapFolder) {
127  final Entry<String, MapFolder<G, A, R>> higherEntry = mapFolders.higherEntry(mapFolder.getName());
128  if (higherEntry == null) {
129  final Entry<String, MapFolder<G, A, R>> lowerEntry = mapFolders.lowerEntry(mapFolder.getName());
130  activeMapFolder = lowerEntry == null ? null : lowerEntry.getValue();
131  } else {
132  activeMapFolder = higherEntry.getValue();
133  }
135  }
136  mapFolders.remove(mapFolder.getName());
137  for (final MapFolderTreeListener<G, A, R> listener : listeners) {
138  listener.folderRemoved(mapFolder);
139  }
140  }
141 
146  @Nullable
148  return activeMapFolder;
149  }
150 
157  public synchronized void setActiveMapFolder(@NotNull final MapFolder<G, A, R> mapFolder) {
158  if (activeMapFolder == mapFolder) {
159  return;
160  }
161 
162  activeMapFolder = mapFolder;
164  }
165 
169  private void fireActiveMapFolderChanged() {
170  for (final MapFolderTreeListener<G, A, R> listener : listeners) {
171  listener.activeMapFolderChanged(activeMapFolder);
172  }
173  }
174 
179  @Override
180  public Iterator<MapFolder<G, A, R>> iterator() {
181  return Collections.unmodifiableCollection(mapFolders.values()).iterator();
182  }
183 
188  public void addModelListener(@NotNull final MapFolderTreeListener<G, A, R> listener) {
189  listeners.add(listener);
190  }
191 
196  public void removeModelListener(@NotNull final MapFolderTreeListener<G, A, R> listener) {
197  listeners.remove(listener);
198  }
199 
204  public void getUnsavedPickmaps(@NotNull final Collection<MapControl<G, A, R>> unsavedMaps) {
205  for (final MapFolder<G, A, R> mapFolder : mapFolders.values()) {
206  mapFolder.getUnsavedPickmaps(unsavedMaps);
207  }
208  }
209 
210 }
net.sf.gridarta.gui.mapfiles.MapFolderTreeListener< G, A, R >
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.gui.mapfiles.MapFolderTree.baseDir
final File baseDir
The base directory for creating new map folders.
Definition: MapFolderTree.java:53
net.sf.gridarta.gui.mapfiles.MapFolderTree
Stores all known MapFiles.
Definition: MapFolderTree.java:42
net.sf
net.sf.gridarta.gui.mapfiles.MapFolderTree.listeners
final Collection< MapFolderTreeListener< G, A, R > > listeners
The registered event listeners.
Definition: MapFolderTree.java:47
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.gui.mapfiles.MapFolderTree.addMapFolder
synchronized void addMapFolder(@NotNull final MapFolder< G, A, R > mapFolder)
Adds a map folder to this model.
Definition: MapFolderTree.java:90
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.MapFolderTree.activeMapFolder
MapFolder< G, A, R > activeMapFolder
The active map folder.
Definition: MapFolderTree.java:59
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.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
net.sf.gridarta.gui.mapfiles.MapFolderTree.fireActiveMapFolderChanged
void fireActiveMapFolderChanged()
Notifies all listeners that the active folder has changed.
Definition: MapFolderTree.java:169
net.sf.gridarta.gui.mapfiles.MapFolder< G, A, R >
net.sf.gridarta.gui.mapfiles.MapFolderTree.iterator
Iterator< MapFolder< G, A, R > > iterator()
Returns an Iterator returning all map folders.
Definition: MapFolderTree.java:180
net.sf.gridarta.gui.mapfiles.MapFolderTree.MapFolderTree
MapFolderTree(@NotNull final File baseDir)
Creates a new instance.
Definition: MapFolderTree.java:70
net.sf.gridarta.gui.mapfiles.DuplicateMapFolderException
Indicates that a folder name is not unique.
Definition: DuplicateMapFolderException.java:28
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.gui.mapfiles.MapFolderTree.removeModelListener
void removeModelListener(@NotNull final MapFolderTreeListener< G, A, R > listener)
Removes a MapFolderTreeListener to be informed about changes.
Definition: MapFolderTree.java:196
net.sf.gridarta.gui.mapfiles.MapFolderTree.getUnsavedPickmaps
void getUnsavedPickmaps(@NotNull final Collection< MapControl< G, A, R >> unsavedMaps)
Returns all unsaved map controls of this model.
Definition: MapFolderTree.java:204
net.sf.gridarta.gui.mapfiles.MapFolderTree.addModelListener
void addModelListener(@NotNull final MapFolderTreeListener< G, A, R > listener)
Adds a MapFolderTreeListener to be informed about changes.
Definition: MapFolderTree.java:188
net.sf.gridarta.gui.mapfiles.MapFolderTree.getBaseDir
File getBaseDir()
Returns the base directory for creating new map folders.
Definition: MapFolderTree.java:79
net.sf.gridarta.model.mapcontrol.MapControl
Currently nothing more than a marker interface for unification.
Definition: MapControl.java:35
net.sf.gridarta.gui.mapfiles.MapFolderTree.removeMapFolder
synchronized void removeMapFolder(@NotNull final MapFolder< G, A, R > mapFolder, final boolean deleteFile)
Removes a map folder from this model.
Definition: MapFolderTree.java:113
net.sf.gridarta.gui.mapfiles.MapFolderTree.mapFolders
final TreeMap< String, MapFolder< G, A, R > > mapFolders
The folders.
Definition: MapFolderTree.java:64
net.sf.gridarta.gui.mapfiles.MapFolderTree.getActiveMapFolder
MapFolder< G, A, R > getActiveMapFolder()
Returns the active map folder.
Definition: MapFolderTree.java:147
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.mapfiles.MapFolderTree.setActiveMapFolder
synchronized void setActiveMapFolder(@NotNull final MapFolder< G, A, R > mapFolder)
Sets the active map folder.
Definition: MapFolderTree.java:157
net.sf.gridarta.gui.mapfiles.MapFolderNotEmptyException
Indicates that a folder contains sub-folders.
Definition: MapFolderNotEmptyException.java:28