| /******************************************************************************* |
| * 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.properties; |
| |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.ui.views.properties.IPropertyDescriptor; |
| import org.eclipse.ui.views.properties.IPropertySource; |
| import org.eclipse.ui.views.properties.TextPropertyDescriptor; |
| import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin; |
| import org.eclipse.wst.xsd.ui.internal.actions.DOMAttribute; |
| import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper; |
| import org.eclipse.wst.xsd.ui.internal.util.XSDSchemaHelper; |
| import org.eclipse.xsd.XSDConcreteComponent; |
| import org.eclipse.xsd.XSDFacet; |
| import org.eclipse.xsd.XSDSchema; |
| import org.eclipse.xsd.XSDSimpleTypeDefinition; |
| import org.eclipse.xsd.impl.XSDFactoryImpl; |
| import org.eclipse.xsd.util.XSDConstants; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.Node; |
| |
| public class SimpleRestrictPropertySource |
| extends BasePropertySource |
| implements IPropertySource |
| { |
| private String [] whiteSpaceComboChoices = { "", "preserve", "replace", "collapse" }; |
| /** |
| * |
| */ |
| public SimpleRestrictPropertySource() |
| { |
| super(); |
| } |
| /** |
| * @param viewer |
| * @param xsdSchema |
| */ |
| public SimpleRestrictPropertySource(Viewer viewer, XSDSchema xsdSchema) |
| { |
| super(viewer, xsdSchema); |
| } |
| /** |
| * @param xsdSchema |
| */ |
| public SimpleRestrictPropertySource(XSDSchema xsdSchema) |
| { |
| super(xsdSchema); |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue() |
| */ |
| public Object getEditableValue() |
| { |
| return null; |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors() |
| */ |
| public IPropertyDescriptor[] getPropertyDescriptors() |
| { |
| List list = new ArrayList(); |
| // Create a descriptor and set a category |
| |
| SimpleContentPropertyDescriptor typeDescriptor = new SimpleContentPropertyDescriptor( |
| XSDConstants.BASE_ATTRIBUTE, |
| XSDConstants.BASE_ATTRIBUTE, |
| (Element)element.getParentNode(), xsdSchema); // get the parent node! |
| list.add(typeDescriptor); |
| |
| Iterator facets = xsdSimpleType.getValidFacets().iterator(); |
| |
| while(facets.hasNext()) |
| { |
| String aValidFacet = (String)facets.next(); |
| if (!(aValidFacet.equals(XSDConstants.PATTERN_ELEMENT_TAG) || aValidFacet.equals(XSDConstants.ENUMERATION_ELEMENT_TAG))) |
| { |
| if (aValidFacet.equals(XSDConstants.WHITESPACE_ELEMENT_TAG)) |
| { |
| XSDComboBoxPropertyDescriptor whitespaceDescriptor = new XSDComboBoxPropertyDescriptor( |
| aValidFacet, aValidFacet, whiteSpaceComboChoices); |
| list.add(whitespaceDescriptor); |
| } |
| else |
| { |
| list.add(new TextPropertyDescriptor(aValidFacet, aValidFacet)); |
| } |
| } |
| } |
| |
| |
| IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()]; |
| list.toArray(result); |
| return result; |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object) |
| */ |
| public Object getPropertyValue(Object id) |
| { |
| Object result = null; |
| if (id instanceof String) |
| { |
| if (((String) id).equals(XSDConstants.BASE_ATTRIBUTE)) |
| { |
| String baseType = element.getAttribute(XSDConstants.BASE_ATTRIBUTE); |
| if (baseType == null) |
| { |
| baseType = ""; |
| } |
| return baseType; |
| } |
| else |
| { |
| String aFacet = (String)id; |
| Iterator facets = xsdSimpleType.getFacets().iterator(); |
| |
| while(facets.hasNext()) |
| { |
| XSDFacet aValidFacet = (XSDFacet)facets.next(); |
| if (aValidFacet.getFacetName().equals(aFacet)) |
| { |
| result = aValidFacet.getLexicalValue(); |
| if (result == null) |
| { |
| result = ""; |
| } |
| return result; |
| } |
| } |
| } |
| } |
| return ""; |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object) |
| */ |
| public boolean isPropertySet(Object id) |
| { |
| return false; |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object) |
| */ |
| public void resetPropertyValue(Object id) |
| { |
| } |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object) |
| */ |
| public void setPropertyValue(Object id, Object value) |
| { |
| if (value != null) |
| { |
| if (value instanceof String) |
| { |
| String newValue = (String)value; |
| |
| if (((String) id).equals(XSDConstants.BASE_ATTRIBUTE)) |
| { |
| beginRecording(XSDEditorPlugin.getXSDString("_UI_TYPE_CHANGE"), element); |
| |
| Element parent = (Element)element.getParentNode(); |
| if (XSDDOMHelper.inputEquals(parent, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false)) |
| { |
| // updateElementToNotAnonymous(element); |
| } |
| getDomHelper().setSimpleContentType(element, newValue); |
| endRecording(element); |
| } |
| else |
| { |
| Element simpleTypeElement = xsdSimpleType.getElement(); |
| XSDDOMHelper xsdDOMHelper = new XSDDOMHelper(); |
| Element derivedByElement = xsdDOMHelper.getDerivedByElement(simpleTypeElement); |
| beginRecording(XSDEditorPlugin.getXSDString("_UI_FACET_CHANGE"), simpleTypeElement); |
| String prefix = simpleTypeElement.getPrefix(); |
| prefix = (prefix == null) ? "" : (prefix + ":"); |
| |
| String aFacet = (String)id; |
| XSDFactoryImpl factory = new XSDFactoryImpl(); |
| |
| Element childNodeElement = null; |
| DOMAttribute valueAttr = null; |
| XSDFacet facet = null; |
| if (aFacet.equals(XSDConstants.TOTALDIGITS_ELEMENT_TAG)) |
| { |
| facet = xsdSimpleType.getTotalDigitsFacet(); |
| } |
| else if (aFacet.equals(XSDConstants.FRACTIONDIGITS_ELEMENT_TAG)) |
| { |
| facet = xsdSimpleType.getFractionDigitsFacet(); |
| } |
| else if (aFacet.equals(XSDConstants.WHITESPACE_ELEMENT_TAG)) |
| { |
| facet = xsdSimpleType.getWhiteSpaceFacet(); |
| } |
| else if (aFacet.equals(XSDConstants.MAXEXCLUSIVE_ELEMENT_TAG)) |
| { |
| facet = xsdSimpleType.getMaxExclusiveFacet(); |
| } |
| else if (aFacet.equals(XSDConstants.MAXINCLUSIVE_ELEMENT_TAG)) |
| { |
| facet = xsdSimpleType.getMaxInclusiveFacet(); |
| } |
| else if (aFacet.equals(XSDConstants.MINEXCLUSIVE_ELEMENT_TAG)) |
| { |
| facet = xsdSimpleType.getMinExclusiveFacet(); |
| } |
| else if (aFacet.equals(XSDConstants.MININCLUSIVE_ELEMENT_TAG)) |
| { |
| facet = xsdSimpleType.getMinInclusiveFacet(); |
| } |
| else if (aFacet.equals(XSDConstants.LENGTH_ELEMENT_TAG)) |
| { |
| facet = xsdSimpleType.getLengthFacet(); |
| } |
| else if (aFacet.equals(XSDConstants.MAXLENGTH_ELEMENT_TAG)) |
| { |
| facet = xsdSimpleType.getMaxLengthFacet(); |
| } |
| else if (aFacet.equals(XSDConstants.MINLENGTH_ELEMENT_TAG)) |
| { |
| facet = xsdSimpleType.getMinLengthFacet(); |
| } |
| |
| if (facet != null) |
| { |
| facet.setLexicalValue(newValue); |
| } |
| else |
| { |
| facet = (XSDFacet)factory.createXSDTotalDigitsFacet(); |
| childNodeElement = (derivedByElement.getOwnerDocument()).createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + aFacet); |
| valueAttr = new DOMAttribute(XSDConstants.VALUE_ATTRIBUTE, ""); |
| childNodeElement.setAttribute(valueAttr.getName(), valueAttr.getValue()); |
| valueAttr.setValue(newValue); |
| childNodeElement.setAttribute(valueAttr.getName(), valueAttr.getValue()); |
| element.appendChild(childNodeElement); |
| //formatChild(childNodeElement, hasChildrenElements); |
| } |
| XSDSchemaHelper.updateElement(xsdSimpleType); |
| if (facet != null) |
| { |
| XSDSchemaHelper.updateElement(facet); |
| } |
| } |
| } |
| } |
| Runnable delayedUpdate = new Runnable() |
| { |
| public void run() |
| { |
| if (viewer != null) |
| viewer.refresh(); |
| } |
| }; |
| Display.getCurrent().asyncExec(delayedUpdate); |
| |
| } |
| |
| protected boolean isAnonymous; |
| protected XSDSimpleTypeDefinition xsdSimpleType; |
| |
| public void setInput(Element element) |
| { |
| this.element = element; |
| if (xsdSchema == null) |
| { |
| return; |
| } |
| |
| isAnonymous = checkForAnonymousType(element); |
| |
| if (XSDDOMHelper.inputEquals(element, XSDConstants.RESTRICTION_ELEMENT_TAG, false)) |
| { |
| Element parent = (Element)element.getParentNode(); |
| if (XSDDOMHelper.inputEquals(parent, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false)) |
| { |
| XSDConcreteComponent component = null; |
| if (parent != null) |
| { |
| component = xsdSchema.getCorrespondingComponent(parent); |
| } |
| if (component instanceof XSDSimpleTypeDefinition) |
| { |
| xsdSimpleType = (XSDSimpleTypeDefinition)component; |
| } |
| } |
| |
| XSDConcreteComponent xsdConcreteComponent = null; |
| if (element.getParentNode() != null) |
| { |
| xsdConcreteComponent = xsdSchema.getCorrespondingComponent(element.getParentNode()); |
| } |
| |
| if (xsdConcreteComponent instanceof XSDSimpleTypeDefinition) |
| { |
| xsdSimpleType = (XSDSimpleTypeDefinition)xsdConcreteComponent; |
| } |
| } |
| } |
| |
| boolean checkForAnonymousType(Element element) |
| { |
| boolean isAnonymous = false; |
| |
| Node aNode = getDomHelper().getChildNode(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG); |
| if (aNode != null) |
| { |
| return true; |
| } |
| return isAnonymous; |
| } |
| |
| } |