X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.model%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fmodel%2Fcomponents%2FModelComponent.java;fp=net.mograsim.logic.model%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fmodel%2Fcomponents%2FModelComponent.java;h=0000000000000000000000000000000000000000;hb=7d05144c25daa53e60fc9ed9fd503546a86567f8;hp=d543c543ebc2050f044e8cd309e6b07a36f98e1a;hpb=8bed58cd47f4e53a0a83e066d38864aa6875502f;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 deleted file mode 100644 index d543c543..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java +++ /dev/null @@ -1,362 +0,0 @@ -package net.mograsim.logic.model.model.components; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.JSONSerializable; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; - -/** - * The base class for all model components.
- * A ModelComponent has a reference to the LogicModel it belongs to.
- * A ModelComponent has a name. This name is unique in the model the ModelComponent belongs to.
- * A ModelComponent has a position and size. The size can only be modified by subclasses. - * - * @author Daniel Kirschten - */ -public abstract class ModelComponent implements JSONSerializable -{ - /** - * The model this component is a part of. - */ - protected final LogicModelModifiable 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()}. - */ - private String name; - private final Rectangle bounds; - /** - * The list of all pins of this component by name. - */ - private final Map pinsByName; - /** - * An unmodifiable view of {@link #pinsByName}. - */ - protected final Map pinsUnmodifiable; - - private final List> componentMovedListeners; - private final List> componentResizedListeners; - private final List> pinAddedListeners; - private final List> pinRemovedListeners; - - private HighLevelStateHandler highLevelStateHandler; - - // 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; - 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<>(); - - if (callInit) - init(); - } - - /** - * Initializes this component. This method should be called exactly once in this component's constructor.
- *
    - *
  • If {@link #name}==null, sets {@link #name} to {@link LogicModelModifiable#getDefaultComponentName(ModelComponent)}. - *
  • Registers this component in the model. - *
- */ - 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.
- * When overriding, make sure to also call the original implementation. - * - * @author Daniel Kirschten - */ - protected void destroyed() - { - pinsByName.values().forEach(this::removePinWithoutRedraw); - } - - // pins - - /** - * Adds the given pin to this component and calls pinAddedListeners and redrawListeners. - * - * @throws IllegalArgumentException if the pin doesn't belong to this component - * @throws IllegalArgumentException if there already is a pin with the given name - * - * @author Daniel Kirschten - */ - protected void addPin(Pin pin) - { - if (pin.component != this) - throw new IllegalArgumentException("Can't add a pin not belonging to this component!"); - if (pinsByName.containsKey(pin.name)) - throw new IllegalArgumentException("Duplicate pin name: " + pin.name); - pinsByName.put(pin.name, pin); - callPinAddedListeners(pin); - model.requestRedraw(); - } - - /** - * Removes the given pin from this component and calls pinAddedListeners and redrawListeners. - * - * @throws NullPointerException if there was no pin with this name - * - * @author Daniel Kirschten - */ - protected void removePin(String name) - { - removePinWithoutRedraw(pinsByName.remove(name)); - model.requestRedraw(); - } - - private void removePinWithoutRedraw(Pin pin) - { - pin.destroyed(); - callPinRemovedListeners(pin); - } - - /** - * Returns a collection of pins of this component. - * - * @author Daniel Kirschten - */ - public Map getPins() - { - return pinsUnmodifiable; - } - - /** - * Returns the pin with the given name of this component. - * - * @throws IllegalArgumentException if there is no pin with the given name - * @see #getPinOrNull(String) - * - * @author Daniel Kirschten - */ - public Pin getPin(String name) - { - Pin pin = getPinOrNull(name); - if (pin == null) - throw new IllegalArgumentException("No pin with the name " + name); - return pin; - } - - /** - * Returns the pin with the given name of this component, or null if there is no such pin. - * - * @see #getPin(String) - * - * @author Daniel Kirschten - */ - public Pin getPinOrNull(String name) - { - return pinsByName.get(name); - } - - // high-level access - - /** - * @author Daniel Kirschten - */ - protected void setHighLevelStateHandler(HighLevelStateHandler highLevelStateHandler) - { - this.highLevelStateHandler = highLevelStateHandler; - } - - public HighLevelStateHandler getHighLevelStateHandler() - { - return highLevelStateHandler; - } - - /** - * Gets the current value of the given high-level state.
- * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. - * - * @see #setHighLevelState(String, Object) - * @see HighLevelStateHandler#getHighLevelState(String) - * - * @author Daniel Kirschten - */ - public Object getHighLevelState(String 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 - - /** - * Sets the position of this component and calls componentMovedListeners and redrawListeners. - * - * @author Daniel Kirschten - */ - public void moveTo(double x, double y) - { - bounds.x = x; - bounds.y = y; - callComponentMovedListeners(); - model.requestRedraw(); - } - - /** - * Sets the size of this component and calls redrawListeners. - * - * @author Daniel Kirschten - */ - protected void setSize(double width, double height) - { - bounds.width = width; - bounds.height = height; - callComponentResizedListener(); - model.requestRedraw(); - } - - /** - * Returns the bounds of this component. Is a bit slower than {@link #getPosX()}, {@link #getPosY()}, {@link #getWidth}, - * {@link #getHeight}, because new objects are created. - * - * @author Daniel Kirschten - */ - public final Rectangle getBounds() - { - return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height); - } - - /** - * Returns the x coordinate of the position of this component. Is a bit faster than {@link #getBounds()} because no objects are created. - * - * @author Daniel Kirschten - */ - public double getPosX() - { - return bounds.x; - } - - /** - * Returns the y coordinate of the position of this component. Is a bit faster than {@link #getBounds()} because no objects are created. - * - * @author Daniel Kirschten - */ - public double getPosY() - { - return bounds.y; - } - - /** - * Returns the (graphical) width of this component. Is a bit faster than {@link #getBounds()} because no objects are created. - * - * @author Daniel Kirschten - */ - public double getWidth() - { - return bounds.width; - } - - /** - * Returns the height of this component. Is a bit faster than {@link #getBounds()} because no objects are created. - * - * @author Daniel Kirschten - */ - public double getHeight() - { - return bounds.height; - } - - /** - * Called when this component is clicked. Absolute coordinates of the click are given. Returns true if this component consumed this - * click. - * - * @author Daniel Kirschten - */ - @SuppressWarnings({ "static-method", "unused" }) // this method is inteded to be overridden - public boolean clicked(double x, double y) - { - return false; - } - - /** - * Render this component to the given gc, in absoulute coordinates. - * - * @author Daniel Kirschten - */ - public abstract void render(GeneralGC gc, Rectangle visibleRegion); - - // serializing - - @Override - public Object getParamsForSerializing(IdentifyParams idParams) - { - return null; - } - - // listeners - - // @formatter:off - public void addComponentMovedListener (Consumer listener) {componentMovedListeners .add (listener);} - public void addComponentResizedListener (Consumer listener) {componentResizedListeners.add (listener);} - public void addPinAddedListener (Consumer listener) {pinAddedListeners .add (listener);} - public void addPinRemovedListener (Consumer listener) {pinRemovedListeners .add (listener);} - - public void removeComponentMovedListener (Consumer listener) {componentMovedListeners .remove(listener);} - public void removeComponentResizedListener (Consumer listener) {componentResizedListeners.remove(listener);} - public void removePinAddedListener (Consumer listener) {pinAddedListeners .remove(listener);} - public void removePinRemovedListener (Consumer listener) {pinRemovedListeners .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 ));} - // @formatter:on -} \ No newline at end of file