После долгих исследований и прочтения этого вопроса Я так и не нашел "хорошего" решения для моей проблемы.
У меня есть редактор 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)
Любая помощь, предложения и комментарии приветствуются.
Заранее спасибо,
Маню