EMF-edit功能解析

來源:互聯網
上載者:User

1.      EMF.edit

a)       說明:EMF.edit位於EMF.editor和EMF.Ecore之間,他起了一個中介者的作用。他負責把來自EMF.editor的UI相關的請求轉換成符合EMF.Ecore的UI無關的調用。他需要提供以下四個功能:實現用於支援Viewer顯示的ContentProvider和LabelProvider;實現用於支援屬性顯示的IPropertySource;實現用於支援對模型進行操作的CommandFramework;實現用於支援修改通知的Framework。

 

b)       ContentProvider和LabelProvider

                     i.             圖:



                  ii.             說明:當TreeViewer需要顯示內容時,調用她的IContentProvider的getChildren(Object obj)方法。這個方法會被轉寄到AdapterFactoryContentProvider內部。她通過她所引用的ItemProviderAdapterFactory來擷取一個對obj的ITreeItemContentProvider類型的Adapter,這個Adapter是由EMF產生的對應於ECore模型的一個ItemProviderAdapter(這裡為TeacherItemProvider),最後由這個TeacherItemProvider負責產生所需要顯示的子節點列表。

 

               iii.             代碼:

public classAdapterFactoryContentProvider implements ITreeContentProvider {

public Object []getChildren(Object object){

ITreeItemContentProvider treeItemContentProvider =

(ITreeItemContentProvider)adapterFactory.adapt(object,

ITreeItemContentProvider.class);

return treeItemContentProvider.getChildren(object);

}

}

註:紅色是UI相關的請求,藍色是UI無關的適配器類,粉紅色就是UI無關的請求。

 

c)       IPropertySource

                     i.             圖:



                  ii.             說明:當PropertySheetPage需要顯示內容內容時,他訪問他的IPropertySourceProvider的getPropertySource(Object obj)方法。這個方法會被轉寄到AdapterFactoryContentProvider內部。她通過她所引用的ItemProviderAdapterFactory來擷取一個對obj的IItemPropertySource類型的Adapter,這個Adapter是由EMF產生的對應於ECore模型的一個ItemProviderAdapter(這裡為TeacherItemProvider),最後由這個TeacherItemProvider負責產生所需要顯示的屬性列表。

               iii.             代碼:

public classAdapterFactoryContentProvider implements IPropertySourceProvider{

     public IPropertySource getPropertySource(Object object){

                       IItemPropertySource itemPropertySource =(IItemPropertySource)

adapterFactory.adapt(object,IItemPropertySource.class));



}   

}

 

d)       Command Framework

                     i.             圖:



                  ii.             說明:由於EMF.editor並不瞭解底層的模型細節,因此他不能直接對模型進行操作,他需要產生一些用於操作模型的Command對象。當editor需要對模型進行修改時,他通過調用他的createCommand(EditingDomain domain)方法,建立用於進行模型操作的Command對象,該方法最後會被轉寄到domain的createCommand(),然後domain會根據他所引用的ItemProviderAdapterFactory來擷取一個IEditingDomainItemProvider的適配器,由他來最後產生用於對模型進行操作的Command對象。

 

               iii.             代碼:

public class DeleteAction extendsCommandActionHandler{

public CommandcreateCommand(Collection selection){

returnRemoveCommand.create(domain, selection);

}

}

public class RemoveCommand extendsAbstractOverrideableCommand{

public static Commandcreate(…){

return domain.createCommand(…);

}

}

public classAdapterFactoryEditingDomain implements EditingDomain{

public CommandcreateCommand(…){

IEditingDomainItemProvider editingDomainItemProvider =

(IEditingDomainItemProvider)adapterFactory.adapt(owner,

IEditingDomainItemProvider.class);

returneditingDomainItemProvider.createCommand(…);

}

}

註:當需要執行命令時,editor會調用EditingDomain上的CommandStack,並調用他上面的execute(Command c)方法。

 

e)       Notify Framework

                     i.             圖:



                  ii.             說明:當我們修改了模型的值以後,模型將會向他對應的ItemProvider發出一個更新通知,這個通知隨後被轉寄到ItemProviderAdapterFactory,然後最終發到AdapterFactoryContentProvider處,並由他來負責更新對應的viewer。


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。