Timeline now passed via constructor
[Mograsim.git] / LogicUI / src / era / mi / gui / components / GUIMux.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.Mux;\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.Point;\r
14 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;\r
15 \r
16 public class GUIMux extends Mux implements BasicGUIComponent\r
17 {\r
18         private final double height;\r
19         private final List<ReadEnd> connectedWireEnds;\r
20         private final List<Point> WireEndConnectionPoints;\r
21 \r
22         public GUIMux(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs)\r
23         {\r
24                 super(timeline, processTime, out, select, inputs);\r
25 \r
26                 double height = inputs.length * 5;\r
27                 if (height < 10)\r
28                         height = 10;\r
29                 this.height = height;\r
30 \r
31                 List<ReadEnd> connectedWireEndsModifiable = new ArrayList<>();\r
32                 List<Point> WireEndConnectionPointsModifiable = new ArrayList<>();\r
33 \r
34                 connectedWireEndsModifiable.add(out);\r
35                 WireEndConnectionPointsModifiable.add(new Point(20, 10 + height / 2));\r
36 \r
37                 connectedWireEndsModifiable.add(select);\r
38                 WireEndConnectionPointsModifiable.add(new Point(10, 5));\r
39 \r
40                 {\r
41                         connectedWireEndsModifiable.addAll(Arrays.asList(inputs));\r
42                         double inputHeightIncrement = (height + 20) / inputs.length;\r
43                         double inputHeight = inputHeightIncrement / 2;\r
44                         for (int i = 0; i < inputs.length; i++, inputHeight += inputHeightIncrement)\r
45                                 WireEndConnectionPointsModifiable.add(new Point(0, inputHeight));\r
46                 }\r
47 \r
48                 this.connectedWireEnds = Collections.unmodifiableList(connectedWireEndsModifiable);\r
49                 this.WireEndConnectionPoints = Collections.unmodifiableList(WireEndConnectionPointsModifiable);\r
50         }\r
51 \r
52         @Override\r
53         public Rectangle getBounds()\r
54         {\r
55                 return new Rectangle(0, 0, 20, height + 20);\r
56         }\r
57 \r
58         @Override\r
59         public void render(GeneralGC gc)\r
60         {\r
61                 gc.drawPolygon(new double[] { 0, 0, 20, 10, 20, height + 10, 0, height + 20 });\r
62         }\r
63 \r
64         @Override\r
65         public int getConnectedWireEndsCount()\r
66         {\r
67                 return connectedWireEnds.size();\r
68         }\r
69 \r
70         @Override\r
71         public ReadEnd getConnectedWireEnd(int connectionIndex)\r
72         {\r
73                 return connectedWireEnds.get(connectionIndex);\r
74         }\r
75 \r
76         @Override\r
77         public Point getWireEndConnectionPoint(int connectionI)\r
78         {\r
79                 return WireEndConnectionPoints.get(connectionI);\r
80         }\r
81 }