blob: 0430149d7df9f6707bc8159bfb92e160e9ea9d40 [file] [log] [blame]
/*******************************************************************************
* 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 java.util.ArrayList;
import java.util.Iterator;
import org.eclipse.xsd.XSDAttributeDeclaration;
import org.eclipse.xsd.XSDAttributeUse;
import org.eclipse.xsd.XSDComplexTypeDefinition;
import org.eclipse.xsd.XSDConcreteComponent;
import org.eclipse.xsd.XSDFactory;
import org.eclipse.xsd.XSDTypeDefinition;
public class AddAttributeDeclarationCommand extends AbstractCommand
{
XSDAttributeDeclaration refAttribute = null;
/**
* @param parent
*/
public AddAttributeDeclarationCommand(XSDConcreteComponent parent)
{
super(parent);
}
public AddAttributeDeclarationCommand(XSDConcreteComponent parent, XSDAttributeDeclaration ref)
{
super(parent);
this.refAttribute = ref;
}
/* (non-Javadoc)
* @see org.eclipse.wst.xsd.ui.internal.commands.AbstractCommand#run()
*/
public void run()
{
XSDConcreteComponent parent = getParent();
if (parent instanceof XSDComplexTypeDefinition)
{
XSDComplexTypeDefinition ct = (XSDComplexTypeDefinition)parent;
XSDAttributeDeclaration attribute = XSDFactory.eINSTANCE.createXSDAttributeDeclaration();
attribute.setName(getNewName("Attribute")); //$NON-NLS-1$
attribute.setTypeDefinition(ct.getSchema().getSchemaForSchema().resolveSimpleTypeDefinition("string")); //$NON-NLS-1$
XSDAttributeUse attributeUse = XSDFactory.eINSTANCE.createXSDAttributeUse();
attributeUse.setAttributeDeclaration(attribute);
attributeUse.setContent(attribute);
if (ct.getAttributeContents() != null)
{
ct.getAttributeContents().add(attributeUse);
formatChild(attribute.getElement());
}
}
}
/* (non-Javadoc)
* @see org.eclipse.wst.xsd.ui.internal.commands.AbstractCommand#adopt(org.eclipse.xsd.XSDConcreteComponent)
*/
protected boolean adopt(XSDConcreteComponent model)
{
return false;
}
ArrayList names;
protected String getNewName(String description)
{
String candidateName = "New" + description; //$NON-NLS-1$
XSDConcreteComponent parent = getParent();
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);
}
}
}
}
}