在GraphicalViewerKeyHandler里面会监听 键盘的上下左右的事件, 效果就是选中下一个界面上的控件. 但, 用户要求改成 给当前选择控件 移动位置. [GEF的对于上下左右的默认处理比较怪, 和一般的编辑器不一样的效果, 用户要求修改是正常的.]
下面贴主要代码:
GefViewerKeyHandler 就是继承于GraphicalViewerKeyHandler, 并覆盖了keyPressed方法.
代码很简单,
1. 就是告诉当前选中的EditPart, 说要触发一个RequestConstants.REQ_MOVE的事件,
2. Command command = editPart.getCommand(request);
3. 得到command后, 执行即可command.execute();
下面贴主要代码:
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();