001: /*******************************************************************************
002: * Copyright (c) 2000, 2005 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.ui.examples.javaeditor;
011:
012: import java.util.ArrayList;
013: import java.util.List;
014:
015: import org.eclipse.jface.text.rules.*;
016:
017: /**
018: * This scanner recognizes the JavaDoc comments and Java multi line comments.
019: */
020: public class JavaPartitionScanner extends RuleBasedPartitionScanner {
021:
022: public final static String JAVA_MULTILINE_COMMENT = "__java_multiline_comment"; //$NON-NLS-1$
023: public final static String JAVA_DOC = "__java_javadoc"; //$NON-NLS-1$
024: public final static String[] JAVA_PARTITION_TYPES = new String[] {
025: JAVA_MULTILINE_COMMENT, JAVA_DOC };
026:
027: /**
028: * Detector for empty comments.
029: */
030: static class EmptyCommentDetector implements IWordDetector {
031:
032: /* (non-Javadoc)
033: * Method declared on IWordDetector
034: */
035: public boolean isWordStart(char c) {
036: return (c == '/');
037: }
038:
039: /* (non-Javadoc)
040: * Method declared on IWordDetector
041: */
042: public boolean isWordPart(char c) {
043: return (c == '*' || c == '/');
044: }
045: }
046:
047: /**
048: *
049: */
050: static class WordPredicateRule extends WordRule implements
051: IPredicateRule {
052:
053: private IToken fSuccessToken;
054:
055: public WordPredicateRule(IToken successToken) {
056: super (new EmptyCommentDetector());
057: fSuccessToken = successToken;
058: addWord("/**/", fSuccessToken); //$NON-NLS-1$
059: }
060:
061: /*
062: * @see org.eclipse.jface.text.rules.IPredicateRule#evaluate(ICharacterScanner, boolean)
063: */
064: public IToken evaluate(ICharacterScanner scanner, boolean resume) {
065: return super .evaluate(scanner);
066: }
067:
068: /*
069: * @see org.eclipse.jface.text.rules.IPredicateRule#getSuccessToken()
070: */
071: public IToken getSuccessToken() {
072: return fSuccessToken;
073: }
074: }
075:
076: /**
077: * Creates the partitioner and sets up the appropriate rules.
078: */
079: public JavaPartitionScanner() {
080: super ();
081:
082: IToken javaDoc = new Token(JAVA_DOC);
083: IToken comment = new Token(JAVA_MULTILINE_COMMENT);
084:
085: List rules = new ArrayList();
086:
087: // Add rule for single line comments.
088: rules.add(new EndOfLineRule("//", Token.UNDEFINED)); //$NON-NLS-1$
089:
090: // Add rule for strings and character constants.
091: rules
092: .add(new SingleLineRule(
093: "\"", "\"", Token.UNDEFINED, '\\')); //$NON-NLS-2$ //$NON-NLS-1$
094: rules.add(new SingleLineRule("'", "'", Token.UNDEFINED, '\\')); //$NON-NLS-2$ //$NON-NLS-1$
095:
096: // Add special case word rule.
097: rules.add(new WordPredicateRule(comment));
098:
099: // Add rules for multi-line comments and javadoc.
100: rules.add(new MultiLineRule(
101: "/**", "*/", javaDoc, (char) 0, true)); //$NON-NLS-1$ //$NON-NLS-2$
102: rules
103: .add(new MultiLineRule(
104: "/*", "*/", comment, (char) 0, true)); //$NON-NLS-1$ //$NON-NLS-2$
105:
106: IPredicateRule[] result = new IPredicateRule[rules.size()];
107: rules.toArray(result);
108: setPredicateRules(result);
109: }
110: }
|