src/Tools/jEdit/src/token_markup.scala
changeset 58529 cd4439d8799c
parent 57612 990ffb84489b
child 58683 c9b7a00d5a10
equal deleted inserted replaced
58528:7d6b8f8893e8 58529:cd4439d8799c
    13 import java.awt.font.TextAttribute
    13 import java.awt.font.TextAttribute
    14 import java.awt.geom.AffineTransform
    14 import java.awt.geom.AffineTransform
    15 
    15 
    16 import org.gjt.sp.util.SyntaxUtilities
    16 import org.gjt.sp.util.SyntaxUtilities
    17 import org.gjt.sp.jedit.{jEdit, Mode}
    17 import org.gjt.sp.jedit.{jEdit, Mode}
    18 import org.gjt.sp.jedit.syntax.{Token => JEditToken, TokenMarker, TokenHandler,
    18 import org.gjt.sp.jedit.syntax.{Token => JEditToken, TokenMarker, TokenHandler, ParserRuleSet,
    19   ParserRuleSet, ModeProvider, XModeHandler, SyntaxStyle}
    19   ModeProvider, XModeHandler, SyntaxStyle}
    20 import org.gjt.sp.jedit.textarea.{TextArea, Selection}
    20 import org.gjt.sp.jedit.textarea.{TextArea, Selection}
    21 import org.gjt.sp.jedit.buffer.JEditBuffer
    21 import org.gjt.sp.jedit.buffer.JEditBuffer
    22 
    22 
    23 import javax.swing.text.Segment
    23 import javax.swing.text.Segment
    24 
    24 
   171     }
   171     }
   172     result
   172     result
   173   }
   173   }
   174 
   174 
   175 
   175 
   176   /* token marker */
   176   /* line context */
   177 
   177 
   178   private val isabelle_rules = new ParserRuleSet("isabelle", "MAIN")
   178   class Generic_Line_Context[C](rules: ParserRuleSet, val context: Option[C])
   179 
   179     extends TokenMarker.LineContext(rules, null)
   180   private class Line_Context(val context: Option[Scan.Line_Context])
       
   181     extends TokenMarker.LineContext(isabelle_rules, null)
       
   182   {
   180   {
   183     override def hashCode: Int = context.hashCode
   181     override def hashCode: Int = context.hashCode
   184     override def equals(that: Any): Boolean =
   182     override def equals(that: Any): Boolean =
   185       that match {
   183       that match {
   186         case other: Line_Context => context == other.context
   184         case other: Line_Context => context == other.context
   187         case _ => false
   185         case _ => false
   188       }
   186       }
   189   }
   187   }
   190 
   188 
       
   189   private val context_rules = new ParserRuleSet("isabelle", "MAIN")
       
   190 
       
   191   private class Line_Context(context: Option[Scan.Line_Context])
       
   192     extends Generic_Line_Context[Scan.Line_Context](context_rules, context)
       
   193 
       
   194 
       
   195   /* token marker */
       
   196 
   191   class Marker(mode: String) extends TokenMarker
   197   class Marker(mode: String) extends TokenMarker
   192   {
   198   {
   193     override def markTokens(context: TokenMarker.LineContext,
   199     override def markTokens(context: TokenMarker.LineContext,
   194         handler: TokenHandler, raw_line: Segment): TokenMarker.LineContext =
   200         handler: TokenHandler, raw_line: Segment): TokenMarker.LineContext =
   195     {
   201     {
   200         }
   206         }
   201       val line = if (raw_line == null) new Segment else raw_line
   207       val line = if (raw_line == null) new Segment else raw_line
   202 
   208 
   203       val context1 =
   209       val context1 =
   204       {
   210       {
       
   211         def no_context =
       
   212         {
       
   213           val styled_token = (JEditToken.NULL, line.subSequence(0, line.count).toString)
       
   214           (List(styled_token), new Line_Context(None))
       
   215         }
   205         val (styled_tokens, context1) =
   216         val (styled_tokens, context1) =
   206           if (mode == "isabelle-ml" || mode == "sml") {
   217           if (mode == "isabelle-ml" || mode == "sml") {
   207             val (tokens, ctxt1) = ML_Lex.tokenize_line(mode == "sml", line, line_ctxt.get)
   218             if (line_ctxt.isDefined) {
   208             val styled_tokens = tokens.map(tok => (Rendering.ml_token_markup(tok), tok.source))
   219               val (tokens, ctxt1) = ML_Lex.tokenize_line(mode == "sml", line, line_ctxt.get)
   209             (styled_tokens, new Line_Context(Some(ctxt1)))
   220               val styled_tokens = tokens.map(tok => (Rendering.ml_token_markup(tok), tok.source))
       
   221               (styled_tokens, new Line_Context(Some(ctxt1)))
       
   222             }
       
   223             else no_context
   210           }
   224           }
   211           else {
   225           else {
   212             Isabelle.mode_syntax(mode) match {
   226             Isabelle.mode_syntax(mode) match {
   213               case Some(syntax) if syntax.has_tokens && line_ctxt.isDefined =>
   227               case Some(syntax) if syntax.has_tokens && line_ctxt.isDefined =>
   214                 val (tokens, ctxt1) = syntax.scan_line(line, line_ctxt.get)
   228                 val (tokens, ctxt1) = syntax.scan_line(line, line_ctxt.get)
   215                 val styled_tokens =
   229                 val styled_tokens =
   216                   tokens.map(tok => (Rendering.token_markup(syntax, tok), tok.source))
   230                   tokens.map(tok => (Rendering.token_markup(syntax, tok), tok.source))
   217                 (styled_tokens, new Line_Context(Some(ctxt1)))
   231                 (styled_tokens, new Line_Context(Some(ctxt1)))
   218               case _ =>
   232               case _ => no_context
   219                 val styled_token = (JEditToken.NULL, line.subSequence(0, line.count).toString)
       
   220                 (List(styled_token), new Line_Context(None))
       
   221             }
   233             }
   222           }
   234           }
   223 
   235 
   224         val extended = extended_styles(line)
   236         val extended = extended_styles(line)
   225 
   237