基于 JFace Text Framework 构建全功能代码编辑器: 第 4 部分:Content Assistant
2010-03-18 00:00:00 来源:WEB开发网快捷键
用过 Java 编辑器的应该知道,内容提示可以用热键进行呼出,这个热键可以在 Eclipse 的设置里找到,以 Eclipse 3.3 为例,我们在设置中找到 General->Keys,然后在 filter 中输入 Content Assist 即可找到。为了能够让快捷键对我们的编辑器也有效果,需要安装一个 Handle 来处理它。这部分内容超出了本文的范围,所以我就不详细解释了。大家可以发现 ExprViewer 中多了一些成员和方法,比如 createHandlers 方法,它们都是为了处理快捷键而准备的。
效果
到这里为止,一个很基本的内容提示就完成了,下图是它的效果:
图 2. 内容提示效果图
查看原图(大图)
Information Control
回过头来看看上一节中我卖的关子:ContentAssistant 设置了一个 IInformationControlCreator。从字面上很好理解,Information Control(信息控件)就是用来显示信息的一个控件,而 IInformationControlCreator 就是创建控件的工厂了。信息控件可以用来显示任何信息,在内容提示的情况下,显示的就是 Additional Info。这个控件可以使用任何形式,那么里面的内容也就根据控件的能力可以有不同的变化。比如,你可以用一个浏览器控件来显示信息,这样的话,你的信息可以用HTML来写。在例子中,我们用的是 JTF 的缺省实现:DefaultInformationControl,它内部使用的是 StyledText 控件。它虽然用的不是浏览器,但是它内部提供了一个信息渲染接口:IInformationPresenter。如果你使用 HTMLTextPresenter,它可以支持你在信息中嵌入 HTML 标签。
由于信息控件是一个通用的部件,它被广泛的用在其它需要显示信息的地方,比如我们以后会提到的Text Hover(文本悬浮帮助)。同时由于JTF使用了一系列的接口来抽象信息控件的功能,因此可以很方便的实现自己的信息控件。
结束语
正如我所说,本文的例子是很基本的,有很多可以提高的地方,这些高级的功能留给有兴趣的读者完成。这里给出一些我能想到的问题以供参考:
内容提示只是显示所有的变量,它不会根据用户已经输入的内容来提示。比如有两个变量 test 和 haha,如果用户输入了“te”再激活内容提示,那么我们应该只提示 test。这个并非难事,我们有 TokenList 来帮助我们得到符号信息。
列出的 Proposal 没有图标,只有文字,这是一个小问题。学习了本文之后,你能立刻想起来要加个图标应该修改哪里吗?
对于 Proposal Popup:我们没有定制,可以尝试像 Java 编辑器那样给它底部加上些提示
对于信息控件,用的是缺省实现。可以尝试使用浏览器,然后使用 HTML 显示帮助信息,看上去效果会更好。
对于 IContentAssistProcessor,我们没有实现其它方法,比如上下文信息,自动激活。
要使内容提示功能达到和 Java 编辑器一样的高度,还是要花一些精力的。我一向提倡先了解基本概念,再深入具体细节。希望本文可以作为大家的起点,最终构造出一个专业的内容提示模块。
本文示例源代码或素材下载
更多精彩
赞助商链接