/*******************************************************************************
 * Copyright (c) 2005, 2012 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);
	}

	
}
