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.mograsim.logic.ui.model.ViewModelModifiable;
11 import net.mograsim.logic.ui.model.wires.Pin;
13 public class SimpleRectangularSubmodelComponent extends SubmodelComponent
15 private static final double width = 35;
16 private static final double pinDistance = 10;
17 private static final double minHeight = 25;
18 private static final double fontHeight = 5;
20 private final String label;
21 protected final int logicWidth;
23 private final List<Pin> inputSupermodelPins;
24 private final List<Pin> inputSupermodelPinsUnmodifiable;
25 private final List<Pin> outputSupermodelPins;
26 private final List<Pin> outputSupermodelPinsUnmodifiable;
27 private final List<Pin> inputSubmodelPins;
28 private final List<Pin> inputSubmodelPinsUnmodifiable;
29 private final List<Pin> outputSubmodelPins;
30 private final List<Pin> outputSubmodelPinsUnmodifiable;
32 protected SimpleRectangularSubmodelComponent(ViewModelModifiable model, int logicWidth, String label)
36 this.logicWidth = logicWidth;
37 this.inputSupermodelPins = new ArrayList<>();
38 this.inputSupermodelPinsUnmodifiable = Collections.unmodifiableList(inputSupermodelPins);
39 this.outputSupermodelPins = new ArrayList<>();
40 this.outputSupermodelPinsUnmodifiable = Collections.unmodifiableList(outputSupermodelPins);
41 this.inputSubmodelPins = new ArrayList<>();
42 this.inputSubmodelPinsUnmodifiable = Collections.unmodifiableList(inputSubmodelPins);
43 this.outputSubmodelPins = new ArrayList<>();
44 this.outputSubmodelPinsUnmodifiable = Collections.unmodifiableList(outputSubmodelPins);
47 protected void setInputCount(int inputCount)
49 int oldInputCount = inputSupermodelPins.size();
50 double height = Math.max(inputCount, outputSupermodelPins.size()) * pinDistance;
51 setSize(width, height);
52 if (oldInputCount > inputCount)
53 while (inputSupermodelPins.size() > inputCount)
55 inputSubmodelPins.remove(inputCount);
56 removePin(inputSupermodelPins.remove(inputCount));
58 else if (oldInputCount < inputCount)
59 for (int i = oldInputCount; i < inputCount; i++)
61 Pin submodelPin = addSubmodelInterface(logicWidth, 0, pinDistance / 2 + i * pinDistance);
62 inputSubmodelPins.add(submodelPin);
63 inputSupermodelPins.add(getSupermodelPin(submodelPin));
67 protected void setOutputCount(int outputCount)
69 int oldOutputCount = outputSupermodelPins.size();
70 setSize(width, Math.max(inputSupermodelPins.size(), outputCount) * pinDistance);
71 if (oldOutputCount > outputCount)
72 while (outputSupermodelPins.size() > outputCount)
74 outputSubmodelPins.remove(outputCount);
75 removePin(outputSupermodelPins.get(outputCount));
77 else if (oldOutputCount < outputCount)
78 for (int i = oldOutputCount; i < outputCount; i++)
80 Pin submodelPin = addSubmodelInterface(logicWidth, width, pinDistance / 2 + i * pinDistance);
81 outputSubmodelPins.add(submodelPin);
82 outputSupermodelPins.add(getSupermodelPin(submodelPin));
86 public List<Pin> getInputPins()
88 return inputSupermodelPinsUnmodifiable;
91 public List<Pin> getOutputPins()
93 return outputSupermodelPinsUnmodifiable;
96 protected List<Pin> getInputSubmodelPins()
98 return inputSubmodelPinsUnmodifiable;
101 protected List<Pin> getOutputSubmodelPins()
103 return outputSubmodelPinsUnmodifiable;
107 protected void renderSymbol(GeneralGC gc)
109 double posX = getBounds().x;
110 double posY = getBounds().y;
112 Font oldFont = gc.getFont();
113 Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
114 gc.setFont(labelFont);
115 Point textExtent = gc.textExtent(label);
116 gc.drawText(label, posX + (getBounds().width - textExtent.x) / 2, posY + (getBounds().height - textExtent.y) / 2, true);
121 protected void renderOutline(GeneralGC gc)
123 gc.drawRectangle(getBounds());