Renamed mograsim to net.mograsim
[Mograsim.git] / LogicUI / src / net / mograsim / logic / ui / model / components / GUIManualSwitch.java
diff --git a/LogicUI/src/net/mograsim/logic/ui/model/components/GUIManualSwitch.java b/LogicUI/src/net/mograsim/logic/ui/model/components/GUIManualSwitch.java
new file mode 100644 (file)
index 0000000..8ca57ee
--- /dev/null
@@ -0,0 +1,67 @@
+package net.mograsim.logic.ui.model.components;
+
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.model.wires.Pin;
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Font;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+import net.mograsim.logic.core.components.ManualSwitch;
+import net.mograsim.logic.core.types.BitVectorFormatter;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+
+public class GUIManualSwitch extends GUIComponent
+{
+       private static final double width = 20;
+       private static final double height = 15;
+       private static final double fontHeight = 5;
+
+       private final Pin outputPin;
+
+       private ManualSwitch logicSwitch;
+       private ReadEnd end;
+
+       public GUIManualSwitch(ViewModel model)
+       {
+               super(model);
+               setSize(width, height);
+               addPin(this.outputPin = new Pin(this, 1, width, height / 2));
+       }
+
+       @Override
+       public void render(GeneralGC gc, Rectangle visibleRegion)
+       {
+               double posX = getBounds().x;
+               double posY = getBounds().y;
+
+               gc.drawRectangle(posX, posY, width, height);
+               String label = BitVectorFormatter.formatValueAsString(end);
+               Font oldFont = gc.getFont();
+               Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
+               gc.setFont(labelFont);
+               Point textExtent = gc.textExtent(label);
+               gc.drawText(label, posX + (width - textExtent.x) / 2, posY + (height - textExtent.y) / 2, true);
+               gc.setFont(oldFont);
+       }
+
+       public void setLogicModelBinding(ManualSwitch logicSwitch, ReadEnd end)
+       {
+               this.logicSwitch = logicSwitch;
+               this.end = end;
+               // TODO when ManualSwitch supports it, add listeners
+               end.addObserver((i, o) -> callComponentLookChangedListeners());
+       }
+
+       @Override
+       public boolean clicked(double x, double y)
+       {
+               if (logicSwitch != null)
+                       logicSwitch.toggle();
+               return true;
+       }
+
+       public Pin getOutputPin()
+       {
+               return outputPin;
+       }
+}
\ No newline at end of file