more permissive handling of plugin startup failure;
authorwenzelm
Mon, 03 Sep 2012 22:22:38 +0200
changeset 49099 10e899bb6530
parent 49098 673e0ed547af
child 49100 e7aecf2a5fc4
more permissive handling of plugin startup failure;
src/Tools/jEdit/src/plugin.scala
--- a/src/Tools/jEdit/src/plugin.scala	Mon Sep 03 21:30:34 2012 +0200
+++ b/src/Tools/jEdit/src/plugin.scala	Mon Sep 03 22:22:38 2012 +0200
@@ -21,7 +21,8 @@
 import org.gjt.sp.jedit.buffer.JEditBuffer
 import org.gjt.sp.jedit.textarea.{JEditTextArea, TextArea}
 import org.gjt.sp.jedit.syntax.{Token => JEditToken, ModeProvider}
-import org.gjt.sp.jedit.msg.{EditorStarted, BufferUpdate, EditPaneUpdate, PropertiesChanged}
+import org.gjt.sp.jedit.msg.{EditorStarted, ViewUpdate,
+  BufferUpdate, EditPaneUpdate, PropertiesChanged}
 import org.gjt.sp.jedit.gui.DockableWindowManager
 
 import org.gjt.sp.util.SyntaxUtilities
@@ -34,8 +35,10 @@
 {
   /* plugin instance */
 
-  var plugin: Plugin = null
-  var session: Session = null
+  @volatile var plugin: Plugin = null
+  @volatile var session: Session = null
+  @volatile var startup_failure: Option[Throwable] = None
+  @volatile var startup_notified = false
 
   def thy_load(): JEdit_Thy_Load =
     session.thy_load.asInstanceOf[JEdit_Thy_Load]
@@ -432,66 +435,93 @@
   override def handleMessage(message: EBMessage)
   {
     Swing_Thread.assert()
-    message match {
-      case msg: EditorStarted =>
-        if (Isabelle.Boolean_Property("auto-start"))
-          Isabelle.session.start(Isabelle.session_args())
 
-      case msg: BufferUpdate
-      if msg.getWhat == BufferUpdate.LOADED || msg.getWhat == BufferUpdate.PROPERTIES_CHANGED =>
-        if (Isabelle.session.is_ready) {
-          val buffer = msg.getBuffer
-          if (buffer != null && !buffer.isLoading) Isabelle.init_model(buffer)
-          delay_load(true)
-        }
+    if (Isabelle.startup_failure.isDefined && !Isabelle.startup_notified) {
+      message match {
+        case msg: ViewUpdate =>
+          Library.error_dialog(msg.getView, "Isabelle plugin startup failure",
+            Library.scrollable_text(Exn.message(Isabelle.startup_failure.get)),
+            "Prover IDE inactive!")
+          Isabelle.startup_notified = true
+        case _ =>
+      }
+    }
+
+    if (Isabelle.startup_failure.isEmpty) {
+      message match {
+        case msg: EditorStarted =>
+          if (Isabelle.Boolean_Property("auto-start"))
+            Isabelle.session.start(Isabelle.session_args())
 
-      case msg: EditPaneUpdate
-      if (msg.getWhat == EditPaneUpdate.BUFFER_CHANGING ||
-          msg.getWhat == EditPaneUpdate.BUFFER_CHANGED ||
-          msg.getWhat == EditPaneUpdate.CREATED ||
-          msg.getWhat == EditPaneUpdate.DESTROYED) =>
-        val edit_pane = msg.getEditPane
-        val buffer = edit_pane.getBuffer
-        val text_area = edit_pane.getTextArea
+        case msg: BufferUpdate
+        if msg.getWhat == BufferUpdate.LOADED || msg.getWhat == BufferUpdate.PROPERTIES_CHANGED =>
+          if (Isabelle.session.is_ready) {
+            val buffer = msg.getBuffer
+            if (buffer != null && !buffer.isLoading) Isabelle.init_model(buffer)
+            delay_load(true)
+          }
 
-        if (buffer != null && text_area != null) {
-          if (msg.getWhat == EditPaneUpdate.BUFFER_CHANGED ||
-              msg.getWhat == EditPaneUpdate.CREATED) {
-            if (Isabelle.session.is_ready)
-              Isabelle.init_view(buffer, text_area)
+        case msg: EditPaneUpdate
+        if (msg.getWhat == EditPaneUpdate.BUFFER_CHANGING ||
+            msg.getWhat == EditPaneUpdate.BUFFER_CHANGED ||
+            msg.getWhat == EditPaneUpdate.CREATED ||
+            msg.getWhat == EditPaneUpdate.DESTROYED) =>
+          val edit_pane = msg.getEditPane
+          val buffer = edit_pane.getBuffer
+          val text_area = edit_pane.getTextArea
+
+          if (buffer != null && text_area != null) {
+            if (msg.getWhat == EditPaneUpdate.BUFFER_CHANGED ||
+                msg.getWhat == EditPaneUpdate.CREATED) {
+              if (Isabelle.session.is_ready)
+                Isabelle.init_view(buffer, text_area)
+            }
+            else Isabelle.exit_view(buffer, text_area)
           }
-          else Isabelle.exit_view(buffer, text_area)
-        }
 
-      case msg: PropertiesChanged =>
-        Isabelle.setup_tooltips()
-        Isabelle.session.global_settings.event(Session.Global_Settings)
+        case msg: PropertiesChanged =>
+          Isabelle.setup_tooltips()
+          Isabelle.session.global_settings.event(Session.Global_Settings)
 
-      case _ =>
+        case _ =>
+      }
     }
   }
 
   override def start()
-  { // FIXME more robust error handling
-    Isabelle.plugin = this
-    Isabelle.setup_tooltips()
-    Isabelle_System.init()
-    Isabelle_System.install_fonts()
+  {
+    try {
+      Isabelle.plugin = this
+      Isabelle.setup_tooltips()
+      Isabelle_System.init()
+      Isabelle_System.install_fonts()
+
+      SyntaxUtilities.setStyleExtender(new Token_Markup.Style_Extender)
+      if (ModeProvider.instance.isInstanceOf[ModeProvider])
+        ModeProvider.instance = new Token_Markup.Mode_Provider(ModeProvider.instance)
 
-    val content = Isabelle.session_content(false)
-    val thy_load = new JEdit_Thy_Load(content.loaded_theories, content.syntax)
-    Isabelle.session = new Session(thy_load)
+      val content = Isabelle.session_content(false)
+      val thy_load = new JEdit_Thy_Load(content.loaded_theories, content.syntax)
+      Isabelle.session = new Session(thy_load)
 
-    SyntaxUtilities.setStyleExtender(new Token_Markup.Style_Extender)
-    if (ModeProvider.instance.isInstanceOf[ModeProvider])
-      ModeProvider.instance = new Token_Markup.Mode_Provider(ModeProvider.instance)
-    Isabelle.session.phase_changed += session_manager
+      Isabelle.session.phase_changed += session_manager
+      Isabelle.startup_failure = None
+    }
+    catch {
+      case exn: Throwable =>
+        stop()
+        Isabelle.session = null
+        Isabelle.startup_failure = Some(exn)
+        Isabelle.startup_notified = false
+    }
   }
 
   override def stop()
   {
-    Isabelle.session.phase_changed -= session_manager
-    Isabelle.jedit_buffers.foreach(Isabelle.exit_model)
-    Isabelle.session.stop()
+    if (Isabelle.session != null) {
+      Isabelle.session.phase_changed -= session_manager
+      Isabelle.jedit_buffers.foreach(Isabelle.exit_model)
+      Isabelle.session.stop()
+    }
   }
 }