src/Pure/General/swing_thread.scala
author wenzelm
Sat, 04 Jul 2009 23:25:28 +0200
changeset 31942 63466160ff27
parent 31862 53acb8ec6c51
child 32494 4ab2292e452a
permissions -rw-r--r--
renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);

/*  Title:      Pure/General/swing_thread.scala
    Author:     Makarius
    Author:     Fabian Immler, TU Munich

Evaluation within the AWT/Swing thread.
*/

package isabelle

import javax.swing.{SwingUtilities, Timer}
import java.awt.event.{ActionListener, ActionEvent}


object Swing_Thread
{
  /* main dispatch queue */

  def now[A](body: => A): A = {
    var result: Option[A] = None
    if (SwingUtilities.isEventDispatchThread) { result = Some(body) }
    else SwingUtilities.invokeAndWait(new Runnable { def run = { result = Some(body) } })
    result.get
  }

  def later(body: => Unit) {
    if (SwingUtilities.isEventDispatchThread) body
    else SwingUtilities.invokeLater(new Runnable { def run = body })
  }


  /* delayed actions */

  // turn multiple invocations into single action within time span
  def delay(time_span: Int)(action: => Unit): () => Unit =
  {
    val listener =
      new ActionListener { override def actionPerformed(e: ActionEvent) { action } }
    val timer = new Timer(time_span, listener)
    def invoke()
    {
      if (!timer.isRunning()) {
        timer.setRepeats(false)
        timer.start()
      }
    }
    invoke _
  }
}