some dialog for auto loading of required files (still inactive);
authorwenzelm
Mon, 29 Aug 2011 16:38:56 +0200
changeset 4544551f8895b9ad9
parent 45444 63d460db4919
child 45446 24444588fddd
some dialog for auto loading of required files (still inactive);
src/Pure/System/session.scala
src/Pure/library.scala
src/Tools/jEdit/src/plugin.scala
     1.1 --- a/src/Pure/System/session.scala	Mon Aug 29 16:28:51 2011 +0200
     1.2 +++ b/src/Pure/System/session.scala	Mon Aug 29 16:38:56 2011 +0200
     1.3 @@ -50,6 +50,7 @@
     1.4    val input_delay = Time.seconds(0.3)  // user input (e.g. text edits, cursor movement)
     1.5    val output_delay = Time.seconds(0.1)  // prover output (markup, common messages)
     1.6    val update_delay = Time.seconds(0.5)  // GUI layout updates
     1.7 +  val load_delay = Time.seconds(0.5)  // file load operations (new buffers etc.)
     1.8  
     1.9  
    1.10    /* pervasive event buses */
    1.11 @@ -186,6 +187,7 @@
    1.12  
    1.13    private case class Start(timeout: Time, args: List[String])
    1.14    private case object Interrupt
    1.15 +  private case class Check_Loaded_Files(ask: List[String] => Boolean)
    1.16    private case class Init_Node(name: String, master_dir: String,
    1.17      header: Document.Node_Header, perspective: Text.Perspective, text: String)
    1.18    private case class Edit_Node(name: String, master_dir: String,
    1.19 @@ -371,6 +373,8 @@
    1.20          case Interrupt if prover.isDefined =>
    1.21            prover.get.interrupt
    1.22  
    1.23 +        case Check_Loaded_Files(ask) => // FIXME
    1.24 +
    1.25          case Init_Node(name, master_dir, header, perspective, text) if prover.isDefined =>
    1.26            // FIXME compare with existing node
    1.27            handle_edits(name, master_dir, header,
    1.28 @@ -413,6 +417,11 @@
    1.29  
    1.30    def interrupt() { session_actor ! Interrupt }
    1.31  
    1.32 +  def check_loaded_files(ask: List[String] => Boolean)
    1.33 +  {
    1.34 +    session_actor ! Check_Loaded_Files(ask)
    1.35 +  }
    1.36 +
    1.37    // FIXME simplify signature
    1.38    def init_node(name: String, master_dir: String,
    1.39      header: Document.Node_Header, perspective: Text.Perspective, text: String)
     2.1 --- a/src/Pure/library.scala	Mon Aug 29 16:28:51 2011 +0200
     2.2 +++ b/src/Pure/library.scala	Mon Aug 29 16:38:56 2011 +0200
     2.3 @@ -142,6 +142,14 @@
     2.4    def warning_dialog = simple_dialog(JOptionPane.WARNING_MESSAGE, "Warning") _
     2.5    def error_dialog = simple_dialog(JOptionPane.ERROR_MESSAGE, "Error") _
     2.6  
     2.7 +  def confirm_dialog(parent: Component, title: String, option_type: Int, message: Any*): Int =
     2.8 +    Swing_Thread.now {
     2.9 +      val java_message = message map { case x: scala.swing.Component => x.peer case x => x }
    2.10 +      JOptionPane.showConfirmDialog(parent,
    2.11 +        java_message.toArray.asInstanceOf[Array[AnyRef]], title,
    2.12 +          option_type, JOptionPane.QUESTION_MESSAGE)
    2.13 +    }
    2.14 +
    2.15  
    2.16    /* zoom box */
    2.17  
     3.1 --- a/src/Tools/jEdit/src/plugin.scala	Mon Aug 29 16:28:51 2011 +0200
     3.2 +++ b/src/Tools/jEdit/src/plugin.scala	Mon Aug 29 16:38:56 2011 +0200
     3.3 @@ -12,6 +12,7 @@
     3.4  import java.lang.System
     3.5  import java.io.{File, FileInputStream, IOException}
     3.6  import java.awt.Font
     3.7 +import javax.swing.JOptionPane
     3.8  
     3.9  import scala.collection.mutable
    3.10  import scala.swing.ComboBox
    3.11 @@ -375,6 +376,25 @@
    3.12  
    3.13    /* session manager */
    3.14  
    3.15 +  private lazy val delay_load =
    3.16 +    Swing_Thread.delay_last(Isabelle.session.load_delay) {
    3.17 +      def ask(files: List[String]): Boolean = Swing_Thread.now
    3.18 +        {
    3.19 +          val file_list = new scala.swing.TextArea(files.mkString("\n"))
    3.20 +          file_list.editable = false
    3.21 +          val answer =
    3.22 +            Library.confirm_dialog(jEdit.getActiveView(),
    3.23 +            "Auto loading of required files",
    3.24 +            JOptionPane.YES_NO_OPTION,
    3.25 +            "The following files are required to resolve theory imports.",
    3.26 +            "Reload now?",
    3.27 +            file_list)
    3.28 +          answer == 0
    3.29 +        }
    3.30 +
    3.31 +      Isabelle.session.check_loaded_files(ask _)
    3.32 +    }
    3.33 +
    3.34    private val session_manager = actor {
    3.35      loop {
    3.36        react {
    3.37 @@ -387,7 +407,10 @@
    3.38                  Library.error_dialog(jEdit.getActiveView, "Failed to start Isabelle process", text)
    3.39                }
    3.40  
    3.41 -            case Session.Ready => Isabelle.jedit_buffers.foreach(Isabelle.init_model)
    3.42 +            case Session.Ready =>
    3.43 +              Isabelle.jedit_buffers.foreach(Isabelle.init_model)
    3.44 +              delay_load()
    3.45 +
    3.46              case Session.Shutdown => Isabelle.jedit_buffers.foreach(Isabelle.exit_model)
    3.47              case _ =>
    3.48            }
    3.49 @@ -410,17 +433,17 @@
    3.50  
    3.51        case msg: BufferUpdate
    3.52        if msg.getWhat == BufferUpdate.LOADED =>
    3.53 -
    3.54 -        val buffer = msg.getBuffer
    3.55 -        if (buffer != null && Isabelle.session.is_ready)
    3.56 -          Isabelle.init_model(buffer)
    3.57 +        if (Isabelle.session.is_ready) {
    3.58 +          val buffer = msg.getBuffer
    3.59 +          if (buffer != null) Isabelle.init_model(buffer)
    3.60 +          delay_load()
    3.61 +        }
    3.62  
    3.63        case msg: EditPaneUpdate
    3.64        if (msg.getWhat == EditPaneUpdate.BUFFER_CHANGING ||
    3.65            msg.getWhat == EditPaneUpdate.BUFFER_CHANGED ||
    3.66            msg.getWhat == EditPaneUpdate.CREATED ||
    3.67            msg.getWhat == EditPaneUpdate.DESTROYED) =>
    3.68 -
    3.69          val edit_pane = msg.getEditPane
    3.70          val buffer = edit_pane.getBuffer
    3.71          val text_area = edit_pane.getTextArea