diff options
| author | Steve Monnier | 2015-03-11 09:50:43 +0000 |
|---|---|---|
| committer | Steve Monnier | 2015-03-11 09:50:43 +0000 |
| commit | eea990666ab364ddb6e1b6d575eee15774f92480 (patch) | |
| tree | d6db4b9a01c23557f2d95205dbe04ba016026876 | |
| parent | 314d2a39069f0b08ac2c9e2e39e9259e28e75f05 (diff) | |
| download | org.eclipse.sirius-eea990666ab364ddb6e1b6d575eee15774f92480.tar.gz org.eclipse.sirius-eea990666ab364ddb6e1b6d575eee15774f92480.tar.xz org.eclipse.sirius-eea990666ab364ddb6e1b6d575eee15774f92480.zip | |
[459783] Improve DnD cursor feedback
When dropping an element on a diagram from the project explorer a "+"
decorator is now displayed
Bug: 459783
Change-Id: I054719ad37995b7cb0f434738b2b6c1ee97f857b
Signed-off-by: Nathalie Lepine <nathalie.lepine@obeo.fr>
Signed-off-by: Steve Monnier <steve.monnier@obeo.fr>
| -rw-r--r-- | plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/DDiagramEditorImpl.java | 91 |
1 files changed, 66 insertions, 25 deletions
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/DDiagramEditorImpl.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/DDiagramEditorImpl.java index 3a1a62ca92..d81865a0b5 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/DDiagramEditorImpl.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/editor/DDiagramEditorImpl.java @@ -43,6 +43,7 @@ import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.emf.workspace.IWorkspaceCommandStack; import org.eclipse.gef.DefaultEditDomain; import org.eclipse.gef.EditPart; +import org.eclipse.gef.EditPartViewer; import org.eclipse.gef.GraphicalViewer; import org.eclipse.gef.KeyHandler; import org.eclipse.gef.KeyStroke; @@ -88,6 +89,7 @@ import org.eclipse.jface.util.LocalSelectionTransfer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.sirius.business.api.dialect.command.RefreshRepresentationsCommand; import org.eclipse.sirius.business.api.session.Session; import org.eclipse.sirius.business.api.session.SessionListener; @@ -184,6 +186,10 @@ import org.eclipse.sirius.viewpoint.DRepresentationElement; import org.eclipse.sirius.viewpoint.DSemanticDecorator; import org.eclipse.sirius.viewpoint.SiriusPlugin; import org.eclipse.swt.SWT; +import org.eclipse.swt.dnd.DND; +import org.eclipse.swt.dnd.DropTarget; +import org.eclipse.swt.dnd.DropTargetEvent; +import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; @@ -219,6 +225,65 @@ import com.google.common.collect.Sets; */ public class DDiagramEditorImpl extends SiriusDiagramEditor implements DDiagramEditor, ISelectionListener, SessionListener { + protected class DDiagramEditorTransferDropTargetListener extends AbstractTransferDropTargetListener { + + /** + * Constructs a new AbstractTransferDropTargetListener and sets the + * EditPartViewer and Transfer. The Viewer's Control should be the Drop + * target. + * + * @param viewer + * the EditPartViewer + * @param xfer + * the Transfer + */ + protected DDiagramEditorTransferDropTargetListener(EditPartViewer viewer, Transfer xfer) { + super(viewer, xfer); + } + + @Override + protected Request createTargetRequest() { + final ChangeBoundsRequest request = new ChangeBoundsRequest(RequestConstants.REQ_DROP); + final List<EditPart> list = new ArrayList<EditPart>(1); + if (getCurrentEvent().data instanceof IStructuredSelection) { + list.add(new DragAndDropWrapper(getCurrentEvent().data)); + } else if (getTransfer() instanceof LocalSelectionTransfer) { + final LocalSelectionTransfer localSelectionTransfer = (LocalSelectionTransfer) getTransfer(); + if (localSelectionTransfer.getSelection() instanceof IStructuredSelection) { + list.add(new DragAndDropWrapper(localSelectionTransfer.getSelection())); + } + } + request.setEditParts(list); + return request; + } + + @Override + public void setCurrentEvent(DropTargetEvent currentEvent) { + // Look into the DropTargetEvent for a LocalSelectionTransfer + if (currentEvent != null && currentEvent.getSource() instanceof DropTarget) { + Transfer[] transferArray = ((DropTarget) currentEvent.getSource()).getTransfer(); + for (Transfer transfer : transferArray) { + if (transfer instanceof LocalSelectionTransfer && ((LocalSelectionTransfer) transfer).getSelection() instanceof TreeSelection) { + TreeSelection localSelectionTransfer = (TreeSelection) ((LocalSelectionTransfer) transfer).getSelection(); + // If there is a DSemanticDecorator among the selected + // element then the source view is a DRepresentation and + // we do not want to modify the performed operation + if (Iterables.isEmpty(Iterables.filter(localSelectionTransfer.toList(), DSemanticDecorator.class))) { + currentEvent.detail = DND.DROP_COPY; + } + } + } + } + super.setCurrentEvent(currentEvent); + } + + @Override + protected void updateTargetRequest() { + final Request request = getTargetRequest(); + ((ChangeBoundsRequest) request).setLocation(getDropLocation()); + } + } + /** * The ID of the editor in the Editor Registry. */ @@ -1462,31 +1527,7 @@ public class DDiagramEditorImpl extends SiriusDiagramEditor implements DDiagramE SiriusCanonicalLayoutHandler.launchArrangeCommand(diagramEditPart); } - transferDropTargetListener = new AbstractTransferDropTargetListener(getGraphicalViewer(), LocalSelectionTransfer.getTransfer()) { - - @Override - protected Request createTargetRequest() { - final ChangeBoundsRequest request = new ChangeBoundsRequest(RequestConstants.REQ_DROP); - final List<EditPart> list = new ArrayList<EditPart>(1); - if (getCurrentEvent().data instanceof IStructuredSelection) { - list.add(new DragAndDropWrapper(getCurrentEvent().data)); - } else if (getTransfer() instanceof LocalSelectionTransfer) { - final LocalSelectionTransfer localSelectionTransfer = (LocalSelectionTransfer) getTransfer(); - if (localSelectionTransfer.getSelection() instanceof IStructuredSelection) { - list.add(new DragAndDropWrapper(localSelectionTransfer.getSelection())); - } - } - request.setEditParts(list); - return request; - } - - @Override - protected void updateTargetRequest() { - final Request request = getTargetRequest(); - ((ChangeBoundsRequest) request).setLocation(getDropLocation()); - } - - }; + transferDropTargetListener = new DDiagramEditorTransferDropTargetListener(getGraphicalViewer(), LocalSelectionTransfer.getTransfer()); getGraphicalViewer().addDropTargetListener(transferDropTargetListener); |
