/**
* <copyright>
* </copyright>
*
*
*/
package org.reuseware.air.language.abstractsyntax.resource.as.ui;
/**
* An adapter from the Eclipse
* <code>org.eclipse.jface.text.rules.ITokenScanner</code> interface to the
* generated lexer.
*/
public class AsTokenScanner implements org.eclipse.jface.text.rules.ITokenScanner {
private org.reuseware.air.language.abstractsyntax.resource.as.IAsTextScanner lexer;
private org.reuseware.air.language.abstractsyntax.resource.as.IAsTextToken currentToken;
private int offset;
private String languageId;
private org.eclipse.jface.preference.IPreferenceStore store;
private org.reuseware.air.language.abstractsyntax.resource.as.ui.AsColorManager colorManager;
/**
*
* @param colorManager A manager to obtain color objects
*/
public AsTokenScanner(org.reuseware.air.language.abstractsyntax.resource.as.ui.AsColorManager colorManager) {
this.lexer = new org.reuseware.air.language.abstractsyntax.resource.as.mopp.AsMetaInformation().createLexer();
this.languageId = new org.reuseware.air.language.abstractsyntax.resource.as.mopp.AsMetaInformation().getSyntaxName();
this.store = org.reuseware.air.language.abstractsyntax.resource.as.ui.AsUIPlugin.getDefault().getPreferenceStore();
this.colorManager = colorManager;
}
public int getTokenLength() {
return currentToken.getLength();
}
public int getTokenOffset() {
return offset + currentToken.getOffset();
}
public org.eclipse.jface.text.rules.IToken nextToken() {
currentToken = lexer.getNextToken();
if (currentToken == null || !currentToken.canBeUsedForSyntaxHighlighting()) {
return org.eclipse.jface.text.rules.Token.EOF;
}
org.eclipse.jface.text.TextAttribute ta = null;
String tokenName = currentToken.getName();
if (tokenName != null) {
String enableKey = org.reuseware.air.language.abstractsyntax.resource.as.ui.AsSyntaxColoringHelper.getPreferenceKey(languageId, tokenName, org.reuseware.air.language.abstractsyntax.resource.as.ui.AsSyntaxColoringHelper.StyleProperty.ENABLE);
if (store.getBoolean(enableKey)) {
String colorKey = org.reuseware.air.language.abstractsyntax.resource.as.ui.AsSyntaxColoringHelper.getPreferenceKey(languageId, tokenName, org.reuseware.air.language.abstractsyntax.resource.as.ui.AsSyntaxColoringHelper.StyleProperty.COLOR);
org.eclipse.swt.graphics.Color color = colorManager.getColor(org.eclipse.jface.preference.PreferenceConverter.getColor(store, colorKey));
int style = org.eclipse.swt.SWT.NORMAL;
if (store.getBoolean(org.reuseware.air.language.abstractsyntax.resource.as.ui.AsSyntaxColoringHelper.getPreferenceKey(languageId, tokenName, org.reuseware.air.language.abstractsyntax.resource.as.ui.AsSyntaxColoringHelper.StyleProperty.BOLD))) {
style = style | org.eclipse.swt.SWT.BOLD;
}
if (store.getBoolean(org.reuseware.air.language.abstractsyntax.resource.as.ui.AsSyntaxColoringHelper.getPreferenceKey(languageId, tokenName, org.reuseware.air.language.abstractsyntax.resource.as.ui.AsSyntaxColoringHelper.StyleProperty.ITALIC))) {
style = style | org.eclipse.swt.SWT.ITALIC;
}
if (store.getBoolean(org.reuseware.air.language.abstractsyntax.resource.as.ui.AsSyntaxColoringHelper.getPreferenceKey(languageId, tokenName, org.reuseware.air.language.abstractsyntax.resource.as.ui.AsSyntaxColoringHelper.StyleProperty.STRIKETHROUGH))) {
style = style | org.eclipse.jface.text.TextAttribute.STRIKETHROUGH;
}
if (store.getBoolean(org.reuseware.air.language.abstractsyntax.resource.as.ui.AsSyntaxColoringHelper.getPreferenceKey(languageId, tokenName, org.reuseware.air.language.abstractsyntax.resource.as.ui.AsSyntaxColoringHelper.StyleProperty.UNDERLINE))) {
style = style | org.eclipse.jface.text.TextAttribute.UNDERLINE;
}
ta = new org.eclipse.jface.text.TextAttribute(color, null, style);
}
}
return new org.eclipse.jface.text.rules.Token(ta);
}
public void setRange(org.eclipse.jface.text.IDocument document, int offset, int length) {
this.offset = offset;
try {
lexer.setText(document.get(offset, length));
} catch (org.eclipse.jface.text.BadLocationException e) {
// ignore this error. It might occur during editing when locations are outdated
// quickly.
}
}
public String getTokenText() {
return currentToken.getText();
}
}