5de11cc4a1216c46bb8318a15911059760d63254
[Mograsim.git] / LogicUI / src / era / mi / gui / components / GUIManualSwitch.java
1 package era.mi.gui.components;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collections;\r
5 import java.util.HashMap;\r
6 import java.util.List;\r
7 import java.util.Map;\r
8 \r
9 import era.mi.logic.components.ManualSwitch;\r
10 import era.mi.logic.timeline.Timeline;\r
11 import era.mi.logic.types.Bit;\r
12 import era.mi.logic.wires.Wire.ReadEnd;\r
13 import era.mi.logic.wires.Wire.ReadWriteEnd;\r
14 import net.haspamelodica.swt.helper.gcs.GeneralGC;\r
15 import net.haspamelodica.swt.helper.swtobjectwrappers.Font;\r
16 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;\r
17 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;\r
18 \r
19 public class GUIManualSwitch extends ManualSwitch implements BasicGUIComponent\r
20 {\r
21         private static final Map<Bit, String> bitNames;\r
22         static\r
23         {\r
24                 Map<Bit, String> bitNamesModifiable = new HashMap<>();\r
25                 bitNamesModifiable.put(Bit.ONE, "1");\r
26                 bitNamesModifiable.put(Bit.ZERO, "0");\r
27                 bitNamesModifiable.put(Bit.Z, "Z");\r
28                 bitNamesModifiable.put(Bit.U, "U");\r
29                 bitNamesModifiable.put(Bit.X, "X");\r
30                 bitNames = Collections.unmodifiableMap(bitNamesModifiable);\r
31         }\r
32 \r
33         private final ReadEnd we;\r
34         private final List<ReadEnd> connectedWireEnds;\r
35         private final List<Point> wireEndConnectionPoints;\r
36 \r
37         public GUIManualSwitch(Timeline timeline, ReadWriteEnd output)\r
38         {\r
39                 super(timeline, output);\r
40 \r
41                 this.we = output;\r
42 \r
43                 List<ReadEnd> connectedWireEndsModifiable = new ArrayList<>();\r
44                 List<Point> wireEndConnectionPointsModifiable = new ArrayList<>();\r
45 \r
46                 connectedWireEndsModifiable.add(output);\r
47                 wireEndConnectionPointsModifiable.add(new Point(20, 7.5));\r
48 \r
49                 this.connectedWireEnds = Collections.unmodifiableList(connectedWireEndsModifiable);\r
50                 this.wireEndConnectionPoints = Collections.unmodifiableList(wireEndConnectionPointsModifiable);\r
51         }\r
52 \r
53         @Override\r
54         public Rectangle getBounds()\r
55         {\r
56                 return new Rectangle(0, 0, 20, 15);\r
57         }\r
58 \r
59         @Override\r
60         public void render(GeneralGC gc)\r
61         {\r
62                 gc.drawRectangle(0, 0, 20, 15);\r
63                 String label = bitNames.get(we.getValue());\r
64                 Font oldFont = gc.getFont();\r
65                 Font labelFont = new Font(oldFont.getName(), 6, oldFont.getStyle());\r
66                 gc.setFont(labelFont);\r
67                 Point textExtent = gc.textExtent(label);\r
68                 gc.drawText(label, 10 - textExtent.x / 2, 7.5 - textExtent.y / 2, true);\r
69                 gc.setFont(oldFont);\r
70         }\r
71 \r
72         @Override\r
73         public boolean clicked(double x, double y)\r
74         {\r
75                 toggle();\r
76                 return true;\r
77         }\r
78 \r
79         @Override\r
80         public int getConnectedWireEndsCount()\r
81         {\r
82                 return connectedWireEnds.size();\r
83         }\r
84 \r
85         @Override\r
86         public ReadEnd getConnectedWireEnd(int connectionIndex)\r
87         {\r
88                 return connectedWireEnds.get(connectionIndex);\r
89         }\r
90 \r
91         @Override\r
92         public Point getWireEndConnectionPoint(int connectionI)\r
93         {\r
94                 return wireEndConnectionPoints.get(connectionI);\r
95         }\r
96 }