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