長い調査とこの質問を読んだ後、私はまだ私の問題の「良い」解決策を得ることができませんでした。
私はGefエディターを持っており、ユーザーがこのエディターから図(==モデルオブジェクト)をドラッグアンドドロップして、自分の視点で使用できる他のカスタムビューにドラッグアンドドロップできるようにしたいと考えています。
GEFエディターのフィギュアキャンバスに独自のドラッグ転送を使用してDragSourceを追加すると、それが可能になります。しかし、副作用として、そして私はこの副作用を望まないので、これはドラッグアンドドロップを使用してエディター内でフィギュアを移動する可能性を無効にします。
調査の結果、Eclipseフォーラムでこの投稿を見つけましたが、解決策は受け入れられません。したがって、私はさらに深く調査し、次の純粋なSWTスニペットに到達しました。これは、ドラッグソースが追加されると、MouseMoveイベント(gefがエディター内でのドラッグをサポートするために使用するイベント)が発生しなくなることを示しています。
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class SwtTest {
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.addMouseListener(new MouseListener() {
public void mouseUp(MouseEvent e) {
System.out.println("mouseUp");
}
public void mouseDown(MouseEvent e) {
System.out.println("mouseDown");
}
public void mouseDoubleClick(MouseEvent e) {
System.out.println("mouseDoubleClick");
}
});
shell.addMouseMoveListener(new MouseMoveListener() {
@Override
public void mouseMove(MouseEvent e) {
System.out.println("Mouse move");
}
});
DragSourceListener dragListener = new DragSourceListener() {
public void dragFinished(DragSourceEvent event) {
System.out.println("dragFinished");
}
public void dragSetData(DragSourceEvent event) {
System.out.println("dragSetData");
}
public void dragStart(DragSourceEvent event) {
System.out.println("dragStart");
}
};
DragSource dragSource = new DragSource(shell, DND.DROP_COPY | DND.DROP_MOVE);
dragSource.addDragListener(dragListener);
dragSource.setTransfer(new Transfer[] { FileTransfer.getInstance() });
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
これは、SWTの観点から見た通常の動作だと思います。確認しますか?
さらに、Shiftが押されたなどの特定の条件が満たされた場合にのみDragSourceをアクティブ化することで構成されるEclipseフォーラムで提案されたもの以外のこの問題の解決策を本当に探しています(これはDragSourceListener.dragStartメソッドでイベントを設定することによって行われます) .doit to false)
ヘルプ、提案、コメントは大歓迎です。
前もって感謝します、
マヌー