| author | wenzelm |
| Mon, 28 Apr 2014 14:41:49 +0200 | |
| changeset 56770 | e160ae47db94 |
| parent 56662 | f373fb77e0a4 |
| child 56773 | 5c7ade7a1e74 |
| permissions | -rw-r--r-- |
|
53783
f5e9d182f645
clarified location of GUI modules (which depend on Swing of JFX);
wenzelm
parents:
52859
diff
changeset
|
1 |
/* Title: Pure/GUI/swing_thread.scala |
|
53853
e8430d668f44
more quasi-generic PIDE modules (NB: Swing/JFX needs to be kept separate from non-GUI material);
wenzelm
parents:
53783
diff
changeset
|
2 |
Module: PIDE-GUI |
| 29202 | 3 |
Author: Makarius |
4 |
||
|
31862
53acb8ec6c51
renamed Swing to Swing_Thread, to avoid overlap with scala.swing.Swing;
wenzelm
parents:
29777
diff
changeset
|
5 |
Evaluation within the AWT/Swing thread. |
| 29202 | 6 |
*/ |
7 |
||
8 |
package isabelle |
|
9 |
||
| 55618 | 10 |
|
|
31942
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
wenzelm
parents:
31862
diff
changeset
|
11 |
import javax.swing.{SwingUtilities, Timer}
|
|
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
wenzelm
parents:
31862
diff
changeset
|
12 |
import java.awt.event.{ActionListener, ActionEvent}
|
|
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
wenzelm
parents:
31862
diff
changeset
|
13 |
|
| 29202 | 14 |
|
|
31862
53acb8ec6c51
renamed Swing to Swing_Thread, to avoid overlap with scala.swing.Swing;
wenzelm
parents:
29777
diff
changeset
|
15 |
object Swing_Thread |
| 29202 | 16 |
{
|
| 32494 | 17 |
/* checks */ |
18 |
||
| 52859 | 19 |
def assert[A](body: => A) = |
20 |
{
|
|
21 |
Predef.assert(SwingUtilities.isEventDispatchThread()) |
|
22 |
body |
|
23 |
} |
|
| 32494 | 24 |
|
| 52859 | 25 |
def require[A](body: => A) = |
26 |
{
|
|
27 |
Predef.require(SwingUtilities.isEventDispatchThread()) |
|
28 |
body |
|
29 |
} |
|
| 52477 | 30 |
|
| 32494 | 31 |
|
|
31942
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
wenzelm
parents:
31862
diff
changeset
|
32 |
/* main dispatch queue */ |
|
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
wenzelm
parents:
31862
diff
changeset
|
33 |
|
| 34026 | 34 |
def now[A](body: => A): A = |
35 |
{
|
|
|
48000
880f1693299a
further attempts to simplify/robustify Swing_Thread.now, to avoid spurious physical race conditions on Java 6 / Mac OS X;
wenzelm
parents:
47989
diff
changeset
|
36 |
if (SwingUtilities.isEventDispatchThread()) body |
|
880f1693299a
further attempts to simplify/robustify Swing_Thread.now, to avoid spurious physical race conditions on Java 6 / Mac OS X;
wenzelm
parents:
47989
diff
changeset
|
37 |
else {
|
|
56662
f373fb77e0a4
avoid "Adaptation of argument list by inserting ()" -- deprecated in scala-2.11.0;
wenzelm
parents:
55618
diff
changeset
|
38 |
lazy val result = { assert { Exn.capture(body) } }
|
|
48000
880f1693299a
further attempts to simplify/robustify Swing_Thread.now, to avoid spurious physical race conditions on Java 6 / Mac OS X;
wenzelm
parents:
47989
diff
changeset
|
39 |
SwingUtilities.invokeAndWait(new Runnable { def run = result })
|
|
880f1693299a
further attempts to simplify/robustify Swing_Thread.now, to avoid spurious physical race conditions on Java 6 / Mac OS X;
wenzelm
parents:
47989
diff
changeset
|
40 |
Exn.release(result) |
|
880f1693299a
further attempts to simplify/robustify Swing_Thread.now, to avoid spurious physical race conditions on Java 6 / Mac OS X;
wenzelm
parents:
47989
diff
changeset
|
41 |
} |
|
29649
8b0c1397868e
more robust treatment of SwingUtilities.isEventDispatchThread;
wenzelm
parents:
29202
diff
changeset
|
42 |
} |
| 29202 | 43 |
|
|
34299
68716caa7745
Swing_Thread.future: plain Future.value if this is already Swing;
wenzelm
parents:
34217
diff
changeset
|
44 |
def future[A](body: => A): Future[A] = |
|
68716caa7745
Swing_Thread.future: plain Future.value if this is already Swing;
wenzelm
parents:
34217
diff
changeset
|
45 |
{
|
|
68716caa7745
Swing_Thread.future: plain Future.value if this is already Swing;
wenzelm
parents:
34217
diff
changeset
|
46 |
if (SwingUtilities.isEventDispatchThread()) Future.value(body) |
|
68716caa7745
Swing_Thread.future: plain Future.value if this is already Swing;
wenzelm
parents:
34217
diff
changeset
|
47 |
else Future.fork { now(body) }
|
|
68716caa7745
Swing_Thread.future: plain Future.value if this is already Swing;
wenzelm
parents:
34217
diff
changeset
|
48 |
} |
| 34026 | 49 |
|
|
34299
68716caa7745
Swing_Thread.future: plain Future.value if this is already Swing;
wenzelm
parents:
34217
diff
changeset
|
50 |
def later(body: => Unit) |
|
68716caa7745
Swing_Thread.future: plain Future.value if this is already Swing;
wenzelm
parents:
34217
diff
changeset
|
51 |
{
|
| 32494 | 52 |
if (SwingUtilities.isEventDispatchThread()) body |
|
29649
8b0c1397868e
more robust treatment of SwingUtilities.isEventDispatchThread;
wenzelm
parents:
29202
diff
changeset
|
53 |
else SwingUtilities.invokeLater(new Runnable { def run = body })
|
|
8b0c1397868e
more robust treatment of SwingUtilities.isEventDispatchThread;
wenzelm
parents:
29202
diff
changeset
|
54 |
} |
|
31942
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
wenzelm
parents:
31862
diff
changeset
|
55 |
|
|
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
wenzelm
parents:
31862
diff
changeset
|
56 |
|
|
56770
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
wenzelm
parents:
56662
diff
changeset
|
57 |
/* delayed events */ |
| 49195 | 58 |
|
|
56770
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
wenzelm
parents:
56662
diff
changeset
|
59 |
def delay_first(delay: => Time)(event: => Unit): Simple_Thread.Delay = |
|
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
wenzelm
parents:
56662
diff
changeset
|
60 |
Simple_Thread.delay_first(delay) { later { event } }
|
|
49196
1d63ceb0d177
postpone update of text overview panel after incoming session edits, to improve reactivity of editing massive theories like src/HOL/Multivariate_Analysis;
wenzelm
parents:
49195
diff
changeset
|
61 |
|
|
56770
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
wenzelm
parents:
56662
diff
changeset
|
62 |
def delay_last(delay: => Time)(event: => Unit): Simple_Thread.Delay = |
|
e160ae47db94
mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
wenzelm
parents:
56662
diff
changeset
|
63 |
Simple_Thread.delay_last(delay) { later { event } }
|
| 29202 | 64 |
} |