// Copyright (c) 2006 by Leif Frenzel <himself@leiffrenzel.de>
// All rights reserved.
package net.sf.eclipsefp.haskell.ui.internal.editors.cabal.text;
import java.util.Iterator;
import org.eclipse.jface.text.rules.ICharacterScanner;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.IWordDetector;
import org.eclipse.jface.text.rules.Token;
import org.eclipse.jface.text.rules.WordRule;
/** <p>a modified WordRule that also detects words if they are in different
* case.</p>
*
* @author Leif Frenzel
*/
public class CaseInsensitiveWordRule extends WordRule {
public CaseInsensitiveWordRule( final IWordDetector detector ) {
super( detector );
}
public CaseInsensitiveWordRule( final IWordDetector detector,
final IToken defaultToken ) {
super( detector, defaultToken );
}
@Override
public IToken evaluate( final ICharacterScanner scanner ) {
// took the superclass functionality and accept now also words that have not the
// exact same case as those in the map
int c= scanner.read();
if (c != ICharacterScanner.EOF) {
if (fColumn == UNDEFINED || (fColumn == scanner.getColumn() - 1)) {
while (c != ICharacterScanner.EOF && Character.isWhitespace( (char )c)){
c= scanner.read();
}
if (fDetector.isWordStart((char) c)) {
StringBuilder fBuffer = new StringBuilder();
do {
fBuffer.append((char) c);
c= scanner.read();
} while (c != ICharacterScanner.EOF && fDetector.isWordPart((char) c));
scanner.unread();
IToken token= findToken( fBuffer );
if (token != null) {
return token;
}
if (fDefaultToken.isUndefined()) {
for (int i= fBuffer.length() - 1; i >= 0; i--) {
scanner.unread();
}
}
return fDefaultToken;
}
}
}
scanner.unread();
return Token.UNDEFINED;
}
// helping methods
//////////////////
private IToken findToken( final StringBuilder sb ) {
String content = sb.toString();
IToken result = ( IToken )fWords.get( content );
if( result == null ) {
Iterator<?> it = fWords.keySet().iterator();
while( result == null && it.hasNext() ) {
String candidate = ( String )it.next();
if( candidate.equalsIgnoreCase( content ) ) {
result = ( IToken )fWords.get( candidate );
}
}
}
return result;
}
}