1

長い調査とこの質問を読んだ後、私はまだ私の問題の「良い」解決策を得ることができませんでした。

私は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)

ヘルプ、提案、コメントは大歓迎です。

前もって感謝します、

マヌー

4

1 に答える 1

2

ほとんどの場合、通常のGEFドラッグアンドドロップを拡張して、イメージドラッグのサポートも含める必要があります。

GEFエディター内でアイテムをドラッグすると、それらをフィギュアとしてドラッグできます(実際には、もう少し複雑で、Request-Commandパターンを使用しています)。ただし、ドラッグがエディターの境界を超える場合は、を提供できる必要があります。このデータからの画像。

SWTは、次のような複数の異なるドラッグデータ転送のサポートを提供します。

dragSource.setTransfer(new Transfer[] { FileTransfer.getInstance(), ImageTransfer.getInstance() });

したがって、GEF DragTrackerで、このImageTransferをOSドラッグにも含める方法を見つけたいと思います。DragTrackersは、ドラッグを処理するGEFの方法であり、EditPartの関数で返されます。getDragTracker()

それがどのように行われるかは完全にはわかりませんが、OSレベルのイメージも提供できる独自のDragTrackerを拡張することでうまくいくはずです。

ケースはコピー貼り付けと非常によく似ており、基本的なGMFエディターでは、貼り付けアイテムをエディターの外部の画像として、画像を受け入れる任意のツールにコピーできます。

于 2011-02-05T11:12:22.370 に答える