Timeline now passed via constructor
[Mograsim.git] / LogicUI / src / era / mi / gui / components / GUIOrGate.java
1 package era.mi.gui.components;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Arrays;\r
5 import java.util.Collections;\r
6 import java.util.List;\r
7 \r
8 import era.mi.logic.components.gates.OrGate;\r
9 import era.mi.logic.timeline.Timeline;\r
10 import era.mi.logic.wires.Wire.ReadEnd;\r
11 import era.mi.logic.wires.Wire.ReadWriteEnd;\r
12 import net.haspamelodica.swt.helper.gcs.GeneralGC;\r
13 import net.haspamelodica.swt.helper.swtobjectwrappers.Font;\r
14 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;\r
15 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;\r
16 \r
17 public class GUIOrGate extends OrGate implements BasicGUIComponent\r
18 {\r
19         private static final String LABEL = "\u22651";// >=1\r
20 \r
21         private final int inputCount;\r
22         private final double height;\r
23         private final List<ReadEnd> connectedWireEnds;\r
24         private final List<Point> WireEndConnectionPoints;\r
25 \r
26         public GUIOrGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)\r
27         {\r
28                 super(timeline, processTime, out, in);\r
29 \r
30                 List<ReadEnd> connectedWireEndsModifiable = new ArrayList<>();\r
31                 List<Point> WireEndConnectionPointsModifiable = new ArrayList<>();\r
32 \r
33                 this.inputCount = in.length;\r
34                 this.height = inputCount * 10;\r
35 \r
36                 {\r
37                         connectedWireEndsModifiable.addAll(Arrays.asList(in));\r
38                         double inputHeight = 5;\r
39                         for (int i = 0; i < inputCount; i++, inputHeight += 10)\r
40                                 WireEndConnectionPointsModifiable.add(new Point(0, inputHeight));\r
41                 }\r
42 \r
43                 connectedWireEndsModifiable.add(out);\r
44                 WireEndConnectionPointsModifiable.add(new Point(20, height / 2));\r
45 \r
46                 this.connectedWireEnds = Collections.unmodifiableList(connectedWireEndsModifiable);\r
47                 this.WireEndConnectionPoints = Collections.unmodifiableList(WireEndConnectionPointsModifiable);\r
48         }\r
49 \r
50         @Override\r
51         public Rectangle getBounds()\r
52         {\r
53                 return new Rectangle(0, 0, 20, height);\r
54         }\r
55 \r
56         @Override\r
57         public void render(GeneralGC gc)\r
58         {\r
59                 gc.drawRectangle(0, 0, 20, height);\r
60                 Font oldFont = gc.getFont();\r
61                 Font labelFont = new Font(oldFont.getName(), 5, oldFont.getStyle());\r
62                 gc.setFont(labelFont);\r
63                 Point textExtent = gc.textExtent(LABEL);\r
64                 gc.drawText(LABEL, 10 - textExtent.x / 2, (height - textExtent.y) / 2, true);\r
65                 gc.setFont(oldFont);\r
66         }\r
67 \r
68         @Override\r
69         public int getConnectedWireEndsCount()\r
70         {\r
71                 return connectedWireEnds.size();\r
72         }\r
73 \r
74         @Override\r
75         public ReadEnd getConnectedWireEnd(int connectionIndex)\r
76         {\r
77                 return connectedWireEnds.get(connectionIndex);\r
78         }\r
79 \r
80         @Override\r
81         public Point getWireEndConnectionPoint(int connectionI)\r
82         {\r
83                 return WireEndConnectionPoints.get(connectionI);\r
84         }\r
85 }