GUIComponents now have names
[Mograsim.git] / net.mograsim.logic.ui / src / net / mograsim / logic / ui / model / components / GUIComponent.java
index fd48e62..bf9ea85 100644 (file)
@@ -5,14 +5,16 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.TreeMap;
 import java.util.function.Consumer;
-import java.util.function.Supplier;
+
+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.ui.model.ViewModelModifiable;
 import net.mograsim.logic.ui.model.wires.Pin;
+import net.mograsim.logic.ui.serializing.snippets.HighLevelStateHandler;
 
 /**
  * The base class for all GUI components.<br>
@@ -26,6 +28,10 @@ public abstract class GUIComponent
         * The model this component is a part of.
         */
        protected final ViewModelModifiable model;
+       /**
+        * The name of this component. Is unique in its model.
+        */
+       public final String name;
        private final Rectangle bounds;
        /**
         * The list of all pins of this component by name.
@@ -37,24 +43,24 @@ public abstract class GUIComponent
        protected final Map<String, Pin> pinsUnmodifiable;
 
        private final List<Consumer<? super GUIComponent>> componentMovedListeners;
+       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;
-       // Defines how the GUIComponent is referenced in SubmodelComponentParams
-       protected Supplier<String> identifierDelegate = () -> getClass().getSimpleName();
-
        // creation and destruction
 
-       public GUIComponent(ViewModelModifiable model)
+       public GUIComponent(ViewModelModifiable model, String name)
        {
                this.model = model;
+               this.name = name == null ? model.getDefaultComponentName(this) : name;
                this.bounds = new Rectangle(0, 0, 0, 0);
                this.pinsByName = new HashMap<>();
                this.pinsUnmodifiable = Collections.unmodifiableMap(pinsByName);
 
                this.componentMovedListeners = new ArrayList<>();
+               this.componentResizedListeners = new ArrayList<>();
                this.pinAddedListeners = new ArrayList<>();
                this.pinRemovedListeners = new ArrayList<>();
                this.redrawListeners = new ArrayList<>();
@@ -140,12 +146,30 @@ public abstract class GUIComponent
 
        // high-level access
 
+       /**
+        * Sets the given high-level state to the given value. <br>
+        * See {@link HighLevelStateHandler#setHighLevelState(String, Object)} for an explanation of high-level state IDs.
+        * 
+        * @see #getHighLevelState(String)
+        * @see HighLevelStateHandler#setHighLevelState(String, Object)
+        * 
+        * @author Daniel Kirschten
+        */
        @SuppressWarnings({ "static-method", "unused" }) // this method is intended to be overridden
        public void setHighLevelState(String stateID, Object newState)
        {
                throw new IllegalArgumentException("No high level state with ID " + stateID);
        }
 
+       /**
+        * Gets the current value of the given high-level state. <br>
+        * See {@link HighLevelStateHandler#setHighLevelState(String, Object)} for an explanation of high-level state IDs.
+        * 
+        * @see #setHighLevelState(String, Object)
+        * @see HighLevelStateHandler#getHighLevelState(String)
+        * 
+        * @author Daniel Kirschten
+        */
        @SuppressWarnings("static-method") // this method is intended to be overridden
        public Object getHighLevelState(String stateID)
        {
@@ -176,6 +200,7 @@ public abstract class GUIComponent
        {
                bounds.width = width;
                bounds.height = height;
+               callComponentResizedListener();
                requestRedraw();
        }
 
@@ -185,7 +210,7 @@ public abstract class GUIComponent
         * 
         * @author Daniel Kirschten
         */
-       public Rectangle getBounds()
+       public final Rectangle getBounds()
        {
                return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height);
        }
@@ -251,18 +276,10 @@ public abstract class GUIComponent
 
        // serializing
 
-       /**
-        * @return an identifier used to reference this GUIComponent inside of {@link SubmodelComponentParams}
-        */
-       public String getIdentifier()
-       {
-               return identifierDelegate.get();
-       }
-
-       @SuppressWarnings("static-method")
-       public Map<String, Object> getInstantiationParameters()
+       @SuppressWarnings("static-method") // this method is intended to be overridden
+       public JsonElement getParams()
        {
-               return new TreeMap<>();
+               return JsonNull.INSTANCE;
        }
 
        // listeners
@@ -278,19 +295,22 @@ public abstract class GUIComponent
        }
 
        // @formatter:off
-       public void addComponentMovedListener   (Consumer<? super GUIComponent> listener) {componentMovedListeners.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 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 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(       ));}
+       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