S-JIS[2013-09-25] 変更履歴

Eclipse GEF ダブルクリック

Eclipseプラグイン開発GEFのダブルクリックの検知方法について。

 

概要

表示されている図形(EditPart)がダブルクリックされたことを検知するには、EditPartのRequestで判定する

EditPart以外(何もない部分)がダブルクリックされたことを検知するには、MouseListenerを使う


図形の例

ダブルクリックを検知したい図形のEditPartでREQ_OPENリクエストをチェックする。

import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
public class MyEditPart extends AbstractGraphicalEditPart {
〜
	@Override
	public void performRequest(Request request) {
		Object t = request.getType();
		if (t == RequestConstants.REQ_OPEN) {
			System.out.println("double click");
		}
	}

何もない部分の例

エディター上の図形でない部分では該当するEditPart(rootのEditPart)にREQ_OPENリクエストが送られてこないので、トップレベルの図形(キャンバス)に対してMouseListenerを登録する。

GraphicalEditorクラス:

import org.eclipse.draw2d.IFigure;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.editparts.ScalableRootEditPart;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
public class MyEditor extends GraphicalEditorWithFlyoutPalette {
〜
	@Override
	protected void configureGraphicalViewer() {
		super.configureGraphicalViewer();

		// zoom
		GraphicalViewer viewer = getGraphicalViewer();
		ScalableRootEditPart rootEditPart = new ScalableRootEditPart();
		viewer.setRootEditPart(rootEditPart);
〜
		// mouse listener
		viewer.getControl().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDoubleClick(MouseEvent e) {
				GraphicalViewer viewer = getGraphicalViewer();
				ScalableRootEditPart root = (ScalableRootEditPart) viewer.getRootEditPart();
				IFigure viewport = root.getFigure();
				IFigure found = viewport.findFigureAt(e.x, e.y);
				if (found == viewport) {
					System.out.println("double click");
				}
			}
		});
	}

viewer.getControl()に対してMouseListenerを登録する。
表示されているEditPartでもそれ以外の部分でもダブルクリックされたらこのリスナーが呼ばれるので、EditPart以外かどうかを判定する必要がある。
まずviewerのIFigure(実体はViewport)を取得する。
そして、そこからマウスの座標にある図形のIFigureを取得(探索)する。
図形が見つからなかった場合はViewport自身が返ってくるので、それでEditPart以外かどうかが判別できる。

参考: Eclipse Community ForumsのHow to capture double click on GEF Container


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