X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.model%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fmodel%2Fcomponents%2FModelComponent.java;h=9171ee839b7a82061619ae66e205b47045079231;hb=d953262602b4b7771472a14b0fb8fbb3cc5faaf0;hp=40ab62fcea78a325441d10644be8be17abe2b8e5;hpb=1f645882d229fc3d4081e4c5060559d75dc2cc24;p=Mograsim.git diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java index 40ab62fc..9171ee83 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java @@ -30,9 +30,10 @@ public abstract class ModelComponent implements JSONSerializable */ protected final LogicModelModifiable model; /** - * The name of this component. Is unique for all components in its model. + * The name of this component. Is unique for all components in its model.
+ * Does never change, but can't be final since it is set in {@link #init()}. */ - public final String name; + private String name; private final Rectangle bounds; /** * The list of all pins of this component by name. @@ -53,9 +54,20 @@ public abstract class ModelComponent implements JSONSerializable // creation and destruction public ModelComponent(LogicModelModifiable model, String name) + { + this(model, name, true); + } + + /** + * Creates a new {@link ModelComponent} and, if callInit, initializes the component (See {@link #init()}).
+ * If callInit==false, make sure to call {@link #init()}! + * + * @author Daniel Kirschten + */ + protected ModelComponent(LogicModelModifiable model, String name, boolean callInit) { this.model = model; - this.name = name == null ? model.getDefaultComponentName(this) : name; + this.name = name; this.bounds = new Rectangle(0, 0, 0, 0); this.pinsByName = new HashMap<>(); this.pinsUnmodifiable = Collections.unmodifiableMap(pinsByName); @@ -65,11 +77,31 @@ public abstract class ModelComponent implements JSONSerializable this.pinAddedListeners = new ArrayList<>(); this.pinRemovedListeners = new ArrayList<>(); - // TODO this will crash the high level state debug shell because submodel is not yet set. - // The same problem exists in LogicModelModifiable.getDefaultComponentName; see there + if (callInit) + init(); + } + + /** + * Initializes this component. This method should be called exactly once in this component's constructor.
+ * + */ + protected void init() + { + if (name == null) + name = model.getDefaultComponentName(this); model.componentCreated(this, this::destroyed); } + // basic getters + + public String getName() + { + return name; + } + /** * Destroys this component. This method is called from {@link LogicModelModifiable#componentDestroyed(ModelComponent) * destroyComponent()} of the model this component is a part of.