c142cb6727b22602fa5de7b26aa9ab9a560b62e8
[Mograsim.git] / SampleERCP / src / sampleercp / parts / LogicUIPart.java
1 package sampleercp.parts;
2
3 import javax.annotation.PostConstruct;
4 import javax.inject.Inject;
5
6 import org.eclipse.e4.ui.model.application.ui.basic.MPart;
7 import org.eclipse.swt.SWT;
8 import org.eclipse.swt.widgets.Composite;
9
10 import era.mi.gui.LogicUICanvas;
11 import era.mi.gui.examples.RSLatchGUIExample;
12 import era.mi.logic.Simulation;
13 import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput;
14
15 public class LogicUIPart
16 {
17         @Inject
18         private MPart part;
19
20         @PostConstruct
21         public void create(Composite parent)
22         {
23                 LogicUICanvas ui = new LogicUICanvas(parent, SWT.NONE);
24                 RSLatchGUIExample.addComponentsAndWires(ui);
25                 ui.addTransformListener((x, y, z) -> part.setDirty(z < 1));
26                 ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui);
27                 userInput.buttonDrag = 3;
28                 userInput.buttonZoom = 2;
29                 userInput.enableUserInput();
30                 Thread simulationThread = new Thread(() ->
31                 {
32                         // TODO find a better condition
33                         while (!ui.isDisposed())
34                         {
35                                 // always execute to keep timeline from "hanging behind" for too long
36                                 Simulation.TIMELINE.executeUpTo(System.currentTimeMillis(), System.currentTimeMillis() + 10);
37                                 long sleepTime;
38                                 if (Simulation.TIMELINE.hasNext())
39                                         sleepTime = Simulation.TIMELINE.nextEventTime() - System.currentTimeMillis();
40                                 else
41                                         sleepTime = 10;
42                                 try
43                                 {
44                                         if (sleepTime > 0)
45                                                 Thread.sleep(sleepTime);
46                                 }
47                                 catch (InterruptedException e)
48                                 {
49                                 } // it is normal execution flow to be interrupted
50                         }
51                 });
52                 simulationThread.start();
53                 Simulation.TIMELINE.addEventAddedListener(event ->
54                 {
55                         if (event.getTiming() <= System.currentTimeMillis())
56                                 simulationThread.interrupt();
57                 });
58         }
59 }