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-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.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;
27 import java.util.TreeMap;
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 
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();
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.getListeners()) {
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();
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 Map.Entry<String, MapFolder<G, A, R>> higherEntry = mapFolders.higherEntry(mapFolder.getName());
128  if (higherEntry != null) {
129  activeMapFolder = higherEntry.getValue();
130  } else {
131  final Map.Entry<String, MapFolder<G, A, R>> lowerEntry = mapFolders.lowerEntry(mapFolder.getName());
132  if (lowerEntry != null) {
133  activeMapFolder = lowerEntry.getValue();
134  } else {
135  activeMapFolder = null;
136  }
137  }
139  }
140  mapFolders.remove(mapFolder.getName());
141  for (final MapFolderTreeListener<G, A, R> listener : listeners.getListeners()) {
142  listener.folderRemoved(mapFolder);
143  }
144  }
145 
150  @Nullable
152  return activeMapFolder;
153  }
154 
161  @SuppressWarnings("NullableProblems")
162  public synchronized void setActiveMapFolder(@NotNull final MapFolder<G, A, R> mapFolder) {
163  if (activeMapFolder == mapFolder) {
164  return;
165  }
166 
167  activeMapFolder = mapFolder;
169  }
170 
174  private void fireActiveMapFolderChanged() {
175  for (final MapFolderTreeListener<G, A, R> listener : listeners.getListeners()) {
176  listener.activeMapFolderChanged(activeMapFolder);
177  }
178  }
179 
184  @Override
185  public Iterator<MapFolder<G, A, R>> iterator() {
186  return Collections.unmodifiableCollection(mapFolders.values()).iterator();
187  }
188 
193  public void addModelListener(@NotNull final MapFolderTreeListener<G, A, R> listener) {
194  listeners.add(listener);
195  }
196 
201  public void removeModelListener(@NotNull final MapFolderTreeListener<G, A, R> listener) {
202  listeners.remove(listener);
203  }
204 
209  public void getUnsavedPickmaps(@NotNull final Collection<MapControl<G, A, R>> unsavedMaps) {
210  for (final MapFolder<G, A, R> mapFolder : mapFolders.values()) {
211  mapFolder.getUnsavedPickmaps(unsavedMaps);
212  }
213  }
214 
215 }
Interface for listeners interested in events of MapFolderTrees.
File getBaseDir()
Returns the base directory for creating new map folders.
void getUnsavedPickmaps(@NotNull final Collection< MapControl< G, A, R >> unsavedMaps)
Returns all unsaved map controls of this model.
T [] getListeners()
Returns an array of all the listeners.
final TreeMap< String, MapFolder< G, A, R > > mapFolders
The folders.
synchronized void removeMapFolder(@NotNull final MapFolder< G, A, R > mapFolder, final boolean deleteFile)
Removes a map folder from this model.
void fireActiveMapFolderChanged()
Notifies all listeners that the active folder has changed.
void addModelListener(@NotNull final MapFolderTreeListener< G, A, R > listener)
Adds a MapFolderTreeListener to be informed about changes.
MapFolder< G, A, R > activeMapFolder
The active map folder.
synchronized void addMapFolder(@NotNull final MapFolder< G, A, R > mapFolder)
Adds a map folder to this model.
Base package of all Gridarta classes.
Reflects a game object (object on a map).
Definition: GameObject.java:36
final File baseDir
The base directory for creating new map folders.
GameObjects are the objects based on Archetypes found on maps.
Iterator< MapFolder< G, A, R > > iterator()
Returns an Iterator returning all map folders.
void removeModelListener(@NotNull final MapFolderTreeListener< G, A, R > listener)
Removes a MapFolderTreeListener to be informed about changes.
String getName()
Returns the name.
Definition: MapFolder.java:130
Type-safe version of EventListenerList.
synchronized void setActiveMapFolder(@NotNull final MapFolder< G, A, R > mapFolder)
Sets the active map folder.
Currently nothing more than a marker interface for unification.
Definition: MapControl.java:35
final EventListenerList2< MapFolderTreeListener< G, A, R > > listeners
The registered event listeners.
MapFolder< G, A, R > getParent()
Returns the parent folder.
Definition: MapFolder.java:121
MapFolder< G, A, R > getActiveMapFolder()
Returns the active map folder.
MapFolderTree(@NotNull final File baseDir)
Creates a new instance.