General SubmodelComponents can now be saved to a json format
[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.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;
14
15 public class SimpleRectangularSubmodelComponent extends SubmodelComponent
16 {
17         private static final double width = 35;
18         private static final double pinDistance = 10;
19         private static final double fontHeight = 5;
20
21         private final String label;
22         protected final int logicWidth;
23
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;
32
33         protected SimpleRectangularSubmodelComponent(ViewModelModifiable model, int logicWidth, String label)
34         {
35                 super(model);
36                 this.label = 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);
46         }
47
48         protected void setInputCount(int inputCount)
49         {
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)
55                         {
56                                 inputSubmodelPins.remove(inputCount);
57                                 removePin(inputSupermodelPins.remove(inputCount));
58                         }
59                 else if (oldInputCount < inputCount)
60                         for (int i = oldInputCount; i < inputCount; i++)
61                         {
62                                 Pin submodelPin = addSubmodelInterface(logicWidth, 0, pinDistance / 2 + i * pinDistance);
63                                 inputSubmodelPins.add(submodelPin);
64                                 inputSupermodelPins.add(getSupermodelPin(submodelPin));
65                         }
66         }
67
68         protected void setOutputCount(int outputCount)
69         {
70                 int oldOutputCount = outputSupermodelPins.size();
71                 setSize(width, Math.max(inputSupermodelPins.size(), outputCount) * pinDistance);
72                 if (oldOutputCount > outputCount)
73                         while (outputSupermodelPins.size() > outputCount)
74                         {
75                                 outputSubmodelPins.remove(outputCount);
76                                 removePin(outputSupermodelPins.get(outputCount));
77                         }
78                 else if (oldOutputCount < outputCount)
79                         for (int i = oldOutputCount; i < outputCount; i++)
80                         {
81                                 Pin submodelPin = addSubmodelInterface(logicWidth, width, pinDistance / 2 + i * pinDistance);
82                                 outputSubmodelPins.add(submodelPin);
83                                 outputSupermodelPins.add(getSupermodelPin(submodelPin));
84                         }
85         }
86
87         public List<Pin> getInputPins()
88         {
89                 return inputSupermodelPinsUnmodifiable;
90         }
91
92         public List<Pin> getOutputPins()
93         {
94                 return outputSupermodelPinsUnmodifiable;
95         }
96
97         protected List<Pin> getInputSubmodelPins()
98         {
99                 return inputSubmodelPinsUnmodifiable;
100         }
101
102         protected List<Pin> getOutputSubmodelPins()
103         {
104                 return outputSubmodelPinsUnmodifiable;
105         }
106
107         @Override
108         protected void renderSymbol(GeneralGC gc, Rectangle visibleRegion)
109         {
110                 double posX = getBounds().x;
111                 double posY = getBounds().y;
112
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);
118                 gc.setFont(oldFont);
119         }
120
121         @Override
122         protected void renderOutline(GeneralGC gc, Rectangle visibleRegion)
123         {
124                 gc.drawRectangle(getBounds());
125         }
126
127         public RectComponentParams calculateRectParams()
128         {
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();
135                 return params;
136         }
137 }