您的位置:首页 > 编程语言 > PHP开发

以鼠标进入EditPartViewer为例讲解GEF执行流程

2011-09-14 21:48 561 查看
鼠标进入EditPartViewer时,FigureCanvas会将MouseMove事件交给其监器处理,

而FigureCanvas的监听器为LightweightSystem内部的EventHandler。

eg:

/**@see MouseMoveListener#mouseMove(MouseEvent)*/

public void mouseMove(MouseEvent e) {

getEventDispatcher().dispatchMouseMoved(e);

}

由代码可知:

是将给EventDispatcher进行转发处理(dispatchMouseMoved(e))。

在GEF中,EventDispatcher为org.eclipse.gef.ui.parts.DomainEventDispatcher,

我们继续去看dispatchMouseMove的代码,

public void dispatchMouseMoved(org.eclipse.swt.events.MouseEvent me) {

if (!editorCaptured) {

super.dispatchMouseMoved(me);

if (draw2dBusy())

return;

}

if (okToDispatch()) {

if ((me.stateMask & InputEvent.ANY_BUTTON) != 0)

domain.mouseDrag(me, viewer);

else

domain.mouseMove(me, viewer);

}

}

从代码看是,交给Editdomain处理了。EditDomain一般是org.eclipse.gef.DefaultEditDomain

domain.mouseMove(me, viewer);

继续跟踪:

public void mouseMove(MouseEvent mouseEvent, EditPartViewer viewer) {

Tool tool = getActiveTool();

if (tool != null)

tool.mouseMove(mouseEvent, viewer);

}

需要明白的是,在EditDomain中,始终都会有且仅有一个Active Tool。

这下又交给Tool处理了,此时,默认的Tool为SelectionTool,请接着看代码,

protected boolean handleMove() {

if (stateTransition(STATE_ACCESSIBLE_DRAG, STATE_INITIAL))

setDragTracker(null);

if (isInState(STATE_INITIAL)) {

updateTargetRequest();//更新Reqeust,生成Request实例

updateTargetUnderMouse();

showTargetFeedback();

return true;

} else if (isInState(STATE_TRAVERSE_HANDLE)) {

EditPartViewer viewer = getCurrentViewer();

if (viewer instanceof GraphicalViewer) {

Handle handle = ((GraphicalViewer) viewer).findHandleAt(getLocation());

if (handle != null) {

setState(STATE_ACCESSIBLE_DRAG);

setStartLocation(getLocation());

setDragTracker(handle.getDragTracker());

return true;

} else {

setState(STATE_INITIAL);

}

}

}

return false;

}
生成Request实例的方法为updateTargetRequest,代码为:

protected void updateTargetRequest() {

SelectionRequest request = (SelectionRequest)getTargetRequest();

request.setModifiers(getCurrentInput().getModifiers());

request.setType(getCommandName());

request.setLocation(getLocation());

updateHoverRequest();

}

protected Request getTargetRequest() {

if (targetRequest == null)

setTargetRequest(createTargetRequest());

return targetRequest;

}

//SelectionTool中创建Request的方法

protected Request createTargetRequest() {

SelectionRequest request = new SelectionRequest();

request.setType(getCommandName());

return request;

}

Tool一般有getCommand方法,

以ResizeTracker为例,

protected Command getCommand() {

List editparts = getOperationSet();

EditPart part;

CompoundCommand command = new CompoundCommand();

command.setDebugLabel("Resize Handle Tracker");//$NON-NLS-1$

for (int i = 0; i < editparts.size(); i++) {

part = (EditPart)editparts.get(i);

command.add(part.getCommand(getSourceRequest()));//转发给了EditPart,向EditPart要Command

}

return command.unwrap();

}

且看AbstractEditPart是如何将收到的请求分发给EditPolicy的。

public Command getCommand(Request request) {

Command command = null;

EditPolicyIterator i = getEditPolicyIterator();

while (i.hasNext()) {

if (command != null)

command = command.chain(i.next().

getCommand(request));

else

command = i.next().

getCommand(request);

}

return command;

}

Tool通过getCommand后,会执行command。查看AbstractTool中有如下代码:

protected void executeCommand(Command command) {

getDomain().getCommandStack().removeCommandStackEventListener(commandStackListener);

try {

getDomain().getCommandStack()

.execute(command);

} finally {

getDomain().getCommandStack().addCommandStackEventListener(commandStackListener);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: