3fcb7a6b5ce8d4c05165e5aa0736ec66f2b8e335
[Mograsim.git] / era.mi / src / era / mi / logic / tests / GUITest.java
1 package era.mi.logic.tests;\r
2 \r
3 import java.awt.Color;\r
4 import java.awt.Graphics;\r
5 import java.awt.Graphics2D;\r
6 import java.awt.Rectangle;\r
7 import java.awt.RenderingHints;\r
8 import java.awt.event.MouseEvent;\r
9 import java.awt.event.MouseListener;\r
10 import java.util.HashMap;\r
11 import java.util.Map;\r
12 import java.util.Map.Entry;\r
13 \r
14 import javax.swing.JFrame;\r
15 import javax.swing.JPanel;\r
16 import javax.swing.WindowConstants;\r
17 \r
18 import era.mi.logic.Simulation;\r
19 import era.mi.logic.components.ManualSwitch;\r
20 import era.mi.logic.components.gates.NotGate;\r
21 import era.mi.logic.components.gates.OrGate;\r
22 import era.mi.logic.timeline.Timeline.ExecutionResult;\r
23 import era.mi.logic.wires.WireArray;\r
24 \r
25 public class GUITest extends JPanel\r
26 {\r
27 \r
28         private static final long serialVersionUID = 1L;\r
29 \r
30         private static final int WIRE_DELAY = 40;\r
31         private static final int OR_DELAY = 100;\r
32         private static final int NOT_DELAY = 100;\r
33 \r
34         WireArray r = new WireArray(1, WIRE_DELAY);\r
35         WireArray s = new WireArray(1, WIRE_DELAY);\r
36         WireArray t1 = new WireArray(1, WIRE_DELAY);\r
37         WireArray t2 = new WireArray(1, WIRE_DELAY);\r
38         WireArray q = new WireArray(1, WIRE_DELAY);\r
39         WireArray nq = new WireArray(1, WIRE_DELAY);\r
40 \r
41         ManualSwitch rIn = new ManualSwitch(r);\r
42         ManualSwitch sIn = new ManualSwitch(s);\r
43 \r
44         OrGate or1 = new OrGate(OR_DELAY, t2, r, nq);\r
45         OrGate or2 = new OrGate(OR_DELAY, t1, s, q);\r
46         NotGate not1 = new NotGate(NOT_DELAY, t2, q);\r
47         NotGate not2 = new NotGate(NOT_DELAY, t1, nq);\r
48 \r
49         Map<ManualSwitch, Rectangle> switchMap = new HashMap<>();\r
50 \r
51         int height;\r
52         int width;\r
53         boolean sizeChanged;\r
54 \r
55         public GUITest()\r
56         {\r
57                 addMouseListener(new MouseListener()\r
58                 {\r
59 \r
60                         @Override\r
61                         public void mouseReleased(MouseEvent e)\r
62                         {\r
63                                 for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet())\r
64                                 {\r
65                                         if (dim.getValue().contains(e.getPoint()))\r
66                                         {\r
67                                                 dim.getKey().switchOff();\r
68                                                 repaint();\r
69                                         }\r
70                                 }\r
71                         }\r
72 \r
73                         @Override\r
74                         public void mousePressed(MouseEvent e)\r
75                         {\r
76                                 for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet())\r
77                                 {\r
78                                         if (dim.getValue().contains(e.getPoint()))\r
79                                         {\r
80                                                 dim.getKey().switchOn();\r
81                                                 repaint();\r
82                                         }\r
83                                 }\r
84                         }\r
85 \r
86                         @Override\r
87                         public void mouseExited(MouseEvent e)\r
88                         {\r
89                                 // none\r
90                         }\r
91 \r
92                         @Override\r
93                         public void mouseEntered(MouseEvent e)\r
94                         {\r
95                                 // none\r
96                         }\r
97 \r
98                         @Override\r
99                         public void mouseClicked(MouseEvent e)\r
100                         {\r
101                                 // If you want toggle buttons, use this code instead\r
102 //                              for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet()) {\r
103 //                                      if (dim.getValue().contains(e.getPoint())) {\r
104 //                                              dim.getKey().toggle();\r
105 //                                              repaint();\r
106 //                                      }\r
107 //                              }\r
108                         }\r
109                 });\r
110         }\r
111 \r
112         @Override\r
113         public void paint(Graphics some_g)\r
114         {\r
115                 super.paint(some_g);\r
116                 Graphics2D g = ((Graphics2D) some_g);\r
117                 g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);\r
118                 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\r
119                 g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);\r
120 \r
121                 checkSizeChange();\r
122                 adaptFont(g);\r
123 \r
124                 drawWire(g, r, "r", 2, 9, 4, 9);\r
125 \r
126                 drawWire(g, s, "s", 2, 3, 4, 3);\r
127 \r
128                 drawWire(g, t2, "t2", 5, 8.5, 6, 8.5);\r
129 \r
130                 drawWire(g, t1, "t1", 5, 3.5, 6, 3.5);\r
131 \r
132                 drawWire(g, q, "q", 7, 8.5, 9, 8.5);\r
133 \r
134                 drawWire(g, nq, "nq", 7, 3.5, 9, 3.5);\r
135 \r
136                 drawWire(g, q, "", 7.5, 8.5, 7.5, 7.5);\r
137                 drawWire(g, q, "", 7.5, 7.5, 3, 4.5);\r
138                 drawWire(g, q, "", 3, 4.5, 3, 4);\r
139                 drawWire(g, q, "q", 3, 4, 4, 4);\r
140 \r
141                 drawWire(g, nq, "", 7.5, 3.5, 7.5, 4.5);\r
142                 drawWire(g, nq, "", 7.5, 4.5, 3, 7.5);\r
143                 drawWire(g, nq, "", 3, 7.5, 3, 8);\r
144                 drawWire(g, nq, "nq", 3, 8, 4, 8);\r
145 \r
146                 drawSquare(g, 4, 8, "OR");\r
147                 drawSquare(g, 4, 3, "OR");\r
148 \r
149                 drawSquare(g, 6, 8, "NOT");\r
150                 drawSquare(g, 6, 3, "NOT");\r
151 \r
152                 drawSwitch(g, rIn, "Switch R", 0.5, 8.25, 2, 9.75);\r
153                 drawSwitch(g, sIn, "Switch S", 0.5, 2.25, 2, 3.75);\r
154 \r
155                 drawString(g, "Hint: drag the cursor out of the pressed switch to keep it's state", 5, 0, 0.0, 1.0);\r
156         }\r
157 \r
158         private void checkSizeChange()\r
159         {\r
160                 sizeChanged = height != getHeight() || width != getWidth();\r
161                 if (sizeChanged)\r
162                 {\r
163                         height = getHeight();\r
164                         width = getWidth();\r
165                 }\r
166         }\r
167 \r
168         private void adaptFont(Graphics g)\r
169         {\r
170                 g.setFont(g.getFont().deriveFont(Math.min(height, width) / 40f));\r
171         }\r
172 \r
173         private void drawString(Graphics g, String s, int x, int y, double anchorX, double anchorY)\r
174         {\r
175                 int h = g.getFontMetrics().getAscent();\r
176                 int w = g.getFontMetrics().stringWidth(s);\r
177                 g.drawString(s, x - (int) (w * anchorX), y + (int) (h * anchorY));\r
178         }\r
179 \r
180         private void drawWire(Graphics g, WireArray wa, String name, double x1, double y1, double x2, double y2)\r
181         {\r
182                 setTo(g, wa);\r
183                 g.drawLine(gX(x1), gY(y1), gX(x2), gY(y2));\r
184                 drawString(g, name, (gX(x1) + gX(x2)) / 2, (gY(y1) + gY(y2)) / 2 - 5, 0, 0);\r
185         }\r
186 \r
187         private void drawSquare(Graphics g, int posX, int posY, String text)\r
188         {\r
189                 int x1 = gX(posX) - 5;\r
190                 int x2 = gX(posX + 1) + 5;\r
191                 int y1 = gY(posY) - 5;\r
192                 int y2 = gY(posY + 1) + 5;\r
193 \r
194                 g.setColor(Color.WHITE);\r
195                 g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);\r
196                 setBlack(g);\r
197                 g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);\r
198                 drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5);\r
199 \r
200         }\r
201 \r
202         private void drawSwitch(Graphics g, ManualSwitch ms, String text, double posX1, double posY1, double posX2, double posY2)\r
203         {\r
204                 int x1 = gX(posX1) - 5;\r
205                 int x2 = gX(posX2) + 5;\r
206                 int y1 = gY(posY1) - 5;\r
207                 int y2 = gY(posY2) + 5;\r
208 \r
209                 if (sizeChanged)\r
210                 {\r
211                         Rectangle r = new Rectangle(x1, y1, x2 - x1, y2 - y1);\r
212                         switchMap.put(ms, r);\r
213                 }\r
214 \r
215                 g.setColor(ms.isOn() ? Color.getHSBColor(.3f, .5f, 1f) : Color.WHITE);\r
216                 g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);\r
217                 setBlack(g);\r
218                 g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);\r
219                 drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5);\r
220         }\r
221 \r
222         private static void setBlack(Graphics g)\r
223         {\r
224                 g.setColor(Color.BLACK);\r
225         }\r
226 \r
227         private static void setTo(Graphics g, WireArray wa)\r
228         {\r
229                 switch (wa.getValue())\r
230                 {\r
231                 case ONE:\r
232                         g.setColor(Color.GREEN);\r
233                         break;\r
234                 case X:\r
235                         g.setColor(Color.RED);\r
236                         break;\r
237                 case Z:\r
238                         g.setColor(Color.DARK_GRAY);\r
239                         break;\r
240                 case ZERO:\r
241                         g.setColor(Color.BLACK);\r
242                         break;\r
243                 default:\r
244                         throw new IllegalArgumentException();\r
245                 }\r
246         }\r
247 \r
248         private int gY(double pos)\r
249         {\r
250                 return (int) (pos * height / 11);\r
251         }\r
252 \r
253         private int gX(double pos)\r
254         {\r
255                 return (int) (pos * width / 11) + 50;\r
256         }\r
257 \r
258         public static void main(String[] args)\r
259         {\r
260                 JFrame f = new JFrame("Test circuit 1.0.0");\r
261                 GUITest gt = new GUITest();\r
262                 f.add(gt);\r
263                 f.setSize(800, 600);\r
264                 f.setLocation(500, 400);\r
265                 f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);\r
266                 f.setVisible(true);\r
267 \r
268                 long begin = System.currentTimeMillis();\r
269 \r
270                 long lastFrame = begin;\r
271                 long updateT = 16;\r
272 \r
273                 while (f.isVisible())\r
274                 {\r
275                         ExecutionResult er = Simulation.TIMELINE.executeUpTo((lastFrame - begin) * 3, lastFrame + 14);\r
276 //                              if (Simulation.TIMELINE.hasNext()) \r
277 //                              Simulation.TIMELINE.executeNext();\r
278                         if (er != ExecutionResult.NOTHING_DONE)\r
279                                 gt.repaint(12);\r
280                         try\r
281                         {\r
282                                 Thread.sleep(Math.max(16 - System.currentTimeMillis() + lastFrame, 0));\r
283                         }\r
284                         catch (Exception e)\r
285                         {\r
286                                 e.printStackTrace();\r
287                         }\r
288                         lastFrame = System.currentTimeMillis();\r
289                 }\r
290         }\r
291 }\r