blob: 7b74ec92a29adcb07e1faf41febc40ae0d7e84a3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2009 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.common.commands;
import org.eclipse.wst.xsd.ui.internal.adapters.XSDBaseAdapter;
import org.eclipse.wst.xsd.ui.internal.common.util.Messages;
import org.eclipse.xsd.XSDComplexTypeContent;
import org.eclipse.xsd.XSDComplexTypeDefinition;
import org.eclipse.xsd.XSDConcreteComponent;
import org.eclipse.xsd.XSDDerivationMethod;
import org.eclipse.xsd.XSDFactory;
import org.eclipse.xsd.XSDSimpleTypeDefinition;
import org.eclipse.xsd.XSDTypeDefinition;
import org.eclipse.xsd.XSDVariety;
public class SetBaseTypeCommand extends BaseCommand
{
XSDConcreteComponent concreteComponent;
XSDTypeDefinition baseType;
XSDBaseAdapter adapter;
public SetBaseTypeCommand(XSDConcreteComponent concreteComponent, XSDTypeDefinition baseType)
{
super(Messages._UI_ACTION_SET_BASE_TYPE);
this.concreteComponent = concreteComponent;
this.baseType = baseType;
}
public void execute()
{
try
{
beginRecording(concreteComponent.getElement());
if (concreteComponent instanceof XSDComplexTypeDefinition)
{
XSDComplexTypeDefinition complexType = (XSDComplexTypeDefinition) concreteComponent;
XSDComplexTypeContent contentType = (baseType instanceof XSDComplexTypeDefinition) ? ((XSDComplexTypeDefinition)baseType).getContentType() : null;
// Complex type simple content
if (baseType instanceof XSDSimpleTypeDefinition || (contentType != null && contentType instanceof XSDSimpleTypeDefinition))
{
if (!(complexType.getContent() instanceof XSDSimpleTypeDefinition))
{
XSDSimpleTypeDefinition simpleContent = XSDFactory.eINSTANCE.createXSDSimpleTypeDefinition();
complexType.setContent(simpleContent);
}
}
// Complex type complex content
else if(baseType instanceof XSDComplexTypeDefinition)
{
if(!(complexType.getContent() instanceof XSDComplexTypeDefinition))
{
XSDComplexTypeDefinition complexContent = XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
complexType.setContent(complexContent.getContent());
}
}
complexType.setDerivationMethod(XSDDerivationMethod.EXTENSION_LITERAL);
complexType.setBaseTypeDefinition(baseType);
// vb This call should not be needed. The XSD Infoset model should reconcile itself properly.
complexType.updateElement(true);
formatChild(complexType.getElement());
}
else if (concreteComponent instanceof XSDSimpleTypeDefinition)
{
XSDSimpleTypeDefinition simpleType = (XSDSimpleTypeDefinition) concreteComponent;
if (baseType instanceof XSDSimpleTypeDefinition)
{
XSDVariety variety = simpleType.getVariety();
if (variety.getValue() == XSDVariety.ATOMIC)
{
simpleType.setBaseTypeDefinition((XSDSimpleTypeDefinition) baseType);
}
else if (variety.getValue() == XSDVariety.UNION)
{
simpleType.getMemberTypeDefinitions().add(baseType);
}
else if (variety.getValue() == XSDVariety.LIST)
{
simpleType.setItemTypeDefinition((XSDSimpleTypeDefinition) baseType);
}
}
}
}
finally
{
endRecording();
}
}
}