/*
* Copyright 2003-2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package eu.esdihumboldt.hale.ui.util.groovy.internal;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.text.TextAttribute;
import org.eclipse.jface.text.rules.EndOfLineRule;
import org.eclipse.jface.text.rules.ICharacterScanner;
import org.eclipse.jface.text.rules.IPredicateRule;
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.RuleBasedPartitionScanner;
import org.eclipse.jface.text.rules.SingleLineRule;
import org.eclipse.jface.text.rules.Token;
import org.eclipse.jface.text.rules.WordRule;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
@SuppressWarnings("javadoc")
public class GroovyPartitionScanner extends RuleBasedPartitionScanner implements IJavaPartitions {
public final static String GROOVY_MULTILINE_STRINGS = "__groovy_multiline_string"; //$NON-NLS-1$
/**
* Array with legal content types.
*
* @since 3.0
*/
public final static String[] LEGAL_CONTENT_TYPES = new String[] { JAVA_DOC,
JAVA_MULTI_LINE_COMMENT, JAVA_SINGLE_LINE_COMMENT, JAVA_STRING, JAVA_CHARACTER,
GROOVY_MULTILINE_STRINGS };
/**
* Detector for empty comments.
*/
static class EmptyCommentDetector implements IWordDetector {
@Override
public boolean isWordStart(char c) {
return (c == '/');
}
@Override
public boolean isWordPart(char c) {
return (c == '*' || c == '/');
}
}
static class WordPredicateRule extends WordRule implements IPredicateRule {
private final IToken fSuccessToken;
public WordPredicateRule(IToken successToken) {
super(new EmptyCommentDetector());
fSuccessToken = successToken;
addWord("/**/", fSuccessToken); //$NON-NLS-1$
}
/*
* @see
* org.eclipse.jface.text.rules.IPredicateRule#evaluate(ICharacterScanner
* , boolean)
*/
@Override
public IToken evaluate(ICharacterScanner scanner, boolean resume) {
return super.evaluate(scanner);
}
/*
* @see org.eclipse.jface.text.rules.IPredicateRule#getSuccessToken()
*/
@Override
public IToken getSuccessToken() {
return fSuccessToken;
}
}
/**
* Creates the partitioner and sets up the appropriate rules.
*/
public GroovyPartitionScanner() {
super();
List<IRule> rules = createRules(false);
IPredicateRule[] result = new IPredicateRule[rules.size()];
rules.toArray(result);
setPredicateRules(result);
}
public static List<IRule> createRules(boolean withColor) {
IPreferenceStore store = GroovyUIPlugin.getDefault().getPreferenceStore();
Object objComment;
Object objdComment;
Object objmString;
Object objsString;
Object objsComment;
if (withColor) {
RGB rgb = PreferenceConverter.getColor(store,
PreferenceConstants.GROOVY_EDITOR_HIGHLIGHT_STRINGS_COLOR);
objComment = objmString = objsString = objsComment = objdComment = new TextAttribute(
new Color(null, rgb), null, SWT.ITALIC);
}
else {
objComment = JAVA_MULTI_LINE_COMMENT;
objmString = GROOVY_MULTILINE_STRINGS;
objsString = JAVA_STRING;
objsComment = JAVA_SINGLE_LINE_COMMENT;
objdComment = JAVA_DOC;
}
IToken comment = new Token(objComment);
IToken mString = new Token(objmString);
IToken sString = new Token(objsString);
IToken sComment = new Token(objsComment);
IToken jdoc = new Token(objdComment);
List<IRule> rules = new ArrayList<IRule>();
// Add rule for single line comments.
rules.add(new EndOfLineRule("//", sComment));
// Add rule for strings and character constants.
rules.add(new MultiLineRule("'''", "'''", mString));
rules.add(new MultiLineRule("\"\"\"", "\"\"\"", mString));
// GRECLIPSE-1111 do not eagerly match these kinds of multiline strings
rules.add(new SingleLineRule("\"", "\"", sString, '\\'));
rules.add(new SingleLineRule("'", "'", sString, '\\'));
// GRECLIPSE-1203 make dollar slashies optionally highlighted
if (store.getBoolean(PreferenceConstants.GROOVY_EDITOR_HIGHLIGHT_SLASHY_STRINGS)) {
rules.add(new MultiLineRule("$/", "/$", mString, '\0', false));
}
// Add special case word rule.
rules.add(new WordPredicateRule(comment));
// Add rule for JavaDoc
rules.add(new MultiLineRule("/**", "*/", jdoc, (char) 0, true)); //$NON-NLS-1$ //$NON-NLS-2$
// Add rules for multi-line comments
rules.add(new MultiLineRule("/*", "*/", comment, (char) 0, true)); //$NON-NLS-1$ //$NON-NLS-2$
return rules;
}
}