1 package net.mograsim.logic.ui.model.components;
3 import java.util.ArrayList;
4 import java.util.Collections;
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.ViewModelModifiable;
12 import net.mograsim.logic.ui.model.components.params.RectComponentParams;
13 import net.mograsim.logic.ui.model.wires.Pin;
15 public class SimpleRectangularSubmodelComponent extends SubmodelComponent
17 private static final double width = 35;
18 private static final double pinDistance = 10;
19 private static final double fontHeight = 5;
21 private final String label;
22 protected final int logicWidth;
24 private final List<Pin> inputSupermodelPins;
25 private final List<Pin> inputSupermodelPinsUnmodifiable;
26 private final List<Pin> outputSupermodelPins;
27 private final List<Pin> outputSupermodelPinsUnmodifiable;
28 private final List<Pin> inputSubmodelPins;
29 private final List<Pin> inputSubmodelPinsUnmodifiable;
30 private final List<Pin> outputSubmodelPins;
31 private final List<Pin> outputSubmodelPinsUnmodifiable;
33 protected SimpleRectangularSubmodelComponent(ViewModelModifiable model, int logicWidth, String label)
37 this.logicWidth = logicWidth;
38 this.inputSupermodelPins = new ArrayList<>();
39 this.inputSupermodelPinsUnmodifiable = Collections.unmodifiableList(inputSupermodelPins);
40 this.outputSupermodelPins = new ArrayList<>();
41 this.outputSupermodelPinsUnmodifiable = Collections.unmodifiableList(outputSupermodelPins);
42 this.inputSubmodelPins = new ArrayList<>();
43 this.inputSubmodelPinsUnmodifiable = Collections.unmodifiableList(inputSubmodelPins);
44 this.outputSubmodelPins = new ArrayList<>();
45 this.outputSubmodelPinsUnmodifiable = Collections.unmodifiableList(outputSubmodelPins);
48 protected void setInputCount(int inputCount)
50 int oldInputCount = inputSupermodelPins.size();
51 double height = Math.max(inputCount, outputSupermodelPins.size()) * pinDistance;
52 setSize(width, height);
53 if (oldInputCount > inputCount)
54 while (inputSupermodelPins.size() > inputCount)
56 inputSubmodelPins.remove(inputCount);
57 removePin(inputSupermodelPins.remove(inputCount));
59 else if (oldInputCount < inputCount)
60 for (int i = oldInputCount; i < inputCount; i++)
62 Pin submodelPin = addSubmodelInterface(logicWidth, 0, pinDistance / 2 + i * pinDistance);
63 inputSubmodelPins.add(submodelPin);
64 inputSupermodelPins.add(getSupermodelPin(submodelPin));
68 protected void setOutputCount(int outputCount)
70 int oldOutputCount = outputSupermodelPins.size();
71 setSize(width, Math.max(inputSupermodelPins.size(), outputCount) * pinDistance);
72 if (oldOutputCount > outputCount)
73 while (outputSupermodelPins.size() > outputCount)
75 outputSubmodelPins.remove(outputCount);
76 removePin(outputSupermodelPins.get(outputCount));
78 else if (oldOutputCount < outputCount)
79 for (int i = oldOutputCount; i < outputCount; i++)
81 Pin submodelPin = addSubmodelInterface(logicWidth, width, pinDistance / 2 + i * pinDistance);
82 outputSubmodelPins.add(submodelPin);
83 outputSupermodelPins.add(getSupermodelPin(submodelPin));
87 public List<Pin> getInputPins()
89 return inputSupermodelPinsUnmodifiable;
92 public List<Pin> getOutputPins()
94 return outputSupermodelPinsUnmodifiable;
97 protected List<Pin> getInputSubmodelPins()
99 return inputSubmodelPinsUnmodifiable;
102 protected List<Pin> getOutputSubmodelPins()
104 return outputSubmodelPinsUnmodifiable;
108 protected void renderSymbol(GeneralGC gc, Rectangle visibleRegion)
110 double posX = getBounds().x;
111 double posY = getBounds().y;
113 Font oldFont = gc.getFont();
114 Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
115 gc.setFont(labelFont);
116 Point textExtent = gc.textExtent(label);
117 gc.drawText(label, posX + (getBounds().width - textExtent.x) / 2, posY + (getBounds().height - textExtent.y) / 2, true);
122 protected void renderOutline(GeneralGC gc, Rectangle visibleRegion)
124 gc.drawRectangle(getBounds());
127 public RectComponentParams calculateRectParams()
129 RectComponentParams params = new RectComponentParams();
130 params.displayName = label;
131 params.inputCount = inputSupermodelPins.size();
132 params.outputCount = outputSubmodelPins.size();
133 params.logicWidth = logicWidth;
134 params.composition = calculateCompositionParams();