/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ui.views.markers.internal;

import java.util.ArrayList;
import java.util.Map;

import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.SelectionProviderAction;
import org.eclipse.ui.part.MarkerTransfer;

/**
 * Pastes one or more bookmark(s) from the clipboard into the bookmark navigator.
 */
public class ActionPasteMarker extends SelectionProviderAction {
	
	private IWorkbenchPart part;
	private Clipboard clipboard;
	private String[] pastableTypes;

	/**
	 * Creates the action.
	 */
	public ActionPasteMarker(IWorkbenchPart part, ISelectionProvider provider) {
		super(provider, Messages.getString("pasteAction.title")); //$NON-NLS-1$
		this.part = part;
		this.pastableTypes = new String[0];
		setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_HOVER));
		setEnabled(false);
	}
	
	void setClipboard(Clipboard clipboard) {
		this.clipboard = clipboard;
	}
	
	/**
	 * Copies the marker(s) from the clipboard to the bookmark navigator view.
	 */
	public void run() {
		// Get the markers from the clipboard
		MarkerTransfer transfer = MarkerTransfer.getInstance();
		IMarker[] markerData = (IMarker[]) clipboard.getContents(transfer);
		paste(markerData);
	}
	
	void paste(final IMarker[] markers) {
		if (markers == null) 
			return;

		final ArrayList newMarkers = new ArrayList();

		try {
			ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
				public void run(IProgressMonitor monitor) throws CoreException {
					for (int i = 0; i < markers.length; i++) {
						String type = markers[i].getType();
						// Paste to the same resource as the original
						IResource resource = markers[i].getResource();
						Map attributes = markers[i].getAttributes();
						IMarker marker = resource.createMarker(type);
						marker.setAttributes(attributes);
						newMarkers.add(marker);
					}
				}
			}, null);
		} catch (CoreException e) {
			ErrorDialog.openError(
				part.getSite().getShell(),
				Messages.getString("PasteMarker.errorTitle"), //$NON-NLS-1$
				null,
				e.getStatus());
			return;
		}

		// Need to do this in an asyncExec, even though we're in the UI thread here,
		// since the marker view updates itself with the addition in an asyncExec,
		// which hasn't been processed yet.
		// Must be done outside IWorkspaceRunnable above since notification for add is
		// sent after IWorkspaceRunnable is run.
		if (getSelectionProvider() != null && newMarkers.size() > 0) {
			part.getSite().getShell().getDisplay().asyncExec(new Runnable() {
				public void run() {
					getSelectionProvider().setSelection(new StructuredSelection(newMarkers));
				}
			});
		}
	}
	
	void updateEnablement() {
		setEnabled(false);
		if (clipboard == null) {
			return;
		}
			
		// Paste if clipboard contains pastable markers
		MarkerTransfer transfer = MarkerTransfer.getInstance();
		IMarker[] markerData = (IMarker[]) clipboard.getContents(transfer);
		if (markerData == null || markerData.length < 1 || pastableTypes == null) {
			return;
		}
		for (int i = 0; i < markerData.length; i++) {
			try {
				IMarker marker = markerData[i];
				if (!marker.exists()) {
					break;
				}
				boolean pastable = false;
				for (int j = 0; j < pastableTypes.length; j++) {
					if (marker.isSubtypeOf((String) pastableTypes[j])) {
						pastable = true;
						break;
					}
				}
				if (!pastable) {
					return;
				}
				if (!Util.isEditable(marker)) {
					return;
				}
			}
			catch (CoreException e) {
				return;
			}
		}
		setEnabled(true);
	}

	/**
	 * @param strings
	 */
	void setPastableTypes(String[] strings) {
		pastableTypes = strings;
	}
}
