diff options
author | Christian W. Damus | 2013-09-21 19:14:17 +0000 |
---|---|---|
committer | Christian W. Damus | 2013-09-24 19:10:22 +0000 |
commit | 2a16db9a01a88c4735ab862dd85c84bfebda7a03 (patch) | |
tree | e7768733a9fbc462d8bfcf9c101a9ae790a78496 | |
parent | c349bdf2f783688fcb3184989af955b7d362ae70 (diff) | |
download | org.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.
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 } } } |