diff -r b6256ea3b7c5 -r 990ffb84489b src/Pure/GUI/gui_thread.scala --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Pure/GUI/gui_thread.scala Wed Jul 23 11:19:24 2014 +0200 @@ -0,0 +1,57 @@ +/* Title: Pure/GUI/gui_thread.scala + Module: PIDE-GUI + Author: Makarius + +Evaluation within the GUI thread: implementation for AWT/Swing. +*/ + +package isabelle + + +import javax.swing.SwingUtilities + + +object GUI_Thread +{ + /* context check */ + + def assert[A](body: => A) = + { + Predef.assert(SwingUtilities.isEventDispatchThread()) + body + } + + def require[A](body: => A) = + { + Predef.require(SwingUtilities.isEventDispatchThread()) + body + } + + + /* event dispatch queue */ + + def now[A](body: => A): A = + { + if (SwingUtilities.isEventDispatchThread()) body + else { + lazy val result = { assert { Exn.capture(body) } } + SwingUtilities.invokeAndWait(new Runnable { def run = result }) + Exn.release(result) + } + } + + def later(body: => Unit) + { + if (SwingUtilities.isEventDispatchThread()) body + else SwingUtilities.invokeLater(new Runnable { def run = body }) + } + + + /* delayed events */ + + def delay_first(delay: => Time)(event: => Unit): Simple_Thread.Delay = + Simple_Thread.delay_first(delay) { later { event } } + + def delay_last(delay: => Time)(event: => Unit): Simple_Thread.Delay = + Simple_Thread.delay_last(delay) { later { event } } +}