S-JIS[2013-05-06/2013-12-04] 変更履歴

Eclipse GEF 図形選択

Eclipseプラグイン開発GEFの図形の選択方法について。

 

概要

プログラム内から図形を選択するにはSelectionManagerを使う。
SelectionManagerはGraphicalEditor内のGraphicalViewerから取得することが出来る。


Editorの例

モデルgetName()というメソッドが存在している前提で、その名前に一致する図形を選択状態にする例。

GraphicalEditorクラス:

import org.eclipse.gef.EditPart;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.SelectionManager;
public class MyEditor extends GraphicalEditorWithFlyoutPalette {
〜
	public void select(String name) {
		GraphicalViewer viewer = getGraphicalViewer();
		SelectionManager manager = viewer.getSelectionManager();
		manager.deselectAll(); //現在の選択を全解除

		EditPart found = findEditPart(name);
		if (found != null) {
			manager.appendSelection(found); //図形を選択
		}
	}
	private EditPart findEditPart(String name) {
		GraphicalViewer viewer = getGraphicalViewer();
		DiagramEditPart diagramEditPart = (DiagramEditPart)viewer.getContents();
		
		@SuppressWarnings("unchecked")
		List<EditPart> list = diagramEditPart.getChildren();
		for (EditPart editPart : list) {
			MyModel model = (MyModel)editPart.getModel();
			if (name.equals(model.getName())) {
				return editPart;
			}
		}

		return null;
	}
}

なお、図形が選択状態にはなるが、その図形への移動(図形が枠外にある時にその図形が枠内に出てくるようスクロールする)はされない。


スクロールさせる為には、GraphicalViewer#reveal()を呼び出す。[2013-09-11]

GraphicalEditorクラス:

	public void selectAndReveal(EditPart editPart) {
		SelectionManager manager = getSelectionManager();
		manager.deselectAll();
		manager.appendSelection(editPart);

		GraphicalViewer viewer = getGraphicalViewer();
		viewer.reveal(editPart);
	}

ついでに言うと、SelectionManagerを使わなくてもGraphicalViewerだけで出来た^^;[2013-09-11]

GraphicalEditorクラス:

	public void selectAndReveal(EditPart editPart) {
		GraphicalViewer viewer = getGraphicalViewer();

//		viewer.deselectAll();
//		viewer.appendSelection(editPart);
		viewer.select(editPart);

		viewer.reveal(editPart);
	}

参考: RichardさんのSelection actions in GEF


EditPartの例

DiagramEditPart等のEditPartからも選択&スクロールさせることが出来る。[2013-09-11]

import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartViewer;

import jp.hishidama.eclipse_plugin.toad.model.diagram.DiagramEditPart;
	private void selectAndReveal(DiagramEditPart diagram, EditPart editPart) {
		EditPartViewer viewer = diagram.getViewer();

//		viewer.deselectAll();
//		viewer.appendSelection(editPart);
		viewer.select(editPart);

		viewer.reveal(editPart);
	}

図形の全選択

図形の全選択を可能にする方法。

ActionBarContributorクラス:

//import org.eclipse.gef.internal.GEFMessages;

import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.RetargetAction;
public class MyActionBarContributor extends ActionBarContributor {
	@Override
	protected void buildActions() {
		〜
//		addRetargetAction(new RetargetAction(ActionFactory.SELECT_ALL.getId(), GEFMessages.SelectAllAction_Label));
		addRetargetAction(new RetargetAction(ActionFactory.SELECT_ALL.getId(), null));
	}

buildActions()でSELECT_ALLを登録すると、Ctrl+Aで全図形を選択することができるようになる。
また、メニューバーの「Edit」→「Select All」も有効になる。

参考: vainoloさんのCan I change this later???

RetargetActionのコンストラクターの第2引数はボタンか何かのラベルらしいが、GEFMessagesはinternalパッケージのクラスなので、使うと警告が出てしまう。
もしくは(SELECT_ALL内で使われている)WorkbenchMessages.Workbench_selectAllでも良さそうだが、internalパッケージなのは同じ。
試しにnullを渡してみたら特にエラーは出なかったので、とりあえずnullにしておく。


動作の実体はSelectAllActionクラスであり、GraphicalEditor#createActions()でインスタンス化されてregistryに登録されている。
SelectAllActionではEditor内のEditPart(図形)を収集している。
EditPartにはisSelectable()というメソッドがあり、これがtrueのEditPartだけが選択対象となる。
つまり、もし選択対象にしたくない図形があるのなら、該当図形のEditPartのisSelectable()がfalseを返すようにすればよい。


RetargetActionを定義する代わりに、GlobalActionKeyを登録する方法でも良いようだ。[2013-12-04]

ActionBarContributorクラス:

	@Override
	protected void buildActions() {
		〜
//		addRetargetAction(new RetargetAction(ActionFactory.SELECT_ALL.getId(), null));
	}
	@Override
	protected void declareGlobalActionKeys() {
		addGlobalActionKey(ActionFactory.SELECT_ALL.getId());
	}

GEFへ戻る / Eclipseプラグインへ戻る / Eclipseへ戻る / 技術メモへ戻る
メールの送信先:ひしだま