diff options
| author | Pierre-Charles David | 2017-08-22 13:34:20 +0000 |
|---|---|---|
| committer | Pierre-Charles David | 2017-08-28 12:48:06 +0000 |
| commit | 8e96cc411a8e3a2d5bf2bf36a064fb3eb5444fba (patch) | |
| tree | b8489396144ca4f6b362a9336d8b547538f6175f | |
| parent | f8b3b15f3dcbff0c4df9769f45f6399b9337a75f (diff) | |
| download | org.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>
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); + } + +} |
