2012-03-07 11 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をまだお持ちでない場合は、作成することができます。しかし、グローバル化を1つ作成しておきます。たとえば、シングルトンの内部。 以下は、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

関連する問題