1 package net.mograsim.logic.ui.model.components;
3 import java.util.ArrayList;
7 import net.haspamelodica.swt.helper.gcs.GeneralGC;
8 import net.haspamelodica.swt.helper.swtobjectwrappers.Font;
9 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
10 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
11 import net.mograsim.logic.ui.model.ModelVisitor;
12 import net.mograsim.logic.ui.model.ViewModelModifiable;
13 import net.mograsim.logic.ui.model.wires.MovablePin;
14 import net.mograsim.logic.ui.model.wires.Pin;
16 public class SimpleRectangularGUIGate extends GUIComponent
18 private static final double width = 20;
19 private static final double pinDistance = 10;
20 private static final double fontHeight = 5;
21 private static final double invertedCircleDiam = 3.5;
23 private final String label;
24 protected final int logicWidth;
25 private final boolean isInverted;
26 private final double rectWidth;
28 private MovablePin outputPin;
29 private final List<Pin> inputPins;
31 public static final String kLogicWidth = "logicWidth";
33 protected SimpleRectangularGUIGate(ViewModelModifiable model, int logicWidth, String label, boolean isInverted)
37 this.logicWidth = logicWidth;
38 this.isInverted = isInverted;
39 this.rectWidth = width - (isInverted ? invertedCircleDiam : 0);
40 this.outputPin = new MovablePin(this, "Y", logicWidth, width, 0);
42 this.inputPins = new ArrayList<>();
46 protected void setInputCount(int inputCount)
48 int oldInputCount = inputPins.size();
49 setSize(width, inputCount * pinDistance);
50 if (oldInputCount > inputCount)
51 while (inputPins.size() > inputCount)
52 removePin(inputPins.remove(inputCount).name);
53 else if (oldInputCount < inputCount)
54 for (int i = oldInputCount; i < inputCount; i++)
56 // TODO what for more than 24 input pins?
57 Pin pin = new Pin(this, String.valueOf((char) ('A' + i)), logicWidth, 0, pinDistance / 2 + i * pinDistance);
61 outputPin.setRelPos(width, inputCount * pinDistance / 2);
65 public void render(GeneralGC gc, Rectangle visibleRegion)
67 double height = (getPins().size() - 1) * pinDistance;
68 gc.drawRectangle(getPosX(), getPosY(), rectWidth, height);
69 Font oldFont = gc.getFont();
70 Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
71 gc.setFont(labelFont);
72 Point textExtent = gc.textExtent(label);
73 gc.drawText(label, getPosX() + (rectWidth - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true);
76 gc.drawOval(getPosX() + rectWidth, getPosY() + (height - invertedCircleDiam) / 2, invertedCircleDiam, invertedCircleDiam);
80 public Map<String, Object> getInstantiationParameters()
82 Map<String, Object> m = super.getInstantiationParameters();
83 m.put(kLogicWidth, logicWidth);
88 public void accept(ModelVisitor mv)