Common ConnectionPoint interface to simplify many things
[Mograsim.git] / net.mograsim.logic.ui / src / net / mograsim / logic / ui / model / wires / Pin.java
index f8325a0..b761c0e 100644 (file)
@@ -5,24 +5,54 @@ import java.util.List;
 import java.util.function.Consumer;
 
 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.ui.model.components.GUIComponent;
 
-//TODO add an ID and/or a name
-public class Pin
+/**
+ * A connection interface between a GUIComponent and the rest of a ViewModel. Pins usually are created by {@link GUIComponent}s themselves.
+ * <br>
+ * A pin has a name identifying it. Pin names are unique for a {@link GUIComponent}: Every pin of a {@link GUIComponent} has a different
+ * name, but different {@link GUIComponent}s can have pins with the same name.
+ * 
+ * @author Daniel Kirschten
+ */
+public class Pin implements ConnectionPoint
 {
+       /**
+        * The {@link GUIComponent} this pin belongs to
+        */
        public final GUIComponent component;
+       /**
+        * The name identifying this pin. Is unique for a {@link GUIComponent}.
+        */
+       public final String name;
+       /**
+        * The logical width of this pin. Denotes how many bits this pin consists of.
+        */
        public final int logicWidth;
 
+       /**
+        * The X position of this pin, relative to its component's location.
+        */
        protected double relX;
+       /**
+        * The Y position of this pin, relative to its component's location.
+        */
        protected double relY;
 
        private final List<Consumer<? super Pin>> pinMovedListeners;
        private final List<Runnable> redrawListeners;
 
-       public Pin(GUIComponent component, int logicWidth, double relX, double relY)
+       // creation and destruction
+
+       /**
+        * Creates a new pin. Usually it is not needed to call this constructor manually, as {@link GUIComponent}s create their pins themselves.
+        * 
+        * @author Daniel Kirschten
+        */
+       public Pin(GUIComponent component, String name, int logicWidth, double relX, double relY)
        {
                this.component = component;
+               this.name = name;
                this.logicWidth = logicWidth;
                this.relX = relX;
                this.relY = relY;
@@ -33,27 +63,53 @@ public class Pin
                component.addComponentMovedListener(c -> callPinMovedListeners());
        }
 
+       // "graphical" operations
+
+       /**
+        * Returns the X position of this pin relative to the position of its component.
+        * 
+        * @author Daniel Kirschten
+        */
        public double getRelX()
        {
                return relX;
        }
 
+       /**
+        * Returns the Y position of this pin relative to the position of its component.
+        * 
+        * @author Daniel Kirschten
+        */
        public double getRelY()
        {
                return relY;
        }
 
+       /**
+        * Returns the position of this pin relative to the position of its component.
+        * 
+        * @author Daniel Kirschten
+        */
        public Point getRelPos()
        {
                return new Point(relX, relY);
        }
 
+       /**
+        * Returns the absolute position of this pin.
+        * 
+        * @author Daniel Kirschten
+        */
        public Point getPos()
        {
-               Rectangle componentBounds = component.getBounds();
-               return new Point(relX + componentBounds.x, relY + componentBounds.y);
+               return new Point(relX + component.getPosX(), relY + component.getPosY());
        }
 
+       /**
+        * Sets the position of this pin relative to the position of its component.
+        * 
+        * @author Daniel Kirschten
+        */
        protected void setRelPos(double relX, double relY)
        {
                this.relX = relX;
@@ -62,6 +118,8 @@ public class Pin
                callRedrawListeners();
        }
 
+       // listeners
+
        // @formatter:off
        public void addPinMovedListener   (Consumer<? super Pin> listener){pinMovedListeners.add   (listener);}
        public void addRedrawListener     (Runnable              listener){redrawListeners  .add   (listener);}
@@ -73,4 +131,15 @@ public class Pin
        private void callRedrawListeners  () {redrawListeners  .forEach(l -> l.run   (    ));}
        // @formatter:on
 
+       @Override
+       public String toString()
+       {
+               return "Pin [" + name + ", point=" + getPos() + "]";
+       }
+
+       @Override
+       public Pin getPin()
+       {
+               return this;
+       }
 }
\ No newline at end of file