src/Pure/GUI/swing_thread.scala
changeset 56770 e160ae47db94
parent 56662 f373fb77e0a4
child 56773 5c7ade7a1e74
equal deleted inserted replaced
56769:8649243d7e91 56770:e160ae47db94
    52     if (SwingUtilities.isEventDispatchThread()) body
    52     if (SwingUtilities.isEventDispatchThread()) body
    53     else SwingUtilities.invokeLater(new Runnable { def run = body })
    53     else SwingUtilities.invokeLater(new Runnable { def run = body })
    54   }
    54   }
    55 
    55 
    56 
    56 
    57   /* delayed actions */
    57   /* delayed events */
    58 
    58 
    59   abstract class Delay extends
    59   def delay_first(delay: => Time)(event: => Unit): Simple_Thread.Delay =
    60   {
    60     Simple_Thread.delay_first(delay) { later { event } }
    61     def invoke(): Unit
       
    62     def revoke(): Unit
       
    63     def postpone(time: Time): Unit
       
    64   }
       
    65 
    61 
    66   private def delayed_action(first: Boolean)(time: => Time)(action: => Unit): Delay =
    62   def delay_last(delay: => Time)(event: => Unit): Simple_Thread.Delay =
    67     new Delay {
    63     Simple_Thread.delay_last(delay) { later { event } }
    68       private val timer = new Timer(time.ms.toInt, null)
       
    69       timer.setRepeats(false)
       
    70       timer.addActionListener(new ActionListener {
       
    71         override def actionPerformed(e: ActionEvent) {
       
    72           assert {}
       
    73           timer.setInitialDelay(time.ms.toInt)
       
    74           action
       
    75         }
       
    76       })
       
    77 
       
    78       def invoke()
       
    79       {
       
    80         require {}
       
    81         if (first) timer.start() else timer.restart()
       
    82       }
       
    83 
       
    84       def revoke()
       
    85       {
       
    86         require {}
       
    87         timer.stop()
       
    88         timer.setInitialDelay(time.ms.toInt)
       
    89       }
       
    90 
       
    91       def postpone(alt_time: Time)
       
    92       {
       
    93         require {}
       
    94         if (timer.isRunning) {
       
    95           timer.setInitialDelay(timer.getInitialDelay max alt_time.ms.toInt)
       
    96           timer.restart()
       
    97         }
       
    98       }
       
    99     }
       
   100 
       
   101   // delayed action after first invocation
       
   102   def delay_first = delayed_action(true) _
       
   103 
       
   104   // delayed action after last invocation
       
   105   def delay_last = delayed_action(false) _
       
   106 }
    64 }