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 |