X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=net.mograsim.logic.model%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fmodel%2Fcomponents%2FGUIComponent.java;h=60e8fb2a782e2dcd2d0f2c01f69094cc932e83fd;hb=1372abe81775e52cc52b715139cf13097a481b49;hp=1b97cd311dbbd16f89337b039d1f9a9c577fcbfa;hpb=47ea68ed5c444dd14864412639f6a6fd60ab8a0f;p=Mograsim.git
diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/GUIComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/GUIComponent.java
index 1b97cd31..60e8fb2a 100644
--- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/GUIComponent.java
+++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/GUIComponent.java
@@ -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.
- * A GUIComponent
has a position and size. The size can only be modified by subclasses.
+ * A GUIComponent
has a reference to the ViewModel it belongs to.
+ * A GUIComponent
has a name. This name is unique in the model the GUIComponent
belongs to.
+ * A GUIComponent
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;
@@ -46,9 +50,9 @@ public abstract class GUIComponent
private final List> componentResizedListeners;
private final List> pinAddedListeners;
private final List> pinRemovedListeners;
- private final List redrawListeners;
- private final Runnable redrawListenerForSubcomponents;
+ private HighLevelStateHandler highLevelStateHandler;
+
// creation and destruction
public GUIComponent(ViewModelModifiable model, String name)
@@ -63,10 +67,9 @@ public abstract class GUIComponent
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);
}
@@ -100,8 +103,7 @@ public abstract class GUIComponent
throw new IllegalArgumentException("Duplicate pin name: " + pin.name);
pinsByName.put(pin.name, pin);
callPinAddedListeners(pin);
- pin.addRedrawListener(redrawListenerForSubcomponents);
- requestRedraw();
+ model.requestRedraw();
}
/**
@@ -115,8 +117,7 @@ public abstract class GUIComponent
{
Pin pin = pinsByName.remove(name);
callPinRemovedListeners(pin);
- pin.removeRedrawListener(redrawListenerForSubcomponents);
- requestRedraw();
+ model.requestRedraw();
}
/**
@@ -147,33 +148,44 @@ public abstract class GUIComponent
// high-level access
/**
- * Sets the given high-level state to the given value.
- * 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)
{
- throw new IllegalArgumentException("No high level state with ID " + stateID);
+ this.highLevelStateHandler = highLevelStateHandler;
+ }
+
+ public HighLevelStateHandler getHighLevelStateHandler()
+ {
+ return highLevelStateHandler;
}
/**
* Gets the current value of the given high-level state.
- * 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.
+ * 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
@@ -188,7 +200,7 @@ public abstract class GUIComponent
bounds.x = x;
bounds.y = y;
callComponentMovedListeners();
- requestRedraw();
+ model.requestRedraw();
}
/**
@@ -201,7 +213,7 @@ public abstract class GUIComponent
bounds.width = width;
bounds.height = height;
callComponentResizedListener();
- requestRedraw();
+ model.requestRedraw();
}
/**
@@ -276,41 +288,28 @@ 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;
}
// 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