基于 JFace Text Framework 构建全功能代码编辑器: 第 5 部分:Text Decoration
2010-03-18 00:00:00 来源:WEB开发网我只列出了这个最关键的方法。它的基本流程是:
做一些必要的检查
得到之前已经存在的错误标注
解析源代码,得到错误列表
为每个错误创建一个 ExprAnnotation,并把标注类型设为错误类型
通过 replaceAnnotations 批量刷新标注
需要解释一下的是第 5 步,为什么要用 replaceAnnotations?主要还是出于性能的考虑,因为你每次添加删除一个标注,都会触发一系列的连锁反应,所以如果你一个个的添加删除,速度会非常慢。replaceAnnotations 解决了这个问题,因为它是一次全部替换。但是这个方法是 IAnnotationModelExtension 接口里面的,为了保险起见,需要先检查类型。当然我们这个例子很简单,并没有显著的性能问题。
效果
下面是运行后的效果,假如我没有输入分号,错误的标注就显示出来了。
图2. 文本装饰效果图
结束语
让我来指出还是做的不够的地方吧:
错误检测太过简单,比如不能标注出未声明的变量。要做一个专业的代码编辑器的话,错误检测可不能这样简单。
语法检查是在文本内容发生变化后立刻触发,当源代码越来越多的时候,这很可能造成性能问题。我们可以从很多方面想办法,比如提高语法解析器的效率,或者减少不必要的语法检查次数,可以考虑用定时器,当用户隔一段时间没有输入动作时再进行语法检查。最好的办法是使用 Reconciler,关于 Reconciler 的概念会在本系列的第 11 部分中提到。
我没有自定义标注类型,用的是 Eclipse 自带的类型。那么不妨尝试一下定义自己的标注类型,可以通过 org.eclipse.ui.editors.annotationTypes 扩展点。
我也没有自定义标注的渲染方式,用 IDrawingStrategy 尝试画一个很酷的标注吧。要分两步走,实现 IDrawingStrategy,然后注册你的 IDrawingStrategy。
我用的是标准的垂直标尺,尝试实现一个自己的标尺,把标注画到上面。
标注只有界面上的提示,没有任何文字上的信息,用户很难知道到底是什么错误。不过不要担心,这是因为我还没有提到 Text Hover(文本悬浮帮助),以后的文章将完善这个功能。
这些不足的地方留给有兴趣的读者。
本文示例源代码或素材下载
更多精彩
赞助商链接