Wrote TODO
[Mograsim.git] / net.mograsim.logic.model / src / net / mograsim / logic / model / model / components / GUIComponent.java
index 1b97cd3..2ffe890 100644 (file)
@@ -14,22 +14,26 @@ import net.haspamelodica.swt.helper.gcs.GeneralGC;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.model.model.ViewModelModifiable;
 import net.mograsim.logic.model.model.wires.Pin;
-import net.mograsim.logic.model.serializing.snippets.HighLevelStateHandler;
+import net.mograsim.logic.model.serializing.IdentifierGetter;
+import net.mograsim.logic.model.serializing.JSONSerializable;
+import net.mograsim.logic.model.snippets.HighLevelStateHandler;
 
 /**
  * The base class for all GUI components.<br>
- * A <code>GUIComponent</code> has a position and size. The size can only be modified by subclasses.<br>
+ * A <code>GUIComponent</code> has a reference to the ViewModel it belongs to.<br>
+ * A <code>GUIComponent</code> has a name. This name is unique in the model the <code>GUIComponent</code> belongs to.<br>
+ * A <code>GUIComponent</code> has a position and size. The size can only be modified by subclasses.
  * 
  * @author Daniel Kirschten
  */
-public abstract class GUIComponent
+public abstract class GUIComponent implements JSONSerializable
 {
        /**
         * The model this component is a part of.
         */
        protected final ViewModelModifiable model;
        /**
-        * The name of this component. Is unique in its model.
+        * The name of this component. Is unique for all components in its model.
         */
        public final String name;
        private final Rectangle bounds;
@@ -49,6 +53,9 @@ public abstract class GUIComponent
        private final List<Runnable> redrawListeners;
 
        private final Runnable redrawListenerForSubcomponents;
+
+       private HighLevelStateHandler highLevelStateHandler;
+
        // creation and destruction
 
        public GUIComponent(ViewModelModifiable model, String name)
@@ -67,6 +74,8 @@ public abstract class GUIComponent
 
                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);
        }
 
@@ -147,33 +156,44 @@ 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)
+       protected void setHighLevelStateHandler(HighLevelStateHandler highLevelStateHandler)
+       {
+               this.highLevelStateHandler = highLevelStateHandler;
+       }
+
+       public HighLevelStateHandler getHighLevelStateHandler()
        {
-               throw new IllegalArgumentException("No high level state with ID " + stateID);
+               return highLevelStateHandler;
        }
 
        /**
         * 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 {@link HighLevelStateHandler} 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)
        {
-               throw new IllegalArgumentException("No high level state with ID " + stateID);
+               return highLevelStateHandler.getHighLevelState(stateID);
+       }
+
+       /**
+        * Sets the given high-level state to the given value. <br>
+        * See {@link HighLevelStateHandler} for an explanation of high-level state IDs.
+        * 
+        * @see #getHighLevelState(String)
+        * @see HighLevelStateHandler#setHighLevelState(String, Object)
+        * 
+        * @author Daniel Kirschten
+        */
+       public void setHighLevelState(String stateID, Object newState)
+       {
+               highLevelStateHandler.setHighLevelState(stateID, newState);
        }
 
        // "graphical" operations
@@ -276,8 +296,8 @@ public abstract class GUIComponent
 
        // serializing
 
-       @SuppressWarnings("static-method") // this method is intended to be overridden
-       public JsonElement getParams()
+       @Override
+       public JsonElement getParamsForSerializing(IdentifierGetter idGetter)
        {
                return JsonNull.INSTANCE;
        }