1 package era.mi.logic.tests;
\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
14 import javax.swing.JFrame;
\r
15 import javax.swing.JPanel;
\r
16 import javax.swing.WindowConstants;
\r
18 import era.mi.logic.components.ManualSwitch;
\r
19 import era.mi.logic.components.gates.NotGate;
\r
20 import era.mi.logic.components.gates.OrGate;
\r
21 import era.mi.logic.timeline.Timeline;
\r
22 import era.mi.logic.timeline.Timeline.ExecutionResult;
\r
23 import era.mi.logic.wires.Wire;
\r
25 public class GUITest extends JPanel
\r
28 private static final long serialVersionUID = 1L;
\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
34 private Timeline t = new Timeline(11);
\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
43 ManualSwitch rIn = new ManualSwitch(t, r.createReadWriteEnd());
\r
44 ManualSwitch sIn = new ManualSwitch(t, s.createReadWriteEnd());
\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
51 Map<ManualSwitch, Rectangle> switchMap = new HashMap<>();
\r
55 boolean sizeChanged;
\r
59 addMouseListener(new MouseListener()
\r
63 public void mouseReleased(MouseEvent e)
\r
65 for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet())
\r
67 if (dim.getValue().contains(e.getPoint()))
\r
69 dim.getKey().switchOff();
\r
76 public void mousePressed(MouseEvent e)
\r
78 for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet())
\r
80 if (dim.getValue().contains(e.getPoint()))
\r
82 dim.getKey().switchOn();
\r
89 public void mouseExited(MouseEvent e)
\r
95 public void mouseEntered(MouseEvent e)
\r
101 public void mouseClicked(MouseEvent e)
\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
114 public Timeline getTimeline()
\r
120 public void paint(Graphics some_g)
\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
131 drawWire(g, r, "r", 2, 9, 4, 9);
\r
133 drawWire(g, s, "s", 2, 3, 4, 3);
\r
135 drawWire(g, t2, "t2", 5, 8.5, 6, 8.5);
\r
137 drawWire(g, t1, "t1", 5, 3.5, 6, 3.5);
\r
139 drawWire(g, q, "q", 7, 8.5, 9, 8.5);
\r
141 drawWire(g, nq, "nq", 7, 3.5, 9, 3.5);
\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
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
153 drawSquare(g, 4, 8, "OR");
\r
154 drawSquare(g, 4, 3, "OR");
\r
156 drawSquare(g, 6, 8, "NOT");
\r
157 drawSquare(g, 6, 3, "NOT");
\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
162 drawString(g, "Hint: drag the cursor out of the pressed switch to keep it's state", 5, 0, 0.0, 1.0);
\r
165 private void checkSizeChange()
\r
167 sizeChanged = height != getHeight() || width != getWidth();
\r
170 height = getHeight();
\r
171 width = getWidth();
\r
175 private void adaptFont(Graphics g)
\r
177 g.setFont(g.getFont().deriveFont(Math.min(height, width) / 40f));
\r
180 private void drawString(Graphics g, String s, int x, int y, double anchorX, double anchorY)
\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
187 private void drawWire(Graphics g, Wire wa, String name, double x1, double y1, double x2, double y2)
\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
194 private void drawSquare(Graphics g, int posX, int posY, String text)
\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
201 g.setColor(Color.WHITE);
\r
202 g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
\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
209 private void drawSwitch(Graphics g, ManualSwitch ms, String text, double posX1, double posY1, double posX2, double posY2)
\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
218 Rectangle r = new Rectangle(x1, y1, x2 - x1, y2 - y1);
\r
219 switchMap.put(ms, r);
\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
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
229 private static void setBlack(Graphics g)
\r
231 g.setColor(Color.BLACK);
\r
234 private static void setTo(Graphics g, Wire wa)
\r
236 switch (wa.getValue())
\r
239 g.setColor(Color.GREEN);
\r
242 g.setColor(Color.RED);
\r
245 g.setColor(Color.DARK_GRAY);
\r
248 g.setColor(Color.BLACK);
\r
251 g.setColor(Color.MAGENTA);
\r
254 throw new IllegalArgumentException();
\r
258 private int gY(double pos)
\r
260 return (int) (pos * height / 11);
\r
263 private int gX(double pos)
\r
265 return (int) (pos * width / 11) + 50;
\r
268 public static void main(String[] args)
\r
270 JFrame f = new JFrame("Test circuit 1.0.0");
\r
271 GUITest gt = new GUITest();
\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
278 long begin = System.currentTimeMillis();
\r
280 long lastFrame = begin;
\r
283 while (f.isVisible())
\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
292 Thread.sleep(Math.max(updateT - System.currentTimeMillis() + lastFrame, 0));
\r
294 catch (Exception e)
\r
296 e.printStackTrace();
\r
298 lastFrame = System.currentTimeMillis();
\r