Stopped creation of unneccessary Rectangle instances
[Mograsim.git] / net.mograsim.logic.ui / src / net / mograsim / logic / ui / model / components / GUIComponent.java
index 7254d8b..edc3d7b 100644 (file)
@@ -1,8 +1,12 @@
 package net.mograsim.logic.ui.model.components;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
 
@@ -15,8 +19,8 @@ public abstract class GUIComponent
 {
        protected final ViewModelModifiable model;
        private final Rectangle bounds;
-       private final List<Pin> pins;
-       protected final List<Pin> pinsUnmodifiable;
+       private final Map<String, Pin> pinsByName;
+       protected final Collection<Pin> pinsUnmodifiable;
 
        private final List<Consumer<? super GUIComponent>> componentMovedListeners;
        private final List<Consumer<? super Pin>> pinAddedListeners;
@@ -31,8 +35,8 @@ public abstract class GUIComponent
        {
                this.model = model;
                this.bounds = new Rectangle(0, 0, 0, 0);
-               this.pins = new ArrayList<>();
-               this.pinsUnmodifiable = Collections.unmodifiableList(pins);
+               this.pinsByName = new HashMap<>();
+               this.pinsUnmodifiable = Collections.unmodifiableCollection(pinsByName.values());
 
                this.componentMovedListeners = new ArrayList<>();
                this.pinAddedListeners = new ArrayList<>();
@@ -46,7 +50,7 @@ public abstract class GUIComponent
 
        public void destroy()
        {
-               pins.forEach(p -> pinRemovedListeners.forEach(l -> l.accept(p)));
+               pinsByName.values().forEach(p -> pinRemovedListeners.forEach(l -> l.accept(p)));
                model.componentDestroyed(this);
        }
 
@@ -65,6 +69,26 @@ public abstract class GUIComponent
                return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height);
        }
 
+       public double getPosX()
+       {
+               return bounds.x;
+       }
+
+       public double getPosY()
+       {
+               return bounds.y;
+       }
+
+       public double getWidth()
+       {
+               return bounds.width;
+       }
+
+       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.
@@ -76,13 +100,21 @@ public abstract class GUIComponent
        }
 
        /**
-        * Returns a list of pins of this component.
+        * Returns a collection of pins of this component.
         */
-       public List<Pin> getPins()
+       public Collection<Pin> getPins()
        {
                return pinsUnmodifiable;
        }
 
+       public Pin getPin(String name)
+       {
+               Pin pin = pinsByName.get(name);
+               if (pin == null)
+                       throw new IllegalArgumentException("No pin with the name " + name);
+               return pin;
+       }
+
        // @formatter:off
        public void addComponentMovedListener   (Consumer<? super GUIComponent> listener) {componentMovedListeners.add   (listener);}
        public void addPinAddedListener         (Consumer<? super Pin         > listener) {pinAddedListeners      .add   (listener);}
@@ -119,15 +151,17 @@ public abstract class GUIComponent
 
        protected void addPin(Pin pin)
        {
-               pins.add(pin);
+               if (pinsByName.containsKey(pin.name))
+                       throw new IllegalArgumentException("Duplicate pin name: " + pin.name);
+               pinsByName.put(pin.name, pin);
                callPinAddedListeners(pin);
                pin.addRedrawListener(redrawListenerForSubcomponents);
                callRedrawListeners();
        }
 
-       protected void removePin(Pin pin)
+       protected void removePin(String name)
        {
-               pins.remove(pin);
+               Pin pin = pinsByName.remove(name);
                callPinRemovedListeners(pin);
                pin.removeRedrawListener(redrawListenerForSubcomponents);
                callRedrawListeners();
@@ -140,4 +174,10 @@ public abstract class GUIComponent
        {
                return identifierDelegate.get();
        }
+
+       @SuppressWarnings("static-method")
+       public Map<String, Object> getInstantiationParameters()
+       {
+               return new TreeMap<>();
+       }
 }
\ No newline at end of file