--- /dev/null
+package era.mi.logic.tests;\r
+\r
+import java.awt.Color;\r
+import java.awt.Graphics;\r
+import java.awt.Graphics2D;\r
+import java.awt.Rectangle;\r
+import java.awt.RenderingHints;\r
+import java.awt.event.MouseEvent;\r
+import java.awt.event.MouseListener;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+import java.util.Map.Entry;\r
+\r
+import javax.swing.JFrame;\r
+import javax.swing.JPanel;\r
+import javax.swing.WindowConstants;\r
+\r
+import era.mi.logic.Simulation;\r
+import era.mi.logic.components.ManualSwitch;\r
+import era.mi.logic.components.gates.NotGate;\r
+import era.mi.logic.components.gates.OrGate;\r
+import era.mi.logic.timeline.Timeline.ExecutionResult;\r
+import era.mi.logic.wires.WireArray;\r
+\r
+public class GUITest extends JPanel {\r
+\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ private static final int WIRE_DELAY = 40;\r
+ private static final int OR_DELAY = 100;\r
+ private static final int NOT_DELAY = 100;\r
+\r
+ WireArray r = new WireArray(1, WIRE_DELAY);\r
+ WireArray s = new WireArray(1, WIRE_DELAY);\r
+ WireArray t1 = new WireArray(1, WIRE_DELAY);\r
+ WireArray t2 = new WireArray(1, WIRE_DELAY);\r
+ WireArray q = new WireArray(1, WIRE_DELAY);\r
+ WireArray nq = new WireArray(1, WIRE_DELAY);\r
+\r
+ ManualSwitch rIn = new ManualSwitch(r);\r
+ ManualSwitch sIn = new ManualSwitch(s);\r
+\r
+ OrGate or1 = new OrGate(OR_DELAY, t2, r, nq);\r
+ OrGate or2 = new OrGate(OR_DELAY, t1, s, q);\r
+ NotGate not1 = new NotGate(NOT_DELAY, t2, q);\r
+ NotGate not2 = new NotGate(NOT_DELAY, t1, nq);\r
+\r
+ Map<ManualSwitch, Rectangle> switchMap = new HashMap<>();\r
+\r
+ int height;\r
+ int width;\r
+ boolean sizeChanged;\r
+\r
+ public GUITest() {\r
+ addMouseListener(new MouseListener() {\r
+\r
+ @Override\r
+ public void mouseReleased(MouseEvent e) {\r
+ for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet()) {\r
+ if (dim.getValue().contains(e.getPoint())) {\r
+ dim.getKey().switchOff();\r
+ repaint();\r
+ }\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void mousePressed(MouseEvent e) {\r
+ for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet()) {\r
+ if (dim.getValue().contains(e.getPoint())) {\r
+ dim.getKey().switchOn();\r
+ repaint();\r
+ }\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void mouseExited(MouseEvent e) {\r
+ // none\r
+ }\r
+\r
+ @Override\r
+ public void mouseEntered(MouseEvent e) {\r
+ // none\r
+ }\r
+\r
+ @Override\r
+ public void mouseClicked(MouseEvent e) {\r
+ // If you want toggle buttons, use this code instead\r
+// for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet()) {\r
+// if (dim.getValue().contains(e.getPoint())) {\r
+// dim.getKey().toggle();\r
+// repaint();\r
+// }\r
+// }\r
+ }\r
+ });\r
+ }\r
+\r
+ @Override\r
+ public void paint(Graphics some_g) {\r
+ super.paint(some_g);\r
+ Graphics2D g = ((Graphics2D) some_g);\r
+ g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);\r
+ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\r
+ g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);\r
+\r
+ checkSizeChange();\r
+ adaptFont(g);\r
+\r
+ drawWire(g, r, "r", 2, 9, 4, 9);\r
+\r
+ drawWire(g, s, "s", 2, 3, 4, 3);\r
+\r
+ drawWire(g, t2, "t2", 5, 8.5, 6, 8.5);\r
+\r
+ drawWire(g, t1, "t1", 5, 3.5, 6, 3.5);\r
+\r
+ drawWire(g, q, "q", 7, 8.5, 9, 8.5);\r
+\r
+ drawWire(g, nq, "nq", 7, 3.5, 9, 3.5);\r
+\r
+ drawWire(g, q, "", 7.5, 8.5, 7.5, 7.5);\r
+ drawWire(g, q, "", 7.5, 7.5, 3, 4.5);\r
+ drawWire(g, q, "", 3, 4.5, 3, 4);\r
+ drawWire(g, q, "q", 3, 4, 4, 4);\r
+\r
+ drawWire(g, nq, "", 7.5, 3.5, 7.5, 4.5);\r
+ drawWire(g, nq, "", 7.5, 4.5, 3, 7.5);\r
+ drawWire(g, nq, "", 3, 7.5, 3, 8);\r
+ drawWire(g, nq, "nq", 3, 8, 4, 8);\r
+\r
+ drawSquare(g, 4, 8, "OR");\r
+ drawSquare(g, 4, 3, "OR");\r
+\r
+ drawSquare(g, 6, 8, "NOT");\r
+ drawSquare(g, 6, 3, "NOT");\r
+\r
+ drawSwitch(g, rIn, "Switch R", 0.5, 8.25, 2, 9.75);\r
+ drawSwitch(g, sIn, "Switch S", 0.5, 2.25, 2, 3.75);\r
+\r
+ drawString(g, "Hint: drag the cursor out of the pressed switch to keep it's state", 5, 0, 0.0, 1.0);\r
+ }\r
+\r
+ private void checkSizeChange() {\r
+ sizeChanged = height != getHeight() || width != getWidth();\r
+ if (sizeChanged) {\r
+ height = getHeight();\r
+ width = getWidth();\r
+ }\r
+ }\r
+\r
+ private void adaptFont(Graphics g) {\r
+ g.setFont(g.getFont().deriveFont(Math.min(height, width) / 40f));\r
+ }\r
+\r
+ private void drawString(Graphics g, String s, int x, int y, double anchorX, double anchorY) {\r
+ int h = g.getFontMetrics().getAscent();\r
+ int w = g.getFontMetrics().stringWidth(s);\r
+ g.drawString(s, x - (int) (w * anchorX), y + (int) (h * anchorY));\r
+ }\r
+\r
+ private void drawWire(Graphics g, WireArray wa, String name, double x1, double y1, double x2, double y2) {\r
+ setTo(g, wa);\r
+ g.drawLine(gX(x1), gY(y1), gX(x2), gY(y2));\r
+ drawString(g, name, (gX(x1) + gX(x2)) / 2, (gY(y1) + gY(y2)) / 2 - 5, 0, 0);\r
+ }\r
+\r
+ private void drawSquare(Graphics g, int posX, int posY, String text) {\r
+ int x1 = gX(posX) - 5;\r
+ int x2 = gX(posX + 1) + 5;\r
+ int y1 = gY(posY) - 5;\r
+ int y2 = gY(posY + 1) + 5;\r
+\r
+ g.setColor(Color.WHITE);\r
+ g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);\r
+ setBlack(g);\r
+ g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);\r
+ drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5);\r
+\r
+ }\r
+\r
+ private void drawSwitch(Graphics g, ManualSwitch ms, String text, double posX1, double posY1, double posX2,\r
+ double posY2) {\r
+ int x1 = gX(posX1) - 5;\r
+ int x2 = gX(posX2) + 5;\r
+ int y1 = gY(posY1) - 5;\r
+ int y2 = gY(posY2) + 5;\r
+\r
+ if (sizeChanged) {\r
+ Rectangle r = new Rectangle(x1, y1, x2 - x1, y2 - y1);\r
+ switchMap.put(ms, r);\r
+ }\r
+\r
+ g.setColor(ms.isOn() ? Color.getHSBColor(.3f, .5f, 1f) : Color.WHITE);\r
+ g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);\r
+ setBlack(g);\r
+ g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);\r
+ drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5);\r
+ }\r
+\r
+ private static void setBlack(Graphics g) {\r
+ g.setColor(Color.BLACK);\r
+ }\r
+\r
+ private static void setTo(Graphics g, WireArray wa) {\r
+ switch (wa.getValue()) {\r
+ case ONE:\r
+ g.setColor(Color.GREEN);\r
+ break;\r
+ case X:\r
+ g.setColor(Color.RED);\r
+ break;\r
+ case Z:\r
+ g.setColor(Color.DARK_GRAY);\r
+ break;\r
+ case ZERO:\r
+ g.setColor(Color.BLACK);\r
+ break;\r
+ default:\r
+ throw new IllegalArgumentException();\r
+ }\r
+ }\r
+\r
+ private int gY(double pos) {\r
+ return (int) (pos * height / 11);\r
+ }\r
+\r
+ private int gX(double pos) {\r
+ return (int) (pos * width / 11) + 50;\r
+ }\r
+\r
+ public static void main(String[] args) {\r
+ JFrame f = new JFrame("Test circuit 1.0.0");\r
+ GUITest gt = new GUITest();\r
+ f.add(gt);\r
+ f.setSize(800, 600);\r
+ f.setLocation(500, 400);\r
+ f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);\r
+ f.setVisible(true);\r
+\r
+ long begin = System.currentTimeMillis();\r
+\r
+ long lastFrame = begin;\r
+ long updateT = 16;\r
+\r
+ while (f.isVisible()) {\r
+ ExecutionResult er = Simulation.TIMELINE.executeUpTo((lastFrame - begin) * 3, lastFrame + 14);\r
+// if (Simulation.TIMELINE.hasNext()) \r
+// Simulation.TIMELINE.executeNext();\r
+ if (er != ExecutionResult.NOTHING_DONE)\r
+ gt.repaint(12);\r
+ try {\r
+ Thread.sleep(Math.max(16 - System.currentTimeMillis() + lastFrame, 0));\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ lastFrame = System.currentTimeMillis();\r
+ }\r
+ }\r
+}\r