Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian W. Damus2013-09-21 19:14:17 +0000
committerChristian W. Damus2013-09-24 19:10:22 +0000
commit2a16db9a01a88c4735ab862dd85c84bfebda7a03 (patch)
treee7768733a9fbc462d8bfcf9c101a9ae790a78496
parentc349bdf2f783688fcb3184989af955b7d362ae70 (diff)
downloadorg.eclipse.papyrus-2a16db9a01a88c4735ab862dd85c84bfebda7a03.tar.gz
org.eclipse.papyrus-2a16db9a01a88c4735ab862dd85c84bfebda7a03.tar.xz
org.eclipse.papyrus-2a16db9a01a88c4735ab862dd85c84bfebda7a03.zip
415373: [CDO] Add LocalSelectionTransfer drag to Model Repositories View
https://bugs.eclipse.org/bugs/show_bug.cgi?id=415373 Dragging a LocalSelectionTransfer type is required to support dropping in the Papyrus diagrams to create hyperlinks.
-rw-r--r--extraplugins/cdo/org.eclipse.papyrus.cdo.ui/META-INF/MANIFEST.MF3
-rw-r--r--extraplugins/cdo/org.eclipse.papyrus.cdo.ui/plugin.properties4
-rw-r--r--extraplugins/cdo/org.eclipse.papyrus.cdo.ui/plugin.xml42
-rw-r--r--extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/dnd/ResourceDragAdapter.java22
-rw-r--r--extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/dnd/ResourceDropAdapter.java4
-rw-r--r--extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/dnd/ResourceDropAdapterAssistant.java186
-rw-r--r--extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/handlers/ExportModelHandler.java18
7 files changed, 267 insertions, 12 deletions
diff --git a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/META-INF/MANIFEST.MF b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/META-INF/MANIFEST.MF
index e13ec9237b8..2309e75fa88 100644
--- a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/META-INF/MANIFEST.MF
+++ b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/META-INF/MANIFEST.MF
@@ -20,7 +20,8 @@ Require-Bundle: org.eclipse.core.runtime,
org.eclipse.papyrus.infra.widgets.toolbox;bundle-version="0.10.1",
com.google.guava;bundle-version="[11.0.0,12.0.0)",
org.eclipse.papyrus.infra.services.labelprovider;bundle-version="0.10.1",
- org.eclipse.papyrus.infra.services.controlmode;bundle-version="0.10.1"
+ org.eclipse.papyrus.infra.services.controlmode;bundle-version="0.10.1",
+ org.eclipse.ui.navigator;bundle-version="3.5.300"
Export-Package: org.eclipse.papyrus.cdo.internal.ui;x-friends:="org.eclipse.papyrus.cdo.ui.tests,org.eclipse.papyrus.cdo.uml.ui",
org.eclipse.papyrus.cdo.internal.ui.actions;x-friends:="org.eclipse.papyrus.cdo.ui.tests",
org.eclipse.papyrus.cdo.internal.ui.adapters;x-friends:="org.eclipse.papyrus.cdo.ui.tests",
diff --git a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/plugin.properties b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/plugin.properties
index cf0aabb9aed..759800eea8e 100644
--- a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/plugin.properties
+++ b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/plugin.properties
@@ -26,4 +26,6 @@ lockCommand.name = Lock objects
unlockCommand.name = Unlock objects
resolveCommand.name = Resolve conflicts
importCommand.name = Import Models into Repository
-exportCommand.name = Export Model to Workspace \ No newline at end of file
+exportCommand.name = Export Model to Workspace
+navigatorDropContent.name = Papyrus Model Repository Content
+repoFiltersExtPt.name = Model Repository Item Provider Filters \ No newline at end of file
diff --git a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/plugin.xml b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/plugin.xml
index 83ad4789b8f..cd53f34a723 100644
--- a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/plugin.xml
+++ b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/plugin.xml
@@ -15,7 +15,7 @@
-->
<plugin>
- <extension-point id="repositoryFilters" name="Model Repository Item Provider Filters" schema="schema/repositoryFilters.exsd"/>
+ <extension-point id="repositoryFilters" name="%repoFiltersExtPt.name" schema="schema/repositoryFilters.exsd"/>
<extension
point="org.eclipse.ui.views">
<view
@@ -338,4 +338,44 @@
</adapter>
</factory>
</extension>
+ <extension
+ point="org.eclipse.ui.navigator.navigatorContent">
+ <navigatorContent
+ contentProvider="org.eclipse.papyrus.cdo.internal.ui.dnd.ResourceDropAdapterAssistant$DummyContent"
+ id="org.eclipse.papyrus.cdo.ui.navigatorResourceDropAssistant"
+ name="%navigatorDropContent.name"
+ icon="$nl$/icons/full/view16/model_repositories.gif"
+ priority="high">
+ <dropAssistant
+ class="org.eclipse.papyrus.cdo.internal.ui.dnd.ResourceDropAdapterAssistant"
+ id="org.eclipse.papyrus.cdo.ui.resourceDropAssistant">
+ <possibleDropTargets>
+ <instanceof
+ value="org.eclipse.core.resources.IContainer">
+ </instanceof>
+ </possibleDropTargets>
+ </dropAssistant>
+ <possibleChildren>
+ <adapt
+ type="org.eclipse.papyrus.cdo.internal.ui.views.DIModel">
+ </adapt>
+ </possibleChildren>
+ <triggerPoints>
+ <instanceof
+ value="org.eclipse.core.resources.IContainer">
+ </instanceof>
+ </triggerPoints>
+ </navigatorContent>
+ </extension>
+ <extension
+ point="org.eclipse.ui.navigator.viewer">
+ <viewerContentBinding
+ viewerId="org.eclipse.ui.navigator.ProjectExplorer">
+ <includes>
+ <contentExtension
+ pattern="org.eclipse.papyrus.cdo.ui.navigatorResourceDropAssistant">
+ </contentExtension>
+ </includes>
+ </viewerContentBinding>
+ </extension>
</plugin>
diff --git a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/dnd/ResourceDragAdapter.java b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/dnd/ResourceDragAdapter.java
index 8f5f9e00aed..529b3b3bae0 100644
--- a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/dnd/ResourceDragAdapter.java
+++ b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/dnd/ResourceDragAdapter.java
@@ -13,7 +13,6 @@ package org.eclipse.papyrus.cdo.internal.ui.dnd;
import java.util.List;
-import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.eresource.CDOResourceNode;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.IStructuredSelection;
@@ -35,10 +34,12 @@ import com.google.common.collect.Iterables;
*/
public class ResourceDragAdapter extends DragSourceAdapter {
- private static final Transfer[] TRANSFERS = { PluginTransfer.getInstance() };
+ private static final Transfer[] TRANSFERS = { PluginTransfer.getInstance(), LocalSelectionTransfer.getTransfer() };
private final StructuredViewer viewer;
+ private long lastDragTimestamp;
+
protected ResourceDragAdapter(StructuredViewer viewer) {
this.viewer = viewer;
}
@@ -46,7 +47,7 @@ public class ResourceDragAdapter extends DragSourceAdapter {
public static ResourceDragAdapter install(StructuredViewer viewer) {
ResourceDragAdapter result = new ResourceDragAdapter(viewer);
- viewer.addDragSupport(DND.DROP_MOVE | /* DND.DROP_COPY | */DND.DROP_DEFAULT, TRANSFERS, result);
+ viewer.addDragSupport(DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT, TRANSFERS, result);
return result;
}
@@ -59,6 +60,19 @@ public class ResourceDragAdapter extends DragSourceAdapter {
public void dragStart(DragSourceEvent event) {
IStructuredSelection selection = getViewerSelection();
event.doit = acceptSelection(selection.toList());
+ if(event.doit) {
+ lastDragTimestamp = System.currentTimeMillis();
+ LocalSelectionTransfer.getTransfer().setSelection(selection);
+ LocalSelectionTransfer.getTransfer().setSelectionSetTime(lastDragTimestamp);
+ }
+ }
+
+ @Override
+ public void dragFinished(DragSourceEvent event) {
+ if(LocalSelectionTransfer.getTransfer().getSelectionSetTime() == lastDragTimestamp) {
+ // clear the selection
+ LocalSelectionTransfer.getTransfer().setSelection(null);
+ }
}
protected boolean acceptSelection(List<?> selection) {
@@ -81,6 +95,6 @@ public class ResourceDragAdapter extends DragSourceAdapter {
}
protected CDOResourceURITransferData getResourceURIs(IStructuredSelection selection) {
- return new CDOResourceURITransferData(Iterables.filter(Iterables.transform((List<?>)selection.toList(), CDOFunctions.adapt(CDOResource.class)), Predicates.notNull()));
+ return new CDOResourceURITransferData(Iterables.filter(Iterables.transform((List<?>)selection.toList(), CDOFunctions.adapt(CDOResourceNode.class)), Predicates.notNull()));
}
}
diff --git a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/dnd/ResourceDropAdapter.java b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/dnd/ResourceDropAdapter.java
index 5990d7a08f5..6f30137c7ab 100644
--- a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/dnd/ResourceDropAdapter.java
+++ b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/dnd/ResourceDropAdapter.java
@@ -238,7 +238,7 @@ public class ResourceDropAdapter extends ViewerDropAdapter {
} else if(node instanceof CDOResource) {
result = view.getResource(node.getPath());
} else {
- throw new CoreException(error(Messages.ResourceDropAdapter_4 + node.getClass().getName()));
+ throw new CoreException(error(NLS.bind(Messages.ResourceDropAdapter_4, node.getClass().getName())));
}
} catch (CoreException e) {
throw e;
@@ -375,6 +375,7 @@ public class ResourceDropAdapter extends ViewerDropAdapter {
Iterable<IPapyrusFile> papyrusFiles = Iterables.filter(selection.toList(), IPapyrusFile.class);
Iterable<IFile> files = Iterables.filter(Iterables.filter(selection.toList(), IFile.class), new Predicate<IFile>() {
+ @Override
public boolean apply(IFile input) {
return PapyrusModelHelper.getPapyrusModelFactory().isDi(input);
}
@@ -382,6 +383,7 @@ public class ResourceDropAdapter extends ViewerDropAdapter {
return Iterables.concat(files, Iterables.transform(papyrusFiles, new Function<IPapyrusFile, IFile>() {
+ @Override
public IFile apply(IPapyrusFile input) {
return input.getMainFile();
}
diff --git a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/dnd/ResourceDropAdapterAssistant.java b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/dnd/ResourceDropAdapterAssistant.java
new file mode 100644
index 00000000000..70165513888
--- /dev/null
+++ b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/dnd/ResourceDropAdapterAssistant.java
@@ -0,0 +1,186 @@
+/*****************************************************************************
+ * Copyright (c) 2013 CEA LIST.
+ *
+ * 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:
+ * CEA LIST - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.cdo.internal.ui.dnd;
+
+import static com.google.common.collect.Iterables.transform;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.papyrus.cdo.core.util.CDOFunctions;
+import org.eclipse.papyrus.cdo.core.util.CDOPredicates;
+import org.eclipse.papyrus.cdo.internal.core.CDOUtils;
+import org.eclipse.papyrus.cdo.internal.ui.Activator;
+import org.eclipse.papyrus.cdo.internal.ui.handlers.ExportModelHandler;
+import org.eclipse.papyrus.cdo.internal.ui.views.DIModel;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.TransferData;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.navigator.CommonDropAdapter;
+import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
+import org.eclipse.ui.navigator.ICommonContentExtensionSite;
+import org.eclipse.ui.navigator.ICommonContentProvider;
+import org.eclipse.ui.navigator.ICommonLabelProvider;
+
+import com.google.common.base.Function;
+import com.google.common.base.Functions;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
+
+/**
+ * Drop-adapter assistant for dropping CDO resources into the Project Explorer to export them.
+ */
+public class ResourceDropAdapterAssistant extends CommonDropAdapterAssistant {
+
+ private static final IStatus INVALID_DROP = new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Invalid drop."); //$NON-NLS-1$
+
+ private static final IStatus VALID_DROP = Status.OK_STATUS;
+
+ public ResourceDropAdapterAssistant() {
+ super();
+ }
+
+ @Override
+ public IStatus validateDrop(Object target, int operation, TransferData transferType) {
+ IStatus result = INVALID_DROP;
+
+ // we can drop a local-selection transfer consisting of DI models onto a workspace container (project or folder)
+ if(LocalSelectionTransfer.getTransfer().isSupportedType(transferType) && CDOPredicates.adaptsTo(IContainer.class).apply(target)) {
+ IStructuredSelection sel = CDOUtils.tryCast(LocalSelectionTransfer.getTransfer().getSelection(), IStructuredSelection.class);
+ if((sel != null) && !sel.isEmpty() && Iterables.all((List<?>)sel.toList(), CDOPredicates.adaptsTo(DIModel.class))) {
+ result = VALID_DROP;
+ }
+ }
+
+ return result;
+ }
+
+ @Override
+ public IStatus handleDrop(CommonDropAdapter aDropAdapter, DropTargetEvent aDropTargetEvent, Object aTarget) {
+ IStatus result = INVALID_DROP;
+
+ IStructuredSelection sel = CDOUtils.tryCast(LocalSelectionTransfer.getTransfer().getSelection(), IStructuredSelection.class);
+ if((sel != null) && !sel.isEmpty()) {
+ IContainer container = CDOUtils.adapt(aTarget, IContainer.class);
+ if(container != null) {
+ Function<Object, URI> uriFunction = Functions.compose(new Function<DIModel, URI>() {
+
+ @Override
+ public URI apply(DIModel input) {
+ return input.getResource().getURI();
+ }
+ }, CDOFunctions.adapt(DIModel.class));
+
+ List<URI> uris = Lists.newArrayList(transform((List<?>)sel.toList(), uriFunction));
+ ExportModelHandler.exportModels(container, uris);
+ result = VALID_DROP;
+ }
+ }
+
+ return result;
+ }
+
+ //
+ // Nested types
+ //
+
+ /**
+ * Navigator content extensions require a content provider even if they have no content to provide, only a drop assistant.
+ * So, this makes the <i>Common Navigator</i> happy.
+ */
+ public static final class DummyContent implements ICommonContentProvider {
+
+ private static final Object[] NOTHING = {};
+
+ @Override
+ public Object[] getElements(Object inputElement) {
+ return NOTHING;
+ }
+
+ @Override
+ public Object[] getChildren(Object parentElement) {
+ return NOTHING;
+ }
+
+ @Override
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ @Override
+ public boolean hasChildren(Object element) {
+ return false;
+ }
+
+ @Override
+ public void dispose() {
+ // pass
+ }
+
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ // pass
+ }
+
+ @Override
+ public void restoreState(IMemento aMemento) {
+ // pass
+ }
+
+ @Override
+ public void saveState(IMemento aMemento) {
+ // pass
+ }
+
+ @Override
+ public void init(ICommonContentExtensionSite aConfig) {
+ // pass
+ }
+
+ }
+
+ /**
+ * Navigator content extensions require a label provider even if they have no content to provide, only a drop assistant.
+ * So, this makes the <i>Common Navigator</i> happy.
+ */
+ public static final class DummyLabels extends LabelProvider implements ICommonLabelProvider {
+
+ @Override
+ public void restoreState(IMemento aMemento) {
+ // pass
+ }
+
+ @Override
+ public void saveState(IMemento aMemento) {
+ // pass
+ }
+
+ @Override
+ public String getDescription(Object anElement) {
+ return null;
+ }
+
+ @Override
+ public void init(ICommonContentExtensionSite aConfig) {
+ // pass
+ }
+
+ }
+}
diff --git a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/handlers/ExportModelHandler.java b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/handlers/ExportModelHandler.java
index 4d607071f23..da84b6d9b09 100644
--- a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/handlers/ExportModelHandler.java
+++ b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/handlers/ExportModelHandler.java
@@ -18,9 +18,10 @@ import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IContainer;
import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.eresource.CDOResourceNode;
+import org.eclipse.emf.cdo.util.CDOURIUtil;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
@@ -29,6 +30,7 @@ import org.eclipse.papyrus.cdo.core.IPapyrusRepository;
import org.eclipse.papyrus.cdo.internal.core.IInternalPapyrusRepository;
import org.eclipse.papyrus.cdo.internal.core.PapyrusRepositoryManager;
import org.eclipse.papyrus.cdo.internal.ui.views.DIModel;
+import org.eclipse.papyrus.cdo.internal.ui.views.DIResourceQuery;
import org.eclipse.papyrus.cdo.internal.ui.wizards.ModelExportWizard;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
@@ -41,6 +43,7 @@ import com.google.common.collect.Lists;
*/
public class ExportModelHandler extends AbstractHandler {
+ @Override
public Object execute(ExecutionEvent event) throws ExecutionException {
ISelection selection = HandlerUtil.getCurrentSelection(event);
@@ -72,9 +75,16 @@ public class ExportModelHandler extends AbstractHandler {
if(repo != null) {
CDOView view = ((IInternalPapyrusRepository)repo).getMasterView();
if(view != null) { // the repository could be disconnected by now
- Resource resource = view.getResourceSet().getResource(next, true);
- if(resource instanceof CDOResource) {
- models.add(DIModel.getInstance((CDOResource)resource, true));
+ try {
+ CDOResourceNode resource = view.getResourceNode(CDOURIUtil.extractResourcePath(next));
+ if(resource instanceof CDOResource) {
+ // only export DI models!
+ if(DIResourceQuery.getDIResources(view).contains(resource)) {
+ models.add(DIModel.getInstance((CDOResource)resource, true));
+ }
+ }
+ } catch (Exception e) {
+ // normal consequence of the repository path not being found
}
}
}

Back to the top