EMF 生成的預設應用程式外觀雷同,需透過定制滿足實際需求。定制途徑:
ecore/genmodel 模型屬性(最直觀、易維護)。@generated 標記)。預設嚮導兩步驟:輸入檔名 → 選擇根物件與編碼。商店範例根物件固定為 Shop,第二步可省略。
ShopModelWizard:addPages():註解掉 initialObjectCreationPage 相關代碼。createInitialModel():直接回傳 shopFactory.createShop()。performFinish():固定編碼為 UTF-8。修改後,使用者僅需輸入檔名即可完成建立。
預設大綱顯示完整 ResourceSet 樹,頂層為 platform:/resource/...shop 無實際意義。需讓大綱直接顯示 Shop 物件。
ShopEditor.getContentOutlinePage():contentOutlineViewer.setInput(
editingDomain.getResourceSet().getResources().get(0)
);
將 Viewer 輸入從 ResourceSet 改為第一個 Resource,大綱即以 Shop 為根節點。
預設編輯器含六個 Tab,實務上常僅需大綱 + 表格。修改 createPages() 保留 Table 頁,其餘註解。
TableColumn objectColumn = new TableColumn(table, SWT.NONE);
objectColumn.setText("Name");
TableColumn childrenColumn = new TableColumn(table, SWT.NONE);
childrenColumn.setText("Children");
TableColumn descColumn = new TableColumn(table, SWT.NONE);
descColumn.setText("Description");
ITableItemLabelProvider 顯示差異化資料:public class CategoryItemProvider extends ItemProviderAdapter
implements ..., ITableItemLabelProvider {
public String getColumnText(Object object, int columnIndex) {
Category category = (Category) object;
switch (columnIndex) {
case 0: return category.getName();
case 1: return String.valueOf(category.getChildren().size());
case 2: return ""; // Category 無描述
default: return "";
}
}
// getColumnImage 回傳 null
}
supportedTypes.add(ITableItemLabelProvider.class);
修改 ShopItemProviderAdapterFactory 建構子,加入上述行,使表格能正確委派顯示邏輯。
經過定制,應用程式擁有精簡嚮導、乾淨大綱、資源管理器風格的雙欄編輯器,大幅提升使用者體驗。