DragTracker接口是gef中用于跟踪鼠标或键盘执行拖拽操作的一个接口。
它本身继承Tool,tool是gef典型的Selection层的产物,从业务流程上来讲。用户操作的第一部就是选中什么节点,然后发送什么请求,再就是得到什么相应。这对应的便是gef的tools,request,policies。
DragTracker控制的是选中后做拖拽相关操作的接口。几乎所有跟拖拽相关的操作,都继承自这个接口。
以下是它的实现类:
ConnectionDragCreationTool
ConnectionEndpointTracker
MarqueeDragTracker
SelectEditPartTracker
DeselectAllTracker
DragEditPartsTracker
DragTreeItemsTracker
SingleSelectionTracker
SimpleDragTracker
ResizeTracker
RulerDragTracker
上述实现类,我也没有仔细看,我只是关注了一下DragEditPartsTracker,因为这个是跟gef图形界面拖拽相关的实现类。
在AbstractGraphicalEditPart类里面有一个getDragTracker(Request request)方法,用于获取DragTracker对象。默认情况下它是直接new了一个DragEditPartsTracker对象。
public DragTracker getDragTracker(Request request) { return new org.eclipse.gef.tools.DragEditPartsTracker(this); }
这个方法的有点在于,它是直接new了一个DragTracker,这说明我们想要重新实现一个自己的DragTracker是一件很容易的事情。
下面是一个例子:如果实现了这个代码,policies里面接受到的会是Move请求
@Override public DragTracker getDragTracker(Request request) { return new org.eclipse.gef.tools.DragEditPartsTracker(this){ /* (non-Javadoc) * @see org.eclipse.gef.tools.DragEditPartsTracker#isMove() */ @Override protected boolean isMove() { return true; } }; }
重写XYLayoutEditPolicy里面的方法,对组件进行特殊处理。
@Override protected Command getChangeConstraintCommand( ChangeBoundsRequest request) { request.getEditParts().clear(); request.setEditParts(getHost()); return getHost().getParent().getCommand(request); }