Как отбросить цифры редакторов ГЭФ во внешний мир? - PullRequest
1 голос
/ 04 февраля 2011

После долгих исследований и прочтения этого вопроса Я так и не нашел "хорошего" решения для моей проблемы.

У меня есть редактор Gef, и я хочу позволить пользователям перетаскивать фигуры (== объекты модели) из этого редактора в другое пользовательское представление, доступное в моей перспективе.

Добавление DragSource с моим собственным перетаскиванием на моем холсте рисунка редактора GEF позволяет это сделать. Но как побочный эффект, и я не хочу этот побочный эффект, это отключает возможность перемещать фигуры ВНУТРИ редактора с помощью перетаскивания.

После исследований я нашел этот пост на форумах 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. Вы подтверждаете?

Более того, я действительно ищу решение этой проблемы, кроме того, которое было предложено на форуме Eclipse и состояло в активации моего DragSource, только если выполняется указанное условие, например нажатие Shift (это делается в методе DragSourceListener.dragStart установив event.doit в false)

Любая помощь, предложения и комментарии приветствуются.

Заранее спасибо,

Маню

1 Ответ

2 голосов
/ 05 февраля 2011

Скорее всего, вы хотите расширить обычное перетаскивание в GEF и включить также поддержку перетаскивания изображений.

Когда вы перетаскиваете элементы в редакторе GEF, вы можете перетаскивать их как рисунки (на самом деле это немного сложнее, используется шаблон запроса-команды).Но когда ваше перетаскивание выходит за границы редактора, вы должны быть в состоянии обеспечить т.е.Изображение из этих данных.

SWT Обеспечивает поддержку нескольких различных типов перетаскивания данных, например:

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

Так что я считаю, что вы хотите найти способ включить в GEF DragTracker этотПередача изображения в ОС Drag.DragTrackers - это GEF способ обработки перетаскивания, и они возвращаются в функции EditPart getDragTracker()

. Я не совсем уверен, как это можно сделать, но расширение собственного DragTracker, которое также способно обеспечить также уровень ОС, должен делатьхитрость.

Случай очень похож на вставку копий, и в базовом редакторе GMF можно скопировать элементы вставки как изображения вне редактора в любой инструмент, принимающий изображения.

...