基于 JFace Text Framework 构建全功能代码编辑器: 第 9 部分:Template
2010-03-18 00:00:00 来源:WEB开发网我把 variableDeclaration 模版修改了一下,变成了“${variable} = ${integer} + ${integer} * ${factor}; ”。注意第二个参数和第三个参数名字是相同的。当你编辑第二个参数的时候,第三个参数周围不是一个空心矩形框,而是一个实心的蓝色背景,并且当你修改了第二个参数之后,第三个参数也跟着变了。
这些看上去很有趣的功能叫做 Linked Model(链式模型),其实就是把一些相关联的标注管理了起来,之所以叫链式模型,我个人认为可能有两个原因:
可以用 Tab 键在它们之间按先后顺序切换,好像一个链表一样
第二个参数改变会导致第三个参数也改变,也就是说第三个标注好像链接到了第二个标注上一样
为了实现这样一些功能,JTF 到底创建了多少种标注呢?看上去只有两种或者三种,实际上有四种,如下图所示:
图5. 标注类型
普通的空心矩形框表示的是 Target(目标)类型的标注,当一个 Target 类型的标注拥有焦点时,就成为了 Master(主)类型标注,也叫做Focus(焦点)类型标注。对于第三个参数,它和第二个参数名称相同,所以 JTF 为它创建了一个 Slave(从)类型标注。注意最后一个标注,我不是画线画的不准,而是在那个肉眼看不到的地方,还存在一个 Exit(退出)类型标注。这些词不是我发明的,如果你看看 LinkedPositionAnnotations 这个类就知道了。
将这些标注联系起来的管理方式,就叫做链式模型,由于它即牵涉到标注的管理,又牵涉到界面的绘制,所以在实现上采用了 MVC 的模式。LinkedModeModel 是模型部分,LinkedModeUI 是界面和控制部分。这两个类不是全部,还有很多其它的相关类,甚至是内部类,最有必要了解的是 LinkedModeUI.IExitPolicy 这个内部接口。一般来说,当你按下回车的时候,你会从模版编辑中退出来,这就是由 IExitPolicy 来判断的。所以,你可以定制退出的行为。Eclipse 里面有没有定制退出行为的例子呢?有的,在 Java 编辑器里,输入引号之后,编辑器会自动帮你插入另一个引号,如果你再输入一个引号,你不会看到三个引号,而是光标移到了自动插入的引号之后,假如你不继续输入引号,还是按回车,光标也会移到自动插入的引号之后。这就是自定义退出行为的例子,Java 编辑器会检查你输入的是什么引号,当你再按下它的时候,你就退出链式编辑状态了,Java 编辑器的这个功能同样适用于各种括号。这个功能,可以称为 Auto Completion(自动补全),我觉得还不能说它是JTF的标准特性之一,它只是链式模型的一个有趣的应用。
提示:如果你想要看看证据的话,浏览一下 CompilationUnitEditor 中的内部类 BracketInserter 和 ExitPolicy,这个类在 org.eclipse.jdt.ui 中。
所以,这种用 Tab 键在很多个标注之间导航的功能,不是模版的专利,你可以用在任何你想用的地方。比如:插入一个函数时,可以用链式模型管理函数的参数,就好像 Java 编辑器那样。至于如何做,TemplateProposal 已经给了你一个不错的例子。
结束语
在实现模版的过程中,我也顺便提及了一些相关概念,因为模版和其它的特性有着微妙的联系。下面是一些值得思考的问题:
试试看自定义模版参数
自定义 TemplateStore?没有什么不可以。
尝试使用多个模版上下文类型
想想看在什么场合可以使用链式模型这个有趣的功能呢
本文示例源代码或素材下载
更多精彩
赞助商链接