X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.ui%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fui%2Fmodel%2Fcomponents%2FGUIComponent.java;fp=net.mograsim.logic.ui%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fui%2Fmodel%2Fcomponents%2FGUIComponent.java;h=0000000000000000000000000000000000000000;hb=b5d8c2d71e27350ea7c9314e40df5bb0584271cd;hp=bf9ea85bebfa82e37756cf3b38890dd0a661d0ee;hpb=69cb6725ef670328959d55649257ded6ac924b33;p=Mograsim.git diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIComponent.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIComponent.java deleted file mode 100644 index bf9ea85b..00000000 --- a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/GUIComponent.java +++ /dev/null @@ -1,316 +0,0 @@ -package net.mograsim.logic.ui.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 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.ui.model.ViewModelModifiable; -import net.mograsim.logic.ui.model.wires.Pin; -import net.mograsim.logic.ui.serializing.snippets.HighLevelStateHandler; - -/** - * The base class for all GUI components.
- * A GUIComponent has a position and size. The size can only be modified by subclasses.
- * - * @author Daniel Kirschten - */ -public abstract class GUIComponent -{ - /** - * The model this component is a part of. - */ - protected final ViewModelModifiable model; - /** - * The name of this component. Is unique in its model. - */ - public final 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 final List redrawListeners; - - private final Runnable redrawListenerForSubcomponents; - // creation and destruction - - public GUIComponent(ViewModelModifiable model, String name) - { - this.model = model; - this.name = name == null ? model.getDefaultComponentName(this) : 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<>(); - this.redrawListeners = new ArrayList<>(); - - redrawListenerForSubcomponents = this::requestRedraw; - - model.componentCreated(this); - } - - /** - * Destroys this component. This method implicitly calls {@link ViewModelModifiable#componentDestroyed(GUIComponent) - * componentDestroyed()} for the model this component is a part of. - * - * @author Daniel Kirschten - */ - public void destroy() - { - pinsByName.values().forEach(p -> pinRemovedListeners.forEach(l -> l.accept(p))); - model.componentDestroyed(this); - } - - // 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); - pin.addRedrawListener(redrawListenerForSubcomponents); - 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) - { - Pin pin = pinsByName.remove(name); - callPinRemovedListeners(pin); - pin.removeRedrawListener(redrawListenerForSubcomponents); - requestRedraw(); - } - - /** - * 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 - * - * @author Daniel Kirschten - */ - public Pin getPin(String name) - { - Pin pin = pinsByName.get(name); - if (pin == null) - throw new IllegalArgumentException("No pin with the name " + name); - return pin; - } - - // 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) - { - throw new IllegalArgumentException("No high level state with ID " + stateID); - } - - /** - * 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 #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); - } - - // "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(); - 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(); - 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 - - @SuppressWarnings("static-method") // this method is intended to be overridden - public JsonElement getParams() - { - return JsonNull.INSTANCE; - } - - // listeners - - /** - * Calls redraw listeners. - * - * @author Daniel Kirschten - */ - protected void requestRedraw() - { - callRedrawListeners(); - } - - // @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 addRedrawListener (Runnable listener) {redrawListeners .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);} - 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