2012-03-07 2 views
1

요약
저는 emf 기반 편집기로 작업 중입니다. 지금까지 EMF 명령을 사용하지 않았지만 지금은 코드를 사용하여 코드를 리팩토링하려고합니다.편집기 동작에서 EMF 명령을 사용하는 방법은 무엇입니까?

내 편집기의 주요 부분으로 트리 뷰어를 사용하고
현재 상태입니다. org.eclipse.ui.popupMenus 확장 포인트를 통해 모든 종류의 작업을 추가했습니다. 이러한 동작은 모델을 직접적으로 방해하여 객체를 추가 및 제거합니다.

문제 내가 쉽게 오류를 도입 모델의 개체를 삭제할 때 수동으로 모든 참조를 제거해야하는이 방식으로
. 또한 편집기에서 실행 취소/다시 실행 작업이 작동하지 않습니다.

목표
리팩터링에게 작업 제대로 EMF 모델을 수정하는 명령을 사용할 수 있도록.

Department d = ... 
    EditingDomain ed = ... 
    Command cmd = RemoveCommand.create(ed, d); 
    ed.getCommandStack().execute(cmd); 

... 내가 사용해야하는 코드처럼 보이는 다음 EMF 문서 내에서


나는이 코드를 발견했다. 그러나 나는 어디에서 EditingDomain을 얻을 수 있는지 모른다.

그래서이 내 질문은 :

  • 이가 내 Action들에 사용하려는 접근 방식인가?
  • 어디에서 EditingDomain을 얻을 수 있습니까?

답변

2

현재 편집 도메인에 쉽게 액세스 할 수 있습니다. 이 코드를 Action 클래스에 추가하기 만하면됩니다.

private EditingDomain domain; 

public void setActivePart(IAction action, IWorkbenchPart workbenchPart) { 
    if (workbenchPart instanceof IEditingDomainProvider) { 
     domain = ((IEditingDomainProvider) workbenchPart).getEditingDomain(); 
    } 
} 

메소드 setActivePart은 Eclipse 프레임 워크에서 자동으로 호출됩니다. 이 기술을 사용하면 항상 편집 도메인에 액세스 할 수 있어야합니다.

편집기가 대부분 수정되지 않은 생성 코드를 기반으로하는 경우에만 해당됩니다. EditingDomains을 직접 관리하는 경우 자신의 방법을 사용해야합니다.

0

아직 EditingDomain이없는 경우 만들 수 있습니다. 그러나 하나의 범 세계를 만들고 유지해야합니다. 예를 들어 싱글 톤 내부. 아래에는 AbstractCommand를 사용하여 TreeItem에 첨부 된 EObject를 삭제하는 최소한의 예가 나와 있습니다.

AdapterFactoryEditingDomain domain = new AdapterFactoryEditingDomain(new ComposedAdapterFactory(
     ComposedAdapterFactory.Descriptor.Registry.INSTANCE), new BasicCommandStack()); 

domain.getCommandStack().execute(new AbstractCommand() { 
    @Override 
    public void redo() { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void execute() { 
     EcoreUtil.delete((EObject) treeItem.getData(), true); 
    } 

    @Override 
    public boolean canExecute() { 
     return true; 
    } 
}); 
+0

EMF 기반 편집기를 사용하면 편집 도메인이 정상적으로 작동합니다. 객체 제거와 같은 모든 자동 생성 표준 명령에 사용됩니다. 새 편집 도메인을 만들면 혼란이 생길 ​​수 있습니다. – Peter