blob: 105c362866304400196b7e95a307a91e80dcdca5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2010 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.adapters;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.commands.Command;
import org.eclipse.swt.graphics.Image;
import org.eclipse.wst.xsd.ui.internal.adt.actions.BaseSelectionAction;
import org.eclipse.wst.xsd.ui.internal.adt.actions.DeleteAction;
import org.eclipse.wst.xsd.ui.internal.adt.actions.SetInputToGraphView;
import org.eclipse.wst.xsd.ui.internal.adt.actions.ShowPropertiesViewAction;
import org.eclipse.wst.xsd.ui.internal.adt.facade.IADTObject;
import org.eclipse.wst.xsd.ui.internal.adt.facade.IModel;
import org.eclipse.wst.xsd.ui.internal.adt.outline.ITreeElement;
import org.eclipse.wst.xsd.ui.internal.common.actions.AddXSDEnumerationFacetAction;
import org.eclipse.wst.xsd.ui.internal.common.actions.OpenInNewEditor;
import org.eclipse.wst.xsd.ui.internal.common.actions.SetBaseTypeAction;
import org.eclipse.wst.xsd.ui.internal.common.commands.DeleteCommand;
import org.eclipse.wst.xsd.ui.internal.editor.Messages;
import org.eclipse.wst.xsd.ui.internal.editor.XSDEditorPlugin;
import org.eclipse.xsd.XSDConcreteComponent;
import org.eclipse.xsd.XSDRedefine;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.XSDSimpleTypeDefinition;
import org.eclipse.xsd.XSDTypeDefinition;
import org.eclipse.xsd.XSDVariety;
import org.eclipse.xsd.util.XSDConstants;
public class XSDSimpleTypeDefinitionAdapter extends XSDTypeDefinitionAdapter
{
protected boolean readOnly;
protected boolean changeReadOnlyField =false;
protected HashMap deletedTypes = new HashMap();
public Image getImage()
{
if (isReadOnly())
{
return XSDEditorPlugin.getPlugin().getIcon("obj16/simpletypedis_obj.gif"); //$NON-NLS-1$
}
return XSDEditorPlugin.getPlugin().getIcon("obj16/simpletype_obj.gif"); //$NON-NLS-1$
}
public String getDisplayName()
{
return getName();
}
public String getText()
{
return getText(true);
}
public String getText(boolean showType)
{
XSDSimpleTypeDefinition xsdSimpleTypeDefinition = (XSDSimpleTypeDefinition) target;
StringBuffer result = new StringBuffer();
result.append(xsdSimpleTypeDefinition.getName() == null ? Messages._UI_LABEL_LOCAL_TYPE : xsdSimpleTypeDefinition.getName());
if (showType)
{
XSDSimpleTypeDefinition baseTypeDefinition = xsdSimpleTypeDefinition.getBaseTypeDefinition();
if (baseTypeDefinition != null && XSDVariety.ATOMIC_LITERAL == xsdSimpleTypeDefinition.getVariety())
{
if (baseTypeDefinition.getName() != null && !xsdSimpleTypeDefinition.getContents().contains(baseTypeDefinition) && !XSDConstants.isAnySimpleType(baseTypeDefinition))
{
try {
String qName = baseTypeDefinition.getQName(xsdSimpleTypeDefinition);
result.append(" : "); //$NON-NLS-1$
result.append(qName);
}
catch (Exception e)
{
}
}
}
else
{
XSDSimpleTypeDefinition itemTypeDefinition = xsdSimpleTypeDefinition.getItemTypeDefinition();
if (itemTypeDefinition != null)
{
if (itemTypeDefinition.getName() != null)
{
result.append(" : "); //$NON-NLS-1$
result.append(itemTypeDefinition.getQName(xsdSimpleTypeDefinition));
}
}
else
{
List memberTypeDefinitions = xsdSimpleTypeDefinition.getMemberTypeDefinitions();
if (!memberTypeDefinitions.isEmpty())
{
boolean first = true;
for (Iterator members = memberTypeDefinitions.iterator(); members.hasNext();)
{
XSDSimpleTypeDefinition memberTypeDefinition = (XSDSimpleTypeDefinition) members.next();
if (memberTypeDefinition.getName() != null)
{
if (first)
{
result.append(" : "); //$NON-NLS-1$
first = false;
}
else
{
result.append(" | "); //$NON-NLS-1$
}
result.append(memberTypeDefinition.getQName(xsdSimpleTypeDefinition));
}
else
{
break;
}
}
}
else if (result.length() == 0)
{
result.append(Messages._UI_LABEL_ABSENT);
}
}
}
}
return result.toString();
}
public boolean hasChildren()
{
return true;
}
public boolean isComplexType()
{
return false;
}
public boolean isFocusAllowed()
{
XSDSimpleTypeDefinition xsdSimpleTypeDefinition = (XSDSimpleTypeDefinition) target;
if (XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001.equals(xsdSimpleTypeDefinition.getTargetNamespace()))
{
return false;
}
if (xsdSimpleTypeDefinition.getName() == null)
{
return isAnonymous();
}
return true;
}
public String[] getActions(Object object)
{
List list = new ArrayList();
list.add(AddXSDEnumerationFacetAction.ID);
list.add(BaseSelectionAction.SEPARATOR_ID);
list.add(SetBaseTypeAction.ID);
list.add(BaseSelectionAction.SEPARATOR_ID);
list.add(DeleteAction.ID);
list.add(BaseSelectionAction.SEPARATOR_ID);
Object schema = getEditorSchema();
XSDTypeDefinition typeDefinition = getXSDTypeDefinition();
if (typeDefinition.getSchema() == schema)
{
XSDConcreteComponent container = typeDefinition.getContainer();
if (container == schema || container instanceof XSDRedefine)
{
list.add(SetInputToGraphView.ID);
}
}
else
{
list.add(OpenInNewEditor.ID);
}
list.add(BaseSelectionAction.SEPARATOR_ID);
list.add(ShowPropertiesViewAction.ID);
return (String [])list.toArray(new String[0]);
}
public boolean isAnonymous()
{
XSDSimpleTypeDefinition xsdSimpleTypeDefinition = (XSDSimpleTypeDefinition) target;
EObject eContainer = xsdSimpleTypeDefinition.eContainer();
return !(eContainer instanceof XSDSchema ||
eContainer instanceof XSDRedefine);
}
public IADTObject getTopContainer()
{
return this;
}
public Command getDeleteCommand()
{
return new DeleteCommand(getXSDTypeDefinition());
}
public IModel getModel()
{
Adapter adapter = XSDAdapterFactory.getInstance().adapt(getXSDTypeDefinition().getSchema());
return (IModel)adapter;
}
public ITreeElement[] getChildren()
{
List adapterList = new ArrayList();
XSDSimpleTypeDefinition xsdSimpleTypeDefinition = (XSDSimpleTypeDefinition) target;
List list = xsdSimpleTypeDefinition.getEnumerationFacets();
populateAdapterList(list, adapterList);
return (ITreeElement[]) adapterList.toArray(new ITreeElement[0]);
}
public boolean isReadOnly()
{
XSDSimpleTypeDefinition xsdSimpleTypeDefinition = (XSDSimpleTypeDefinition) target;
if (hasSetReadOnlyField())
{
deletedTypes.put(xsdSimpleTypeDefinition.getName(), new Boolean(true));
changeReadOnlyField = false;
return readOnly;
}
else
{
if (deletedTypes!= null )
{
Boolean deleted = ((Boolean)deletedTypes.get(xsdSimpleTypeDefinition.getName()));
if (deleted != null && deleted.booleanValue())
return true;
else return super.isReadOnly();
}
else
return super.isReadOnly();
}
}
public void setReadOnly(boolean readOnly) {
this.readOnly = readOnly;
}
public boolean hasSetReadOnlyField() {
return changeReadOnlyField;
}
public void setChangeReadOnlyField(boolean setReadOnlyField) {
this.changeReadOnlyField = setReadOnlyField;
}
public void updateDeletedMap(String addComponent) {
if (deletedTypes.get(addComponent) != null)
deletedTypes.clear();
}
}