/*******************************************************************************
 * Copyright (c) 2001, 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 API and implementation
 *******************************************************************************/
package org.eclipse.wst.wsdl.ui.internal.adapters.actions;

import org.eclipse.gef.EditPart;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.wsdl.Definition;
import org.eclipse.wst.wsdl.Message;
import org.eclipse.wst.wsdl.MessageReference;
import org.eclipse.wst.wsdl.Part;
import org.eclipse.wst.wsdl.ui.internal.InternalWSDLMultiPageEditor;
import org.eclipse.wst.wsdl.ui.internal.Messages;
import org.eclipse.wst.wsdl.ui.internal.WSDLEditorPlugin;
import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11Description;
import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11MessageReference;
import org.eclipse.wst.wsdl.ui.internal.adapters.basic.W11ParameterForPart;
import org.eclipse.wst.wsdl.ui.internal.asd.ASDEditorPlugin;
import org.eclipse.wst.wsdl.ui.internal.asd.actions.BaseSelectionAction;
import org.eclipse.wst.wsdl.ui.internal.asd.actions.IASDAddCommand;
import org.eclipse.wst.wsdl.ui.internal.asd.design.editparts.ParameterEditPart;
import org.eclipse.wst.wsdl.ui.internal.asd.facade.IMessage;
import org.eclipse.wst.wsdl.ui.internal.commands.AddMessageCommand;
import org.eclipse.wst.wsdl.ui.internal.util.NameUtil;
import org.eclipse.wst.wsdl.ui.internal.util.WSDLAdapterFactoryHelper;

public class W11AddPartAction extends BaseSelectionAction {
	public static String ID = "ASDAddPartAction"; //$NON-NLS-1$
	
	public W11AddPartAction(IWorkbenchPart part)	{
		super(part);
		setId(ID);
		setText(Messages._UI_ACTION_ADD_PART); //$NON-NLS-1$
		setImageDescriptor(WSDLEditorPlugin.getImageDescriptor("icons/part_obj.gif")); //$NON-NLS-1$
	}
	
	public void run() {
		if (getSelectedObjects().size() > 0) {
			Object o = getSelectedObjects().get(0);
			MessageReference messageRef = null;
			IMessage iMessage = null;
			Message message = null;
			
			if (o instanceof W11MessageReference) {
				messageRef = (MessageReference) ((W11MessageReference) o).getTarget();
				message = messageRef.getEMessage();
			}
			else if (o instanceof W11ParameterForPart) {
				W11ParameterForPart param = (W11ParameterForPart) o;
				if (param.getOwner() instanceof IMessage) {
					iMessage = (IMessage) param.getOwner();
				}
				else if (param.getOwner() instanceof W11MessageReference) {
					messageRef = (MessageReference) ((W11MessageReference) param.getOwner()).getTarget();
					message = messageRef.getEMessage();
				}
				
				if (message == null) {
					Part part = (Part) param.getTarget();
					message = (Message) part.eContainer();
				}
			}
			else if (o instanceof IMessage) {
				iMessage = (IMessage) o;
			}
			
			if (message == null && iMessage == null && messageRef != null) {
				InternalWSDLMultiPageEditor editor = (InternalWSDLMultiPageEditor) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
				Definition definition = (Definition) ((W11Description) editor.getModel()).getTarget();
				String messageName = NameUtil.buildUniqueMessageName(definition, "NewMessage"); //$NON-NLS-1$
				AddMessageCommand command = new AddMessageCommand(definition, messageName, false);
				command.run();
				message = (Message) command.getWSDLElement();
				messageRef.setEMessage(message);
			}
			
			if (message != null) {
				iMessage = (IMessage) WSDLAdapterFactoryHelper.getInstance().adapt(message);
			}

			if (iMessage != null) {
				Command command = iMessage.getAddPartCommand();
			    CommandStack stack = (CommandStack) ASDEditorPlugin.getActiveEditor().getAdapter(CommandStack.class);
			    stack.execute(command);
			    
			    if (command instanceof IASDAddCommand) {
			    	Object element = ((IASDAddCommand) command).getNewlyAddedComponent();
			    	selectAndDirectEdit(element);
			    }
			}
		}  
	}
	
	protected void doDirectEdit(EditPart ep) {
		if (ep instanceof ParameterEditPart) {
			((ParameterEditPart) ep).performDirectEdit(null);
		}
	}
}