2014-02-07 45 views
1

我們有一個包含四個頁面的FormEditor:三個FormPages和第四個頁面是XTextEditor作爲源頁面。xtext的EMF模型以適當的值更改時如何獲得通知

每當用戶進行任何改變(如改變文本框的值)上FormPages,我們將裏面XTextDocument.modify()方法EMF模型內容如下:

xtextEditor.getDocument().modify(new IUnitOfWork.Void<XtextResource>() { 

     @Override 
     public void process(XtextResource state) throws Exception { 
      IParseResult parseResult = state.getParseResult(); 
      Assert.isNotNull(parseResult); 
      EObject rootASTElement = parseResult.getRootASTElement(); 

      if (rootASTElement instanceof MyModel) { 
       XyzType t = ((MyModel) rootASTElement).getXyzType(); 
       t.setName(name); <- ‘name’ is the new value entered on FormPage text box 
      } 
     } 
    }); 

現在,我們希望得到通知在FormPages中,每當用戶在源頁面上進行一些更改(例如XTextEditor)時,每當EMF模型被更改時。

我們嘗試將IXtextModelListener和IXtextDocumentContentObserver添加到IXtextDocument;但是這些會調用XTextEditor中輸入的每個字符。

我們的要求是僅當EMF模型中的值發生變化時(而不是用於文本格式化,例如插入/移除空白時)纔會收到通知。

有人可以提供一些指針嗎?

問候, AKHIL

+0

你還嘗試建立'org.eclipse.emf.common.notify.Notifier'嗎? – SpaceTrucker

+0

@SpaceTrucker:感謝您的快速回復!我沒有使用這種方法。你能詳細告訴我嗎? –

+0

我自己並沒有使用這個API,但是由於每個'EObject'都實現了它,所以我認爲這是個好主意。您將不得不爲模型中的每個對象註冊相同的'org.eclipse.emf.common.notify.Adapter'。當你的模型改變時,這個適配器會得到通知。但爲了使其發揮作用,xtext編輯器不能每次都創建一個新模型,但必須修改現有模型。 – SpaceTrucker

回答

0

您可以使用EMF客戶端平臺(ECP),其中增加了一個Observer Bus to an EMF model的實現。

他們實現一個自己的驗證服務,做你所描述的:

ecp.view.validation 這是驗證服務,它監視的域模型和 計算驗證錯誤。

驗證服務已使用ECP的觀察器總線註冊到EMF更改事件。觀察者總線本身被實現爲一個EContentAdapter,用於監聽模型的每一個變化。它已經過濾了更改事件,並將它們按照Observer總線模式提供給可註冊的事件總線。在那裏你只能得到你註冊的事件,而不是所有的事件,你必須爲自己過濾EContentAdapter。

我認爲他們主要用它來驗證模型在EMF Forms GUI中顯示結果。不過,您也可以單獨使用這些服務。

相關問題