天天看點

插件進階應用---通過擴充點自定義元件

      在前面我介紹了在首選項中來對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 代碼 

  1. <function text="Open Listener" icon="java/java.png" clazz="com.bstek.designer.impl.module.ShowDatasetListenerClassFunction"/>需要改成   
  2. <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 代碼

  1. xml version="1.0" encoding="UTF-8"?>  
  2. eclipse version="3.2"?>  
  3. <plugin>  
  4.    <extension  
  5.          point="com.bstek.ide.core.viewRules">  
  6.       <rules>  
  7.  <rule name="Datasets">  
  8.   <children>  
  9.    <child name="Dataset-SCFUserDataset" insertable="true" defaultNamePrefix="dataset"/>  
  10.    <child name="Dataset-SCFProDefDataset" insertable="true" defaultNamePrefix="dataset"/>  
  11.    <child name="Dataset-SCFProInsDataset" insertable="true" defaultNamePrefix="dataset"/>  
  12.    <child name="Dataset-SCFRelDataset" insertable="true" defaultNamePrefix="dataset"/>  
  13.    <child name="Dataset-SCFWorkItemDataset" insertable="true" defaultNamePrefix="dataset"/>  
  14.   children>  
  15.  rule>  
  16.  <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">  
  17.   <properties>  
  18.    <property name="id" required="true"/>  
  19.    <property name="listener" kind = "java" superClazz="com.bstek.dorado.data.AbstractDatasetListener"/>  
  20.    <property name="state" visible="false"/>  
  21.    <property name="type" visible="false" defaultValue="SCFUserDataset"/>  
  22.    <property name="objectClazz" type="java.lang.String" kind="java"/>  
  23.    <property name="autoLoadData"  defaultValue="false"/>  
  24.    <property name="insertOnEmpty"  defaultValue="true"/>  
  25.   properties>  
  26.   <children>  
  27.    <child name="MasterLink" fixed="true"/>  
  28.    <child name="Fields-Base" fixed="true"/>  
  29.    <child name="Parameters" fixed="true"/>  
  30.    <child name="Properties" fixed="true"/>  
  31.   children>  
  32.   <functions>  
  33.    <function text="Auto create fields" icon="module/list-field.png" clazz="com.bstek.ide.action.GenerateViewDatasetFieldAction"/>  
  34.    <function text="Open Listener" icon="java/java.png" clazz="com.bstek.ide.action.OpenListenerAction"/>  
  35.   functions>  
  36.  rule>  
  37.  <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">  
  38.   <properties>  
  39.    <property name="id" required="true"/>  
  40.    <property name="listener" kind = "java" superClazz="com.bstek.dorado.data.AbstractDatasetListener"/>  
  41.    <property name="state" visible="false"/>  
  42.    <property name="type" visible="false" defaultValue="SCFProDefDataset"/>  
  43.    <property name="objectClazz" type="java.lang.String" kind="java"/>  
  44.   properties>  
  45.   <children>  
  46.    <child name="MasterLink" fixed="true"/>  
  47.    <child name="Fields-Base" fixed="true"/>  
  48.    <child name="Parameters" fixed="true"/>  
  49.    <child name="Properties" fixed="true"/>  
  50.   children>  
  51.   <functions>  
  52.    <function text="Auto create fields" icon="module/list-field.png" clazz="com.bstek.ide.action.GenerateViewDatasetFieldAction"/>  
  53.    <function text="Open Listener" icon="java/java.png" clazz="com.bstek.ide.action.OpenListenerAction"/>  
  54.   functions>  
  55.  rule>  
  56.  <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">  
  57.   <properties>  
  58.    <property name="id" required="true"/>  
  59.    <property name="listener" kind = "java" superClazz="com.bstek.dorado.data.AbstractDatasetListener"/>  
  60.    <property name="state" visible="false"/>  
  61.    <property name="type" visible="false" defaultValue="SCFProInsDataset"/>  
  62.    <property name="objectClazz" type="java.lang.String" kind="java"/>  
  63.   properties>  
  64.   <children>  
  65.    <child name="MasterLink" fixed="true"/>  
  66.    <child name="Fields-Base" fixed="true"/>  
  67.    <child name="Parameters" fixed="true"/>  
  68.    <child name="Properties" fixed="true"/>  
  69.   children>  
  70.   <functions>  
  71.    <function text="Auto create fields" icon="module/list-field.png" clazz="com.bstek.ide.action.GenerateViewDatasetFieldAction"/>  
  72.    <function text="Open Listener" icon="java/java.png" clazz="com.bstek.ide.action.OpenListenerAction"/>  
  73.   functions>  
  74.  rule>  
  75.  <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">  
  76.   <properties>  
  77.    <property name="id" required="true"/>  
  78.    <property name="listener" kind = "java" superClazz="com.bstek.dorado.data.AbstractDatasetListener"/>  
  79.    <property name="state" visible="false"/>  
  80.    <property name="type" visible="false" defaultValue="SCFRelDataset"/>  
  81.    <property name="objectClazz" type="java.lang.String" kind="java"/>  
  82.    <property name="autoLoadData"  defaultValue="false"/>  
  83.    <property name="insertOnEmpty"  defaultValue="true"/>  
  84.   properties>  
  85.   <children>  
  86.    <child name="MasterLink" fixed="true"/>  
  87.    <child name="Fields-Base" fixed="true"/>  
  88.    <child name="Parameters" fixed="true"/>  
  89.    <child name="Properties" fixed="true"/>  
  90.   children>  
  91.   <functions>  
  92.    <function text="Auto create fields" icon="module/list-field.png" clazz="com.bstek.ide.action.GenerateViewDatasetFieldAction"/>  
  93.    <function text="Open Listener" icon="java/java.png" clazz="com.bstek.ide.action.OpenListenerAction"/>  
  94.   functions>  
  95.  rule>  
  96.  <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">  
  97.   <properties>  
  98.    <property name="id" required="true"/>  
  99.    <property name="listener" kind = "java" superClazz="com.bstek.dorado.data.AbstractDatasetListener"/>  
  100.    <property name="state" visible="false"/>  
  101.    <property name="type" visible="false" defaultValue="SCFWorkItemDataset"/>  
  102.    <property name="objectClazz" type="java.lang.String" kind="java"/>  
  103.   properties>  
  104.   <children>  
  105.    <child name="MasterLink" fixed="true"/>  
  106.    <child name="Fields-Base" fixed="true"/>  
  107.    <child name="Parameters" fixed="true"/>  
  108.    <child name="Properties" fixed="true"/>  
  109.   children>  
  110.   <functions>  
  111.    <function text="Auto create fields" icon="module/list-field.png" clazz="com.bstek.ide.action.GenerateViewDatasetFieldAction"/>  
  112.    <function text="Open Listener" icon="java/java.png" clazz="com.bstek.ide.action.OpenListenerAction"/>  
  113.   functions>  
  114.  rule>  
  115. rules>  
  116.    extension>  
  117. 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即可

插件進階應用---通過擴充點自定義元件