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