/*
* Copyright (c) 2012 Sam Harwell, Tunnel Vision Laboratories LLC
* All rights reserved.
*
* The source code of this document is proprietary work, and is not licensed for
* distribution. For information about licensing, contact Sam Harwell at:
* sam@tunnelvisionlabs.com
*/
package org.antlr.works.editor.st4.highlighter;
import java.util.Collection;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.StyledDocument;
import org.antlr.netbeans.editor.highlighting.Highlight;
import org.antlr.netbeans.editor.text.OffsetRegion;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.Token;
import org.antlr.works.editor.antlr4.highlighting.ANTLRHighlighterBaseV4;
import org.antlr.works.editor.antlr4.highlighting.TokenSourceWithStateV4;
import org.antlr.works.editor.st4.StringTemplateEditorKit;
import org.netbeans.api.editor.mimelookup.MimeLookup;
import org.netbeans.api.editor.mimelookup.MimePath;
import org.netbeans.api.editor.settings.FontColorSettings;
import org.openide.util.Lookup;
/**
*
* @author Sam Harwell
*/
public class TemplateHighlighter extends ANTLRHighlighterBaseV4<TemplateHighlighterLexerState> {
private final AttributeSet identifierAttributes;
private final AttributeSet keywordAttributes;
private final AttributeSet commentAttributes;
private final AttributeSet stringLiteralAttributes;
private final AttributeSet operatorAttributes;
private final AttributeSet symbolReferenceAttributes;
private final AttributeSet bigStringDelimiterAttributes;
private final AttributeSet expressionDelimiterAttributes;
private final AttributeSet anonymousTemplateDelimiterAttributes;
private final AttributeSet escapeCharacterAttributes;
private final AttributeSet escapeTagAttributes;
private final AttributeSet regionUseAttributes;
private TemplateHighlighterLexer lexer;
public TemplateHighlighter(StyledDocument document) {
super(document);
Lookup lookup = MimeLookup.getLookup(MimePath.parse(StringTemplateEditorKit.TEMPLATE_MIME_TYPE));
FontColorSettings settings = lookup.lookup(FontColorSettings.class);
identifierAttributes = getFontAndColors(settings, "identifier");
keywordAttributes = getFontAndColors(settings, "keyword");
commentAttributes = getFontAndColors(settings, "comment");
stringLiteralAttributes = getFontAndColors(settings, "stringliteral");
operatorAttributes = getFontAndColors(settings, "operator");
symbolReferenceAttributes = getFontAndColors(settings, "reference");
bigStringDelimiterAttributes = getFontAndColors(settings, "bigStringDelimiter");
expressionDelimiterAttributes = getFontAndColors(settings, "expressionDelimiter");
anonymousTemplateDelimiterAttributes = getFontAndColors(settings, "anonymousTemplateDelimiter");
escapeCharacterAttributes = getFontAndColors(settings, "escapeCharacter");
escapeTagAttributes = getFontAndColors(settings, "escapeTag");
this.regionUseAttributes = getFontAndColors(settings, "regionUse");
}
private static AttributeSet getFontAndColors(FontColorSettings settings, String category) {
AttributeSet attributes = settings.getTokenFontColors(category);
return attributes;
}
@Override
protected CharStream createInputStream(OffsetRegion span) throws BadLocationException {
return super.createInputStream(span);
}
@Override
protected TemplateHighlighterLexerState getStartState() {
return TemplateHighlighterLexerState.INITIAL;
}
@Override
protected TokenSourceWithStateV4<TemplateHighlighterLexerState> createLexer(CharStream input, TemplateHighlighterLexerState startState) {
if (lexer == null) {
lexer = new TemplateHighlighterLexer(input, startState);
} else {
lexer.setState(input, startState);
}
return lexer;
}
@Override
protected AttributeSet highlightToken(Token token) {
switch (token.getType()) {
case GroupHighlighterLexer.DEFAULT:
case GroupHighlighterLexer.IMPORT:
case GroupHighlighterLexer.GROUP:
case GroupHighlighterLexer.TRUE:
case GroupHighlighterLexer.FALSE:
case GroupHighlighterLexer.DELIMITERS:
case GroupHighlighterLexer.IF:
case GroupHighlighterLexer.ELSEIF:
case GroupHighlighterLexer.ELSE:
case GroupHighlighterLexer.ENDIF:
case GroupHighlighterLexer.END:
case GroupHighlighterLexer.SUPER:
case GroupHighlighterLexer.FIRST:
case GroupHighlighterLexer.LAST:
case GroupHighlighterLexer.REST:
case GroupHighlighterLexer.TRUNC:
case GroupHighlighterLexer.STRIP:
case GroupHighlighterLexer.TRIM:
case GroupHighlighterLexer.LENGTH:
case GroupHighlighterLexer.STRLEN:
case GroupHighlighterLexer.REVERSE:
return keywordAttributes;
case GroupHighlighterLexer.ID:
return identifierAttributes;
case GroupHighlighterLexer.LBRACE:
case GroupHighlighterLexer.RBRACE:
return anonymousTemplateDelimiterAttributes;
case GroupHighlighterLexer.BIGSTRING:
case GroupHighlighterLexer.BIGSTRINGLINE:
case GroupHighlighterLexer.BigStringTemplate_END:
case GroupHighlighterLexer.BigStringLineTemplate_END:
return bigStringDelimiterAttributes;
case GroupHighlighterLexer.STRING:
return stringLiteralAttributes;
case GroupHighlighterLexer.LINE_COMMENT:
case GroupHighlighterLexer.COMMENT:
return commentAttributes;
// case GroupHighlighterLexer.WS:
// return whitespaceAttributes;
case GroupHighlighterLexer.OPEN_DELIMITER:
case GroupHighlighterLexer.CLOSE_DELIMITER:
return expressionDelimiterAttributes;
case GroupHighlighterLexer.ESCAPE:
return escapeTagAttributes;
case GroupHighlighterLexer.AnonymousTemplate_ID:
case GroupHighlighterLexer.AnonymousTemplate_COMMA:
case GroupHighlighterLexer.TEXT:
return stringLiteralAttributes;
case GroupHighlighterLexer.REGION_ID:
return regionUseAttributes;
default:
return null;
}
}
@Override
protected Collection<Highlight> getHighlightsForToken(Token token) {
// if (token.getType() == GroupHighlighterLexer.LEGACY_DELIMITERS) {
// throw new UnsupportedOperationException("Not implemented yet.");
// } else {
return super.getHighlightsForToken(token);
// }
}
// public class TemplateEscapedCharStream extends DocumentCharStreamV4 {
// private TemplateHighlighterLexer lexer;
//
// public TemplateEscapedCharStream(StyledDocument document) {
// super(document);
// }
//
// public TemplateHighlighterLexer getLexer() {
// return lexer;
// }
//
// public void setLexer(TemplateHighlighterLexer value) {
// lexer = value;
// }
//
// @Override
// public void consume() {
// boolean consumeEscape = shouldConsumeEscape(0);
// if (consumeEscape) {
// super.consume();
// }
//
// super.consume();
// }
//
// @Override
// public int LA(int i) {
// int escapeCount = 0;
// if (i >= 1) {
// for (int j = 0; j < i; j++) {
// if (shouldConsumeEscape(j + escapeCount)) {
// escapeCount++;
// }
// }
// }
//
// return super.LA(i + escapeCount);
// }
//
// private boolean shouldConsumeEscape(int offset) {
// if (getLexer() == null) {
// return false;
// }
//
// if (super.LA(offset + 1) != '\\') {
// return false;
// }
//
// boolean inString = getLexer().getOutermost() == OutermostTemplate.String;
// if (inString) {
// return super.LA(offset + 2) == '"';
// }
//
// boolean inBigString = getLexer().getOutermost() == OutermostTemplate.BigString
// || getLexer().getOutermost() == OutermostTemplate.BigStringLine;
// if (inBigString) {
// return super.LA(offset + 2) == '>';
// }
//
// return false;
// }
// }
}