Cleaned up implementations of GUIComponent#getParamsForSerializing
[Mograsim.git] / net.mograsim.logic.model / src / net / mograsim / logic / model / model / components / GUIComponent.java
index 2ffe890..2e4d768 100644 (file)
@@ -7,9 +7,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.function.Consumer;
 
-import com.google.gson.JsonElement;
-import com.google.gson.JsonNull;
-
 import net.haspamelodica.swt.helper.gcs.GeneralGC;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.model.model.ViewModelModifiable;
@@ -50,9 +47,6 @@ public abstract class GUIComponent implements JSONSerializable
        private final List<Consumer<? super GUIComponent>> componentResizedListeners;
        private final List<Consumer<? super Pin>> pinAddedListeners;
        private final List<Consumer<? super Pin>> pinRemovedListeners;
-       private final List<Runnable> redrawListeners;
-
-       private final Runnable redrawListenerForSubcomponents;
 
        private HighLevelStateHandler highLevelStateHandler;
 
@@ -70,25 +64,22 @@ public abstract class GUIComponent implements JSONSerializable
                this.componentResizedListeners = new ArrayList<>();
                this.pinAddedListeners = new ArrayList<>();
                this.pinRemovedListeners = new ArrayList<>();
-               this.redrawListeners = new ArrayList<>();
-
-               redrawListenerForSubcomponents = this::requestRedraw;
 
                // TODO this will crash the high level state debug shell because submodel is not yet set.
                // The same problem exists in ViewModelModifiable.getDefaultComponentName; see there
-               model.componentCreated(this);
+               model.componentCreated(this, this::destroyed);
        }
 
        /**
-        * Destroys this component. This method implicitly calls {@link ViewModelModifiable#componentDestroyed(GUIComponent)
-        * componentDestroyed()} for the model this component is a part of.
+        * Destroys this component. This method is called from {@link ViewModelModifiable#componentDestroyed(GUIComponent) destroyComponent()}
+        * of the model this component is a part of.<br>
+        * When overriding, make sure to also call the original implementation.
         * 
         * @author Daniel Kirschten
         */
-       public void destroy()
+       protected void destroyed()
        {
                pinsByName.values().forEach(p -> pinRemovedListeners.forEach(l -> l.accept(p)));
-               model.componentDestroyed(this);
        }
 
        // pins
@@ -109,8 +100,7 @@ public abstract class GUIComponent implements JSONSerializable
                        throw new IllegalArgumentException("Duplicate pin name: " + pin.name);
                pinsByName.put(pin.name, pin);
                callPinAddedListeners(pin);
-               pin.addRedrawListener(redrawListenerForSubcomponents);
-               requestRedraw();
+               model.requestRedraw();
        }
 
        /**
@@ -124,8 +114,7 @@ public abstract class GUIComponent implements JSONSerializable
        {
                Pin pin = pinsByName.remove(name);
                callPinRemovedListeners(pin);
-               pin.removeRedrawListener(redrawListenerForSubcomponents);
-               requestRedraw();
+               model.requestRedraw();
        }
 
        /**
@@ -208,7 +197,7 @@ public abstract class GUIComponent implements JSONSerializable
                bounds.x = x;
                bounds.y = y;
                callComponentMovedListeners();
-               requestRedraw();
+               model.requestRedraw();
        }
 
        /**
@@ -221,7 +210,7 @@ public abstract class GUIComponent implements JSONSerializable
                bounds.width = width;
                bounds.height = height;
                callComponentResizedListener();
-               requestRedraw();
+               model.requestRedraw();
        }
 
        /**
@@ -297,40 +286,27 @@ public abstract class GUIComponent implements JSONSerializable
        // serializing
 
        @Override
-       public JsonElement getParamsForSerializing(IdentifierGetter idGetter)
+       public Object getParamsForSerializing(IdentifierGetter idGetter)
        {
-               return JsonNull.INSTANCE;
+               return null;
        }
 
        // listeners
 
-       /**
-        * Calls redraw listeners.
-        * 
-        * @author Daniel Kirschten
-        */
-       protected void requestRedraw()
-       {
-               callRedrawListeners();
-       }
-
        // @formatter:off
        public void addComponentMovedListener      (Consumer<? super GUIComponent> listener) {componentMovedListeners  .add   (listener);}
        public void addComponentResizedListener    (Consumer<? super GUIComponent> listener) {componentResizedListeners.add   (listener);}
        public void addPinAddedListener            (Consumer<? super Pin         > listener) {pinAddedListeners        .add   (listener);}
        public void addPinRemovedListener          (Consumer<? super Pin         > listener) {pinRemovedListeners      .add   (listener);}
-       public void addRedrawListener              (Runnable                       listener) {redrawListeners          .add   (listener);}
 
        public void removeComponentMovedListener   (Consumer<? super GUIComponent> listener) {componentMovedListeners  .remove(listener);}
        public void removeComponentResizedListener (Consumer<? super GUIComponent> listener) {componentResizedListeners.remove(listener);}
        public void removePinAddedListener         (Consumer<? super Pin         > listener) {pinAddedListeners        .remove(listener);}
        public void removePinRemovedListener       (Consumer<? super Pin         > listener) {pinRemovedListeners      .remove(listener);}
-       public void removeRedrawListener           (Runnable                       listener) {redrawListeners          .remove(listener);}
 
        private void callComponentMovedListeners (     ) {componentMovedListeners  .forEach(l -> l.accept(this));}
        private void callComponentResizedListener(     ) {componentResizedListeners.forEach(l -> l.accept(this));}
        private void callPinAddedListeners       (Pin p) {pinAddedListeners        .forEach(l -> l.accept(p   ));}
        private void callPinRemovedListeners     (Pin p) {pinRemovedListeners      .forEach(l -> l.accept(p   ));}
-       private void callRedrawListeners         (     ) {redrawListeners          .forEach(l -> l.run(       ));}
        // @formatter:on
 }
\ No newline at end of file