参考:
http://dev.eclipse.org/newslists/news.eclipse.platform.rcp/msg01745.html
在非Editor中实现syntax coloring
Rainer wrote:
I hope this is the right place to ask this question:
It's fine; eclipse.platform would have been right as well.
I am working on a simple XML editing rich client. One of the main components is a JFace TextViewer, embedded in an Eclipse view (I can't use an Eclipse editor in my special case, unfortunately). I want to add syntax coloring, but can't seem to get the presentation reconciler to work.
Here's the sample code:
[...]
reconciler= new PresentationReconciler();
DefaultDamagerRepairer dr = new DefaultDamagerRepairer(new CodeRuleScanner());
dr.setDocument(viewer.getDocument());
reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
reconciler.install(viewer);
[..]
The CodeRuleScanner (extends RuleBasedScanner) is configured with a set of rules and a default token. However, the PresentationReconciler seems to be totally inactive. Is there any further configuration necessary?
No. If you look at the implementation of PresentationReconciler.install, you will see that it waits until the viewer's document is set (via an ITextInputListener). So, in order for the above to work, you have to set the document *after* installing the reconciler.
You should also look at SourceViewer that adds more features and configures itself in the right order using a SourceViewerConfiguration.
HTH, tom
正确的做法:
PresentationReconciler reconciler= new PresentationReconciler();
DefaultDamagerRepairer dr = new DefaultDamagerRepairer(new PolicyCodeScanner(new ColorProvider()));
reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
reconciler.install(sourceViewer);//PresentationReconciler.install必须在setDoucument之前,切记
//设置字体
sourceViewer.getTextWidget().setFont(new Font(sourceViewer.getControl().getDisplay(),
new FontData("Courier", 10, SWT.NORMAL)));
//设置当前编辑行的背景色
CursorLinePainter painter= new CursorLinePainter(sourceViewer);
painter.setHighlightColor(yellow);
sourceViewer.addPainter(painter);
//设置文档帮助
final ContentAssistant assistant = new ContentAssistant();
assistant.setContentAssistProcessor(new PolicyContentAssistProcessor(), IDocument.DEFAULT_CONTENT_TYPE);
assistant.install(sourceViewer);
//设置文本内容
sourceViewer.setDocument(new Document(this.content));
dr.setDocument(sourceViewer.getDocument());
另外:
注入config:
sourceViewer.configure(SourceViewerConfiguration configuration)