Eclipse PDE 默認插件模板功能有限,無法滿足複雜項目結構需求。本文基於「透視圖/視圖生成器」案例,深度講解四大進階特性:多區段實現與控制、自定義 UI 組件、輸入校驗、Ant 腳本驅動的目錄結構自動化組織。
需生成多個 Eclipse 透視圖項目,每個透視圖包含可變數量的視圖,視圖擁有圖像與生成的 Java 源碼。單一模板需支持:
• 透視圖區段(必選)
• 視圖區段(可選,可重複多次)
<extension point="org.eclipse.pde.ui.pluginContent">
<section class="com.example.PerspectiveSection" id="perspectiveSection" name="Perspective" />
<section class="com.example.ViewSection" id="viewSection" name="View" />
</extension>
| 方法 | 職責 |
|---|---|
| initializeFields | 根據前序頁面輸入初始化選項 |
| addPages | 向向導添加頁面 |
| getStringOption / getSectionId | 獲取選項值/區段 ID |
| updateModel | 向插件模型添加必要條目 |
public class SampleWizard extends NewPluginTemplateWizard {
public ITemplateSection[] createTemplateSections() {
return new ITemplateSection[] { new PerspectiveSection(), new ViewSection() };
}
public boolean performFinish(IProject project, IPluginModelBase model, IProgressMonitor monitor) {
// 循環執行各區段 execute()
// 透視圖區段接收視圖名稱列表,生成透視圖類
// 視圖區段按用戶輸入次數生成視圖類
}
}
視圖區段需收集「視圖類名」列表,設計包含:
• 輸入框 View Class Name
• 列表框 View List
• Add/Remove 按鈕
public class ViewOption extends TemplateOption {
public void createControl(Composite parent, int span) {
// Label + ListViewer (高度 100px)
// Button "Add" → 選中文本加入列表
// Button "Remove" → 移除選中項
}
}
規則:同一透視圖內視圖類名不可重複。覆寫 validateOptions(TemplateOption source):
public void validateOptions(TemplateOption source) {
ViewOption opt = (ViewOption) source;
String[] items = opt.getListField().getItems();
String input = opt.getTextField().getText();
for (String item : items) {
if (item.equals(input)) {
getPage(0).setErrorMessage("Class name '" + input + "' already exists in View List.");
break;
}
}
}
錯誤信息顯示在頁面頂部,阻止用戶點擊 Finish。
<project name="template" default="clean" basedir=".">
<property name="package" value=".\${sourcePath}\${packagePath}"/>
<target name="create"><mkdir dir="$\{package\}"/></target>
<target name="move" depends="create">
<move todir="$\{package\}"><fileset dir="."><include name="*.java"/></fileset></move>
</target>
<target name="clean" depends="move">
<delete><fileset dir="."><include name="CreatePackage.xml"/></fileset></delete>
</target>
</project>
IResourceChangeListener listener = new IResourceChangeListener() {
public void resourceChanged(IResourceChangeEvent event) {
if (event.getType() == POST_CHANGE) {
IResourceDelta delta = event.getDelta().findMember(file.getFullPath());
if (delta != null) { // Ant 文件生成完畢
Project antProject = new Project();
ProjectHelper.getProjectHelper().parse(antProject, new File(file.getLocationURI()));
antProject.executeTarget(antProject.getDefaultTarget());
workspace.removeResourceChangeListener(this);
}
}
}
};
workspace.addResourceChangeListener(listener);
eclipse/plugins,eclipse -clean 重啟。通過多區段控制實現功能模塊化、自定義 UI 提升易用性、校驗保障數據質量、Ant 自動化組織目錄,使單一模板能生成結構各異的複雜插件項目,大幅提升開發效率。