Frage

Nach langen Nachforschungen und dem Lesen dieser Frage Ich habe immer noch keine" gute "Lösung für mein Problem gefunden.

Ich habe einen Gef-Editor und möchte, dass die Benutzer Figuren (== Modellobjekte) aus diesem Editor in eine andere benutzerdefinierte Ansicht ziehen, die in meiner Perspektive verfügbar ist.

Das Hinzufügen einer DragSource mit meiner eigenen Drag-Übertragung auf meiner GEF-Editor-Zeichenfläche ermöglicht dies. Aber als Nebeneffekt, und ich möchte diesen Nebeneffekt nicht, deaktiviert dies die Möglichkeit, die Figuren per Drag & Drop in den Editor zu verschieben.

Nach Untersuchungen fand ich diesen Beitrag auf Eclipse-Foren , aber die Lösung ist für mich nicht akzeptabel. Daher habe ich mich eingehender mit dem folgenden reinen SWT-Snippet befasst, das zeigt, dass MouseMove-Ereignisse (die von gef verwendet werden, um das Ziehen in den Editor zu unterstützen) nicht mehr ausgelöst werden, sobald eine Drag-Quelle hinzugefügt wurde:

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();
        }
    }

Ich denke, dies ist das normale Verhalten aus Sicht der SWT. Bestätigen Sie?

Außerdem suche ich wirklich nach einer Lösung für dieses Problem, die nicht im Eclipse-Forum vorgeschlagen wurde und darin besteht, meine DragSource nur zu aktivieren, wenn eine bestimmte Bedingung erfüllt ist, z. B. Shift (dies wird in einer DragSourceListener.dragStart-Methode durchgeführt) indem Sie event.doit auf false setzen)

Hilfe, Vorschläge und Kommentare sind willkommen.

Vielen Dank im Voraus,

Manu

War es hilfreich?

Lösung

Höchstwahrscheinlich möchten Sie das normale Ziehen und Ablegen von GEF erweitern, um auch die Unterstützung für das Ziehen von Bildern zu erhalten.

Wenn Sie Elemente in den GEF-Editor ziehen, können Sie sie als Figuren ziehen (tatsächlich ist es etwas komplexer, es verwendet das Anforderungsbefehlsmuster). Wenn Sie jedoch über die Editorgrenzen ziehen, müssen Sie in der Lage sein, z. Bild aus diesen Daten.

SWT Bietet Unterstützung für mehrere verschiedene Drag-Datenübertragungen wie folgt:

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

Ich glaube, Sie möchten in GEF DragTracker einen Weg finden, diesen ImageTransfer auch in das OS Drag aufzunehmen. DragTrackers sind GEF-Methoden zum Behandeln von Drag und werden in der Funktion getDragTracker() von EditPart zurückgegeben

Ich bin mir nicht ganz sicher, wie das gemacht werden kann, aber die Erweiterung des eigenen DragTracker, der auch Image auf Betriebssystemebene bereitstellen kann, sollte den Trick tun.

Groß- und Kleinschreibung ähnelt dem Einfügen von Kopien, und im einfachen GMF-Editor ist es möglich, Einfügeelemente als Bilder außerhalb des Editors in jedes Tool zu kopieren, das Bilder akzeptiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top