2016-10-17 5 views
1

私がMarsに移行して以来、私のRCPアプリケーションのドラッグ&ドロップ機能はもう動作していません。Eclipse MarsでmouseDragとmouseMoveを区別する

私はこのクラスのorg.eclipse.gef.ui.parts.DomainEventDispatcher方法でルナから火星に異なる挙動を発見いくつかのデバッグ後:

/** 
* @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のバグか新しい動作かどうかは誰にも分かりますか?

UPDATE:私はもっと研究し、問題がそこから来ていませんが、方法がある

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); 
     } 
    } 
} 
:SWTEventDispatcherに(私org.eclipse.swt.events.MouseEvent)を受け取ります

fig/editpartをクリックすると、dispatchMouseReleasedが(SWTEventDispatcherから)呼び出された後、LunaのIFigure f = root.findMouseEventTargetAt(me.x、me。 y); '今は火星では図を返します。これは私が見つけた現在の違いで、ドラッグ・アンド・ドロップは動作しません。

しかし..ルナと火星の違いは、org.eclipse.draw2d.findMouseEventTargetAtの動作がどう違うか分かりません。

答えて

0

私はこの問題を解決することができました。org.eclipse.draw2d.Figure.findMouseEventTargetInDescendantsAtがLunaからMarsに変更されました。

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

火星:ルナで

我々は、このコードを持っている私はのlayeredPaneを拡張し、私自身のクラスを持って

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

を、私は、いつでも、常に数字を戻すには、このメソッドをオーバーライドする必要がありましたそれはnullです。何らかの理由でSWTEventDispatcherのreceive(MouseEvent me)メソッドで、Figureがクリックされてドラッグされているのに値が返されていた特定のケースで、root.findMouseEventTargetAt(me.x、me.y)がnullを返す必要があります。

関連する問題