blob: 6ca8441e97fd568821c5f404a5c47c8726e81c1f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2007 ILOG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Joel Cheuoua - Initial API and implementation
*******************************************************************************/
package org.eclipse.jet.internal.editor.scanners;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jdt.ui.PreferenceConstants;
import org.eclipse.jet.internal.editor.configuration.JETTokenStyleManager;
import org.eclipse.jface.text.rules.BufferedRuleBasedScanner;
import org.eclipse.jface.text.rules.ICharacterScanner;
import org.eclipse.jface.text.rules.IRule;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.IWordDetector;
import org.eclipse.jface.text.rules.MultiLineRule;
import org.eclipse.jface.text.rules.SingleLineRule;
import org.eclipse.jface.text.rules.Token;
import org.eclipse.jface.text.rules.WordRule;
/**
* A Java code scanner for JET-java sections.
*/
public class JETJavaCodeScanner extends BufferedRuleBasedScanner {
/**
* Rule to detect java operators.
*/
private class OperatorRule implements IRule {
private char[] JAVA_OPERATORS= { ';', '.', '=', '/', '\\', '+', '-', '*', '<', '>', ':', '?', '!', ',', '|', '&', '^', '%', '~'};
private IToken fToken;
public OperatorRule(IToken token) {
fToken= token;
}
public boolean isOperator(char character) {
for (int index= 0; index < JAVA_OPERATORS.length; index++) {
if (JAVA_OPERATORS[index] == character)
return true;
}
return false;
}
/*
* @see org.eclipse.jface.text.rules.IRule#evaluate(org.eclipse.jface.text.rules.ICharacterScanner)
*/
public IToken evaluate(ICharacterScanner scanner) {
int character= scanner.read();
if (isOperator((char) character)) {
do {
character= scanner.read();
} while (isOperator((char) character));
scanner.unread();
return fToken;
} else {
scanner.unread();
return Token.UNDEFINED;
}
}
}
/**
* Rule to detect java brackets.
*/
private class BracketRule implements IRule {
private char[] JAVA_BRACKETS= { '(', ')', '{', '}', '[', ']' };
private final IToken success;
public BracketRule(IToken token) {
success= token;
}
public boolean isBracket(char character) {
for (int index= 0; index < JAVA_BRACKETS.length; index++) {
if (JAVA_BRACKETS[index] == character)
return true;
}
return false;
}
/*
* @see org.eclipse.jface.text.rules.IRule#evaluate(org.eclipse.jface.text.rules.ICharacterScanner)
*/
public IToken evaluate(ICharacterScanner scanner) {
int character= scanner.read();
if (isBracket((char) character)) {
do {
character= scanner.read();
} while (isBracket((char) character));
scanner.unread();
return success;
} else {
scanner.unread();
return Token.UNDEFINED;
}
}
}
private class JavaWordDetector implements IWordDetector {
/*
* @see IWordDetector#isWordStart
*/
public boolean isWordStart(char c) {
return Character.isJavaIdentifierStart(c);
}
/*
* @see IWordDetector#isWordPart
*/
public boolean isWordPart(char c) {
return Character.isJavaIdentifierPart(c);
}
}
private String[] javaKeywords= {
"abstract", //$NON-NLS-1$
"break", //$NON-NLS-1$
"case", "catch", "class", "const", "continue", //$NON-NLS-5$ //$NON-NLS-4$ //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
"default", "do", //$NON-NLS-2$ //$NON-NLS-1$
"else", "extends", //$NON-NLS-2$ //$NON-NLS-1$
"final", "finally", "for", //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
"goto", //$NON-NLS-1$
"if", "implements", "import", "instanceof", "interface", //$NON-NLS-5$ //$NON-NLS-4$ //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
"native", "new", //$NON-NLS-2$ //$NON-NLS-1$
"package", "private", "protected", "public", //$NON-NLS-4$ //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
"static", "super", "switch", "synchronized", //$NON-NLS-4$ //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
"this", "throw", "throws", "transient", "try", //$NON-NLS-5$ //$NON-NLS-4$ //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
"volatile", //$NON-NLS-1$
"while", //$NON-NLS-1$
"assert", //$NON-NLS-1$
"enum", //$NON-NLS-1$
"return" //$NON-NLS-1$
};
private String[] javaTypes= { "class", "interface", "void", "boolean", "char", "byte", "short", "strictfp", "int", "long", "float", "double" }; //$NON-NLS-1$ //$NON-NLS-5$ //$NON-NLS-7$ //$NON-NLS-6$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-2$
private String[] javaConstants= { "false", "null", "true" }; //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
private String defaultBg;
/**
* Creates a Java code scanner
*
* @param manager the color manager
* @param store the preference store
*/
public JETJavaCodeScanner(JETTokenStyleManager manager, String defaultBg) {
this.defaultBg = defaultBg;
List rules = createRules(manager);
IRule[] result= new IRule[rules.size()];
rules.toArray(result);
setRules(result);
}
protected List createRules(JETTokenStyleManager manager) {
List rules= new ArrayList();
// Add rule for character constants.
IToken token= manager.requestToken("__jet_java_string_" + defaultBg,
PreferenceConstants.EDITOR_STRING_COLOR,
defaultBg,
PreferenceConstants.EDITOR_STRING_BOLD,
PreferenceConstants.EDITOR_STRING_ITALIC,
PreferenceConstants.EDITOR_STRING_STRIKETHROUGH,
PreferenceConstants.EDITOR_STRING_UNDERLINE);
rules.add(new SingleLineRule("'", "'", token, '\\')); //$NON-NLS-2$ //$NON-NLS-1$
// Add generic whitespace rule.
//rules.add(new WhitespaceRule(new JETWhitespaceDetector()));
// Add rule for multiline comments
token= manager.requestToken("__jet_java_multi_line_comment_" + defaultBg,
PreferenceConstants.EDITOR_MULTI_LINE_COMMENT_COLOR,
defaultBg,
PreferenceConstants.EDITOR_MULTI_LINE_COMMENT_BOLD,
PreferenceConstants.EDITOR_MULTI_LINE_COMMENT_ITALIC,
PreferenceConstants.EDITOR_MULTI_LINE_COMMENT_STRIKETHROUGH,
PreferenceConstants.EDITOR_MULTI_LINE_COMMENT_UNDERLINE);
MultiLineRule multiLineCommentsRule = new MultiLineRule("/*", "*/", token, '\\');
rules.add(multiLineCommentsRule);
// Add rule for single line comments
token= manager.requestToken("__jet_java_single_line_comment_" + defaultBg,
PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_COLOR,
defaultBg,
PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_BOLD,
PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_ITALIC,
PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_STRIKETHROUGH,
PreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_UNDERLINE);
SingleLineRule singleLineCommentsRule = new SingleLineRule("//", null, token);
rules.add(singleLineCommentsRule);
// Add word rule for keywords,types and constants
JavaWordDetector wordDetector= new JavaWordDetector();
token= manager.requestToken("__jet_java_default_" + defaultBg,
PreferenceConstants.EDITOR_JAVA_DEFAULT_COLOR,
defaultBg,
PreferenceConstants.EDITOR_JAVA_DEFAULT_BOLD,
PreferenceConstants.EDITOR_JAVA_DEFAULT_ITALIC,
PreferenceConstants.EDITOR_JAVA_DEFAULT_STRIKETHROUGH,
PreferenceConstants.EDITOR_JAVA_DEFAULT_UNDERLINE);
WordRule wordRule= new WordRule(wordDetector, token);
token = manager.requestToken("__jet_java_keyword_" + defaultBg,
PreferenceConstants.EDITOR_JAVA_KEYWORD_COLOR,
defaultBg,
PreferenceConstants.EDITOR_JAVA_KEYWORD_BOLD,
PreferenceConstants.EDITOR_JAVA_KEYWORD_ITALIC,
PreferenceConstants.EDITOR_JAVA_KEYWORD_STRIKETHROUGH,
PreferenceConstants.EDITOR_JAVA_KEYWORD_UNDERLINE);
for (int i=0; i<javaKeywords.length; i++)
wordRule.addWord(javaKeywords[i], token);
for (int i=0; i<javaTypes.length; i++)
wordRule.addWord(javaTypes[i], token);
for (int i=0; i<javaConstants.length; i++)
wordRule.addWord(javaConstants[i], token);
rules.add(wordRule);
// Add rule for operators
token = manager.requestToken("__jet_java_operator_" + defaultBg,
PreferenceConstants.EDITOR_JAVA_OPERATOR_COLOR,
defaultBg,
PreferenceConstants.EDITOR_JAVA_OPERATOR_BOLD,
PreferenceConstants.EDITOR_JAVA_OPERATOR_ITALIC,
PreferenceConstants.EDITOR_JAVA_OPERATOR_STRIKETHROUGH,
PreferenceConstants.EDITOR_JAVA_OPERATOR_UNDERLINE);;
rules.add(new OperatorRule(token));
// Add rule for brackets
token = manager.requestToken("__jet_java_bracket_" + defaultBg,
PreferenceConstants.EDITOR_JAVA_BRACKET_COLOR,
defaultBg,
PreferenceConstants.EDITOR_JAVA_BRACKET_BOLD,
PreferenceConstants.EDITOR_JAVA_BRACKET_ITALIC,
PreferenceConstants.EDITOR_JAVA_BRACKET_STRIKETHROUGH,
PreferenceConstants.EDITOR_JAVA_BRACKET_UNDERLINE);;
rules.add(new BracketRule(token));
return rules;
}
}