Merge branch 'development' of
[Mograsim.git] / net.mograsim.logic.model.editor / src / net / mograsim / logic / model / editor / handles / InterfacePinHandle.java
diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/InterfacePinHandle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/InterfacePinHandle.java
new file mode 100644 (file)
index 0000000..9eff5ce
--- /dev/null
@@ -0,0 +1,109 @@
+package net.mograsim.logic.model.editor.handles;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+import net.mograsim.logic.model.model.wires.MovablePin;
+import net.mograsim.logic.model.model.wires.Pin;
+import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent;
+
+public class InterfacePinHandle extends PinHandle
+{
+       private final static int CIRCLE_DIAM = 4, CIRCLE_RADIUS = CIRCLE_DIAM / 2, SELECTED_CIRCLE_OFFSET = 1,
+                       SELECTED_CIRCLE_DIAM = SELECTED_CIRCLE_OFFSET * 2 + CIRCLE_DIAM;
+       private final MovablePin parent;
+       private final DeserializedSubmodelComponent owner;
+       private boolean selected = false;
+
+       public InterfacePinHandle(MovablePin parent, DeserializedSubmodelComponent pinOwner)
+       {
+               super();
+               this.parent = parent;
+               this.owner = pinOwner;
+               setSize(CIRCLE_DIAM, CIRCLE_DIAM);
+               initPos();
+       }
+
+       private void initPos()
+       {
+               Point pos = parent.getPos();
+               moveTo(pos.x - CIRCLE_RADIUS, pos.y - CIRCLE_RADIUS);
+       }
+
+       @Override
+       protected void render(GeneralGC gc)
+       {
+               double x = getPosX(), y = getPosY();
+
+               gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+               gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+               gc.drawText(parent.name, x + CIRCLE_DIAM, y + CIRCLE_DIAM, true);
+               if (selected)
+               {
+                       gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW));
+                       gc.drawOval(x - SELECTED_CIRCLE_OFFSET, y - SELECTED_CIRCLE_OFFSET, SELECTED_CIRCLE_DIAM,
+                                       SELECTED_CIRCLE_DIAM);
+               }
+               gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+               gc.fillOval(getPosX(), getPosY(), CIRCLE_DIAM, CIRCLE_DIAM);
+       }
+
+       @Override
+       public void reqMove(double x, double y)
+       {
+               moveTo(x, y);
+       }
+
+       @Override
+       public void onSelect()
+       {
+               selected = true;
+               callRedrawListeners();
+       }
+
+       @Override
+       public void onDeselect()
+       {
+               selected = false;
+               callRedrawListeners();
+       }
+
+       @Override
+       public void reqDelete()
+       {
+               owner.removeSubmodelInterface(parent.name);
+       }
+       
+       @Override
+       protected void moveTo(double x, double y)
+       {
+               super.moveTo(x, y);
+               parent.setRelPos(getCenterX(), getCenterY());
+       }
+
+       @Override
+       public double getCenterX()
+       {
+               return getPosX() + CIRCLE_RADIUS;
+       }
+
+       @Override
+       public double getCenterY()
+       {
+               return getPosY() + CIRCLE_RADIUS;
+       }
+
+       @Override
+       public HandleType getType()
+       {
+               return HandleType.INTERFACE_PIN;
+       }
+
+       @Override
+       public Pin getPin()
+       {
+               return parent;
+       }
+}
\ No newline at end of file