Eclipse Mars中mouseDrag和mouseMove的区别

Distinguishing between mouseDrag and mouseMove in Eclipse Mars

自从我移居火星后,我的 RCP 应用程序的拖放功能就不再可用了。

经过一些调试后,我在方法 class 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 错误还是新行为?

更新:

我研究了更多,问题不在于此,但有一个方法:在 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);
        }
    }
}

在我点击 figure/editpart 的特定情况下,调用 dispatchMouseReleased 之后(从 SWTEventDispatcher),在方法 receive(..) 中,Luna 'IFigure f = root.findMouseEventTargetAt(me.x, me.y);' 为空,现在开启火星吧returns一个图。这是我发现的导致拖放不起作用的当前差异。

然而..我不明白 Luna 和 Mars 之间的区别是 org.eclipse。draw2d.findMouseEventTargetAt 工作方式不同。

所以我设法解决了这个问题.. org.eclipse.draw2d.Figure.findMouseEventTargetInDescendantsAt从Luna改成了Mars。

在 Luna 中我们有这样的代码:

if (fig.containsPoint(PRIVATE_POINT.x, PRIVATE_POINT.y)) {
                    fig = fig.findMouseEventTargetAt(PRIVATE_POINT.x,
                            PRIVATE_POINT.y);
                    return fig;
                }

火星:

if (fig.containsPoint(PRIVATE_POINT.x, PRIVATE_POINT.y)) {
                    fig = fig.findMouseEventTargetAt(PRIVATE_POINT.x,
                            PRIVATE_POINT.y);
                    if (fig != null) {
                        return fig;
                    }
                }

我有自己的 class 扩展 LayeredPane 并且我必须重写此方法以始终 return 该图,即使它为 null。在 SWTEventDispatcher 的 receive(MouseEvent me) 方法中,root.findMouseEventTargetAt(me.x, me.y) 在特定情况下应该 return null 一个图形被点击并拖动但是return输入一个值!= null。