基于 JFace Text Framework 构建全功能代码编辑器: 第 9 部分:Template

Template(模版)是可以用来快速添加某种固定形式的代码,提高代码编辑的速度。模版和JTF的其它特性有或多或少的联系,比如内容提示,比如标注。本文介绍模版的相关概念,并给出一个简单的实现。

Template

Template (模版)可以用来快速添加某种固定形式的代码,中间还可以插入参数。对于 Java 编辑器来说,你可以在 Eclipse 的设置中找到相应的属性页,路径是 General->Java->Editor->Templates。这个属性页是Eclipse标准的模版属性页,因为它做的比较完 善,所以一般不需要自己写一个。

仔细探索一下这个属性页,尝试编辑一下模版,你可能会发现很多不了解的概念,下面我会一一解释

模版属性

模版包含一些基本属性:

  • Name(名称):这个模版的名字,必须唯一
  • Context(上下文):上下文是指这个模版可以在什么位置或者什么情况下出现,它相当于对模版做了一个粗略的分类。这个属性可以方便你在某些时候隐藏掉不需要显示的模版。
  • Description(描述):一段详细介绍模版功能的文字,还记得内容提示的时候可以通过 IInformationControl 显示一些帮助信息吗?这个属性很适合显示在那里。
  • Auto Insert(自动插入):当用户的输入只可能定位到一个模版的时候,是否自动把这个模版插入到编辑器中。不然还是提示用户选择一个模版插入,即使只有一个模版。

模版的定义

模 版可以通过扩展的方式定义,扩展点是 org.eclipse.ui.editors.templates,也可以通过属性页手动添加,也可以通过程序方式添加。通过扩展点添加的模版,可以认 为是“静态模版”,即缺省就存在的,后面两种方式则更灵活一些,但是稍微麻烦一点。

模版的存储

模 版是需要持久化的,它最终会被存放到一个XML文件里面。我们并不需要知道这个 XML 文件在哪里,格式是什么,这些事情被 TemplateStore 封装了,我们直接用它就行。在装载的模版的过程中,既要装载通过扩展点定义的模版,又要装载用户手动添加的模版,TemplateStore 只能装载通过扩展点定义的模版,所以一般是使用 TemplateStore 的子类 ContributionTemplateStore,它提供了装载用户自定义模版的能力。

模版参数

模 版中可以嵌入参数,即我们看到的 ${arg} 的形式。JTF 缺省定义了一些参数,程序员也可以自己定义参数。参数大致可以分为两种:自动解析式和输入式。自动解析的参数有 time,date 等等,这类参数在插入模版到编辑器的时候,会自动替换成相应的时间,日期等等。输入式的参数则相当于一个占位符,用户通过键盘输入替换掉参数内容。后面的 例子中不会演示自定义参数,有兴趣的读者可以看看 TemplateVariable,GlobalTemplateVariables和 TemplateVariableResolver 这些类。







实现模版功能

下面我来实现模版功能,然后能让模版在内容提示中出现。

定义模版上下文和缺省模版

首先通过扩展方式添加一个模版上下文类型,并且添加一个缺省的模版:


清单 1. 通过扩展点定义模版上下文
                
<extension
point="org.eclipse.ui.editors.templates">
<contextType
class="jtf.tutorial.template.ExprTemplateContextType"
id="jtf.tutorial.template.contextType"
name="Expr Template">
</contextType>
<template
autoinsert="true"
contextTypeId="jtf.tutorial.template.contextType"
description="Declare a variable"
id="jtf.tutorial.template.variableDeclaration"
name="variableDeclaration">
<pattern>
${variable} = ${integer}
</pattern>
</template>
</extension>

通过扩展方式还是很简单的,缺省的模版叫做“variableDeclaration”,它的信息都放在扩展定义里了,注意正确的方式应该是把一些字符串放到资源文件中,为了简单我没有这样做。

模版上下文类型需要一个实现类,在里面你可以管理你的模版参数,下面是 ExprTemplateContextType 的代码:


清单2. ExprTemplateContextType 实现
                
public class ExprTemplateContextType extends TemplateContextType {
public ExprTemplateContextType() {
addGlobalResolvers();
}

/**
* We add support for global variables
*/
private void addGlobalResolvers() {
addResolver(new GlobalTemplateVariables.Cursor());
addResolver(new GlobalTemplateVariables.WordSelection());
addResolver(new GlobalTemplateVariables.LineSelection());
addResolver(new GlobalTemplateVariables.Dollar());
addResolver(new GlobalTemplateVariables.Date());
addResolver(new GlobalTemplateVariables.Year());
addResolver(new GlobalTemplateVariables.Time());
addResolver(new GlobalTemplateVariables.User());
}
}

我添加了很多全局参数,所以我可以在编辑模版时看到它们,如下图所示:


本文转自:IBM developerWorks 中国

请点击此处查看全文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值