2016-10-17 8 views
1

화성에서 마이그레이션 한 이래로 내 RCP 앱의 드래그 앤 드롭 기능이 더 이상 작동하지 않습니다.Eclipse 화성에서 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이기 때문에 더 이상 공개되지 않습니다. 이 사람이 이클립스 버그 또는 새로운 행동인지 알 수 있습니까?

업데이트 : 좀 더 연구하고 문제가 거기에서 오지 않는다, 그러나 방법이

:

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)를 수신

특정한 경우에 Figure/editpart를 클릭하면 dispatchMouseReleased가 SWTEventDispatcher에서 호출 된 후 receive (..) 메서드에서 Luna의 IFigure f = root.findMouseEventTargetAt (me.x, me. 와이);' 이제는 화성에서 그림을 반환합니다. 이것은 드래그 앤 드롭이 작동하지 않는 것을 발견 한 현재의 차이입니다.

그러나 .. 나는 루나와 화성의 차이점을 이해하지 못한다. 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; 
        } 
       } 

을 나는 경우에도 항상 그림을 반환하는이 메소드를 오버라이드 (override)했다 그것은 null입니다. 어떻게 든 SWTEventDispatcher의 receive (MouseEvent me) 메서드에서 root.findMouseEventTargetAt (me.x, me.y)는 숫자가 클릭되고 드래그되었지만 값을 반환했음을 null로 반환해야합니다! = null.