src/Tools/jEdit/src/jedit/IsabelleSideKickParser.scala
author wenzelm
Wed, 17 Jun 2009 00:26:46 +0200
changeset 34609 7ca1ef2f150d
parent 34562 cdf914c78ff2
child 34611 b40e43d70ae9
permissions -rw-r--r--
simplified and reactivated SideKickCompletion, cf. org.gjt.sp.jedit.gui.CompleteWord;

/*
 * SideKick parser for Isabelle proof documents
 *
 * @author Fabian Immler, TU Munich
 * @author Makarius
 */

package isabelle.jedit

import scala.collection.Set
import scala.collection.immutable.TreeSet

import javax.swing.tree.DefaultMutableTreeNode

import org.gjt.sp.jedit.{Buffer, EditPane, TextUtilities, View}
import errorlist.DefaultErrorSource
import sidekick.{SideKickParser, SideKickParsedData, SideKickCompletion}


class IsabelleSideKickParser extends SideKickParser("isabelle") {

  /* parsing */

  private var stopped = false
  override def stop() = { stopped = true }

  def parse(buffer : Buffer, error_source : DefaultErrorSource): SideKickParsedData = {
    stopped = false
    
    val data = new SideKickParsedData(buffer.getName)

    val prover_setup = Isabelle.plugin.prover_setup(buffer)
    if (prover_setup.isDefined) {
        val document = prover_setup.get.prover.document
        for (command <- document.commands)
          data.root.add(command.markup_root.swing_node(document))
        
        if (stopped) data.root.add(new DefaultMutableTreeNode("<parser stopped>"))
    } else {
      data.root.add(new DefaultMutableTreeNode("<buffer inactive>"))
    }

    data
  }


  /* completion */

  override def supportsCompletion = true
  override def canCompleteAnywhere = true

  override def complete(pane: EditPane, caret: Int): SideKickCompletion =
  {
    val buffer = pane.getBuffer
    val ps = Isabelle.prover_setup(buffer)
    if (ps.isDefined) {
      val no_word_sep = "_'.?"

      val caret_line = buffer.getLineOfOffset(caret)
      val line = buffer.getLineSegment(caret_line)

      val dot = caret - buffer.getLineStartOffset(caret_line)
      if (dot == 0) return null

      val ch = line.charAt(dot - 1)
      if (!ch.isLetterOrDigit &&   // FIXME Isabelle word!?
          no_word_sep.indexOf(ch) == -1) return null

		  val word_start = TextUtilities.findWordStart(line, dot - 1, no_word_sep)
      val word = line.subSequence(word_start, dot)
  		if (word.length <= 1) return null   // FIXME property?

      val completions = ps.get.prover.completions(word).filter(_ != word)
      if (completions.isEmpty) return null

      new SideKickCompletion(pane.getView, word.toString,
        completions.toArray.asInstanceOf[Array[Object]]) {}
    } else null
  }

}