blob: 2ee575e73a8dd1b3d927f7e25445b784b278b986 [file] [log] [blame]
/*******************************************************************************
* 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.xsd.ui.internal.common.commands;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.wst.xsd.ui.internal.common.util.XSDCommonUIUtils;
import org.eclipse.xsd.XSDAttributeDeclaration;
import org.eclipse.xsd.XSDAttributeGroupDefinition;
import org.eclipse.xsd.XSDAttributeUse;
import org.eclipse.xsd.XSDComplexTypeDefinition;
import org.eclipse.xsd.XSDConcreteComponent;
import org.eclipse.xsd.XSDFactory;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.XSDTypeDefinition;
import org.w3c.dom.Text;
public class AddXSDAttributeGroupDefinitionCommand extends BaseCommand
{
XSDComplexTypeDefinition xsdComplexTypeDefinition;
XSDSchema xsdSchema;
public AddXSDAttributeGroupDefinitionCommand(String label, XSDComplexTypeDefinition xsdComplexTypeDefinition)
{
super(label);
this.xsdComplexTypeDefinition = xsdComplexTypeDefinition;
}
public AddXSDAttributeGroupDefinitionCommand(String label, XSDSchema xsdSchema)
{
super(label);
this.xsdSchema = xsdSchema;
}
public void execute()
{
XSDAttributeGroupDefinition attributeGroup = XSDFactory.eINSTANCE.createXSDAttributeGroupDefinition();
try
{
if (xsdSchema == null)
{
beginRecording(xsdComplexTypeDefinition.getElement());
attributeGroup.setName(getNewName("AttributeGroup")); //$NON-NLS-1$
List list = xsdComplexTypeDefinition.getSchema().getAttributeGroupDefinitions();
if (list.size() > 0)
{
attributeGroup.setResolvedAttributeGroupDefinition((XSDAttributeGroupDefinition) list.get(0));
}
else
{
attributeGroup.setName(null);
XSDAttributeGroupDefinition attributeGroup2 = XSDFactory.eINSTANCE.createXSDAttributeGroupDefinition();
attributeGroup2.setName(XSDCommonUIUtils.createUniqueElementName("NewAttributeGroup", xsdComplexTypeDefinition.getSchema().getAttributeGroupDefinitions())); //$NON-NLS-1$
xsdComplexTypeDefinition.getSchema().getContents().add(attributeGroup2);
attributeGroup.setResolvedAttributeGroupDefinition(attributeGroup2);
}
if (xsdComplexTypeDefinition.getAttributeContents() != null)
{
xsdComplexTypeDefinition.getAttributeContents().add(attributeGroup);
}
addedXSDConcreteComponent = attributeGroup;
}
else
{
ensureSchemaElement(xsdSchema);
// put this after, since we don't have a DOM node yet
beginRecording(xsdSchema.getElement());
attributeGroup.setName(XSDCommonUIUtils.createUniqueElementName("NewAttributeGroup", xsdSchema.getAttributeGroupDefinitions())); //$NON-NLS-1$
Text textNode = xsdSchema.getDocument().createTextNode("\n"); //$NON-NLS-1$
xsdSchema.getElement().appendChild(textNode);
xsdSchema.getContents().add(attributeGroup);
addedXSDConcreteComponent = attributeGroup;
}
}
finally
{
endRecording();
}
}
ArrayList names;
protected String getNewName(String description)
{
String candidateName = "New" + description; //$NON-NLS-1$
XSDConcreteComponent parent = xsdComplexTypeDefinition;
names = new ArrayList();
int i = 1;
if (parent instanceof XSDComplexTypeDefinition)
{
XSDComplexTypeDefinition ct = (XSDComplexTypeDefinition) parent;
walkUpInheritance(ct);
boolean ready = false;
while (!ready)
{
ready = true;
for (Iterator iter = names.iterator(); iter.hasNext();)
{
String attrName = (String) iter.next();
if (candidateName.equals(attrName))
{
ready = false;
candidateName = "New" + description + String.valueOf(i); //$NON-NLS-1$
i++;
}
}
}
}
return candidateName;
}
private void walkUpInheritance(XSDComplexTypeDefinition ct)
{
updateNames(ct);
XSDTypeDefinition typeDef = ct.getBaseTypeDefinition();
if (ct != ct.getRootType())
{
if (typeDef instanceof XSDComplexTypeDefinition)
{
XSDComplexTypeDefinition ct2 = (XSDComplexTypeDefinition) typeDef;
walkUpInheritance(ct2);
}
}
}
private void updateNames(XSDComplexTypeDefinition ct)
{
Iterator iter = ct.getAttributeContents().iterator();
while (iter.hasNext())
{
Object obj = iter.next();
if (obj instanceof XSDAttributeUse)
{
XSDAttributeUse use = (XSDAttributeUse) obj;
XSDAttributeDeclaration attr = use.getAttributeDeclaration();
String attrName = attr.getName();
if (attrName != null)
{
names.add(attrName);
}
}
}
}
}