src/Tools/jEdit/src/jedit/DynamicTokenMarker.scala
author wenzelm
Fri, 20 Mar 2009 21:31:57 +0100
changeset 34521 fc851e58a610
parent 34518 7407bc6cf28d
child 34542 e647f063ffad
permissions -rw-r--r--
added ML syntax markup;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
34467
c7d7a92fe3d5 created DynamicTokenMarker
immler@in.tum.de
parents:
diff changeset
     1
/*
c7d7a92fe3d5 created DynamicTokenMarker
immler@in.tum.de
parents:
diff changeset
     2
 * include isabelle's command- and keyword-declarations
c7d7a92fe3d5 created DynamicTokenMarker
immler@in.tum.de
parents:
diff changeset
     3
 * live in jEdits syntax-highlighting
34517
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
     4
 *
34467
c7d7a92fe3d5 created DynamicTokenMarker
immler@in.tum.de
parents:
diff changeset
     5
 * @author Fabian Immler, TU Munich
c7d7a92fe3d5 created DynamicTokenMarker
immler@in.tum.de
parents:
diff changeset
     6
 */
c7d7a92fe3d5 created DynamicTokenMarker
immler@in.tum.de
parents:
diff changeset
     7
c7d7a92fe3d5 created DynamicTokenMarker
immler@in.tum.de
parents:
diff changeset
     8
package isabelle.jedit
c7d7a92fe3d5 created DynamicTokenMarker
immler@in.tum.de
parents:
diff changeset
     9
34517
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    10
import isabelle.proofdocument.ProofDocument
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    11
import isabelle.prover.{Command, MarkupNode}
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    12
import isabelle.Markup
34467
c7d7a92fe3d5 created DynamicTokenMarker
immler@in.tum.de
parents:
diff changeset
    13
34517
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    14
import org.gjt.sp.jedit.buffer.JEditBuffer
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    15
import org.gjt.sp.jedit.syntax._
34467
c7d7a92fe3d5 created DynamicTokenMarker
immler@in.tum.de
parents:
diff changeset
    16
34517
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    17
import java.awt.Color
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    18
import java.awt.Font
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    19
import javax.swing.text.Segment;
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    20
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    21
object DynamicTokenMarker {
34467
c7d7a92fe3d5 created DynamicTokenMarker
immler@in.tum.de
parents:
diff changeset
    22
34517
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    23
  def styles: Array[SyntaxStyle] = {
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    24
    val array = new Array[SyntaxStyle](256)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    25
    // array(0) won't be used: reserved for global default-font
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    26
    array(1) = new SyntaxStyle(Color.black, Color.white, Isabelle.plugin.font)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    27
    array(2) = new SyntaxStyle(new Color(255, 0, 255), Color.white, Isabelle.plugin.font)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    28
    array(3) = new SyntaxStyle(Color.blue, Color.white, Isabelle.plugin.font)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    29
    array(4) = new SyntaxStyle(Color.green, Color.white, Isabelle.plugin.font)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    30
    array(5) = new SyntaxStyle(new Color(255, 128, 128), Color.white,Isabelle.plugin.font)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    31
    array(6) = new SyntaxStyle(Color.yellow, Color.white, Isabelle.plugin.font)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    32
    array(7) = new SyntaxStyle( new Color(0, 192, 0), Color.white, Isabelle.plugin.font)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    33
    array(8) = new SyntaxStyle(Color.blue, Color.white, Isabelle.plugin.font)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    34
    array(9) = new SyntaxStyle(Color.green, Color.white, Isabelle.plugin.font)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    35
    array(10) = new SyntaxStyle(Color.gray, Color.white, Isabelle.plugin.font)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    36
    array(11) = new SyntaxStyle(Color.white, Color.white, Isabelle.plugin.font)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    37
    array(12) = new SyntaxStyle(Color.red, Color.white, Isabelle.plugin.font)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    38
    array(13) = new SyntaxStyle(Color.orange, Color.white, Isabelle.plugin.font)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    39
    return array
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    40
  }
34467
c7d7a92fe3d5 created DynamicTokenMarker
immler@in.tum.de
parents:
diff changeset
    41
34517
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    42
  def choose_byte(kind: String): Byte = {
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    43
    // TODO: as properties
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    44
    kind match {
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    45
      // logical entities
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    46
      case Markup.TCLASS | Markup.TYCON | Markup.FIXED_DECL | Markup.FIXED | Markup.CONST_DECL
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    47
        | Markup.CONST | Markup.FACT_DECL | Markup.FACT | Markup.DYNAMIC_FACT
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    48
        | Markup.LOCAL_FACT_DECL | Markup.LOCAL_FACT => 2
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    49
      // inner syntax
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    50
      case Markup.TFREE | Markup.FREE => 3
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    51
      case Markup.TVAR | Markup.SKOLEM | Markup.BOUND | Markup.VAR => 4
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    52
      case Markup.NUM | Markup.FLOAT | Markup.XNUM | Markup.XSTR | Markup.LITERAL
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    53
        | Markup.INNER_COMMENT => 5
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    54
      case Markup.SORT | Markup.TYP | Markup.TERM | Markup.PROP
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    55
        | Markup.ATTRIBUTE | Markup.METHOD => 6
34521
fc851e58a610 added ML syntax markup;
wenzelm
parents: 34518
diff changeset
    56
      // ML syntax
fc851e58a610 added ML syntax markup;
wenzelm
parents: 34518
diff changeset
    57
      case Markup.ML_KEYWORD | Markup.ML_IDENT => 8
fc851e58a610 added ML syntax markup;
wenzelm
parents: 34518
diff changeset
    58
      case Markup.ML_TVAR => 4
fc851e58a610 added ML syntax markup;
wenzelm
parents: 34518
diff changeset
    59
      case Markup.ML_NUMERAL => 5
fc851e58a610 added ML syntax markup;
wenzelm
parents: 34518
diff changeset
    60
      case Markup.ML_CHAR | Markup.ML_STRING => 13
fc851e58a610 added ML syntax markup;
wenzelm
parents: 34518
diff changeset
    61
      case Markup.ML_COMMENT => 10
fc851e58a610 added ML syntax markup;
wenzelm
parents: 34518
diff changeset
    62
      case Markup.ML_MALFORMED => 12
34517
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    63
      // embedded source text
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    64
      case Markup.ML_SOURCE | Markup.DOC_SOURCE | Markup.ANTIQ | Markup.ML_ANTIQ
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    65
        | Markup.DOC_ANTIQ => 7
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    66
      // outer syntax
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    67
      case Markup.IDENT | Markup.COMMAND | Markup.KEYWORD => 8
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    68
      case Markup.VERBATIM => 9
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    69
      case Markup.COMMENT => 10
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    70
      case Markup.CONTROL => 11
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    71
      case Markup.MALFORMED => 12
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    72
      case Markup.STRING | Markup.ALTSTRING => 13
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    73
      // other
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    74
      case _ => 1
34467
c7d7a92fe3d5 created DynamicTokenMarker
immler@in.tum.de
parents:
diff changeset
    75
    }
c7d7a92fe3d5 created DynamicTokenMarker
immler@in.tum.de
parents:
diff changeset
    76
  }
34517
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    77
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    78
  def choose_color(kind : String) : Color = styles((choose_byte(kind).asInstanceOf[Byte])).getForegroundColor
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    79
34467
c7d7a92fe3d5 created DynamicTokenMarker
immler@in.tum.de
parents:
diff changeset
    80
}
34517
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    81
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    82
class DynamicTokenMarker(buffer: JEditBuffer, document: ProofDocument) extends TokenMarker {
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    83
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    84
  override def markTokens(prev: TokenMarker.LineContext,
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    85
    handler: TokenHandler, line_segment: Segment): TokenMarker.LineContext = {
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    86
    val previous = prev.asInstanceOf[IndexLineContext]
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    87
    val line = if(prev == null) 0 else previous.line + 1
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    88
    val context = new IndexLineContext(line, previous)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    89
    val start = buffer.getLineStartOffset(line)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    90
    val stop = start + line_segment.count
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    91
    
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    92
    def to = Isabelle.prover_setup(buffer).get.theory_view.to_current(_)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    93
    def from = Isabelle.prover_setup(buffer).get.theory_view.from_current(_)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    94
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    95
    val commands = document.commands.dropWhile(_.stop <= from(start))
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    96
    if(commands.hasNext) {
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    97
      var next_x = start
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    98
      for {
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
    99
        command <- commands.takeWhile(_.start < from(stop))
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   100
        markup <- command.root_node.flatten
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   101
        if(to(markup.abs_stop) > start)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   102
        if(to(markup.abs_start) < stop)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   103
        byte = DynamicTokenMarker.choose_byte(markup.kind)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   104
        token_start = to(markup.abs_start) - start max 0
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   105
        token_length = to(markup.abs_stop) - to(markup.abs_start) -
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   106
                       (start - to(markup.abs_start) max 0) -
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   107
                       (to(markup.abs_stop) - stop max 0)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   108
      } {
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   109
        if (start + token_start > next_x) 
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   110
          handler.handleToken(line_segment, 1, next_x - start, start + token_start - next_x, context)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   111
        handler.handleToken(line_segment, byte, token_start, token_length, context)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   112
        next_x = start + token_start + token_length
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   113
      }
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   114
      if (next_x < stop)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   115
        handler.handleToken(line_segment, 1, next_x - start, stop - next_x, context)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   116
    } else {
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   117
      handler.handleToken(line_segment, 1, 0, line_segment.count, context)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   118
    }
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   119
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   120
    handler.handleToken(line_segment,Token.END, line_segment.count, 0, context)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   121
    handler.setLineContext(context)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   122
    return context
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   123
  }
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   124
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   125
}
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   126
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   127
class IndexLineContext(val line: Int, prev: IndexLineContext)
163cda249619 implemented markTokens;
immler@in.tum.de
parents: 34472
diff changeset
   128
  extends TokenMarker.LineContext(new ParserRuleSet("isabelle", "MAIN"), prev)