/********************************************************************** Copyright (c) 2000, 2002 IBM Corp. and others. All rights reserved. This program and the accompanying materials are made available under the terms of the Common Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/cpl-v10.html Contributors: IBM Corporation - Initial implementation Klaus Hartlage - www.eclipseproject.de **********************************************************************/ package net.sourceforge.phpeclipse.phpeditor.php; import java.util.ArrayList; import java.util.List; import java.util.Vector; import net.sourceforge.phpeclipse.phpeditor.util.PHPWhitespaceDetector; import net.sourceforge.phpeclipse.phpeditor.util.PHPWordDetector; 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.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.RuleBasedScanner; 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.text.rules.WordRule; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import net.sourceforge.phpeclipse.IPreferenceConstants; import net.sourceforge.phpeclipse.PHPeclipsePlugin; import net.sourceforge.phpeclipse.phpeditor.PHPSyntaxRdr; import net.sourceforge.phpeclipse.phpeditor.util.PHPColorProvider; /** * PHP Code Scanner */ public class PHPCodeScanner extends RuleBasedScanner implements IPreferenceConstants { private static Token variable; private static Token keyword; private static Token type; private static Token constant; private static Token functionName; private static Token string; private static Token comment; private static Token multi_comment; private static Token other; private class PHPWordRule extends WordRule { private StringBuffer fBuffer = new StringBuffer(); public PHPWordRule(IWordDetector detector) { super(detector, Token.UNDEFINED); } public PHPWordRule(IWordDetector detector, IToken defaultToken) { super(detector, defaultToken); } public IToken evaluate(ICharacterScanner scanner) { int c = scanner.read(); boolean isVariable = false; if (fDetector.isWordStart((char) c)) { if (c == '$') { isVariable = true; } if (fColumn == UNDEFINED || (fColumn == scanner.getColumn() - 1)) { fBuffer.setLength(0); do { fBuffer.append((char) c); c = scanner.read(); } while (c != ICharacterScanner.EOF && fDetector.isWordPart((char) c)); scanner.unread(); if (isVariable) { return variable; } IToken token = (IToken) fWords.get(fBuffer.toString()); if (token != null) return token; if (fDefaultToken.isUndefined()) unreadBuffer(scanner); return fDefaultToken; } } scanner.unread(); return Token.UNDEFINED; } } private PHPColorProvider fColorProvider; /** * Creates a PHP code scanner */ public PHPCodeScanner(PHPColorProvider provider) { final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore(); Color BackgroundColor = provider.getColor(PreferenceConverter.getColor(store, PHP_EDITOR_BACKGROUND)); variable = new Token( new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_VARIABLE)), BackgroundColor, (store.getBoolean(PHP_VARIABLE_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_VARIABLE_ITALIC) ? SWT.ITALIC : SWT.NONE))); keyword = new Token(new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_KEYWORD)), BackgroundColor, //SWT.NONE)); (store.getBoolean(PHP_KEYWORD_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_KEYWORD_ITALIC) ? SWT.ITALIC : SWT.NONE))); type = new Token(new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_TYPE)), BackgroundColor, //SWT.NONE)); (store.getBoolean(PHP_TYPE_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_TYPE_ITALIC) ? SWT.ITALIC : SWT.NONE))); functionName = new Token(new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_FUNCTIONNAME)), BackgroundColor, //SWT.NONE)); (store.getBoolean(PHP_FUNCTIONNAME_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_FUNCTIONNAME_ITALIC) ? SWT.ITALIC : SWT.NONE))); constant = new Token(new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_CONSTANT)), BackgroundColor, //SWT.NONE)); (store.getBoolean(PHP_CONSTANT_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_CONSTANT_ITALIC) ? SWT.ITALIC : SWT.NONE))); string = new Token(new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_STRING)), BackgroundColor, //SWT.NONE)); (store.getBoolean(PHP_STRING_BOLD) ? SWT.NONE : SWT.BOLD) + (store.getBoolean(PHP_STRING_ITALIC) ? SWT.ITALIC : SWT.NONE))); comment = new Token(new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_SINGLELINE_COMMENT)), BackgroundColor, //SWT.NONE)); (store.getBoolean(PHP_SINGLELINE_COMMENT_BOLD) ? SWT.NONE : SWT.BOLD) + (store.getBoolean(PHP_SINGLELINE_COMMENT_ITALIC) ? SWT.ITALIC : SWT.NONE))); multi_comment = new Token(new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_MULTILINE_COMMENT)), BackgroundColor, //SWT.NONE)); (store.getBoolean(PHP_MULTILINE_COMMENT_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_MULTILINE_COMMENT_ITALIC) ? SWT.ITALIC : SWT.NONE))); other = new Token(new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_DEFAULT)), BackgroundColor, //SWT.NONE)); (store.getBoolean(PHP_DEFAULT_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_DEFAULT_ITALIC) ? SWT.ITALIC : SWT.NONE))); updateWordRules(); } public void updateToken(PHPColorProvider provider) { final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore(); Color BackgroundColor = provider.getColor(PreferenceConverter.getColor(store, PHP_EDITOR_BACKGROUND)); variable.setData( new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_VARIABLE)), BackgroundColor, (store.getBoolean(PHP_VARIABLE_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_VARIABLE_ITALIC) ? SWT.ITALIC : SWT.NONE))); keyword.setData( new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_KEYWORD)), BackgroundColor, (store.getBoolean(PHP_KEYWORD_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_KEYWORD_ITALIC) ? SWT.ITALIC : SWT.NONE))); type.setData( new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_TYPE)), BackgroundColor, (store.getBoolean(PHP_TYPE_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_TYPE_ITALIC) ? SWT.ITALIC : SWT.NONE))); functionName.setData( new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_FUNCTIONNAME)), BackgroundColor, (store.getBoolean(PHP_FUNCTIONNAME_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_FUNCTIONNAME_ITALIC) ? SWT.ITALIC : SWT.NONE))); constant.setData( new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_CONSTANT)), BackgroundColor, (store.getBoolean(PHP_CONSTANT_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_CONSTANT_ITALIC) ? SWT.ITALIC : SWT.NONE))); string.setData( new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_STRING)), BackgroundColor, (store.getBoolean(PHP_STRING_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_STRING_ITALIC) ? SWT.ITALIC : SWT.NONE))); comment.setData( new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_SINGLELINE_COMMENT)), BackgroundColor, (store.getBoolean(PHP_SINGLELINE_COMMENT_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_SINGLELINE_COMMENT_ITALIC) ? SWT.ITALIC : SWT.NONE))); multi_comment.setData( new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_MULTILINE_COMMENT)), BackgroundColor, (store.getBoolean(PHP_MULTILINE_COMMENT_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_MULTILINE_COMMENT_ITALIC) ? SWT.ITALIC : SWT.NONE))); other.setData( new TextAttribute( provider.getColor(PreferenceConverter.getColor(store, PHP_DEFAULT)), BackgroundColor, (store.getBoolean(PHP_DEFAULT_BOLD) ? SWT.BOLD : SWT.NONE) + (store.getBoolean(PHP_DEFAULT_ITALIC) ? SWT.ITALIC : SWT.NONE))); } public void updateWordRules() { List rules = new ArrayList(); // Add rule for single line comments. rules.add(new EndOfLineRule("//", comment)); //$NON-NLS-1$ rules.add(new EndOfLineRule("#", comment)); // Add rule for strings and character constants. rules.add(new MultiLineRule("\"", "\"", string, '\\')); //$NON-NLS-2$ //$NON-NLS-1$ rules.add(new SingleLineRule("'", "'", string, '\\')); //$NON-NLS-2$ //$NON-NLS-1$ // rules.add(new SingleLineRule("//", "//", php_comment)); rules.add(new MultiLineRule("/*", "*/", multi_comment)); // Add generic whitespace rule. rules.add(new WhitespaceRule(new PHPWhitespaceDetector())); // Add word rule for keywords, types, and constants. PHPWordRule wordRule = new PHPWordRule(new PHPWordDetector(), other); PHPSyntaxRdr.readInSyntax(); Vector buffer = PHPSyntaxRdr.getsyntaxdata(); String strbuffer = null; PHPElement elbuffer = null; while ((buffer != null) && (!buffer.isEmpty() && ((elbuffer = (PHPElement) buffer.remove(0)) != null))) { if (elbuffer instanceof PHPKeyword) wordRule.addWord(((PHPKeyword) elbuffer).getName(), keyword); if (elbuffer instanceof PHPFunction) wordRule.addWord(((PHPFunction) elbuffer).getName(), functionName); if (elbuffer instanceof PHPType) wordRule.addWord(elbuffer.getName(), type); if (elbuffer instanceof PHPConstant) wordRule.addWord(elbuffer.getName(), constant); } rules.add(wordRule); IRule[] result = new IRule[rules.size()]; rules.toArray(result); setRules(result); } }