GEF编辑在外界的表现如何?

时间:2011-02-04 10:57:32

标签: java eclipse drag-and-drop swt eclipse-gef

经过长时间的调查和阅读question后,我仍然没有为我的问题找到一个“好”的解决方案。

我有一个Gef编辑器,我想让用户将此编辑器中的图形(==模型对象)拖放到我的视角中可用的其他自定义视图中。

在我的GEF编辑器图形画布上使用我自己的拖动传输添加DragSource允许这样做。但作为一个副作用,我不想要这种副作用,这就禁止了使用拖放操作在编辑器中移动数字的可能性。

经过调查,我发现了post on eclipse forums,但解决方案对我来说是不可接受的。因此,我进行了更深入的调查,并得出以下纯SWT片段,该片段显示一旦添加了拖动源,MouseMove事件(gef用于支持拖动INSIDE编辑器的事件)不再被触发:

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 个答案:

答案 0 :(得分:2)

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

当你在GEF编辑器中拖动项目时,你可以将它们拖动为数字(实际上它有点复杂,它使用Request-Command模式)。但是当你的拖动遍历编辑器边框时,你需要能够提供ie。图像超出此数据。

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

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

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

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

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