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

我想这是从 man SWT 的角度来看的正常行为。你确认吗?

此外,我真的在寻找这个问题的解决方案,除了在 Eclipse 论坛上提出的一个解决方案,即只有在满足给定条件(例如按下 Shift)时才激活我的 DragSource(这是通过设置事件在 DragSourceListener.dragStart 方法中完成的.doit 为假)

欢迎任何帮助、建议和意见。

提前致谢,

马努

4

1 回答 1

2

您很可能希望扩展正常的 GEF 拖放以包含图像拖动支持。

当您在 GEF 编辑器中拖动项目时,您可以将它们拖动为图形(实际上它有点复杂,它使用请求命令模式)。但是,当您的拖动超出编辑器边界时,您需要能够提供 ie。此数据中的图像。

SWT 支持多种不同的拖动数据传输,如下所示:

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

所以我相信你想在 GEF DragTracker 中找到一种方法来将此 ImageTransfer 也包含到 OS Drag 中。DragTracker 是 GEF 处理拖动的方式,在 EditPart 的函数中返回getDragTracker()

我不完全确定如何做到这一点,但扩展自己的 DragTracker 也能够提供操作系统级别的图像应该可以解决问题。

案例与复制粘贴非常相似,在基本的 GMF 编辑器中,可以将粘贴项目作为编辑器外部的图像复制到任何接受图像的工具。

于 2011-02-05T11:12:22.370 回答