/*******************************************************************************
* Copyright (c) 2008, 2012 Symbian Software Systems 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:
* Andrew Ferguson (Symbian) - Initial implementation
*******************************************************************************/
package org.eclipse.cdt.ui.text.doctools.generic;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.rules.BufferedRuleBasedScanner;
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.WordRule;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.cdt.ui.PreferenceConstants;
import org.eclipse.cdt.ui.text.ICTokenScanner;
import org.eclipse.cdt.ui.text.ITokenStore;
import org.eclipse.cdt.ui.text.ITokenStoreFactory;
import org.eclipse.cdt.internal.ui.text.TaskTagRule;
/**
* ICTokenScanner which recognizes a specified set of tags, starting with a specified name.
* It is assumed this will be used within a single-line or multi-line comment context.
* @since 5.0
* @noextend This class is not intended to be subclassed by clients.
*/
public class GenericTagCommentScanner extends BufferedRuleBasedScanner implements ICTokenScanner {
protected TaskTagRule fTaskTagRule;
protected IPreferenceStore fCorePreferenceStore;
protected String fDefaultTokenProperty;
protected String fTagToken;
protected GenericDocTag[] fTags;
protected char[] fTagMarkers;
protected ITokenStore fTokenStore;
/**
* @param tags the tags to be recognized and highlighted by this scanner
* @param tagMarkers the character prefixes that denote the start of a tag
* @param tokenStoreFactory the token store factory used to store tokens
* @param docToken the token id associated with the enclosing comment
* @param tagToken the token id associated with highlighting any recognized tags
*/
public GenericTagCommentScanner(GenericDocTag[] tags, char[] tagMarkers, ITokenStoreFactory tokenStoreFactory, String docToken, String tagToken) {
Assert.isNotNull(tags);
Assert.isNotNull(tagMarkers);
fTags= tags;
fTagMarkers= tagMarkers;
fTagToken= tagToken;
fTokenStore= tokenStoreFactory.createTokenStore(mkArray(docToken, tagToken));
fDefaultTokenProperty= docToken;
setRules(createRules());
}
/*
* @see org.eclipse.jface.text.rules.RuleBasedScanner#nextToken()
*/
@Override
public IToken nextToken() {
fTokenStore.ensureTokensInitialised();
return super.nextToken();
}
/**
* @return the rules to use in this scanner
*/
protected IRule[] createRules() {
List<IRule> result= new ArrayList<IRule>();
class TagDetector implements IWordDetector {
@Override
public boolean isWordStart(char c) {
for (int i= 0; i < fTagMarkers.length; i++)
if (fTagMarkers[i] == c)
return true;
return false;
}
@Override
public boolean isWordPart(char c) {
return c == '.' || Character.isJavaIdentifierPart(c);
}
}
setDefaultReturnToken(fTokenStore.getToken(fDefaultTokenProperty));
WordRule wr= new WordRule(new TagDetector(), fDefaultReturnToken);
for (int i= 0; i < fTags.length; i++) {
String wd= fTags[i].getTagName();
for (int j= 0; j < fTagMarkers.length; j++) {
wr.addWord(fTagMarkers[j] + wd, fTokenStore.getToken(fTagToken));
}
}
result.add(wr);
// Add rule for Task Tags.
fTaskTagRule= new TaskTagRule(fTokenStore.getToken(PreferenceConstants.EDITOR_TASK_TAG_COLOR),
fDefaultReturnToken, fTokenStore.getPreferenceStore(), fCorePreferenceStore);
result.add(fTaskTagRule);
return result.toArray(new IRule[result.size()]);
}
/*
* @see org.eclipse.cdt.internal.ui.text.AbstractJavaScanner#affectsBehavior(org.eclipse.jface.util.PropertyChangeEvent)
*/
@Override
public boolean affectsBehavior(PropertyChangeEvent event) {
return fTaskTagRule.affectsBehavior(event) || fTokenStore.affectsBehavior(event);
}
/*
* @see org.eclipse.cdt.internal.ui.text.AbstractJavaScanner#adaptToPreferenceChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
@Override
public void adaptToPreferenceChange(PropertyChangeEvent event) {
if (fTokenStore.affectsBehavior(event)) {
fTokenStore.adaptToPreferenceChange(event);
}
fTaskTagRule.adaptToPreferenceChange(event);
}
private static String[] mkArray(String defaultTokenProperty, String tagToken) {
return new String[] { defaultTokenProperty, tagToken, PreferenceConstants.EDITOR_TASK_TAG_COLOR };
}
}