2014-02-07 3 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 
      } 
     } 
    }); 

지금, 우리는 공지를 받을지 사용자가 소스 페이지 (예 : XTextEditor)에서 일부 변경을 수행 할 때 EMF 모델이 변경 될 때마다 FormPages에 저장됩니다.

IXtextModelListener 및 IXtextDocumentContentObserver를 IXtextDocument에 추가하려고 시도했습니다. XTextEditor에 입력 된 모든 문자에 대해 호출됩니다.

우리의 요구 사항은 EMF 모델의 값이 변경 될 때만 알림을받는 것입니다 (예 : 공백 삽입/제거시 텍스트 형식이 아닌 경우).

누군가 어떤 포인터를 제공시겠습니까?

감사합니다, 아킬

+0

당신은 또한'org.eclipse.emf.common.notify.Notifier'에 구축하려고 했습니까? – SpaceTrucker

+0

@SpaceTrucker : 빠른 답장을 보내 주셔서 감사합니다! 나는이 접근법을 사용하지 않았다. 너 그것에 대해 자세히 말해 줄 수 있니? –

+0

나는 그 API를 직접 사용하지는 않았지만 모든'EObject'가 구현하기 때문에 좋은 생각이라고 제안했다. 모델의 모든 객체에 동일한'org.eclipse.emf.common.notify.Adapter'를 등록해야합니다. 모델이 변경되면이 어댑터에 알림이 전송됩니다. 그러나 이것이 작동하려면 xtext 편집기가 매번 새로운 모델을 생성해서는 안되며, 기존의 모델을 수정해야합니다. – SpaceTrucker

답변

0

당신은 Observer Bus to an EMF model의 구현을 추가 EMF 클라이언트 플랫폼 (ECP)를 사용할 수 있습니다.

ecp.view.validation 이 도메인 모델을 모니터링하고 는 유효성 검사 오류를 계산 검증 서비스입니다 :

그들은 당신이 설명한 것을 않는 자신의 검증 서비스를 구현합니다.

유효성 검증 서비스는 이미 Observer Bus of ECP를 사용하여 EMF 변경 이벤트에 등록합니다. 옵서버 버스 자체는 모델의 모든 변경 사항을 청취하는 EContentAdapter로 구현됩니다. 이미 변경 이벤트를 필터링하고 등록 할 수있는 이벤트 버스에 Observer Bus 패턴을 따라 이벤트를 제공합니다. 여기서 등록한 이벤트 만 가져오고 모든 이벤트가 아닌 EContentAdapter는 직접 필터링해야합니다.

주로 EMF Forms GUI에서 결과를 보여주기 위해 모델을 검증하는 데 사용한다고 생각합니다. 그러나 서비스를 독립형으로 사용할 수도 있습니다.