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;
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;
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
throw new IllegalArgumentException("Duplicate pin name: " + pin.name);
pinsByName.put(pin.name, pin);
callPinAddedListeners(pin);
- pin.addRedrawListener(redrawListenerForSubcomponents);
- requestRedraw();
+ model.requestRedraw();
}
/**
{
Pin pin = pinsByName.remove(name);
callPinRemovedListeners(pin);
- pin.removeRedrawListener(redrawListenerForSubcomponents);
- requestRedraw();
+ model.requestRedraw();
}
/**
bounds.x = x;
bounds.y = y;
callComponentMovedListeners();
- requestRedraw();
+ model.requestRedraw();
}
/**
bounds.width = width;
bounds.height = height;
callComponentResizedListener();
- requestRedraw();
+ model.requestRedraw();
}
/**
// 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