20 package net.sf.gridarta.gui.delayedmapmodel;
22 import java.lang.reflect.InvocationTargetException;
23 import java.util.IdentityHashMap;
26 import javax.swing.SwingUtilities;
43 import org.apache.log4j.Category;
44 import org.apache.log4j.Logger;
45 import org.jetbrains.annotations.NotNull;
46 import org.jetbrains.annotations.Nullable;
64 private static final long DELAY = 500L;
77 private final Map<MapModel<G, A, R>, MapModelListenerImpl>
mapModelListeners =
new IdentityHashMap<>();
96 private final Object
sync =
new Object();
124 public void mapCreated(@NotNull
final MapControl<G, A, R> mapControl,
final boolean interactive) {
126 final MapModelListenerImpl mapModelListener =
new MapModelListenerImpl(mapModel);
128 mapModelListeners.put(mapModel, mapModelListener);
129 final MapArchObjectListenerImpl mapArchObjectListener =
new MapArchObjectListenerImpl(mapModel);
130 mapModel.
getMapArchObject().addMapArchObjectListener(mapArchObjectListener);
131 mapArchObjectListeners.put(mapModel, mapArchObjectListener);
144 if (mapModelListener != null) {
148 if (mapArchObjectListener != null) {
149 mapModel.
getMapArchObject().removeMapArchObjectListener(mapArchObjectListener);
151 synchronized (
sync) {
152 scheduledMapModels.remove(mapControl.getMapModel());
161 private final Thread
thread =
new Thread(
new Runnable() {
166 final Map<MapModel<G, A, R>, Void> mapModels =
new IdentityHashMap<>();
167 while (!Thread.currentThread().isInterrupted()) {
169 final long now = System.currentTimeMillis();
170 synchronized (
sync) {
174 final long diff = timeout - now;
177 mapModels.putAll(scheduledMapModels);
178 scheduledMapModels.clear();
188 SwingUtilities.invokeAndWait(
new Runnable() {
195 listener.mapModelChanged(mapModel);
200 }
catch (
final InvocationTargetException ex) {
201 LOG.error(
"InvocationTargetException: " + ex.getMessage(), ex);
205 }
catch (
final InterruptedException ignored) {
206 Thread.currentThread().interrupt();
224 public void preExitNotify() {
228 }
catch (
final InterruptedException ignored) {
229 Thread.currentThread().interrupt();
230 LOG.warn(
"DelayedMapModelListenerManager was interrupted");
235 public void appExitNotify() {
240 public void waitExitNotify() {
245 exiter.addExiterListener(exiterListener);
261 listeners.
add(listener);
263 listener.mapModelChanged(mapControl.getMapModel());
272 listeners.
remove(listener);
280 final long now = System.currentTimeMillis();
281 synchronized (
sync) {
282 scheduledMapModels.put(mapModel, null);
283 timeout = now +
DELAY;
292 final long now = System.currentTimeMillis();
293 synchronized (
sync) {
295 scheduledMapModels.put(mapControl.getMapModel(), null);
297 timeout = now +
DELAY;
333 public void mapObjectsChanged(@NotNull
final Set<G> gameObjects, @NotNull
final Set<G> transientGameObjects) {
final MapModel< G, A, R > mapModel
The tracked MapModel instance.
Interface for listeners listening on map arch object changes.
void mapObjectsChanged(@NotNull final Set< G > gameObjects, @NotNull final Set< G > transientGameObjects)
One or more GameObjects on a map have changed.
A MapModel reflects the data of a map.
A MapManager manages all opened maps.
T [] getListeners()
Returns an array of all the listeners.
long timeout
The timestamp when to deliver scheduled map models.
A MapModelListener attached to all existing maps.
This package contains the framework for validating maps.
void mapMetaChanged()
Meta information of a map has changed.
final MapManagerListener< G, A, R > mapManagerListener
The MapManagerListener used to detect created and closed MapControl instances.
void removeDelayedMapModelListener(@NotNull final DelayedMapModelListener< G, A, R > listener)
Removes a DelayedMapModelListener to be notified.
Interface for listeners listening on MapModel events.
final MapManager< G, A, R > mapManager
The MapManager to track.
void addMapModelListener(@NotNull MapModelListener< G, A, R > listener)
Register a map listener.
final MapModel< G, A, R > mapModel
The tracked MapModel instance.
Base package of all Gridarta classes.
DelayedMapModelListenerManager(@NotNull final MapManager< G, A, R > mapManager, @NotNull final Exiter exiter)
Creates a new instance.
MapArchObjectListenerImpl(@NotNull final MapModel< G, A, R > mapModel)
Creates a new instance.
Reflects a game object (object on a map).
static final long DELAY
Notification delay in milliseconds.
Interface for listeners listening to MapManager changes.
final Map< MapModel< G, A, R >, Void > scheduledMapModels
The MapModels having pending changes.
void remove(@NotNull final T listener)
Removes a listener.
Interface for listeners interested in Exiter related events.
final Map< MapModel< G, A, R >, MapArchObjectListenerImpl > mapArchObjectListeners
All known MapModel instances.
final Thread thread
The Thread performing map validations.
void mapSizeChanged(@NotNull final Size2D mapSize)
The map size has changed.
GameObjects are the objects based on Archetypes found on maps.
MapModelListenerImpl(@NotNull final MapModel< G, A, R > mapModel)
Creates a new instance.
void add(@NotNull final T listener)
Adds a listener.
void mapFileChanged(@Nullable final MapFile oldMapFile)
The map file has changed.
void modifiedChanged()
The modified flag has changed.
void mapSquaresChanged(@NotNull final Set< MapSquare< G, A, R >> mapSquares)
Squares of a map have changed.
void removeMapModelListener(@NotNull MapModelListener< G, A, R > listener)
Unregister a map listener.
void mapSizeChanged(@NotNull final Size2D newSize)
The size of a map has changed.
final Map< MapModel< G, A, R >, MapModelListenerImpl > mapModelListeners
All known MapModel instances.
void scheduleAllMapModels()
Schedules all MapModels as changed.
A MapArchObjectListener attached to all existing maps.
Type-safe version of EventListenerList.
void start()
Starts execution.
A getMapArchObject()
Returns the Map Arch Object with the meta information about the map.
void addMapManagerListener(@NotNull MapManagerListener< G, A, R > listener)
Adds a MapManagerListener to be notified.
Currently nothing more than a marker interface for unification.
An interface for classes that collect errors.
static final Category LOG
The Logger for printing log messages.
final Object sync
The object used for synchronization.
void scheduleMapModel(@NotNull final MapModel< G, A, R > mapModel)
Schedules a MapModel which has been changed.
Interface for listeners interested in delayed map model change events.
Provides support for delayed notification of MapModel changes.
void errorsChanged(@NotNull final ErrorCollector< G, A, R > errors)
The errors of a map model have changed.
List< MapControl< G, A, R > > getOpenedMaps()
Returns all opened maps.
void addDelayedMapModelListener(@NotNull final DelayedMapModelListener< G, A, R > listener)
Adds a DelayedMapModelListener to be notified.
The location of a map file with a map directory.
final EventListenerList2< DelayedMapModelListener< G, A, R > > listeners
The listeners to notify.
Interface for MapArchObjects.
The class Size2D represents a 2d rectangular area.