基于 JFace Text Framework 构建全功能代码编辑器: 第 2 部分:Syntax Highlight
2010-03-18 00:00:00 来源:WEB开发网可见通过这个接口,JTF 可以遍历所有的符号并且得到符号的偏移和长度信息。所以实现这个接口是一个实质性的工作。但是 JTF 怎么知道如何去渲染不同的文本呢?为了解决这个问题,JTF 也提供了一个 IToken 接口,并且有一个基本的实现类 Token。注意 ANTLR 里面也有 Token 这个类,两者的概念类似,只不过用法不同。JTF 的 Token 可以附带一些自定义的对象,我们可以把文本的属性,比如前景背景字体样式等等,都放到 Token 里面,这样 JTF 就知道该如何渲染文本了。这些文本属性也被 JTF 包装成了一个 TextAttribute 类,我们在构造 Token 之后的传入 TextAttribute 对象就可以了。
既然我们有了 TokenList 这样的基础类,实现 ITokenScanner 就是很简单的事了,我们看看 ExprTokenScanner 的代码:
清单 2. ExprTokenScanner 实现了 ITokenScanner
public class ExprTokenScanner implements ITokenScanner {
/*
* JFace token type definition
*/
private static IToken VARIABLE = new Token(
new TextAttribute(ColorManager.getInstance().getColor(IColorConstants.VARIABLE)));
private static IToken INTEGER = new Token(
new TextAttribute(ColorManager.getInstance().getColor(IColorConstants.INTEGER)));
private static IToken DEFAULT = new Token(
new TextAttribute(ColorManager.getInstance().getColor(IColorConstants.DEFAULT)));
// character offset
private int offset;
// last token returned by nextToken()
private CommonToken lastToken;
// token list
private TokenList tokenList;
public ExprTokenScanner() {
offset = 0;
}
public int getTokenLength() {
return lastToken.getStopIndex() - lastToken.getStartIndex() + 1;
}
public int getTokenOffset() {
return lastToken.getStartIndex();
}
public IToken nextToken() {
if(lastToken == null)
lastToken = tokenList.getToken(offset);
else
lastToken = tokenList.getNextToken(lastToken);
if(lastToken == null)
return Token.UNDEFINED;
switch(lastToken.getType()) {
case IExprTokens.ID:
return VARIABLE;
case IExprTokens.INT:
return INTEGER;
case org.antlr.runtime.Token.EOF:
return Token.EOF;
default:
return DEFAULT;
}
}
public void setRange(IDocument document, int offset, int length) {
lastToken = null;
this.offset = offset;
tokenList = TokenManager.getTokenList(document);
}
}
更多精彩
赞助商链接