1 package net.mograsim.logic.ui.model.components;
3 import java.util.ArrayList;
4 import java.util.Collections;
7 import java.util.TreeMap;
9 import net.haspamelodica.swt.helper.gcs.GeneralGC;
10 import net.haspamelodica.swt.helper.swtobjectwrappers.Font;
11 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
12 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
13 import net.mograsim.logic.ui.model.ViewModelModifiable;
14 import net.mograsim.logic.ui.model.components.params.SubmodelComponentParams;
15 import net.mograsim.logic.ui.model.wires.Pin;
17 public class SimpleRectangularSubmodelComponent extends SubmodelComponent
19 public static String kLabel = "label", kInCount = "input_count", kOutCount = "output_count", kLogicWidth = "logic_width";
21 private static final double width = 35;
22 private static final double pinDistance = 10;
23 private static final double fontHeight = 5;
25 private final String label;
26 protected final int logicWidth;
28 private final List<Pin> inputSupermodelPins;
29 private final List<Pin> inputSupermodelPinsUnmodifiable;
30 private final List<Pin> outputSupermodelPins;
31 private final List<Pin> outputSupermodelPinsUnmodifiable;
32 private final List<Pin> inputSubmodelPins;
33 private final List<Pin> inputSubmodelPinsUnmodifiable;
34 private final List<Pin> outputSubmodelPins;
35 private final List<Pin> outputSubmodelPinsUnmodifiable;
37 protected SimpleRectangularSubmodelComponent(ViewModelModifiable model, int logicWidth, String label)
41 this.logicWidth = logicWidth;
42 this.inputSupermodelPins = new ArrayList<>();
43 this.inputSupermodelPinsUnmodifiable = Collections.unmodifiableList(inputSupermodelPins);
44 this.outputSupermodelPins = new ArrayList<>();
45 this.outputSupermodelPinsUnmodifiable = Collections.unmodifiableList(outputSupermodelPins);
46 this.inputSubmodelPins = new ArrayList<>();
47 this.inputSubmodelPinsUnmodifiable = Collections.unmodifiableList(inputSubmodelPins);
48 this.outputSubmodelPins = new ArrayList<>();
49 this.outputSubmodelPinsUnmodifiable = Collections.unmodifiableList(outputSubmodelPins);
52 protected void setInputCount(int inputCount)
54 int oldInputCount = inputSupermodelPins.size();
55 double height = Math.max(inputCount, outputSupermodelPins.size()) * pinDistance;
56 setSize(width, height);
57 if (oldInputCount > inputCount)
58 while (inputSupermodelPins.size() > inputCount)
60 inputSubmodelPins.remove(inputCount);
61 removePin(inputSupermodelPins.remove(inputCount));
63 else if (oldInputCount < inputCount)
64 for (int i = oldInputCount; i < inputCount; i++)
66 Pin submodelPin = addSubmodelInterface(logicWidth, 0, pinDistance / 2 + i * pinDistance);
67 inputSubmodelPins.add(submodelPin);
68 inputSupermodelPins.add(getSupermodelPin(submodelPin));
72 protected void setOutputCount(int outputCount)
74 int oldOutputCount = outputSupermodelPins.size();
75 setSize(width, Math.max(inputSupermodelPins.size(), outputCount) * pinDistance);
76 if (oldOutputCount > outputCount)
77 while (outputSupermodelPins.size() > outputCount)
79 outputSubmodelPins.remove(outputCount);
80 removePin(outputSupermodelPins.get(outputCount));
82 else if (oldOutputCount < outputCount)
83 for (int i = oldOutputCount; i < outputCount; i++)
85 Pin submodelPin = addSubmodelInterface(logicWidth, width, pinDistance / 2 + i * pinDistance);
86 outputSubmodelPins.add(submodelPin);
87 outputSupermodelPins.add(getSupermodelPin(submodelPin));
91 public List<Pin> getInputPins()
93 return inputSupermodelPinsUnmodifiable;
96 public List<Pin> getOutputPins()
98 return outputSupermodelPinsUnmodifiable;
101 protected List<Pin> getInputSubmodelPins()
103 return inputSubmodelPinsUnmodifiable;
106 protected List<Pin> getOutputSubmodelPins()
108 return outputSubmodelPinsUnmodifiable;
112 protected void renderSymbol(GeneralGC gc, Rectangle visibleRegion)
114 double posX = getBounds().x;
115 double posY = getBounds().y;
117 Font oldFont = gc.getFont();
118 Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
119 gc.setFont(labelFont);
120 Point textExtent = gc.textExtent(label);
121 gc.drawText(label, posX + (getBounds().width - textExtent.x) / 2, posY + (getBounds().height - textExtent.y) / 2, true);
126 protected void renderOutline(GeneralGC gc, Rectangle visibleRegion)
128 gc.drawRectangle(getBounds());
132 public SubmodelComponentParams calculateParams()
134 SubmodelComponentParams ret = super.calculateParams();
135 ret.type = SimpleRectangularSubmodelComponent.class.getSimpleName();
136 Map<String, Object> m = new TreeMap<>();
137 m.put(kLabel, label);
138 m.put(kInCount, inputSupermodelPins.size());
139 m.put(kOutCount, outputSupermodelPins.size());
140 m.put(kLogicWidth, logicWidth);