在前面我介紹了在首選項中來對bstekIDE進行擴充(dorado studio插件定制擴充應用兩則 ),這個擴充隻能應付一些簡單的基于已有的,靜态的定制(比如修改字首,修改已有元件的屬性來得到一個新的元件等等),如果要實作更複雜的定制(比如通過自定義dataset,在加載資料的地方加入一些其他的業務資訊),則可以通過我們提供的擴充點(com.bstek.ide.core.viewRules)以插件的方式來進行定制擴充.
在dorado studio Swing版本中,為了做到對view-rules.xml進行定制,一般的步驟是:先将寫好的java打成jar包以及需要依賴的jar包放到studio的lib目錄下,然後把自定義user-view-rules.xml檔案放到studio的configs目錄下即可
在插件版本中的做法基本類似,下面我們就具體做法進行介紹
在2007-11-07之後我們推出的插件版本中增加了一個擴充點com.bstek.ide.core.viewRules,它就是用來實作user-view-rules.xml配置檔案的作用
首先我們需要先使用帶有插件開發功能的PDE插件的Eclipse建立一個插件工程,具體步驟,可以參考"bstekIDE Eclipse插件擴充點應用介紹 "這篇文章的介紹
建立好插件工程之後,打開MANIFEST.MF檔案,轉到Dependencies設定頁,添加依賴的插件工程,這裡我們需要選擇兩個依賴插件: com.bstek.ide.core, com.bstek.libraries
接着是轉到extensions設定頁,點選add按鈕,添加要使用的擴充點:com.bstek.ide.core.viewRules
如果你以前在dorado studio Swing版本下已經定義好了user-view-rules.xml檔案,那麼,我們可以直接将其copy到我們目前添加的擴充點下.但是還有一些小的地方需要修改
雖然dorado插件版和Swing版使用的xxx-view.xml配置檔案大部分情況下是一緻的,但是還是有少部分差別,一個是listener和objectClazz property定義加了個kind以及superClazz屬性,這裡的kind值目前均為java,而superClazz如同他的名字一樣,就是在給屬性dataset的listener屬性生成一個java類的時候,指定的父類,對于dataset的listener一般為"com.bstek.dorado.data.AbstractDatasetListener", 另一個是function的clazz屬性,在定義的時候注意一下差別,比如:
xml 代碼
- <function text="Open Listener" icon="java/java.png" clazz="com.bstek.designer.impl.module.ShowDatasetListenerClassFunction"/>需要改成
- <function text="Open Listener" icon="java/java.png" clazz="com.bstek.ide.action.OpenListenerAction"/>
而 < property name = "listener" /> < property name = "objectClazz" type = "java.lang.String" /> 需要改成 < property name = "listener" kind = "java" superClazz = "com.bstek.dorado.data.AbstractDatasetListener" /> < property name = "objectClazz" type = "java.lang.String" kind = "java" />
對于dataset來說,如果你的dataset的object屬性指定的類是從com.bstek.dorado.data.db.AutoSqlDataset繼承過來的,那麼"Auto create fields"這個function的clazz屬性要保持跟Dataset-AutoSql裡面的"Auto create fields" function一緻,其他的以此類推,如果是直接從AbstractViewDataset繼承的,則function的clazz需要設定為com.bstek.ide.action.GenerateViewDatasetFieldAction
下面是我們為了與synchroflow工作流進行整合而自定義的幾個dataset的plugin.xml配置檔案
xml 代碼
- xml version="1.0" encoding="UTF-8"?>
- eclipse version="3.2"?>
- <plugin>
- <extension
- point="com.bstek.ide.core.viewRules">
- <rules>
- <rule name="Datasets">
- <children>
- <child name="Dataset-SCFUserDataset" insertable="true" defaultNamePrefix="dataset"/>
- <child name="Dataset-SCFProDefDataset" insertable="true" defaultNamePrefix="dataset"/>
- <child name="Dataset-SCFProInsDataset" insertable="true" defaultNamePrefix="dataset"/>
- <child name="Dataset-SCFRelDataset" insertable="true" defaultNamePrefix="dataset"/>
- <child name="Dataset-SCFWorkItemDataset" insertable="true" defaultNamePrefix="dataset"/>
- children>
- rule>
- <rule name="Dataset-SCFUserDataset" text="SCFUserDataset" tagName="Dataset" object="com.bstek.dorado.synchroflow.dataset.SCFUserDataset" nameAttribute="id" editable="true" icon="view/scf/synchroflow.png" expanded="true" eventSet="Dataset">
- <properties>
- <property name="id" required="true"/>
- <property name="listener" kind = "java" superClazz="com.bstek.dorado.data.AbstractDatasetListener"/>
- <property name="state" visible="false"/>
- <property name="type" visible="false" defaultValue="SCFUserDataset"/>
- <property name="objectClazz" type="java.lang.String" kind="java"/>
- <property name="autoLoadData" defaultValue="false"/>
- <property name="insertOnEmpty" defaultValue="true"/>
- properties>
- <children>
- <child name="MasterLink" fixed="true"/>
- <child name="Fields-Base" fixed="true"/>
- <child name="Parameters" fixed="true"/>
- <child name="Properties" fixed="true"/>
- children>
- <functions>
- <function text="Auto create fields" icon="module/list-field.png" clazz="com.bstek.ide.action.GenerateViewDatasetFieldAction"/>
- <function text="Open Listener" icon="java/java.png" clazz="com.bstek.ide.action.OpenListenerAction"/>
- functions>
- rule>
- <rule name="Dataset-SCFProDefDataset" text="SCFProDefDataset" tagName="Dataset" object="com.bstek.dorado.synchroflow.dataset.SCFProDefDataset" nameAttribute="id" editable="true" icon="view/scf/synchroflow.png" expanded="true" eventSet="Dataset">
- <properties>
- <property name="id" required="true"/>
- <property name="listener" kind = "java" superClazz="com.bstek.dorado.data.AbstractDatasetListener"/>
- <property name="state" visible="false"/>
- <property name="type" visible="false" defaultValue="SCFProDefDataset"/>
- <property name="objectClazz" type="java.lang.String" kind="java"/>
- properties>
- <children>
- <child name="MasterLink" fixed="true"/>
- <child name="Fields-Base" fixed="true"/>
- <child name="Parameters" fixed="true"/>
- <child name="Properties" fixed="true"/>
- children>
- <functions>
- <function text="Auto create fields" icon="module/list-field.png" clazz="com.bstek.ide.action.GenerateViewDatasetFieldAction"/>
- <function text="Open Listener" icon="java/java.png" clazz="com.bstek.ide.action.OpenListenerAction"/>
- functions>
- rule>
- <rule name="Dataset-SCFProInsDataset" text="SCFProInsDataset" tagName="Dataset" object="com.bstek.dorado.synchroflow.dataset.SCFProInsDataset" nameAttribute="id" editable="true" icon="view/scf/synchroflow.png" expanded="true" eventSet="Dataset">
- <properties>
- <property name="id" required="true"/>
- <property name="listener" kind = "java" superClazz="com.bstek.dorado.data.AbstractDatasetListener"/>
- <property name="state" visible="false"/>
- <property name="type" visible="false" defaultValue="SCFProInsDataset"/>
- <property name="objectClazz" type="java.lang.String" kind="java"/>
- properties>
- <children>
- <child name="MasterLink" fixed="true"/>
- <child name="Fields-Base" fixed="true"/>
- <child name="Parameters" fixed="true"/>
- <child name="Properties" fixed="true"/>
- children>
- <functions>
- <function text="Auto create fields" icon="module/list-field.png" clazz="com.bstek.ide.action.GenerateViewDatasetFieldAction"/>
- <function text="Open Listener" icon="java/java.png" clazz="com.bstek.ide.action.OpenListenerAction"/>
- functions>
- rule>
- <rule name="Dataset-SCFRelDataset" text="SCFRelDataset" tagName="Dataset" object="com.bstek.dorado.synchroflow.dataset.SCFRelDataset" nameAttribute="id" editable="true" icon="view/scf/synchroflow.png" expanded="true" eventSet="Dataset">
- <properties>
- <property name="id" required="true"/>
- <property name="listener" kind = "java" superClazz="com.bstek.dorado.data.AbstractDatasetListener"/>
- <property name="state" visible="false"/>
- <property name="type" visible="false" defaultValue="SCFRelDataset"/>
- <property name="objectClazz" type="java.lang.String" kind="java"/>
- <property name="autoLoadData" defaultValue="false"/>
- <property name="insertOnEmpty" defaultValue="true"/>
- properties>
- <children>
- <child name="MasterLink" fixed="true"/>
- <child name="Fields-Base" fixed="true"/>
- <child name="Parameters" fixed="true"/>
- <child name="Properties" fixed="true"/>
- children>
- <functions>
- <function text="Auto create fields" icon="module/list-field.png" clazz="com.bstek.ide.action.GenerateViewDatasetFieldAction"/>
- <function text="Open Listener" icon="java/java.png" clazz="com.bstek.ide.action.OpenListenerAction"/>
- functions>
- rule>
- <rule name="Dataset-SCFWorkItemDataset" text="SCFWorkItemDataset" tagName="Dataset" object="com.bstek.dorado.synchroflow.dataset.SCFWorkItemDataset" nameAttribute="id" editable="true" icon="view/scf/synchroflow.png" expanded="true" eventSet="Dataset">
- <properties>
- <property name="id" required="true"/>
- <property name="listener" kind = "java" superClazz="com.bstek.dorado.data.AbstractDatasetListener"/>
- <property name="state" visible="false"/>
- <property name="type" visible="false" defaultValue="SCFWorkItemDataset"/>
- <property name="objectClazz" type="java.lang.String" kind="java"/>
- properties>
- <children>
- <child name="MasterLink" fixed="true"/>
- <child name="Fields-Base" fixed="true"/>
- <child name="Parameters" fixed="true"/>
- <child name="Properties" fixed="true"/>
- children>
- <functions>
- <function text="Auto create fields" icon="module/list-field.png" clazz="com.bstek.ide.action.GenerateViewDatasetFieldAction"/>
- <function text="Open Listener" icon="java/java.png" clazz="com.bstek.ide.action.OpenListenerAction"/>
- functions>
- rule>
- rules>
- extension>
- plugin>
在這個插件配置檔案中<rules></rules>節點下的配置基本上跟我們以前在Swing版本下的配置一樣.
在自定義的dataset中,我們使用到了一些自己定義的java類,這些java類已經打包,為了插件能調用到,我們需要在目前工程下建立一個檔案夾lib,然後将我們的java檔案打成的jar包以及相關的依賴jar包放到lib目錄下.此外,還給我們自定義的dataset一個新的圖示,這個我們也要添加到目前工程下
在打包前,我們還需要對我們引用的jar包進行一下設定
打開MANIFEST.MF檔案,轉到Runtime設定頁的classpath選項,點選"add"按鈕,選中我們添加的兩個jar包,得到如下的設定
因為預設情況下在build的時候不會包含我們添加的資源檔案,是以我們應該在Build選項頁的"Binary Build"中将view檔案夾選中
最後一步就是打包(選中工程,選擇右鍵"export..."->"Plugin-in Development"->"Deployable plug-ins and fragment"選項,然後next->finish),因為我們這裡使用圖檔資源檔案,是以在打包的時候需要将"Package plug-ins as individual JAR archive"選項去掉,打包成檔案夾的形式
将打包完成的插件放到Eclipse安裝目錄下的plugins檔案夾中,重新啟動Eclipse即可