/*******************************************************************************
* Copyright © 2000, 2013 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*
*******************************************************************************/
package org.eclipse.edt.ide.ui.internal.editor;
/*
* This class handles all the syntax highlighting for EGL files
* except for the SQL sections.
*/
import java.util.ArrayList;
import java.util.List;
import org.eclipse.edt.compiler.core.EGLKeywordHandler;
import org.eclipse.edt.ide.ui.EDTUIPreferenceConstants;
import org.eclipse.edt.ide.ui.internal.preferences.ColorProvider;
import org.eclipse.jface.text.TextAttribute;
import org.eclipse.jface.text.rules.IRule;
import org.eclipse.jface.text.rules.NumberRule;
import org.eclipse.jface.text.rules.SingleLineRule;
import org.eclipse.jface.text.rules.Token;
import org.eclipse.jface.text.rules.WhitespaceRule;
import org.eclipse.jface.util.PropertyChangeEvent;
/**
* An EGL code scanner.
*
* In the future, the tokens in this scanner will have to be updated based on changes in the
* preferences.
*/
public class CodeScanner extends AbstractCodeScanner {
public static String[] keywords = EGLKeywordHandler.getKeywordNamesToLowerCase();
private ColorProvider colorProvider = null;
/**
* Creates a EGL code scanner
*/
public CodeScanner(ColorProvider provider) {
super();
colorProvider = provider;
setRules();
}
/*
* @see AbstractJavaScanner#affectsBehavior(PropertyChangeEvent)
*/
public boolean affectsBehavior(PropertyChangeEvent event) {
return event.getProperty().equals(EDTUIPreferenceConstants.EDITOR_KEYWORD_COLOR) ||
event.getProperty().equals(EDTUIPreferenceConstants.EDITOR_KEYWORD_BOLD) ||
event.getProperty().equals(EDTUIPreferenceConstants.EDITOR_STRING_COLOR) ||
event.getProperty().equals(EDTUIPreferenceConstants.EDITOR_STRING_BOLD) ||
event.getProperty().equals(EDTUIPreferenceConstants.EDITOR_MULTI_LINE_COMMENT_COLOR) ||
event.getProperty().equals(EDTUIPreferenceConstants.EDITOR_MULTI_LINE_COMMENT_BOLD) ||
event.getProperty().equals(EDTUIPreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_COLOR) ||
event.getProperty().equals(EDTUIPreferenceConstants.EDITOR_SINGLE_LINE_COMMENT_BOLD) ||
event.getProperty().equals(EDTUIPreferenceConstants.EDITOR_DEFAULT_COLOR) ||
event.getProperty().equals(EDTUIPreferenceConstants.EDITOR_DEFAULT_BOLD);
}
/**
* Sets up the rules for different types of things we highlight
* in the non-SQL EGL text.
*/
public void setRules() {
Token currentToken = null;
TextAttribute attr = null;
List rules = new ArrayList();
// Add rule for single line comments.
attr = colorProvider.getTextAttribute(ColorProvider.SINGLE_LINE_COMMENT);
currentToken = new Token(attr);
// Add rules for multi-line comments.
attr = colorProvider.getTextAttribute(ColorProvider.MULTI_LINE_COMMENT);
currentToken = new Token(attr);
// Add rule for strings and character constants.
attr = colorProvider.getTextAttribute(ColorProvider.LITERAL);
currentToken = new Token(attr);
rules.add(new SingleLineRule(CodeConstants.EGL_STRING_COMMENT, CodeConstants.EGL_STRING_COMMENT, currentToken, '\\')); //$NON-NLS-1$ //$NON-NLS-2$
// Add generic number rule.
attr = colorProvider.getTextAttribute(ColorProvider.DEFAULT);
currentToken = new Token(attr);
rules.add(new NumberRule(currentToken)); //$NON-NLS-1$
// Add generic whitespace rule.
rules.add(new WhitespaceRule(new EGLWhitespaceDetector()));
// Add rules for all keywords
EGLWordRule wordRule = new EGLWordRule(new EGLWordDetector(), currentToken); // currentToken still set for Default
attr = colorProvider.getTextAttribute(ColorProvider.KEYWORD);
currentToken = new Token(attr);
for (int i = 0; i < keywords.length; i++) {
wordRule.addWord((String) keywords[i], currentToken);
}
rules.add(wordRule);
attr = colorProvider.getTextAttribute(ColorProvider.DEFAULT);
currentToken = new Token(attr);
setDefaultReturnToken(currentToken);
result = new IRule[rules.size()];
rules.toArray(result);
setRules(result);
}
}