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。
自从我移居火星后,我的 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。