From 1a52da722b548dc8f6a524d60abb822b805e7dd9 Mon Sep 17 00:00:00 2001
From: Christian Meyer <christian.meyer@leibniz-zmt.de>
Date: Fri, 22 Jul 2016 13:56:57 +0200
Subject: [PATCH] expanded GuiListener interface

GuiListener.java
    renamed method onGuiStart to started
    renamed method onGuiFinish to finished
    added methods inited, loaded, quit
ZmtGuiState.java
    moved nested interface GuiListener to new file
    notifies GuiListener objects according to added methods
---
 src/main/java/sim/display/GuiListener.java | 61 ++++++++++++++++++++++
 src/main/java/sim/display/ZmtGUIState.java | 44 ++++++++--------
 2 files changed, 84 insertions(+), 21 deletions(-)
 create mode 100644 src/main/java/sim/display/GuiListener.java

diff --git a/src/main/java/sim/display/GuiListener.java b/src/main/java/sim/display/GuiListener.java
new file mode 100644
index 0000000..ee86e97
--- /dev/null
+++ b/src/main/java/sim/display/GuiListener.java
@@ -0,0 +1,61 @@
+package sim.display;
+
+import sim.engine.SimState;
+import sim.engine.ZmtSimState;
+
+public interface GuiListener {
+    /**
+     * @see GUIState#init(Controller)
+     * @param controller
+     *            the simulation controller
+     */
+    default void inited(Controller controller) {
+
+    }
+
+    /**
+     * Called right after the simulation has started.
+     * 
+     * @param state
+     *            the started simulation state
+     * 
+     * @see GUIState#start()
+     */
+    default void started(ZmtSimState state) {
+
+    }
+
+    /**
+     * Called right after a new simulation state was loaded.
+     * 
+     * @param oldState
+     *            the old state replaced by the loaded one
+     * @param loadedState
+     *            the loaded simulation state
+     * 
+     * @see GUIState#load(SimState)
+     */
+    default void loaded(ZmtSimState oldState, ZmtSimState loadedState) {
+
+    }
+
+    /**
+     * Called right after the simulation is finished.
+     * 
+     * @param state
+     *            the finished simulation state
+     * @see GUIState#finish()
+     */
+    default void finished(ZmtSimState state) {
+
+    }
+
+    /**
+     * Called right after the {@link GUIState} quit.
+     * 
+     * @see GUIState#quit()
+     */
+    default void quit() {
+
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/sim/display/ZmtGUIState.java b/src/main/java/sim/display/ZmtGUIState.java
index d31b6f3..08c4cd8 100644
--- a/src/main/java/sim/display/ZmtGUIState.java
+++ b/src/main/java/sim/display/ZmtGUIState.java
@@ -2,10 +2,9 @@ package sim.display;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.EventListener;
-import java.util.List;
 
 import de.zmt.params.SimParams;
+import sim.engine.SimState;
 import sim.engine.ZmtSimState;
 import sim.portrayal.Inspector;
 
@@ -17,19 +16,20 @@ import sim.portrayal.Inspector;
  *
  */
 public abstract class ZmtGUIState extends GUIState {
-    private final List<GuiListener> guiListeners = new ArrayList<>(1);
+    private final Collection<GuiListener> guiListeners = new ArrayList<>(0);
 
     public ZmtGUIState(ZmtSimState state) {
         super(state);
     }
 
     /**
-     * Adds a {@link GuiListener} to be notified on gui events.
+     * Adds a {@link GuiListener} to be notified on GUI events.
      * 
      * @param listener
+     *            the listener to add
      * @return <tt>true</tt> (as specified by {@link Collection#add})
      */
-    public final boolean addGuiListener(GuiListener listener) {
+    public final boolean addListener(GuiListener listener) {
         return guiListeners.add(listener);
     }
 
@@ -37,32 +37,42 @@ public abstract class ZmtGUIState extends GUIState {
      * Removes a {@link GuiListener}, which is no longer notified on GUI events.
      * 
      * @param listener
+     *            the listener to remove
      * @return <tt>true</tt> if specified listener was removed
      */
-    public final boolean removeGuiListener(Object listener) {
+    public final boolean removeListener(GuiListener listener) {
         return guiListeners.remove(listener);
     }
 
+    @Override
+    public void init(Controller controller) {
+        super.init(controller);
+        guiListeners.stream().forEach(listener -> listener.inited(controller));
+    }
+
     @Override
     public void start() {
-        for (GuiListener listener : guiListeners) {
-            listener.onGuiStart();
-        }
         super.start();
+        guiListeners.stream().forEach(listener -> listener.started((ZmtSimState) state));
+    }
+
+    @Override
+    public void load(SimState state) {
+        ZmtSimState oldState = (ZmtSimState) state;
+        super.load(state);
+        guiListeners.stream().forEach(listener -> listener.loaded(oldState, (ZmtSimState) state));
     }
 
     @Override
     public void finish() {
-        for (GuiListener listener : guiListeners) {
-            listener.onGuiFinish();
-        }
         super.finish();
+        guiListeners.stream().forEach(listener -> listener.finished((ZmtSimState) state));
     }
 
     @Override
     public void quit() {
         super.quit();
-        guiListeners.clear();
+        guiListeners.stream().forEach(listener -> listener.quit());
     }
 
     /** Returns a {@link Inspector} displaying {@link SimParams}. */
@@ -70,12 +80,4 @@ public abstract class ZmtGUIState extends GUIState {
     public Inspector getInspector() {
         return Inspector.getInspector(((ZmtSimState) state).getParams(), this, null);
     }
-
-    public static interface GuiListener extends EventListener {
-        /** Called on {@link GUIState#start()}. */
-        void onGuiStart();
-
-        /** Called on {@link GUIState#finish()}. */
-        void onGuiFinish();
-    }
 }
-- 
GitLab