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.wires.Pin;
16 public class SimpleRectangularSubmodelComponent extends SubmodelComponent
18 public static String kLabel = "label", kInCount = "input_count", kOutCount = "output_count", kLogicWidth = "logic_width";
20 private static final double width = 35;
21 private static final double pinDistance = 10;
22 private static final double fontHeight = 5;
24 private final String label;
25 protected final int logicWidth;
27 private final List<Pin> inputSupermodelPins;
28 private final List<Pin> inputSupermodelPinsUnmodifiable;
29 private final List<Pin> outputSupermodelPins;
30 private final List<Pin> outputSupermodelPinsUnmodifiable;
31 private final List<Pin> inputSubmodelPins;
32 private final List<Pin> inputSubmodelPinsUnmodifiable;
33 private final List<Pin> outputSubmodelPins;
34 private final List<Pin> outputSubmodelPinsUnmodifiable;
36 protected SimpleRectangularSubmodelComponent(ViewModelModifiable model, int logicWidth, String label)
40 this.logicWidth = logicWidth;
41 this.inputSupermodelPins = new ArrayList<>();
42 this.inputSupermodelPinsUnmodifiable = Collections.unmodifiableList(inputSupermodelPins);
43 this.outputSupermodelPins = new ArrayList<>();
44 this.outputSupermodelPinsUnmodifiable = Collections.unmodifiableList(outputSupermodelPins);
45 this.inputSubmodelPins = new ArrayList<>();
46 this.inputSubmodelPinsUnmodifiable = Collections.unmodifiableList(inputSubmodelPins);
47 this.outputSubmodelPins = new ArrayList<>();
48 this.outputSubmodelPinsUnmodifiable = Collections.unmodifiableList(outputSubmodelPins);
51 protected void setInputCount(int inputCount)
53 int oldInputCount = inputSupermodelPins.size();
54 double height = Math.max(inputCount, outputSupermodelPins.size()) * pinDistance;
55 setSize(width, height);
56 if (oldInputCount > inputCount)
57 while (inputSupermodelPins.size() > inputCount)
59 inputSubmodelPins.remove(inputCount);
60 removePin(inputSupermodelPins.remove(inputCount));
62 else if (oldInputCount < inputCount)
63 for (int i = oldInputCount; i < inputCount; i++)
66 Pin submodelPin = addSubmodelInterface("Input pin #" + i, 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++)
86 Pin submodelPin = addSubmodelInterface("Output pin #" + i, logicWidth, width, pinDistance / 2 + i * pinDistance);
87 outputSubmodelPins.add(submodelPin);
88 outputSupermodelPins.add(getSupermodelPin(submodelPin));
92 public List<Pin> getInputPins()
94 return inputSupermodelPinsUnmodifiable;
97 public List<Pin> getOutputPins()
99 return outputSupermodelPinsUnmodifiable;
102 protected List<Pin> getInputSubmodelPins()
104 return inputSubmodelPinsUnmodifiable;
107 protected List<Pin> getOutputSubmodelPins()
109 return outputSubmodelPinsUnmodifiable;
113 protected void renderSymbol(GeneralGC gc, Rectangle visibleRegion)
115 double posX = getBounds().x;
116 double posY = getBounds().y;
118 Font oldFont = gc.getFont();
119 Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
120 gc.setFont(labelFont);
121 Point textExtent = gc.textExtent(label);
122 gc.drawText(label, posX + (getBounds().width - textExtent.x) / 2, posY + (getBounds().height - textExtent.y) / 2, true);
124 // TODO draw pin names
128 protected void renderOutline(GeneralGC gc, Rectangle visibleRegion)
130 gc.drawRectangle(getBounds());
134 public SubmodelComponentParams calculateParams()
136 SubmodelComponentParams ret = super.calculateParams();
137 ret.type = SimpleRectangularSubmodelComponent.class.getSimpleName();
138 Map<String, Object> m = new TreeMap<>();
139 m.put(kLabel, label);
140 m.put(kInCount, inputSupermodelPins.size());
141 m.put(kOutCount, outputSupermodelPins.size());
142 m.put(kLogicWidth, logicWidth);