// Copyright (c) 2006 by Leif Frenzel <himself@leiffrenzel.de> // All rights reserved. package net.sf.eclipsefp.haskell.ui.internal.editors.cabal.text; import net.sf.eclipsefp.haskell.core.cabalmodel.CabalSyntax; import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin; import net.sf.eclipsefp.haskell.ui.internal.preferences.editor.IEditorPreferenceNames; import org.eclipse.jface.text.TextAttribute; 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.RuleBasedScanner; 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; /** <p>token scanner for the cabal file content.</p> * * @author Leif Frenzel */ public class CabalScanner extends RuleBasedScanner { public CabalScanner() { IRule[] rules= new IRule[] { createKeywordRule() }; setRules( rules ); } @Override public IToken nextToken() { return super.nextToken(); } // helping methods ////////////////// private IRule createKeywordRule() { ColorProvider cp=new ColorProvider( HaskellUIPlugin.getDefault().getPreferenceStore() ); Color keyColor = cp.getColor( IEditorPreferenceNames.EDITOR_KEYWORD_COLOR ); IToken token= new Token( new TextAttribute( keyColor, null, SWT.BOLD ) ); Color sectionColor = cp.getColor( IEditorPreferenceNames.EDITOR_CON_COLOR); IToken sectionToken= new Token( new TextAttribute( sectionColor, null, SWT.BOLD ) ); WordRule wordRule= new CaseInsensitiveWordRule( new SimpleWordDetector() ); for( CabalSyntax keyword: CabalSyntax.values() ) { if (keyword.isSectionHeader()){ wordRule.addWord( keyword.getCabalName(), sectionToken ); } else { wordRule.addWord( keyword.getCabalName() + ":", token ); //$NON-NLS-1$ } } wordRule.setColumnConstraint( 0 ); // only react if this is at the line beginning return wordRule; } // inner classes //////////////// private static final class SimpleWordDetector implements IWordDetector { // interface methods of IWordDetector ///////////////////////////////////// @Override public boolean isWordStart( final char ch ) { return isWordPart( ch ); } @Override public boolean isWordPart( final char ch ) { return !Character.isWhitespace( ch ); } } }