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を登録する。
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