经过长时间的调查和阅读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)
欢迎任何帮助,建议和意见。
提前致谢,
马努
答案 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编辑器中,可以将粘贴项目作为编辑器外的图像复制到任何接受图像的工具。