EMFで生成したマルチページエディタにZestによるグラフィカルビューを追加する

EMFでは、EMFモデルからそのインスタンスを編集するためのマルチページエディタを自動生成可能です。そのマルチページエディタは以下のタブで構成されます。

  • Selection
  • Parent
  • List
  • Tree
  • Table
  • Tree with Columns

今回は、上記のマルチページエディタに、Zestを用いたグラフィカルビューを表示するタブを追加してみます。

今回追加するタブは、上記List、Tree、Table、Tree with Columnsタブと同様、EMFモデルインスタンス全体ではなく、アウトラインビュー等で選択されたオブジェクトの子供のみを表示するものとします。

まず、前回と同様、AdapterFactoryContentProviderを拡張して、ZestのGraphViewerにセットするContentProviderを実装します。

public class MyAdapterFactoryContentProvider extends
		AdapterFactoryContentProvider implements IGraphEntityContentProvider {

	public MyAdapterFactoryContentProvider(AdapterFactory adapterFactory) {
		super(adapterFactory);
	}
	
	public Object[] getConnectedTo(Object entity) {
		return getChildren(entity);
	}
}

前回の復習ですが、ZestのGraphViewerにセットするContentPoviderでは、getElement()はグラフ表示したいオブジェクト全てを返す必要があります。そして、前回と異なり、AdapterFactoryContentProvider.getElements()をoverrideしません。AdapterFactoryContentProviderクラスが移譲するアイテムプロバイダではgetElement()の実装では、単純にgetChildren()をリターンするようになっています。この実装をそのまま利用することにより、上記のように今回追加するタブは、EMFモデルインスタンス全てではなく、アウトラインビュー等で選択されたオブジェクトの子供のみを表示することになります。

最後に、EMFで自動生成したマルチページエディタのXXEditorクラスにおけるcreatePages()に以下のコードを適当な場所に追加します。

{
	ViewerPane viewerPane =
		new ViewerPane(getSite().getPage(), FilesystemEditor.this) {
			@Override
			public Viewer createViewer(Composite composite) {
				GraphViewer newGraphViewer = new GraphViewer(composite, SWT.NONE);
				return newGraphViewer;
			}
			@Override
			public void requestActivation() {
				super.requestActivation();
				setCurrentViewerPane(this);
			}
		};
	viewerPane.createControl(getContainer());
	graphViewer = (GraphViewer)viewerPane.getViewer();
	graphViewer.setContentProvider(new MyAdapterFactoryContentProvider(adapterFactory));

	graphViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
	graphViewer.setLayoutAlgorithm(
			new HorizontalTreeLayoutAlgorithm(
					LayoutStyles.NO_LAYOUT_NODE_RESIZING));
	graphViewer.setInput(editingDomain.getResourceSet());
	graphViewer.setSelection(new StructuredSelection(editingDomain.getResourceSet().getResources().get(0)), true);
	viewerPane.setTitle(editingDomain.getResourceSet());

	createContextMenuFor(graphViewer);
	int pageIndex = addPage(viewerPane.getControl());
	setPageText(pageIndex, "Graph");
}

上記コードのうち、graphViewerは、どこかでGraphViewer型で宣言しておきます。また、今回は、レイアウトとしてHorizontanTreeLayoutAlgorithmを指定してみました。

これにより、以下のようなタブが追加されます。

AdapterFactoryContentProviderを拡張したContentProviderをGraphViewerにセットすることにより、上記スクリーンショットが示すように、右クリックすることで表示されるコンテキストメニューに「New Child」等のメニューが他のタブと同様に表示され、EMFモデルインスタンスを編集可能です。

ただ、今回追加したビューにおいて、ノードの移動がうまくいきません。。。もう少しちゃんとコードを追う必要がありそうです。