Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPierre-Charles David2017-08-22 13:34:20 +0000
committerPierre-Charles David2017-08-28 12:48:06 +0000
commit8e96cc411a8e3a2d5bf2bf36a064fb3eb5444fba (patch)
treeb8489396144ca4f6b362a9336d8b547538f6175f
parentf8b3b15f3dcbff0c4df9769f45f6399b9337a75f (diff)
downloadorg.eclipse.sirius-8e96cc411a8e3a2d5bf2bf36a064fb3eb5444fba.tar.gz
org.eclipse.sirius-8e96cc411a8e3a2d5bf2bf36a064fb3eb5444fba.tar.xz
org.eclipse.sirius-8e96cc411a8e3a2d5bf2bf36a064fb3eb5444fba.zip
[520581] Handle dropping of non-semantic model files more gracefully
Move the ModelCommonDropAdapterAssistant class into an internal package (no reason to expose this as API), and make sure it will only attempt to add as semantic resources files which look like good candidates. Bug: 520581 Change-Id: I83b3f8e6d3232d4599a708668e0f2fedbaf02585 Signed-off-by: Pierre-Charles David <pierre-charles.david@obeo.fr>
-rw-r--r--plugins/org.eclipse.sirius.ui.editor/META-INF/MANIFEST.MF1
-rw-r--r--plugins/org.eclipse.sirius.ui.editor/plugin.xml2
-rw-r--r--plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/ModelCommonDropAdapterAssistant.java113
-rw-r--r--plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/ModelCommonDropAdapterAssistant.java128
4 files changed, 130 insertions, 114 deletions
diff --git a/plugins/org.eclipse.sirius.ui.editor/META-INF/MANIFEST.MF b/plugins/org.eclipse.sirius.ui.editor/META-INF/MANIFEST.MF
index cecee57ae8..b5b2fad373 100644
--- a/plugins/org.eclipse.sirius.ui.editor/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.sirius.ui.editor/META-INF/MANIFEST.MF
@@ -39,6 +39,7 @@ Import-Package: org.eclipse.sirius.ext.base;version="2.1.0",
Bundle-Activator: org.eclipse.sirius.ui.editor.SessionEditorPlugin$Implementation
Export-Package: org.eclipse.sirius.ui.editor;version="5.1.0",
org.eclipse.sirius.ui.editor.api.pages;version="5.1.0",
+ org.eclipse.sirius.ui.editor.internal;version="5.1.0";x-internal:=true,
org.eclipse.sirius.ui.editor.internal.graphicalcomponents;version="5.1.0";x-internal:=true,
org.eclipse.sirius.ui.editor.internal.pages;version="5.1.0";x-internal:=true,
org.eclipse.sirius.ui.editor.internal.preferences;version="5.1.0";x-internal:=true
diff --git a/plugins/org.eclipse.sirius.ui.editor/plugin.xml b/plugins/org.eclipse.sirius.ui.editor/plugin.xml
index d301a876b0..20802483d0 100644
--- a/plugins/org.eclipse.sirius.ui.editor/plugin.xml
+++ b/plugins/org.eclipse.sirius.ui.editor/plugin.xml
@@ -73,7 +73,7 @@
<triggerPoints>
</triggerPoints>
<dropAssistant
- class="org.eclipse.sirius.ui.editor.ModelCommonDropAdapterAssistant"
+ class="org.eclipse.sirius.ui.editor.internal.ModelCommonDropAdapterAssistant"
id="org.eclipse.sirius.ui.editor.modelDropAssistant">
<possibleDropTargets>
<adapt
diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/ModelCommonDropAdapterAssistant.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/ModelCommonDropAdapterAssistant.java
deleted file mode 100644
index dbd879d66b..0000000000
--- a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/ModelCommonDropAdapterAssistant.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017 Obeo.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Obeo - initial API and implementation
- *******************************************************************************/
-package org.eclipse.sirius.ui.editor;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.internal.resources.File;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.transaction.RecordingCommand;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.sirius.business.api.session.Session;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.navigator.CommonDropAdapter;
-import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
-
-/**
- * A {@link CommonDropAdapterAssistant} to support drop of model elements into
- * semantic tree viewer.
- *
- * @author jmallet
- */
-@SuppressWarnings("restriction")
-public class ModelCommonDropAdapterAssistant extends CommonDropAdapterAssistant {
-
- @Override
- public IStatus validateDrop(Object target, int operation, TransferData transferType) {
- IStatus status = Status.CANCEL_STATUS;
- if (DND.DROP_MOVE == operation) {
- Collection<File> extractDragSource = extractDragSource(LocalSelectionTransfer.getTransfer().getSelection());
- if (!extractDragSource.isEmpty()) {
- status = Status.OK_STATUS;
- }
- }
- return status;
- }
-
- @Override
- public IStatus handleDrop(CommonDropAdapter aDropAdapter, DropTargetEvent aDropTargetEvent, Object aTarget) {
- IStatus status = Status.CANCEL_STATUS;
- IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
- final IWorkbenchPage activePage = window.getActivePage();
- final IEditorPart activeEditor = activePage.getActiveEditor();
- if (activeEditor instanceof SessionEditor) {
- Session session = ((SessionEditor) activeEditor).getSession();
- Collection<File> droppedEObjects = extractDragSource(aDropTargetEvent.data);
- if (!droppedEObjects.isEmpty()) {
- try {
- new ProgressMonitorDialog(window.getShell()).run(false, false, monitor -> {
- session.getTransactionalEditingDomain().getCommandStack().execute(new RecordingCommand(session.getTransactionalEditingDomain()) {
- @Override
- protected void doExecute() {
- for (Iterator<File> iterator = droppedEObjects.iterator(); iterator.hasNext(); ) {
- File file = iterator.next();
- session.addSemanticResource(URI.createPlatformResourceURI(file.getFullPath().toString(), true), monitor);
- }
- }
- });
- });
- status = Status.OK_STATUS;
- } catch (InvocationTargetException | InterruptedException e) {
- SessionEditorPlugin.getPlugin().error(e.getMessage(), e);
- }
- }
- }
- return status;
- }
-
- /**
- * This extracts a collection of dragged source file from the given object
- * retrieved from the transfer agent. This default implementation converts a
- * structured selection into a collection of elements.
- *
- * @param object
- * the object representing the selection in drag
- * @return the drag selection in form of collection
- */
- protected Collection<File> extractDragSource(Object object) {
- Collection<File> droppedEObjects = new ArrayList<File>();
- if (object instanceof IStructuredSelection) {
- List<?> list = ((IStructuredSelection) object).toList();
- for (Object obj : list) {
- if (obj instanceof File) {
- File file = (File) obj;
- droppedEObjects.add(file);
- }
- }
- }
- return droppedEObjects;
- }
-
-}
diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/ModelCommonDropAdapterAssistant.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/ModelCommonDropAdapterAssistant.java
new file mode 100644
index 0000000000..d6b915e28d
--- /dev/null
+++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/ModelCommonDropAdapterAssistant.java
@@ -0,0 +1,128 @@
+/*******************************************************************************
+ * Copyright (c) 2017 Obeo.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sirius.ui.editor.internal;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.sirius.business.api.resource.strategy.ResourceStrategyRegistry;
+import org.eclipse.sirius.business.api.session.Session;
+import org.eclipse.sirius.common.ui.tools.api.util.EclipseUIUtil;
+import org.eclipse.sirius.ui.editor.SessionEditor;
+import org.eclipse.sirius.ui.editor.SessionEditorPlugin;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.TransferData;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.navigator.CommonDropAdapter;
+import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
+
+/**
+ * A {@link CommonDropAdapterAssistant} to support drop of model elements into
+ * semantic tree viewer.
+ *
+ * @author jmallet
+ */
+public class ModelCommonDropAdapterAssistant extends CommonDropAdapterAssistant {
+
+ @Override
+ public IStatus validateDrop(Object target, int operation, TransferData transferType) {
+ if (DND.DROP_MOVE == operation) {
+ Optional<Session> session = findCurrentSession();
+ if (session.isPresent()) {
+ Collection<IFile> droppedModelFiles = collectDroppedSemanticModelCandidates(LocalSelectionTransfer.getTransfer().getSelection(), session.get());
+ if (!droppedModelFiles.isEmpty()) {
+ // Found at least one potential semantic model in the
+ // selection.
+ return Status.OK_STATUS;
+ }
+ }
+ }
+ return Status.CANCEL_STATUS;
+ }
+
+ @Override
+ public IStatus handleDrop(CommonDropAdapter aDropAdapter, DropTargetEvent aDropTargetEvent, Object aTarget) {
+ IStatus status = Status.CANCEL_STATUS;
+ Optional<Session> session = findCurrentSession();
+ if (session.isPresent()) {
+ Collection<IFile> droppedModelFiles = collectDroppedSemanticModelCandidates(aDropTargetEvent.data, session.get());
+ if (!droppedModelFiles.isEmpty()) {
+ try {
+ new ProgressMonitorDialog(getShell()).run(false, false, monitor -> {
+ TransactionalEditingDomain ted = session.get().getTransactionalEditingDomain();
+ ted.getCommandStack().execute(new RecordingCommand(ted) {
+ @Override
+ protected void doExecute() {
+ droppedModelFiles.forEach(file -> session.get().addSemanticResource(URI.createPlatformResourceURI(file.getFullPath().toString(), true), monitor));
+ }
+ });
+ });
+ status = Status.OK_STATUS;
+ } catch (InvocationTargetException | InterruptedException e) {
+ SessionEditorPlugin.getPlugin().error(e.getMessage(), e);
+ }
+ }
+ }
+ return status;
+ }
+
+ private Optional<Session> findCurrentSession() {
+ final IEditorPart activeEditor = EclipseUIUtil.getActiveEditor();
+ if (activeEditor instanceof SessionEditor) {
+ return Optional.ofNullable(((SessionEditor) activeEditor).getSession());
+ } else {
+ return Optional.empty();
+ }
+ }
+
+ /**
+ * This extracts a collection of dropped source file from the given object
+ * retrieved from the transfer agent. This default implementation converts a
+ * structured selection into a collection of elements.
+ *
+ * @param object
+ * the object representing the selection in drag
+ * @param session
+ * the session into which the candidate files dropped should be
+ * added as semantic models.
+ * @return the dropped files which look like potential semantic models the
+ * could be added to the session.
+ */
+ private Collection<IFile> collectDroppedSemanticModelCandidates(Object object, Session session) {
+ if (object instanceof IStructuredSelection) {
+ List<?> list = ((IStructuredSelection) object).toList();
+ return list.stream().filter(IFile.class::isInstance).map(IFile.class::cast).filter(f -> isLoadableSemanticModel(f, session)).collect(Collectors.toList());
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+ private boolean isLoadableSemanticModel(IFile file, Session session) {
+ URI candidateURI = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
+ ResourceStrategyRegistry rsr = ResourceStrategyRegistry.getInstance();
+ return rsr.isPotentialSemanticResource(candidateURI) && rsr.isLoadableModel(candidateURI, session);
+ }
+
+}

Back to the top