http://macrochen.iteye.com/category/8456
众所周知,Eclipse开发平台本身就是基于插件体系的,为了实现某个功能,我们可以在Eclipse的基础上以插件的方式添加我们需要的功能,bstekIDE就是这样实现的,同时我们还可以通过给插件增加扩展点,来给插件添加插件从而达到对已有插件进行扩展以及定制来适应我们的需要
为了提高bstekIDE的灵活性,我们给其增加了三个扩展点:com.bstek.ide.common.editor.generateNodeWizards,
com.bstek.ide.common.editor.generateJspWizards,
com.bstek.ide.common.editor.generateViewWizards.下面我们将分别对其进行讲解,帮助广大bstek用户来根据自己的需要在bstekIDE的基础上制作自己的插件
1.com.bstek.ide.common.editor.generateNodeWizards
在编辑view.xml文件的时候,我们会碰到以下几个问题:比如我们在添加一个DataTable
control节点的时候,通常的步骤是点击controls节点,然后从右键菜单中选择DataTable菜单项,添加节点之后,然后指定dataset属性,以及其他的一些属性,最后修改默认id值,而这个id值一般都是根据dataset来的,比如我们关联的dataset
id名为datasetEmployee,那么对应的DataTable的id名则为tableEmployee.通过该扩展点我们将简化这个过程,即提供一个新建DataTable
Control节点向导,向导中会根据我们的需要只列出我们通常会设置的属性,而且在我们在指定了dataset的值之后,自动生成对应的DataTable的id值.
要开发一个插件的过程非常简单,下面我们给出一个具体的实现过程:
注意在安装eclipse的时候,必须带有PDE插件模块,该插件模块是专门用来开发插件的
然后创建一个plug-in project, 指定工程名之后,一路next,直到finish即可,如下图所示
然后打开MANIFEST.MF文件,转到Dependencies设置页,添加依赖的插件工程,这里我们需要选择三个依赖插件:com.bstek.ide.common.editor,
com.bstek.ide.core, com.bstek.libraries.如下图:
接着是转到extensions设置页,点击add按钮,添加要使用的扩展点:com.bstek.ide.common.editor.generateNodeWizards,如下图所示:
在扩展点上点右键,选择new->wizard, 这里有两个属性设置:
name:使用向导生成节点的节点名,如果不是节点名,则是创建节点的右键菜单名
context:如果该向导不属于某个节点,那么则是某个节点的右键菜单,该属性用来指明节点的类型,通常就是rules.xml中某个rule的name值
比如要对新建DataTable节点使用wizard,那么name的值为Control-DataTable(这个值是从view-rules.xml中找到的),
而这里的context属性不用设置,context一般在一个向导中创建两个关联节点的时候才会用到,比如我们一次要创建Button和Command两个节点,这里我们的name值就是我们希望在右键菜单看到的菜单项,而context则是当前创建的这个菜单项是放在那个节点下的,比如Controls(这个值也是从view-rules.xml中取得)
然后是点击我们创建wizard节点,选择右键new->page,在wizard下添加一个page节点,这里面有四个属性需要进行设置:
context:指定当前编辑节点类型,这个值是xxx-rules.xml文件中rule节点的name属性值
reference:用来说明当前页中的id值是根据那个属性自动获得的,比如将该属性设置为dataset,则当前节点id属性值是根据reference的属性值使用指定的entryNameExtractingStrategy类来获取
self:指定当前编辑的节点是否为前一页所编辑节点的子节点,
true表示是,否则不是,默认是否
entryNameExtractingStrategy:指定的实现类用来说明将采用何种方式从reference属性值中得到当前新增节点的id值,如果没有指定,将使用com.bstek.ide.contributor.EntryNameExtractingByReferenceStrategy
作为默认实现类,该类将从reference中取得制定的值,并作为dataset的id进行解析来得到entryName,比如给定的reference是dataset,那么id值将从dataset属性中取得,如果dataset属性为datasetEmployee,那么默认情况下当前节点的id为"前缀+Employee",如tableEmployee
说明:这里的的self属性一般不用设置,一般需要用多个向导页面来创建一个节点的时候,在后续的页面设置中才使用,用来表明,当前的设置是针对第一个页面中创建的节点的,
reference一般都是dataset,因为该扩展点主要针对根据dataset创建control节点的情况,如果是针对dataset来创建的control的,那么entryNameExtractingStrategy属性一般也不用指定,用默认的就好
选择我们前面创建的节点,右键选择new->property,创建一个属性节点,这里只有一个属性需要设置:
name:指定属性名
这里是用来指定在当前的向导页面中要对那些属性进行设置,简单的说就是把一个节点的常用的属性集中到向导页面中来进行设置
这样针对com.bstek.ide.common.editor.generateNodeWizards的一个扩展就创建好了
下面的工作就是将当前的插件工程进行打包
选择当前工程,右键选择export->在列表中选择Plug-in
Develop,然后再选择Deployable plug-ins and fragment,
点击next按钮,在Destination选项卡中制定要发布的目录,这里可以随便制定,最后点击finish按钮,创建的插件是以jar的形式打包的,然后放到eclipse的plugins目录下就可以了
我们再次打开eclipse的时候,在xxx.view.xml文件中添加一个DataTable控件的时候,就不是以前我们那样添加直接新建一个节点,然后一个属性一个属性的设置了,而是把属性的设置放到向导页面中来做了,而且还能根据我们指定的dataset属性值来自动生成id值(如果该id值已经存在,它将给一个默认值)
下面是的扩展是一次创建两个节点(Button和QueryCommand)的设置,它将在点击Controls的右键菜单项下新建一个叫"QueryCommand
+ Button"的菜单项
-
<wizard
-
context="Controls"
-
name="QueryCommand + Button">
-
<page
-
context="Control-QueryCommand"
-
reference="conditionDataset">
-
<property name="queryDataset"/>
-
page>
-
<page
-
context="Control-Button"
-
reference="command">
-
<property name="value"/>
-
<property name="width"/>
-
page>
-
wizard>
2.com.bstek.ide.common.editor.generateViewWizards
有时候我们创建的view可能大同小异,比如针对单表操作的模块,唯一不同的可能在于dataset对应的数据库表不同而已,针对这种情况,我们一般想到的是提供一个模板,将变动的部分以参数的形式传递给模板引擎,最终生成我们需要的内容,这里我们提供了一个扩展点来让用户添加不同的模板.目前有各种不同的模板技术,这里我们使用的是velocity(http://velocity.apache.org/),该技术比较简单,可以通过它提供的文档熟悉其用法.
在我们前面创建的插件工程中,首先添加com.bstek.ide.common.editor.generateViewWizards扩展点,然后选中该扩展点,在右键菜单中选中new->template,创建template节点,这里有两个属性要设置:
name:对该模板的描述, 这里的名称可以随便取
file:指定相关的模板文件,该模板文件需要我们来创建一个,下面是我们使用到的模板文件:
xml 代码
-
<!---->xml version="1.0" encoding="UTF-8"?>
-
<view>
- <!---->
- ##定制变量
- #if(${datasetEntryId})
-
#set($datasetEntryId=${datasetEntryId})
- #else
-
#set($datasetEntryId="datasetEntry")
- #end
-
- #if(${datasetSearchId})
-
#set($datasetSearchId=${datasetSearchId})
- #else
-
#set($datasetSearchId="datasetSearch")
- #end
-
-->
-
<Datasets>
-
<Dataset type="Wrapper" id="${datasetEntryId}" wrappedType="AutoSql">
-
<MasterLink/>
-
<Fields/>
-
<Joins/>
-
<MatchRules/>
-
<SortRules/>
-
<Parameters/>
-
<Properties/>
-
Dataset>
-
<Dataset type="Form" id="${datasetSearchId}">
-
<MasterLink/>
-
<Fields/>
-
<Parameters/>
-
<Properties/>
-
Dataset>
-
Datasets>
-
<Controls>
-
<Control type="DataTable" dataset="${datasetEntryId}" height="100%" id="tblEntry" width="100%"/>
-
<Control type="AutoForm" id="frmSearch" dataset="${datasetSearchId}"/>
-
<Control id="btnSearch" command="cmdSearch" type="Button"/>
-
<Control id="cmdSearch" queryDataset="${datasetEntryId}" type="QueryCommand" conditionDataset="${datasetSearchId}">
-
<Parameters/>
-
Control>
-
<Control id="pltEntry" dataset="${datasetEntryId}" type="PagePilot"/>
-
Controls>
-
<Properties/>
-
view>
-
该文件中使用了velocity中的一些定义模板的语法,不懂之处可以参考velocity的相关文档,它定义了一个查询操作的通用view.xml模板,包括两个dataset,一个用于对查询表的封装,一个对查询autoform的封装,然后在control中创建了一个DataTable,用来显示查询结果,一个AutoForm,用来查询条件,一个Button+QueryCommand,提交AutoForm中的查询条件,以及一个分页控件PagePilot
在该模板文件中,我们指定了两个输入参数:datasetEntryId和datasetSearchId,为了将这两个参数值传递给模板,我们还需要给template节点添加两个parameter节点,节点的id为datasetEntryId和datasetSearchId
parameter有三个属性:
id:唯一标识符,用来与模板中要用到的变量对应
defaultValue:为模板中要使用的变量给一个默认值
options:有时候定义的变量值可能是一些固定的,比如如果是布尔值的时候就是true和false,该属性就是用来列出这些固定枚举值并用逗号分隔
这样我们就扩展点就做好了,打包发布到eclipse的plugins目录下之后在新建view的时候,我们的向导中就会出现我们添加的模板选项,选择并指定参数,就可以调用模板生成我们需要的view.xml文件
这里需要注意的是,在对插件工程进行打包的时候有几个设置要指定一下:
一个就是MANIFEST.MF文件中的build选项里面的Binary Build中要将模板所在的文件夹选中
在export设置中要将"Package plug-ins as individual JAR
archive"选中去掉,这样生成的就不是jar包而是以文件夹形式生成插件
3.com.bstek.ide.common.editor.generateJspWizards
既然view.xml文件可以做成模板,那么相应的,由该文件生成的jsp页面也可以采用模板的形式来产生jsp文件,除此之外,我们还可以定制不同的布局模板,然后在根据view.xml配置生成jsp的时候,将制定的control放到制定的布局位置中,而不是简单的将所有jsp可见的控件以自定义标签的形式在jsp中列出.
跟创建com.bstek.ide.common.editor.generateViewWizards类似,也是先添加com.bstek.ide.common.editor.generateJspWizards扩展点,然后在该扩展点下创建template节点,template的属性设置跟generateViewWizards一样,在parameter节点属性多了一个controlled属性,它用来标识该模板变量的值是否是当前要显示的所有控件id值(一个或者多个),默认为false,当为true的时候,该属性的值需要从control
id列表中来选择
这里我们定义了一个查询页面模板:
xml 代码
-
<%@ page contentType="text/html; charset=UTF-8"%>
-
#if( ${importTagLib} == "true" )
-
<%@ taglib uri="http://www.bstek.com/dorado" prefix="d"%>
- #end
-
<html>
-
<head>
-
<title>#if(${title})${title}#end</title>
-
</head>
-
<body scroll="${scroll}">
-
<d:View config="${config}">
-
<d:Layout type="border">
-
<d:Pane position="top">
-
<d:Layout type="border">
-
<d:Pane position="center">
-
#if(${searchForm})
-
${searchForm}
-
#end
-
</d:Pane>
-
<d:Pane position="bottom" align="right">
-
#if(${searchButton})
-
${searchButton}
-
#end
-
</d:Pane>
-
</d:Layout>
-
</d:Pane>
-
<d:Pane position="center">
-
-
<d:Layout type="border">
-
<d:Pane position="center">
-
#if(${searchTable})
-
${searchTable}
-
#end
-
</d:Pane>
-
<d:Pane position="bottom" align="right">
-
#if(${tablePilot})
-
${tablePilot}
-
#end
-
</d:Pane>
-
</d:Layout>
-
</d:Pane>
-
</d:Layout>
-
</d:View>
-
</body>
-
</html>
扩展点设置完之后,打包发布到eclipse的plugins目录下,当我们再次点击view.xml文件中的view节点,新建一个jsp页面的向导页面中就会多出两个页面,即一个选择模板,另一个就是为模板中指定的不同位置添加不同的view.xml配置文件中新建的control节点