src/Pure/GUI/gui_thread.scala
author wenzelm
Thu, 04 Feb 2016 21:28:56 +0100
changeset 62263 2c76c66897fc
parent 61556 0d4ee4168e41
child 64370 865b39487b5d
permissions -rw-r--r--
removed unused cancel operation;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 56773
diff changeset
     1
/*  Title:      Pure/GUI/gui_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
2454172eddae Swing utilities.
wenzelm
parents:
diff changeset
     3
    Author:     Makarius
2454172eddae Swing utilities.
wenzelm
parents:
diff changeset
     4
57613
4c6d44a3a079 tuned comments;
wenzelm
parents: 57612
diff changeset
     5
Evaluation within the GUI thread (for AWT/Swing).
29202
2454172eddae Swing utilities.
wenzelm
parents:
diff changeset
     6
*/
2454172eddae Swing utilities.
wenzelm
parents:
diff changeset
     7
2454172eddae Swing utilities.
wenzelm
parents:
diff changeset
     8
package isabelle
2454172eddae Swing utilities.
wenzelm
parents:
diff changeset
     9
55618
995162143ef4 tuned imports;
wenzelm
parents: 53853
diff changeset
    10
56773
5c7ade7a1e74 removed dead code;
wenzelm
parents: 56770
diff changeset
    11
import javax.swing.SwingUtilities
31942
63466160ff27 renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
wenzelm
parents: 31862
diff changeset
    12
29202
2454172eddae Swing utilities.
wenzelm
parents:
diff changeset
    13
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 56773
diff changeset
    14
object GUI_Thread
29202
2454172eddae Swing utilities.
wenzelm
parents:
diff changeset
    15
{
56773
5c7ade7a1e74 removed dead code;
wenzelm
parents: 56770
diff changeset
    16
  /* context check */
32494
4ab2292e452a explicit checks;
wenzelm
parents: 31942
diff changeset
    17
52859
f31624cc4467 tuned signature;
wenzelm
parents: 52477
diff changeset
    18
  def assert[A](body: => A) =
f31624cc4467 tuned signature;
wenzelm
parents: 52477
diff changeset
    19
  {
f31624cc4467 tuned signature;
wenzelm
parents: 52477
diff changeset
    20
    Predef.assert(SwingUtilities.isEventDispatchThread())
f31624cc4467 tuned signature;
wenzelm
parents: 52477
diff changeset
    21
    body
f31624cc4467 tuned signature;
wenzelm
parents: 52477
diff changeset
    22
  }
32494
4ab2292e452a explicit checks;
wenzelm
parents: 31942
diff changeset
    23
52859
f31624cc4467 tuned signature;
wenzelm
parents: 52477
diff changeset
    24
  def require[A](body: => A) =
f31624cc4467 tuned signature;
wenzelm
parents: 52477
diff changeset
    25
  {
f31624cc4467 tuned signature;
wenzelm
parents: 52477
diff changeset
    26
    Predef.require(SwingUtilities.isEventDispatchThread())
f31624cc4467 tuned signature;
wenzelm
parents: 52477
diff changeset
    27
    body
f31624cc4467 tuned signature;
wenzelm
parents: 52477
diff changeset
    28
  }
52477
025b3777e592 tuned signature;
wenzelm
parents: 49251
diff changeset
    29
32494
4ab2292e452a explicit checks;
wenzelm
parents: 31942
diff changeset
    30
56773
5c7ade7a1e74 removed dead code;
wenzelm
parents: 56770
diff changeset
    31
  /* event dispatch queue */
31942
63466160ff27 renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
wenzelm
parents: 31862
diff changeset
    32
34026
0cb44ac299f8 added future;
wenzelm
parents: 32501
diff changeset
    33
  def now[A](body: => A): A =
0cb44ac299f8 added future;
wenzelm
parents: 32501
diff changeset
    34
  {
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
    35
    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
    36
    else {
56662
f373fb77e0a4 avoid "Adaptation of argument list by inserting ()" -- deprecated in scala-2.11.0;
wenzelm
parents: 55618
diff changeset
    37
      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
    38
      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
    39
      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
    40
    }
29649
8b0c1397868e more robust treatment of SwingUtilities.isEventDispatchThread;
wenzelm
parents: 29202
diff changeset
    41
  }
29202
2454172eddae Swing utilities.
wenzelm
parents:
diff changeset
    42
34299
68716caa7745 Swing_Thread.future: plain Future.value if this is already Swing;
wenzelm
parents: 34217
diff changeset
    43
  def later(body: => Unit)
68716caa7745 Swing_Thread.future: plain Future.value if this is already Swing;
wenzelm
parents: 34217
diff changeset
    44
  {
32494
4ab2292e452a explicit checks;
wenzelm
parents: 31942
diff changeset
    45
    if (SwingUtilities.isEventDispatchThread()) body
29649
8b0c1397868e more robust treatment of SwingUtilities.isEventDispatchThread;
wenzelm
parents: 29202
diff changeset
    46
    else SwingUtilities.invokeLater(new Runnable { def run = body })
8b0c1397868e more robust treatment of SwingUtilities.isEventDispatchThread;
wenzelm
parents: 29202
diff changeset
    47
  }
31942
63466160ff27 renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
wenzelm
parents: 31862
diff changeset
    48
63466160ff27 renamed Delay to Swing_Thread.delay (action is executed within AWT thread!);
wenzelm
parents: 31862
diff changeset
    49
56770
e160ae47db94 mane delayed events outside of Swing thread -- triggers no longer require Swing_Thread.later;
wenzelm
parents: 56662
diff changeset
    50
  /* delayed events */
49195
9d10bd85c1be more explicit Delay operations;
wenzelm
parents: 48000
diff changeset
    51
62263
2c76c66897fc removed unused cancel operation;
wenzelm
parents: 61556
diff changeset
    52
  def delay_first(delay: => Time)(event: => Unit): Standard_Thread.Delay =
2c76c66897fc removed unused cancel operation;
wenzelm
parents: 61556
diff changeset
    53
    Standard_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
    54
62263
2c76c66897fc removed unused cancel operation;
wenzelm
parents: 61556
diff changeset
    55
  def delay_last(delay: => Time)(event: => Unit): Standard_Thread.Delay =
2c76c66897fc removed unused cancel operation;
wenzelm
parents: 61556
diff changeset
    56
    Standard_Thread.delay_last(delay) { later { event } }
29202
2454172eddae Swing utilities.
wenzelm
parents:
diff changeset
    57
}