//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation 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:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.authoring.ui.actions;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.edit.command.CopyToClipboardCommand;
import org.eclipse.emf.edit.ui.action.CopyAction;
import org.eclipse.epf.common.ui.util.ClipboardUtil;
import org.eclipse.epf.common.utils.StrUtil;
import org.eclipse.epf.library.LibraryServiceUtil;
import org.eclipse.epf.library.edit.util.ActivityHandler;
import org.eclipse.epf.library.edit.util.ProcessUtil;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.library.util.ResourceHelper;
import org.eclipse.epf.persistence.MultiFileXMIResourceImpl;
import org.eclipse.epf.services.ILibraryPersister;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.MethodPlugin;
import org.eclipse.epf.uma.edit.domain.TraceableAdapterFactoryEditingDomain;
import org.eclipse.jface.viewers.IStructuredSelection;


/**
 * Copies an element in the Library view.
 * 
 * @author Phong Nguyen Le
 * @since 1.0
 */
public class LibraryViewCopyAction extends CopyAction {

	/**
	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#run()
	 */
	public void run() {
		if (command == null)
			return;
		else {
			TraceableAdapterFactoryEditingDomain tDomain = null;
			if (domain instanceof TraceableAdapterFactoryEditingDomain) {
				((TraceableAdapterFactoryEditingDomain) domain).resetCopyMaps();
				tDomain = (TraceableAdapterFactoryEditingDomain) domain;
				tDomain.setExtenalMaintainedCopyMap(new HashMap<Object, Object>());
			}
			if (command instanceof CopyToClipboardCommand) {
				String links = ""; //$NON-NLS-1$
				for (Iterator iter = ((CopyToClipboardCommand)command).getSourceObjects().iterator();iter.hasNext();) {
					Object item = TngUtil.unwrap(iter.next());
					if (item instanceof MethodElement) {
						MethodElement e = (MethodElement)item;
						String href = ResourceHelper.getUrl(e,
								null, "html"); //$NON-NLS-1$
						if (links.length() > 0) {
							links += StrUtil.LINE_FEED;
						}
						links += ResourceHelper.getElementLink(e, true,
								"file://" + href); //$NON-NLS-1$
					}
				}
				if (links.length() > 0) {
					handleCopyTextHTMLToClipboard(links);
				}
			}
			super.run();
			
			if (ProcessUtil.isSynFree() && tDomain != null) {
				Set<Resource> resouresToSave = new HashSet<Resource>();
				Map map = tDomain.getExtenalMaintainedCopyMap();
				ActivityHandler.fixGuidReferences(map, false, false, null);
			}
			
			if (tDomain != null) {
				tDomain.setExtenalMaintainedCopyMap(null);
			}
			
		}
	}

	/**
	 * Handles copying the links to the clipboard as Text and HTML
	 * @param links
	 */
	protected void handleCopyTextHTMLToClipboard(String links) {
		ClipboardUtil.copyTextHTMLToClipboard(links);
	}

	
	/**
	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
	 */
	public boolean updateSelection(IStructuredSelection selection) {
		if (selection == null || selection.isEmpty())
			return false;

		Collection collection = new ArrayList();
		for (Iterator objects = selection.iterator(); objects.hasNext();) {
			Object element = TngUtil.unwrap(objects.next());
			if (element instanceof MethodElement
					&& !(element instanceof MethodPlugin)
					&& !TngUtil.isPredefined((MethodElement) element)) {
				collection.add(element);
			}

		}

		command = createCommand(collection);

		return command.canExecute();
	}

}
