自从我在火星上迁移后,我的RCP应用程序的拖放功能不再起作用了。
经过一些调试后,我在这个类org.eclipse.gef.ui.parts.DomainEventDispatcher中找到了来自Luna的火星中不同的行为:
/**
* @see EventDispatcher#dispatchMouseMoved(org.eclipse.swt.events.MouseEvent)
*/
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);
}
}
不再显示mouseDrag和mouseMove之间的区别,因为即使我在编辑器中拖动鼠标(单击并拖动),me.stateMask也为0。有谁知道这是Eclipse Bug还是新行为?
更新:
我研究了更多,问题不是来自那里,但有一个方法:在SWTEventDispatcher中接收(org.eclipse.swt.events.MouseEvent me):
private void receive(org.eclipse.swt.events.MouseEvent me) {
currentEvent = null;
updateFigureUnderCursor(me);
if (captured) {
if (mouseTarget != null)
currentEvent = new MouseEvent(this, mouseTarget, me);
} else {
IFigure f = root.findMouseEventTargetAt(me.x, me.y);
if (f == mouseTarget) {
if (mouseTarget != null)
currentEvent = new MouseEvent(this, mouseTarget, me);
return;
}
if (mouseTarget != null) {
currentEvent = new MouseEvent(this, mouseTarget, me);
mouseTarget.handleMouseExited(currentEvent);
}
setMouseTarget(f);
if (mouseTarget != null) {
currentEvent = new MouseEvent(this, mouseTarget, me);
mouseTarget.handleMouseEntered(currentEvent);
}
}
}
在我点击图形/ editpart的特定情况下,在调用dispatchMouseReleased(来自SWTEventDispatcher)后,在方法receive(..)中,在Luna'IFigure f = root.findMouseEventTargetAt(me.x,me。 Y);”为null,现在在火星上返回一个图。这是我发现的当前差异,使得拖放不起作用。
然而..我不明白Luna和Mars之间的区别是org.eclipse.draw2d.findMouseEventTargetAt的工作方式不同。
答案 0 :(得分:0)
所以我设法解决了这个问题.. org.eclipse.draw2d.Figure.findMouseEventTargetInDescendantsAt从Luna变为Mars。
在Luna中我们有这个代码:user_id
火星
if (fig.containsPoint(PRIVATE_POINT.x, PRIVATE_POINT.y)) {
fig = fig.findMouseEventTargetAt(PRIVATE_POINT.x,
PRIVATE_POINT.y);
return fig;
}
我有自己的类扩展了LayeredPane,我必须重写此方法以始终返回该数字,即使它为空。不知何故,在SWTEventDispatcher的receive(MouseEvent me)方法中,root.findMouseEventTargetAt(me.x,me.y)应该在特定情况下返回null,点击并拖动一个数字,但返回一个值!= null。