`
lggege
  • 浏览: 372733 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

GEF 修改默认的上下左右按键事件[GraphicalViewerKeyHandler]

    博客分类:
  • GEF
UP 
阅读更多
在GraphicalViewerKeyHandler里面会监听 键盘的上下左右的事件, 效果就是选中下一个界面上的控件. 但, 用户要求改成 给当前选择控件 移动位置. [GEF的对于上下左右的默认处理比较怪, 和一般的编辑器不一样的效果, 用户要求修改是正常的.]

下面贴主要代码:
getGraphicalViewer().setKeyHandler(new GefViewerKeyHandler(getGraphicalViewer()).setParent(this.sharedKeyHandler));


GefViewerKeyHandler 就是继承于GraphicalViewerKeyHandler, 并覆盖了keyPressed方法.
public class GefViewerKeyHandler extends GraphicalViewerKeyHandler {

	public GefViewerKeyHandler(GraphicalViewer viewer) {
		super(viewer);
	}

	@Override
	public boolean keyPressed(KeyEvent event) {
		if ((event.stateMask & SWT.ALT) == 0 && (event.stateMask & SWT.CTRL) == 0 && (event.stateMask & SWT.SHIFT) == 0
				&& (event.keyCode == SWT.ARROW_DOWN || event.keyCode == SWT.ARROW_LEFT || event.keyCode == SWT.ARROW_RIGHT || event.keyCode == SWT.ARROW_UP)) {
			GraphicalEditPart editPart = getFocusEditPart();

			if (editPart instanceof BaseControlEditPart) {
				BaseControlModel baseControlModel = ((BaseControlEditPart) editPart).getControlModel();

				ChangeBoundsRequest request = new ChangeBoundsRequest(RequestConstants.REQ_MOVE); // 请求事件类型:移动
				request.setLocation(new Point(baseControlModel.getX(), baseControlModel.getY())); // 从Model得到移动的初始位置
				request.setEditParts(editPart);
				Point moveDelta = null;
				switch (event.keyCode) { // 下面根据按键 得到对应的移动delta(增量)
					case SWT.ARROW_LEFT:
						moveDelta = new Point(-5, 0); // 左移5像素
break;

					case SWT.ARROW_RIGHT:
						moveDelta = new Point(5, 0); // 右移5像素
break;

					case SWT.ARROW_UP:
						moveDelta = new Point(0, -5); // 上移5像素
break;

					case SWT.ARROW_DOWN:
						moveDelta = new Point(0, 5); // 下移5像素
break;
				}

				request.setMoveDelta(moveDelta);
				Command command = editPart.getCommand(request);
				if (command != null && !(command instanceof UnexecutableCommand)) {
					command.execute(); // 触发移动的事件
					return true;
				}
			}
		}
		return super.keyPressed(event);
	}
}



代码很简单,
1. 就是告诉当前选中的EditPart, 说要触发一个RequestConstants.REQ_MOVE的事件,
2. Command command = editPart.getCommand(request);
3. 得到command后, 执行即可command.execute();
分享到:
评论
1 楼 tob111 2009-08-12  
顶、、、、

相关推荐

Global site tag (gtag.js) - Google Analytics