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 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