package org.erlide.ui.editors.erl.scanner; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.TextAttribute; import org.eclipse.jface.text.rules.BufferedRuleBasedScanner; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.Token; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.RGB; import org.erlide.engine.services.parsing.ErlToken; import org.erlide.ui.internal.ErlideUIPlugin; import org.erlide.ui.prefs.HighlightStyle; import org.erlide.ui.prefs.TokenHighlight; import org.erlide.ui.util.IColorManager; public abstract class ErlTokenScanner extends BufferedRuleBasedScanner { private static Token t_default; private static Token t_atom; private static Token t_string; private static Token t_keyword; private static Token t_var; private static Token t_char; private static Token t_arrow; private static Token t_macro; private static Token t_integer; private static Token t_float; private static Token t_comment; private static Token t_edocTag; private static Token t_htmlTag; private static Token t_tildeTag; private static Token t_escapeTag; protected final IColorManager fColorManager; public ErlTokenScanner(final IColorManager colorManager) { super(); fColorManager = colorManager; setTokens(); } private void setTokens() { if (t_string != null) { return; } t_string = new Token(getTextAttribute(TokenHighlight.STRING)); t_tildeTag = new Token(getTextAttribute(TokenHighlight.TILDE_TAG)); t_escapeTag = new Token(getTextAttribute(TokenHighlight.ESCAPE_TAG)); t_keyword = new Token(getTextAttribute(TokenHighlight.KEYWORD)); t_var = new Token(getTextAttribute(TokenHighlight.VARIABLE)); t_default = new Token(getTextAttribute(TokenHighlight.DEFAULT)); t_arrow = new Token(getTextAttribute(TokenHighlight.ARROW)); t_char = new Token(getTextAttribute(TokenHighlight.CHAR)); t_macro = new Token(getTextAttribute(TokenHighlight.MACRO)); t_atom = new Token(getTextAttribute(TokenHighlight.ATOM)); t_integer = new Token(getTextAttribute(TokenHighlight.INTEGER)); t_float = new Token(getTextAttribute(TokenHighlight.FLOAT)); t_comment = new Token(getTextAttribute(TokenHighlight.COMMENT)); t_edocTag = new Token(getTextAttribute(TokenHighlight.EDOC_TAG)); t_htmlTag = new Token(getTextAttribute(TokenHighlight.HTML_TAG)); } // private static final List<String> RESERVED = Arrays.asList(new String[] { // "after", "begin", "case", "try", "cond", "catch", "andalso", // "orelse", "end", "fun", "if", "let", "of", "query", "receive", // "when", "bnot", "not", "div", "rem", "band", "and", "bor", "bxor", // "bsl", "bsr", "or", "xor", "spec", }); protected TextAttribute getTextAttribute(final TokenHighlight th) { final IPreferenceStore store = ErlideUIPlugin.getDefault().getPreferenceStore(); final HighlightStyle data = th.getStyle(store); // load from prefsstore return new TextAttribute(fColorManager.getColor(data.getColor()), null, data.getStyles()); } public void handleColorChange(final String id, final RGB newValue, final int style) { final Token token = getToken(id); fixTokenData(token, newValue, style); } public IToken convert(final ErlToken tk) { if (tk == ErlToken.EOF || tk == null) { return Token.EOF; } switch (tk.getKind()) { case ErlToken.KIND_STRING: return t_string; case ErlToken.KIND_ATOM: return t_atom; case ErlToken.KIND_VAR: return t_var; case ErlToken.KIND_CHAR: return t_char; case ErlToken.KIND_MACRO: return t_macro; case ErlToken.KIND_ARROW: return t_arrow; case ErlToken.KIND_INTEGER: return t_integer; case ErlToken.KIND_FLOAT: return t_float; case ErlToken.KIND_COMMENT: return t_comment; case ErlToken.KIND_KEYWORD: return t_keyword; default: return t_default; } } public static Token getToken(final String id) { if (TokenHighlight.KEYWORD.getName().equals(id)) { return t_keyword; } else if (TokenHighlight.STRING.getName().equals(id)) { return t_string; } else if (TokenHighlight.TILDE_TAG.getName().equals(id)) { return t_tildeTag; } else if (TokenHighlight.ESCAPE_TAG.getName().equals(id)) { return t_escapeTag; } else if (TokenHighlight.VARIABLE.getName().equals(id)) { return t_var; } else if (TokenHighlight.CHAR.getName().equals(id)) { return t_char; } else if (TokenHighlight.ATOM.getName().equals(id)) { return t_atom; } else if (TokenHighlight.ARROW.getName().equals(id)) { return t_arrow; } else if (TokenHighlight.FLOAT.getName().equals(id)) { return t_float; } else if (TokenHighlight.INTEGER.getName().equals(id)) { return t_integer; } else if (TokenHighlight.MACRO.getName().equals(id)) { return t_macro; } else if (TokenHighlight.COMMENT.getName().equals(id)) { return t_comment; } else if (TokenHighlight.EDOC_TAG.getName().equals(id)) { return t_edocTag; } else if (TokenHighlight.HTML_TAG.getName().equals(id)) { return t_htmlTag; } return t_default; } private void fixTokenData(final Token token, final RGB color, final int style) { final TextAttribute attr = (TextAttribute) token.getData(); final int newStyle = style == -1 ? attr.getStyle() : style; final Color newColor = color == null ? attr.getForeground() : fColorManager.getColor(color); token.setData(new TextAttribute(newColor, attr.getBackground(), newStyle)); } }