src/Tools/jEdit/src/jedit/plugin.scala
changeset 34759 bfea7839d9e1
parent 34751 6ed1b3701459
child 34760 dc7f5e0d9d27
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Tools/jEdit/src/jedit/plugin.scala	Tue Dec 08 14:49:01 2009 +0100
@@ -0,0 +1,155 @@
+/*
+ * Main Isabelle/jEdit plugin setup
+ *
+ * @author Johannes Hölzl, TU Munich
+ * @author Fabian Immler, TU Munich
+ */
+
+package isabelle.jedit
+
+
+import java.io.{FileInputStream, IOException}
+import java.awt.Font
+import javax.swing.JScrollPane
+
+import scala.collection.mutable
+
+import isabelle.prover.{Prover, Command}
+import isabelle.proofdocument.ProofDocument
+import isabelle.Isabelle_System
+
+import org.gjt.sp.jedit.{jEdit, EBMessage, EBPlugin, Buffer, EditPane, ServiceManager, View}
+import org.gjt.sp.jedit.buffer.JEditBuffer
+import org.gjt.sp.jedit.textarea.JEditTextArea
+import org.gjt.sp.jedit.msg.{EditPaneUpdate, PropertiesChanged}
+
+
+object Isabelle
+{
+  /* name */
+
+  val NAME = "Isabelle"
+
+
+  /* properties */
+
+  val OPTION_PREFIX = "options.isabelle."
+
+  object Property
+  {
+    def apply(name: String): String = jEdit.getProperty(OPTION_PREFIX + name)
+    def update(name: String, value: String) = jEdit.setProperty(OPTION_PREFIX + name, value)
+  }
+
+  object Boolean_Property
+  {
+    def apply(name: String): Boolean = jEdit.getBooleanProperty(OPTION_PREFIX + name)
+    def update(name: String, value: Boolean) = jEdit.setBooleanProperty(OPTION_PREFIX + name, value)
+  }
+
+  object Int_Property
+  {
+    def apply(name: String): Int = jEdit.getIntegerProperty(OPTION_PREFIX + name)
+    def update(name: String, value: Int) = jEdit.setIntegerProperty(OPTION_PREFIX + name, value)
+  }
+
+
+  /* Isabelle system instance */
+
+  var system: Isabelle_System = null
+  def symbols = system.symbols
+  lazy val completion = new Completion + symbols
+
+
+  /* settings */
+
+  def default_logic(): String =
+  {
+    val logic = Isabelle.Property("logic")
+    if (logic != null) logic
+    else system.getenv_strict("ISABELLE_LOGIC")
+  }
+
+
+  /* plugin instance */
+
+  var plugin: Plugin = null
+
+
+  /* running provers */
+
+  def prover_setup(buffer: JEditBuffer) = plugin.prover_setup(buffer)
+}
+
+
+class Plugin extends EBPlugin
+{
+  /* event buses */
+
+  val state_update = new Event_Bus[Command]
+
+
+  /* selected state */
+
+  private var _selected_state: Command = null
+  def selected_state = _selected_state
+  def selected_state_=(state: Command) { _selected_state = state; state_update.event(state) }
+
+
+  /* mapping buffer <-> prover */
+
+  private val mapping = new mutable.HashMap[JEditBuffer, ProverSetup]
+
+  private def install(view: View)
+  {
+    val buffer = view.getBuffer
+    val prover_setup = new ProverSetup(buffer)
+    mapping.update(buffer, prover_setup)
+    prover_setup.activate(view)
+  }
+
+  private def uninstall(view: View) =
+    mapping.removeKey(view.getBuffer).get.deactivate
+
+  def switch_active (view: View) =
+    if (mapping.isDefinedAt(view.getBuffer)) uninstall(view)
+    else install(view)
+
+  def prover_setup(buffer: JEditBuffer): Option[ProverSetup] = mapping.get(buffer)
+  def is_active (buffer: JEditBuffer) = mapping.isDefinedAt(buffer)
+
+
+  /* main plugin plumbing */
+
+  override def handleMessage(msg: EBMessage)
+  {
+    msg match {
+      case epu: EditPaneUpdate =>
+        val buffer = epu.getEditPane.getBuffer
+        epu.getWhat match {
+          case EditPaneUpdate.BUFFER_CHANGED =>
+            (mapping get buffer) map (_.theory_view.activate)
+          case EditPaneUpdate.BUFFER_CHANGING =>
+            if (buffer != null)
+              (mapping get buffer) map (_.theory_view.deactivate)
+          case _ =>
+        }
+      case _ =>
+    }
+  }
+
+  override def start()
+  {
+    Isabelle.plugin = this
+    Isabelle.system = new Isabelle_System
+    if (!Isabelle.system.register_fonts())
+      System.err.println("Failed to register Isabelle fonts")
+  }
+
+  override def stop()
+  {
+    // TODO: proper cleanup
+    Isabelle.system = null
+    Isabelle.plugin = null
+  }
+}