/*******************************************************************************
 * Copyright (c) 2001, 2004 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.xsd.ui.internal.commands;

import org.eclipse.xsd.XSDAttributeDeclaration;
import org.eclipse.xsd.XSDComplexTypeDefinition;
import org.eclipse.xsd.XSDConcreteComponent;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDSimpleTypeDefinition;
import org.eclipse.xsd.XSDTypeDefinition;

public final class MakeAnonymousTypeGlobalCommand extends AbstractCommand {

	String fNewName;

	public MakeAnonymousTypeGlobalCommand(XSDConcreteComponent element,
			String newName) {
		super(element.getContainer());
		setModelObject(element);
		fNewName = newName;
	}

	public void run() {
		XSDConcreteComponent model = getModelObject();
		XSDConcreteComponent parent = model.getContainer();
		XSDTypeDefinition globalTypeDef = null;
		if (model instanceof XSDComplexTypeDefinition) {
			if (parent instanceof XSDElementDeclaration) {
				// clone typedef with it's content and set it global
				globalTypeDef = (XSDComplexTypeDefinition) model
						.cloneConcreteComponent(true, false);
				globalTypeDef.setName(fNewName);
				parent.getSchema().getContents().add(globalTypeDef);
				((XSDElementDeclaration) parent)
						.setTypeDefinition(globalTypeDef);
			}
		} else if (model instanceof XSDSimpleTypeDefinition) {

			XSDSimpleTypeDefinition typeDef = (XSDSimpleTypeDefinition) model;
			if (parent instanceof XSDElementDeclaration) {
				// clone typedef with it's content and set it global
				globalTypeDef = (XSDSimpleTypeDefinition) typeDef
						.cloneConcreteComponent(true, false);
				globalTypeDef.setName(fNewName);
				parent.getSchema().getContents().add(globalTypeDef);
				((XSDElementDeclaration) parent)
						.setTypeDefinition(globalTypeDef);
				formatChild(globalTypeDef.getElement());

			} else if (parent instanceof XSDAttributeDeclaration) {
				// clone typedef with it's content and set it global
				globalTypeDef = (XSDSimpleTypeDefinition) typeDef
						.cloneConcreteComponent(true, false);
				globalTypeDef.setName(fNewName);
				parent.getSchema().getContents().add(globalTypeDef);
				((XSDAttributeDeclaration) parent)
						.setTypeDefinition((XSDSimpleTypeDefinition) globalTypeDef);

			}

		}

		formatChild(globalTypeDef.getElement());

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.wst.xsd.ui.internal.commands.AbstractCommand#adopt(org.eclipse.xsd.XSDConcreteComponent)
	 */
	protected boolean adopt(XSDConcreteComponent model) {
		// TODO Auto-generated method stub
		return true;
	}
}
