前面的幾篇是讀了《EMF:A Developer's Guide》一書前三章的讀書筆記,我覺得這三章的內(nèi)容是最重要的,介紹了EMF Framework的一些設(shè)計(jì)、結(jié)構(gòu)以及實(shí)現(xiàn)的問題。但是這些只是一些原理性的東西,要熟練掌握EMF的方法是在項(xiàng)目中應(yīng)用它,我們可以從修改EMF生成的代碼入手。EMF生成的編輯器是MultiPageEditor,比較復(fù)雜,我們可以參考它自己寫一個(gè)普通的Editor,在這個(gè)過程中可以熟悉哪些代碼是用于實(shí)現(xiàn)哪些功能的。
下面用一個(gè)簡單的例子來說明如何實(shí)現(xiàn)PropertySheet,這里只關(guān)心與PropertySheet有關(guān)的代碼:
getAdapter方法繼承自WorkbenchPart類(EditorPart和ViewPart都是它的子類,都可以重寫這個(gè)方法),當(dāng)我們需要打開屬性頁視圖時(shí),該方法會(huì)被調(diào)用,傳入的參數(shù)就是IPropertySheetPage.class,因此返回我們新建的PropertySheetPage,屬性頁就出現(xiàn)了。
下面用一個(gè)簡單的例子來說明如何實(shí)現(xiàn)PropertySheet,這里只關(guān)心與PropertySheet有關(guān)的代碼:
public class MySchoolEditor extends EditorPart implements ISelectionListener{
...
PropertySheetPage propertySheetPage;
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
...
propertySheetPage = getPropertySheetPage();
}
public PropertySheetPage getPropertySheetPage() {
if (propertySheetPage == null) {
propertySheetPage = new PropertySheetPage();
propertySheetPage.setPropertySourceProvider(new AdapterFactoryContentProvider(adapterFactory));
}
return propertySheetPage;
}
public Object getAdapter(Class key) {
if (key.equals(IPropertySheetPage.class))
return getPropertySheetPage();
else
return super.getAdapter(key);
}
}
創(chuàng)建PropertySheetPage之后,為它設(shè)置PropertySourceProvider,參數(shù)是一個(gè)AdapterFactoryContentProvider實(shí)例,在前面的帖子里邊說過,它實(shí)現(xiàn)了IPropertySourceProvider接口,其getPropertySource方法是這樣實(shí)現(xiàn)的:比如我們?cè)诰庉嬈骼镞呥x中一個(gè)teacher對(duì)象,它先找到Teacher類對(duì)應(yīng)的實(shí)現(xiàn)了IItemPropertySource的TeacherItemProvider對(duì)象,然后以這兩個(gè)對(duì)象作為參數(shù)新建一個(gè)PropertySource。...
PropertySheetPage propertySheetPage;
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
...
propertySheetPage = getPropertySheetPage();
}
public PropertySheetPage getPropertySheetPage() {
if (propertySheetPage == null) {
propertySheetPage = new PropertySheetPage();
propertySheetPage.setPropertySourceProvider(new AdapterFactoryContentProvider(adapterFactory));
}
return propertySheetPage;
}
public Object getAdapter(Class key) {
if (key.equals(IPropertySheetPage.class))
return getPropertySheetPage();
else
return super.getAdapter(key);
}
}
getAdapter方法繼承自WorkbenchPart類(EditorPart和ViewPart都是它的子類,都可以重寫這個(gè)方法),當(dāng)我們需要打開屬性頁視圖時(shí),該方法會(huì)被調(diào)用,傳入的參數(shù)就是IPropertySheetPage.class,因此返回我們新建的PropertySheetPage,屬性頁就出現(xiàn)了。