| author | paulson | 
| Thu, 17 Sep 2009 14:59:58 +0100 | |
| changeset 32596 | bd68c04dace1 | 
| parent 32501 | 41aa620885c2 | 
| child 34026 | 0cb44ac299f8 | 
| permissions | -rw-r--r-- | 
| 
31862
 
53acb8ec6c51
renamed Swing to Swing_Thread, to avoid overlap with scala.swing.Swing;
 
wenzelm 
parents: 
29777 
diff
changeset
 | 
1  | 
/* Title: Pure/General/swing_thread.scala  | 
| 29202 | 2  | 
Author: Makarius  | 
| 
31942
 
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
 
wenzelm 
parents: 
31862 
diff
changeset
 | 
3  | 
Author: Fabian Immler, TU Munich  | 
| 29202 | 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  | 
||
| 
31942
 
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
 
wenzelm 
parents: 
31862 
diff
changeset
 | 
10  | 
import javax.swing.{SwingUtilities, Timer}
 | 
| 
 
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
 
wenzelm 
parents: 
31862 
diff
changeset
 | 
11  | 
import java.awt.event.{ActionListener, ActionEvent}
 | 
| 
 
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
 
wenzelm 
parents: 
31862 
diff
changeset
 | 
12  | 
|
| 29202 | 13  | 
|
| 
31862
 
53acb8ec6c51
renamed Swing to Swing_Thread, to avoid overlap with scala.swing.Swing;
 
wenzelm 
parents: 
29777 
diff
changeset
 | 
14  | 
object Swing_Thread  | 
| 29202 | 15  | 
{
 | 
| 32494 | 16  | 
/* checks */  | 
17  | 
||
18  | 
def assert() = Predef.assert(SwingUtilities.isEventDispatchThread())  | 
|
19  | 
def require() = Predef.require(SwingUtilities.isEventDispatchThread())  | 
|
20  | 
||
21  | 
||
| 
31942
 
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
 
wenzelm 
parents: 
31862 
diff
changeset
 | 
22  | 
/* main dispatch queue */  | 
| 
 
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
 
wenzelm 
parents: 
31862 
diff
changeset
 | 
23  | 
|
| 29777 | 24  | 
  def now[A](body: => A): A = {
 | 
25  | 
var result: Option[A] = None  | 
|
| 32494 | 26  | 
    if (SwingUtilities.isEventDispatchThread()) { result = Some(body) }
 | 
| 29777 | 27  | 
    else SwingUtilities.invokeAndWait(new Runnable { def run = { result = Some(body) } })
 | 
28  | 
result.get  | 
|
| 
29649
 
8b0c1397868e
more robust treatment of SwingUtilities.isEventDispatchThread;
 
wenzelm 
parents: 
29202 
diff
changeset
 | 
29  | 
}  | 
| 29202 | 30  | 
|
| 
29649
 
8b0c1397868e
more robust treatment of SwingUtilities.isEventDispatchThread;
 
wenzelm 
parents: 
29202 
diff
changeset
 | 
31  | 
  def later(body: => Unit) {
 | 
| 32494 | 32  | 
if (SwingUtilities.isEventDispatchThread()) body  | 
| 
29649
 
8b0c1397868e
more robust treatment of SwingUtilities.isEventDispatchThread;
 
wenzelm 
parents: 
29202 
diff
changeset
 | 
33  | 
    else SwingUtilities.invokeLater(new Runnable { def run = body })
 | 
| 
 
8b0c1397868e
more robust treatment of SwingUtilities.isEventDispatchThread;
 
wenzelm 
parents: 
29202 
diff
changeset
 | 
34  | 
}  | 
| 
31942
 
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
 
wenzelm 
parents: 
31862 
diff
changeset
 | 
35  | 
|
| 
 
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
 
wenzelm 
parents: 
31862 
diff
changeset
 | 
36  | 
|
| 
 
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
 
wenzelm 
parents: 
31862 
diff
changeset
 | 
37  | 
/* delayed actions */  | 
| 
 
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
 
wenzelm 
parents: 
31862 
diff
changeset
 | 
38  | 
|
| 32501 | 39  | 
private def delayed_action(first: Boolean)(time_span: Int)(action: => Unit): () => Unit =  | 
| 
31942
 
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
 
wenzelm 
parents: 
31862 
diff
changeset
 | 
40  | 
  {
 | 
| 
 
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
 
wenzelm 
parents: 
31862 
diff
changeset
 | 
41  | 
val listener =  | 
| 
 
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
 
wenzelm 
parents: 
31862 
diff
changeset
 | 
42  | 
      new ActionListener { override def actionPerformed(e: ActionEvent) { action } }
 | 
| 
 
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
 
wenzelm 
parents: 
31862 
diff
changeset
 | 
43  | 
val timer = new Timer(time_span, listener)  | 
| 32501 | 44  | 
timer.setRepeats(false)  | 
45  | 
||
46  | 
    def invoke() { if (first) timer.start() else timer.restart() }
 | 
|
| 
31942
 
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
 
wenzelm 
parents: 
31862 
diff
changeset
 | 
47  | 
invoke _  | 
| 
 
63466160ff27
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
 
wenzelm 
parents: 
31862 
diff
changeset
 | 
48  | 
}  | 
| 32501 | 49  | 
|
50  | 
// delayed action after first invocation  | 
|
51  | 
def delay_first = delayed_action(true) _  | 
|
52  | 
||
53  | 
// delayed action after last invocation  | 
|
54  | 
def delay_last = delayed_action(false) _  | 
|
| 29202 | 55  | 
}  |