/******************************************************************************* * Copyright (c) 2008, 2011 Andrew Gvozdev and others. * 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: * Andrew Gvozdev (Quoin Inc.)- Initial implementation *******************************************************************************/ package org.eclipse.cdt.make.ui.views; import org.eclipse.cdt.make.core.IMakeTarget; import org.eclipse.cdt.make.internal.ui.MakeUIPlugin; import org.eclipse.cdt.make.internal.ui.dnd.FileTransferDropTargetListener; import org.eclipse.cdt.make.internal.ui.dnd.MakeTargetTransfer; import org.eclipse.cdt.make.internal.ui.dnd.MakeTargetTransferData; import org.eclipse.cdt.make.internal.ui.dnd.MakeTargetTransferDropTargetListener; import org.eclipse.cdt.make.internal.ui.dnd.TextTransferDropTargetListener; import org.eclipse.cdt.make.ui.TargetSourceContainer; import org.eclipse.core.resources.IContainer; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.FileTransfer; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.SelectionListenerAction; /** * Action to paste make targets from clipboard to Make Target View. * {@link PasteTargetAction} can accept several kinds of clipboard transfers * including make targets, plain text or files . * <p> * {@link CopyTargetAction} and {@link PasteTargetAction} are able to transfer * targets inside Make Target View or between eclipse sessions. * * @noextend This class is not intended to be subclassed by clients. * @noinstantiate This class is not intended to be instantiated by clients. */ public class PasteTargetAction extends SelectionListenerAction { private final Shell shell; private final Clipboard clipboard; /** * Constructor setting internal private fields and initializing the action. * * @param shell * - the shell in which to show any dialogs. * @param clipboard * - system clipboard. * @since 7.3 */ public PasteTargetAction(Shell shell, Clipboard clipboard) { super(MakeUIPlugin.getResourceString("PasteTargetAction.label")); //$NON-NLS-1$ this.shell = shell; this.clipboard = clipboard; ISharedImages images = PlatformUI.getWorkbench().getSharedImages(); setDisabledImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_DISABLED)); setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE)); setHoverImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE)); setToolTipText(MakeUIPlugin.getResourceString("PasteTargetAction.tooltip")); //$NON-NLS-1$ } /** * Updates enablement of this action in response to the given selection. */ @Override protected boolean updateSelection(IStructuredSelection selection) { if (!super.updateSelection(selection)) { return false; } return determineDropContainer()!=null; } /** * Perform actual action of pasting of make targets from clipboard. An appropriate * transfer agent is used depending on the clipboard content data type. */ @Override public void run() { IContainer dropContainer = determineDropContainer(); if (dropContainer==null) { return; } Object clipboardContent; clipboardContent = clipboard.getContents(MakeTargetTransfer.getInstance()); if (clipboardContent instanceof MakeTargetTransferData) { MakeTargetTransferDropTargetListener.createTransferTargetsUI( (MakeTargetTransferData) clipboardContent, dropContainer, DND.DROP_COPY, shell); return; } clipboardContent = clipboard.getContents(FileTransfer.getInstance()); if (clipboardContent instanceof String[]) { FileTransferDropTargetListener.createFileTargetsUI((String[]) clipboardContent, dropContainer, DND.DROP_COPY, shell); return; } clipboardContent = clipboard.getContents(TextTransfer.getInstance()); if (clipboardContent instanceof String) { TextTransferDropTargetListener.createMultilineTargetsUI((String) clipboardContent, dropContainer, DND.DROP_COPY, shell); return; } } /** * Drop container is determined by first element. The rest of the logic is * to figure out if drop is allowed. The drop is allowed if the selection is * one {@code IContainer} or {@code IMakeTarget}s from the same folder. * * @return drop container or {@code null}. */ private IContainer determineDropContainer() { IStructuredSelection selection = getStructuredSelection(); if (selection.size()==0) { return null; } Object first = selection.getFirstElement(); if (first instanceof IContainer) { if (selection.size()==1) { return (IContainer)first; } else { return null; } } if (first instanceof IMakeTarget) { // it has to be selection of IMakeTargets only and from the same IContainer IContainer dropContainer = ((IMakeTarget)first).getContainer(); for (Object item : selection.toList()) { if ( !(item instanceof IMakeTarget) || ((IMakeTarget)item).getContainer()!=dropContainer ) { return null; } } return dropContainer; } if (first instanceof TargetSourceContainer) { return ((TargetSourceContainer) first).getContainer(); } return null; } }