在Eclipse Mars中区分mouseDrag和mouseMove

时间:2016-10-17 14:41:43

标签: eclipse events move drag eclipse-mars

自从我在火星上迁移后,我的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的工作方式不同。

1 个答案:

答案 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。