wenzelm@43414: /* Title: Tools/jEdit/src/token_markup.scala wenzelm@43414: Author: Makarius wenzelm@43414: wenzelm@43414: Outer syntax token markup. wenzelm@43414: */ wenzelm@43414: wenzelm@43414: package isabelle.jedit wenzelm@43414: wenzelm@43414: wenzelm@43414: import isabelle._ wenzelm@43414: wenzelm@43414: import org.gjt.sp.jedit.Buffer wenzelm@43414: import org.gjt.sp.jedit.syntax.{Token => JToken, TokenMarker, TokenHandler, ParserRuleSet} wenzelm@43414: import javax.swing.text.Segment wenzelm@43414: wenzelm@43414: wenzelm@43414: object Token_Markup wenzelm@43414: { wenzelm@43414: /* extended jEdit syntax styles */ wenzelm@43414: wenzelm@43414: private val plain_range: Int = JToken.ID_COUNT wenzelm@43414: private def check_range(i: Int) { require(0 <= i && i < plain_range) } wenzelm@43414: wenzelm@43414: def subscript(i: Byte): Byte = { check_range(i); (i + plain_range).toByte } wenzelm@43414: def superscript(i: Byte): Byte = { check_range(i); (i + 2 * plain_range).toByte } wenzelm@43414: val hidden: Byte = (3 * plain_range).toByte wenzelm@43414: wenzelm@43414: wenzelm@43414: /* token marker */ wenzelm@43414: wenzelm@43414: private val isabelle_rules = new ParserRuleSet("isabelle", "MAIN") wenzelm@43414: wenzelm@43414: private class Line_Context(val context: Scan.Context) wenzelm@43414: extends TokenMarker.LineContext(isabelle_rules, null) wenzelm@43414: { wenzelm@43414: override def hashCode: Int = context.hashCode wenzelm@43414: override def equals(that: Any): Boolean = wenzelm@43414: that match { wenzelm@43414: case other: Line_Context => context == other.context wenzelm@43414: case _ => false wenzelm@43414: } wenzelm@43414: } wenzelm@43414: wenzelm@43414: def token_marker(session: Session, buffer: Buffer): TokenMarker = wenzelm@43414: new TokenMarker { wenzelm@43414: override def markTokens(context: TokenMarker.LineContext, wenzelm@43414: handler: TokenHandler, line: Segment): TokenMarker.LineContext = wenzelm@43414: { wenzelm@43414: Isabelle.swing_buffer_lock(buffer) { wenzelm@43414: val syntax = session.current_syntax() wenzelm@43414: wenzelm@43414: val ctxt = wenzelm@43414: context match { wenzelm@43414: case c: Line_Context => c.context wenzelm@43414: case _ => Scan.Finished wenzelm@43414: } wenzelm@43414: wenzelm@43414: val (tokens, ctxt1) = syntax.scan_context(line, ctxt) wenzelm@43414: val context1 = new Line_Context(ctxt1) wenzelm@43414: wenzelm@43414: var offset = 0 wenzelm@43414: for (token <- tokens) { wenzelm@43414: val style = Isabelle_Markup.token_markup(syntax, token) wenzelm@43414: val length = token.source.length wenzelm@43414: handler.handleToken(line, style, offset, length, context1) wenzelm@43414: offset += length wenzelm@43414: } wenzelm@43414: handler.handleToken(line, JToken.END, line.count, 0, context1) wenzelm@43414: handler.setLineContext(context1) wenzelm@43414: context1 wenzelm@43414: } wenzelm@43414: } wenzelm@43414: } wenzelm@43414: } wenzelm@43414: