Pergunta

Depois de longas investigações e lendo isto pergunta Ainda não consegui uma solução "boa" para o meu problema.

Eu tenho um editor Gef e quero permitir que os usuários arrastem e soltem figuras (== objetos modelo) deste editor para outra visualização personalizada disponível em minha perspectiva.

Adicionar um DragSource com minha própria transferência de arrastar na tela de figura do editor GEF permite isso.Mas como efeito colateral, e não quero esse efeito colateral, isso desativa a possibilidade de mover as figuras DENTRO do editor usando arrastar e soltar.

Depois de investigações descobri isso postar em fóruns de eclipse, mas a solução não é aceitável para mim.Assim, investiguei mais profundamente e cheguei ao seguinte trecho SWT puro que mostra que os eventos MouseMove (aqueles usados ​​pelo gef para suportar o arrastamento DENTRO do editor) não são mais acionados depois que uma fonte de arrastar é adicionada:

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

Acho que esse é o comportamento normal do ponto de vista do homem SWT.Você confirma ?

Além disso, estou realmente procurando uma solução para este problema diferente daquela proposta no fórum Eclipse que consiste em ativar meu DragSource somente se uma determinada condição for atendida, como Shift for pressionado (isso é feito em um método DragSourceListener.dragStart definindo o evento .doit para falso)

Qualquer ajuda, sugestões e comentários são bem-vindos.

Desde já, obrigado,

Manu

Foi útil?

Solução

Provavelmente você deseja estender o arrastar e soltar normal do GEF para conter também o suporte para arrastar imagens.

Ao arrastar itens dentro do editor GEF você pode arrastá-los como Figuras (na verdade é um pouco mais complexo, está usando o padrão Request-Command).Mas quando o arrasto ultrapassa as bordas do editor, você precisa ser capaz de fornecer, por exemplo.Imagem desses dados.

SWT fornece suporte para várias transferências de dados de arrastar diferentes como esta:

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

Então acredito que você queira encontrar uma maneira no GEF DragTracker de incluir também esse ImageTransfer no OS Drag.DragTrackers são a forma GEF de lidar com o arrasto e são retornados na função EditPart getDragTracker()

Não tenho certeza de como isso pode ser feito, mas estender o próprio DragTracker, que também é capaz de fornecer imagens no nível do sistema operacional, deve resolver o problema.

O caso é bastante semelhante ao copiar e colar, e no editor GMF básico é possível copiar e colar itens como imagens fora do editor para qualquer ferramenta que esteja aceitando imagens.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top