Removed obsolete field
[Mograsim.git] / net.mograsim.logic.ui / src / net / mograsim / logic / ui / model / components / SimpleRectangularSubmodelComponent.java
1 package net.mograsim.logic.ui.model.components;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.List;
6
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;
12
13 public class SimpleRectangularSubmodelComponent extends SubmodelComponent
14 {
15         private static final double width = 35;
16         private static final double pinDistance = 10;
17         private static final double fontHeight = 5;
18
19         private final String label;
20         protected final int logicWidth;
21
22         private final List<Pin> inputSupermodelPins;
23         private final List<Pin> inputSupermodelPinsUnmodifiable;
24         private final List<Pin> outputSupermodelPins;
25         private final List<Pin> outputSupermodelPinsUnmodifiable;
26         private final List<Pin> inputSubmodelPins;
27         private final List<Pin> inputSubmodelPinsUnmodifiable;
28         private final List<Pin> outputSubmodelPins;
29         private final List<Pin> outputSubmodelPinsUnmodifiable;
30
31         protected SimpleRectangularSubmodelComponent(ViewModelModifiable model, int logicWidth, String label)
32         {
33                 super(model);
34                 this.label = label;
35                 this.logicWidth = logicWidth;
36                 this.inputSupermodelPins = new ArrayList<>();
37                 this.inputSupermodelPinsUnmodifiable = Collections.unmodifiableList(inputSupermodelPins);
38                 this.outputSupermodelPins = new ArrayList<>();
39                 this.outputSupermodelPinsUnmodifiable = Collections.unmodifiableList(outputSupermodelPins);
40                 this.inputSubmodelPins = new ArrayList<>();
41                 this.inputSubmodelPinsUnmodifiable = Collections.unmodifiableList(inputSubmodelPins);
42                 this.outputSubmodelPins = new ArrayList<>();
43                 this.outputSubmodelPinsUnmodifiable = Collections.unmodifiableList(outputSubmodelPins);
44         }
45
46         protected void setInputCount(int inputCount)
47         {
48                 int oldInputCount = inputSupermodelPins.size();
49                 double height = Math.max(inputCount, outputSupermodelPins.size()) * pinDistance;
50                 setSize(width, height);
51                 if (oldInputCount > inputCount)
52                         while (inputSupermodelPins.size() > inputCount)
53                         {
54                                 inputSubmodelPins.remove(inputCount);
55                                 removePin(inputSupermodelPins.remove(inputCount));
56                         }
57                 else if (oldInputCount < inputCount)
58                         for (int i = oldInputCount; i < inputCount; i++)
59                         {
60                                 Pin submodelPin = addSubmodelInterface(logicWidth, 0, pinDistance / 2 + i * pinDistance);
61                                 inputSubmodelPins.add(submodelPin);
62                                 inputSupermodelPins.add(getSupermodelPin(submodelPin));
63                         }
64         }
65
66         protected void setOutputCount(int outputCount)
67         {
68                 int oldOutputCount = outputSupermodelPins.size();
69                 setSize(width, Math.max(inputSupermodelPins.size(), outputCount) * pinDistance);
70                 if (oldOutputCount > outputCount)
71                         while (outputSupermodelPins.size() > outputCount)
72                         {
73                                 outputSubmodelPins.remove(outputCount);
74                                 removePin(outputSupermodelPins.get(outputCount));
75                         }
76                 else if (oldOutputCount < outputCount)
77                         for (int i = oldOutputCount; i < outputCount; i++)
78                         {
79                                 Pin submodelPin = addSubmodelInterface(logicWidth, width, pinDistance / 2 + i * pinDistance);
80                                 outputSubmodelPins.add(submodelPin);
81                                 outputSupermodelPins.add(getSupermodelPin(submodelPin));
82                         }
83         }
84
85         public List<Pin> getInputPins()
86         {
87                 return inputSupermodelPinsUnmodifiable;
88         }
89
90         public List<Pin> getOutputPins()
91         {
92                 return outputSupermodelPinsUnmodifiable;
93         }
94
95         protected List<Pin> getInputSubmodelPins()
96         {
97                 return inputSubmodelPinsUnmodifiable;
98         }
99
100         protected List<Pin> getOutputSubmodelPins()
101         {
102                 return outputSubmodelPinsUnmodifiable;
103         }
104
105         @Override
106         protected void renderSymbol(GeneralGC gc)
107         {
108                 double posX = getBounds().x;
109                 double posY = getBounds().y;
110
111                 Font oldFont = gc.getFont();
112                 Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
113                 gc.setFont(labelFont);
114                 Point textExtent = gc.textExtent(label);
115                 gc.drawText(label, posX + (getBounds().width - textExtent.x) / 2, posY + (getBounds().height - textExtent.y) / 2, true);
116                 gc.setFont(oldFont);
117         }
118
119         @Override
120         protected void renderOutline(GeneralGC gc)
121         {
122                 gc.drawRectangle(getBounds());
123         }
124 }