Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Monnier2015-03-11 09:50:43 +0000
committerSteve Monnier2015-03-11 09:50:43 +0000
commiteea990666ab364ddb6e1b6d575eee15774f92480 (patch)
treed6db4b9a01c23557f2d95205dbe04ba016026876
parent314d2a39069f0b08ac2c9e2e39e9259e28e75f05 (diff)
downloadorg.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.java91
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);

Back to the top