/*******************************************************************************
 * Copyright (c) 2005 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 API and implementation
 *******************************************************************************/
package org.eclipse.bpel.ui.actions;

import java.util.ArrayList;

import org.eclipse.bpel.ui.*;
import org.eclipse.bpel.ui.commands.BPELCopyCommand;
import org.eclipse.bpel.ui.commands.BPELPasteCommand;
import org.eclipse.bpel.ui.commands.CompoundCommand;
import org.eclipse.bpel.ui.commands.RestoreSelectionCommand;
import org.eclipse.bpel.ui.commands.SetSelectionCommand;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.commands.Command;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IEditorActionDelegate;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart;


/**
 * Create a duplicate entry if item in the process map.
 * 
 * @author Michal Chmielewski (michal.chmielewski@oracle.com)
 * @date May 24, 2007
 *
 */
public class BPELDuplicateAction extends BPELCopyAction implements IEditorActionDelegate {

	/**
	 * The action id.
	 */
	
	public static final String ACTION_ID = BPELDuplicateAction.class.getName();
	
	/**
	 * 
	 */
	public BPELDuplicateAction () {
		super(null);
	}
	
	/**
	 * Duplicate selected objects in the editor.
	 * 
	 * @param editorPart
	 */
	public BPELDuplicateAction(IWorkbenchPart editorPart) {
		super(editorPart);
	}

	@SuppressWarnings("nls")
	@Override
	protected void init() {
		super.init();
		setText(Messages.BPELDuplicateAction_Duplicate_1); 
		setToolTipText(Messages.BPELDuplicateAction_Duplicate_2); 
		
		setId(ACTION_ID);
		
		setImageDescriptor( BPELUIPlugin.INSTANCE.getImageDescriptor( IBPELUIConstants.ICON_DUPLICATE_16_E ));
		setDisabledImageDescriptor ( BPELUIPlugin.INSTANCE.getImageDescriptor(IBPELUIConstants.ICON_DUPLICATE_16_D  ) );
		setEnabled(false);
	}


	
	/**
	 * @see org.eclipse.bpel.ui.actions.BPELCopyAction#getCommand()
	 */
	@Override
	protected Command getCommand() {
		
		CompoundCommand cmd = new CompoundCommand(Messages.BPELCopyAction_Copy_3); 
		
		final BPELEditor bpelEditor = (BPELEditor) getWorkbenchPart();
		
		// 1. Restore selection
		cmd.add(new RestoreSelectionCommand(bpelEditor.getAdaptingSelectionProvider(), true, true));

		// 2. Copy the objects that are selected.
		BPELCopyCommand copyCmd = new BPELCopyCommand(bpelEditor);
		if (fSelection.isEmpty()) {
		  for (Object o : ((IStructuredSelection) bpelEditor.getSelection()).toList()) {
		    if (o instanceof EObject) {
		      fSelection.add((EObject) o);
		    }
		  }
		}
		if (fSelection.isEmpty()) {
		  return null;
		}
		copyCmd.setObjectList( new ArrayList<EObject>(fSelection) );
		cmd.add(copyCmd);
				
		// 3. Immediately paste them
		BPELPasteCommand pasteCmd = new BPELPasteCommand(bpelEditor) {

			/**
			 * We override the canDoExecute, because the compound command in GEF will 
			 * check both of the commands for canDoExecute() before running the compound command.
			 * Since the copy command is a prerequisite for the paste here, this condition will
			 * never be true unless we just allow it.
			 * 
			 * @see org.eclipse.bpel.ui.commands.BPELPasteCommand#canDoExecute()
			 */
			@Override
			public boolean canDoExecute() {
				return true;
			}
			
		};
		pasteCmd.setTargetObject( fSelection.get(0) , true );
		cmd.add(pasteCmd);
		
		// 4. Add the command to select the pasted elements		
		cmd.add( new SetSelectionCommand(pasteCmd,false) );		
		
		return cmd;
	}


	/**
	 * @see org.eclipse.ui.IEditorActionDelegate#setActiveEditor(org.eclipse.jface.action.IAction, org.eclipse.ui.IEditorPart)
	 */
	public void setActiveEditor (IAction action, IEditorPart targetEditor) {
		if (targetEditor instanceof BPELMultipageEditorPart) {
		  targetEditor = ((BPELMultipageEditorPart) targetEditor).getActiveEditor();
		}
		if (!(targetEditor instanceof BPELEditor)) {
      targetEditor = null;
		}
		setWorkbenchPart(targetEditor);
		if (targetEditor == null) {
		  action.setEnabled(false);
		}
	}

	/**
	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
	 */
	public void run (IAction action) {			
		run();		
	}

	
	/**
	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
	 */
	public void selectionChanged (IAction action, ISelection selection) {
		setSelection(selection);
	}

	
}
