Index: editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/filesview/PasteAction.java |
=================================================================== |
--- editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/filesview/PasteAction.java (revision 0) |
+++ editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/filesview/PasteAction.java (revision 0) |
@@ -0,0 +1,260 @@ |
+/* |
+ * Copyright (c) 2012, the Dart project authors. |
+ * |
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except |
+ * in compliance with the License. You may obtain a copy of the License at |
+ * |
+ * http://www.eclipse.org/legal/epl-v10.html |
+ * |
+ * Unless required by applicable law or agreed to in writing, software distributed under the License |
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
+ * or implied. See the License for the specific language governing permissions and limitations under |
+ * the License. |
+ */ |
+package com.google.dart.tools.ui.internal.filesview; |
+ |
+import com.google.dart.tools.ui.DartToolsPlugin; |
+ |
+import org.eclipse.core.resources.IContainer; |
+import org.eclipse.core.resources.IFile; |
+import org.eclipse.core.resources.IProject; |
+import org.eclipse.core.resources.IResource; |
+import org.eclipse.core.runtime.Assert; |
+import org.eclipse.jface.viewers.IStructuredSelection; |
+import org.eclipse.swt.SWT; |
+import org.eclipse.swt.dnd.Clipboard; |
+import org.eclipse.swt.dnd.FileTransfer; |
+import org.eclipse.swt.dnd.TransferData; |
+import org.eclipse.swt.widgets.Shell; |
+import org.eclipse.ui.ISharedImages; |
+import org.eclipse.ui.PlatformUI; |
+import org.eclipse.ui.actions.CopyFilesAndFoldersOperation; |
+import org.eclipse.ui.actions.CopyProjectOperation; |
+import org.eclipse.ui.actions.SelectionListenerAction; |
+import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages; |
+import org.eclipse.ui.part.ResourceTransfer; |
+ |
+import java.util.List; |
+ |
+/** |
+ * Standard action for pasting resources on the clipboard to the selected resource's location. |
+ * <p> |
+ * Based on the package private <code>org.eclipse.ui.views.navigator.PasteAction</code>. |
+ * </p> |
+ */ |
+@SuppressWarnings({"restriction", "rawtypes"}) |
+public class PasteAction extends SelectionListenerAction { |
+ |
+ /** |
+ * The id of this action. |
+ */ |
+ public static final String ID = DartToolsPlugin.PLUGIN_ID + ".PasteAction";//$NON-NLS-1$ |
+ |
+ /** |
+ * The shell in which to show any dialogs. |
+ */ |
+ private Shell shell; |
+ |
+ /** |
+ * System clipboard |
+ */ |
+ private Clipboard clipboard; |
+ |
+ /** |
+ * Creates a new action. |
+ * |
+ * @param shell the shell for any dialogs |
+ * @param clipboard the clipboard |
+ */ |
+ public PasteAction(Shell shell, Clipboard clipboard) { |
+ super(ResourceNavigatorMessages.PasteAction_title); |
+ Assert.isNotNull(shell); |
+ Assert.isNotNull(clipboard); |
+ this.shell = shell; |
+ this.clipboard = clipboard; |
+ setToolTipText(ResourceNavigatorMessages.PasteAction_toolTip); |
+ setId(PasteAction.ID); |
+ setAccelerator(SWT.MOD1 | 'v'); |
+ setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor( |
+ ISharedImages.IMG_TOOL_PASTE)); |
+ setDisabledImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor( |
+ ISharedImages.IMG_TOOL_PASTE_DISABLED)); |
+ } |
+ |
+ @Override |
+ public void run() { |
+ // try a resource transfer |
+ ResourceTransfer resTransfer = ResourceTransfer.getInstance(); |
+ IResource[] resourceData = (IResource[]) clipboard.getContents(resTransfer); |
+ |
+ if (resourceData != null && resourceData.length > 0) { |
+ if (resourceData[0].getType() == IResource.PROJECT) { |
+ // enablement checks for all projects |
+ for (int i = 0; i < resourceData.length; i++) { |
+ CopyProjectOperation operation = new CopyProjectOperation(this.shell); |
+ operation.copyProject((IProject) resourceData[i]); |
+ } |
+ } else { |
+ // enablement should ensure that we always have access to a container |
+ IContainer container = getContainer(); |
+ |
+ CopyFilesAndFoldersOperation operation = new CopyFilesAndFoldersOperation(this.shell); |
+ operation.copyResources(resourceData, container); |
+ } |
+ return; |
+ } |
+ |
+ // try a file transfer |
+ FileTransfer fileTransfer = FileTransfer.getInstance(); |
+ String[] fileData = (String[]) clipboard.getContents(fileTransfer); |
+ |
+ if (fileData != null) { |
+ // enablement should ensure that we always have access to a container |
+ IContainer container = getContainer(); |
+ |
+ CopyFilesAndFoldersOperation operation = new CopyFilesAndFoldersOperation(this.shell); |
+ operation.copyFiles(fileData, container); |
+ } |
+ } |
+ |
+ /** |
+ * The <code>PasteAction</code> implementation of this <code>SelectionListenerAction</code> method |
+ * enables this action if a resource compatible with what is on the clipboard is selected. |
+ * -Clipboard must have IResource or java.io.File -Projects can always be pasted if they are open |
+ * -Workspace folder may not be copied into itself -Files and folders may be pasted to a single |
+ * selected folder in open project or multiple selected files in the same folder |
+ */ |
+ @Override |
+ protected boolean updateSelection(IStructuredSelection selection) { |
+ if (!super.updateSelection(selection)) { |
+ return false; |
+ } |
+ |
+ final IResource[][] clipboardData = new IResource[1][]; |
+ shell.getDisplay().syncExec(new Runnable() { |
+ @Override |
+ public void run() { |
+ // clipboard must have resources or files |
+ ResourceTransfer resTransfer = ResourceTransfer.getInstance(); |
+ clipboardData[0] = (IResource[]) clipboard.getContents(resTransfer); |
+ } |
+ }); |
+ IResource[] resourceData = clipboardData[0]; |
+ boolean isProjectRes = resourceData != null && resourceData.length > 0 |
+ && resourceData[0].getType() == IResource.PROJECT; |
+ |
+ if (isProjectRes) { |
+ for (int i = 0; i < resourceData.length; i++) { |
+ // make sure all resource data are open projects |
+ // can paste open projects regardless of selection |
+ if (resourceData[i].getType() != IResource.PROJECT |
+ || ((IProject) resourceData[i]).isOpen() == false) { |
+ return false; |
+ } |
+ } |
+ return true; |
+ } |
+ |
+ if (getSelectedNonResources().size() > 0) { |
+ return false; |
+ } |
+ |
+ IResource targetResource = getTarget(); |
+ // targetResource is null if no valid target is selected (e.g., open project) |
+ // or selection is empty |
+ if (targetResource == null) { |
+ return false; |
+ } |
+ |
+ // can paste files and folders to a single selection (file, folder, |
+ // open project) or multiple file selection with the same parent |
+ List selectedResources = getSelectedResources(); |
+ if (selectedResources.size() > 1) { |
+ for (int i = 0; i < selectedResources.size(); i++) { |
+ IResource resource = (IResource) selectedResources.get(i); |
+ if (resource.getType() != IResource.FILE) { |
+ return false; |
+ } |
+ if (!targetResource.equals(resource.getParent())) { |
+ return false; |
+ } |
+ } |
+ } |
+ if (resourceData != null) { |
+ // linked resources can only be pasted into projects |
+ if (isLinked(resourceData) && targetResource.getType() != IResource.PROJECT |
+ && targetResource.getType() != IResource.FOLDER) { |
+ return false; |
+ } |
+ |
+ if (targetResource.getType() == IResource.FOLDER) { |
+ // don't try to copy folder to self |
+ for (int i = 0; i < resourceData.length; i++) { |
+ if (targetResource.equals(resourceData[i])) { |
+ return false; |
+ } |
+ } |
+ } |
+ return true; |
+ } |
+ TransferData[] transfers = clipboard.getAvailableTypes(); |
+ FileTransfer fileTransfer = FileTransfer.getInstance(); |
+ for (int i = 0; i < transfers.length; i++) { |
+ if (fileTransfer.isSupportedType(transfers[i])) { |
+ return true; |
+ } |
+ } |
+ return false; |
+ } |
+ |
+ /** |
+ * Returns the container to hold the pasted resources. |
+ */ |
+ private IContainer getContainer() { |
+ List selection = getSelectedResources(); |
+ if (selection.get(0) instanceof IFile) { |
+ return ((IFile) selection.get(0)).getParent(); |
+ } else { |
+ return (IContainer) selection.get(0); |
+ } |
+ } |
+ |
+ /** |
+ * Returns the actual target of the paste action. Returns null if no valid target is selected. |
+ * |
+ * @return the actual target of the paste action |
+ */ |
+ private IResource getTarget() { |
+ List selectedResources = getSelectedResources(); |
+ |
+ for (int i = 0; i < selectedResources.size(); i++) { |
+ IResource resource = (IResource) selectedResources.get(i); |
+ |
+ if (resource instanceof IProject && !((IProject) resource).isOpen()) { |
+ return null; |
+ } |
+ if (resource.getType() == IResource.FILE) { |
+ resource = resource.getParent(); |
+ } |
+ if (resource != null) { |
+ return resource; |
+ } |
+ } |
+ return null; |
+ } |
+ |
+ /** |
+ * Returns whether any of the given resources are linked resources. |
+ * |
+ * @param resources resource to check for linked type. may be null |
+ * @return true=one or more resources are linked. false=none of the resources are linked |
+ */ |
+ private boolean isLinked(IResource[] resources) { |
+ for (int i = 0; i < resources.length; i++) { |
+ if (resources[i].isLinked()) { |
+ return true; |
+ } |
+ } |
+ return false; |
+ } |
+} |