Pins now have names
[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 import java.util.Map;
7 import java.util.TreeMap;
8
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;
15
16 public class SimpleRectangularSubmodelComponent extends SubmodelComponent
17 {
18         public static String kLabel = "label", kInCount = "input_count", kOutCount = "output_count", kLogicWidth = "logic_width";
19
20         private static final double width = 35;
21         private static final double pinDistance = 10;
22         private static final double fontHeight = 5;
23
24         private final String label;
25         protected final int logicWidth;
26
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;
35
36         protected SimpleRectangularSubmodelComponent(ViewModelModifiable model, int logicWidth, String label)
37         {
38                 super(model);
39                 this.label = 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);
49         }
50
51         protected void setInputCount(int inputCount)
52         {
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)
58                         {
59                                 inputSubmodelPins.remove(inputCount);
60                                 removePin(inputSupermodelPins.remove(inputCount));
61                         }
62                 else if (oldInputCount < inputCount)
63                         for (int i = oldInputCount; i < inputCount; i++)
64                         {
65                                 // TODO pin names
66                                 Pin submodelPin = addSubmodelInterface("Input pin #" + i, logicWidth, 0, pinDistance / 2 + i * pinDistance);
67                                 inputSubmodelPins.add(submodelPin);
68                                 inputSupermodelPins.add(getSupermodelPin(submodelPin));
69                         }
70         }
71
72         protected void setOutputCount(int outputCount)
73         {
74                 int oldOutputCount = outputSupermodelPins.size();
75                 setSize(width, Math.max(inputSupermodelPins.size(), outputCount) * pinDistance);
76                 if (oldOutputCount > outputCount)
77                         while (outputSupermodelPins.size() > outputCount)
78                         {
79                                 outputSubmodelPins.remove(outputCount);
80                                 removePin(outputSupermodelPins.get(outputCount));
81                         }
82                 else if (oldOutputCount < outputCount)
83                         for (int i = oldOutputCount; i < outputCount; i++)
84                         {
85                                 // TODO pin names
86                                 Pin submodelPin = addSubmodelInterface("Output pin #" + i, logicWidth, width, pinDistance / 2 + i * pinDistance);
87                                 outputSubmodelPins.add(submodelPin);
88                                 outputSupermodelPins.add(getSupermodelPin(submodelPin));
89                         }
90         }
91
92         public List<Pin> getInputPins()
93         {
94                 return inputSupermodelPinsUnmodifiable;
95         }
96
97         public List<Pin> getOutputPins()
98         {
99                 return outputSupermodelPinsUnmodifiable;
100         }
101
102         protected List<Pin> getInputSubmodelPins()
103         {
104                 return inputSubmodelPinsUnmodifiable;
105         }
106
107         protected List<Pin> getOutputSubmodelPins()
108         {
109                 return outputSubmodelPinsUnmodifiable;
110         }
111
112         @Override
113         protected void renderSymbol(GeneralGC gc, Rectangle visibleRegion)
114         {
115                 double posX = getBounds().x;
116                 double posY = getBounds().y;
117
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);
123                 gc.setFont(oldFont);
124                 // TODO draw pin names
125         }
126
127         @Override
128         protected void renderOutline(GeneralGC gc, Rectangle visibleRegion)
129         {
130                 gc.drawRectangle(getBounds());
131         }
132
133         @Override
134         public SubmodelComponentParams calculateParams()
135         {
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);
143                 ret.specialized = m;
144                 return ret;
145         }
146 }