我正在编写一个Eclipse插件(Indigo / Juno),其中包含用于自定义文本格式的文本编辑器。我在这里关注本教程:http://www.realsolve.co.uk/site/tech/jface-text.php
到目前为止,我一切正常。 Eclipse将使用我的编辑器来编辑文件。我进行分区,破坏,修复,语法突出显示所有工作。
我添加了带有颜色选择器的首选项页面,以控制语法突出显示。它的工作原理基本上是正确的。如果我更新颜色,则下次打开或重新打开文件时,编辑器将使用它们。
我如何在不打开新标签的情况下获得编辑器标签来进行自我更新?内置的JDT Java编辑器可以执行此操作,但是到目前为止,我还无法解释其方式(这是一个非常大且复杂的编辑器)。
我知道我需要创建一个首选项监听器(http://www.vogella.com/articles/EclipsePreferences/article.html)。我已完成此操作,可以在设置断点时验证是否正在调用我的侦听器代码。
缺少的部分是侦听器与重新初始化编辑器之间的连接。我尝试重建分区逻辑,颜色逻辑,损坏/修复程序等,但是似乎没有任何效果。它要么无能为力,要么在最坏的情况下会损坏显示,直到将当前文本滚动到视图之外以使用旧颜色对其进行重新绘制为止。
有什么想法吗?
我认为SourceViewer.invalidatePresentation()
需要调用。
可能已经晚了,但是如果您愿意,可以使用LiClipse(http://brainwy.github.io/liclipse/)-它的目标之一就是轻松地针对Eclipse进行语法突出显示,基本代码完成,大纲等编辑器。
不需要Java技能即可添加新语言(通常在适当的位置创建新的.liclipse-这是一个YAML-文件,并创建一些基本规则来说明如何划分语言-例如:通常只是从注释和字符串中分离出代码-并指定分区中的关键字已经可以使您正确地突出显示语法)。
如果下载它,在plugins \ com.brainwy.liclipse.editor \ languages中有很多示例,并且在http://brainwy.github.io/liclipse/supported_languages.html和http://brainwy.github.io/liclipse/scope_definition.html中有一些有关如何操作的基本文档。
对于像我这样遇到的任何人:我的解决方案涉及将以下几行添加到“编辑器”的构造函数中
Activator.getActivator().getPreferenceStore().addPropertyChangeListener(new IPropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event) {
getSourceViewer().invalidateTextPresentation();
handlePreferenceStoreChanged(event);
}
});
然后创建扩展IToken的自定义类。在构造函数中,我传递首选项字段的String,然后在“ getObject”方法中,创建TextAttribute:以下代码段
public class MyToken extends Token implements IToken {
public MyToken(Object data) {
super(data);
}
@Override
public Object getData() {
String dataString = (String) super.getData();
return getAttributeFromColorName(dataString);
}
private TextAttribute getAttributeFromColorName(String preferenceField) {
Color color = new Color(Display.getCurrent(), StringConverter.asRGB(Activator.getActivator().getPreferenceStore().getString(preferenceField)));
return new TextAttribute(color);
}
}
[生成规则时,我将所有标记作为自定义类,这使我可以动态更改语法颜色。