| /******************************************************************************* |
| * 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.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.wst.xsd.ui.internal.XSDEditorPlugin; |
| import org.eclipse.wst.xsd.ui.internal.actions.SetBaseTypeAction; |
| import org.eclipse.wst.xsd.ui.internal.refactor.rename.GlobalSimpleOrComplexTypeRenamer; |
| import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper; |
| import org.eclipse.xsd.XSDComplexTypeDefinition; |
| import org.eclipse.xsd.XSDConcreteComponent; |
| import org.eclipse.xsd.XSDNamedComponent; |
| import org.eclipse.xsd.XSDSchema; |
| import org.eclipse.xsd.util.XSDConstants; |
| import org.w3c.dom.Element; |
| |
| public class ComplexTypePropertySource |
| extends BasePropertySource |
| implements IPropertySource |
| { |
| private String DERIVED_BY_ID = "derived by"; // XSDEditorPlugin.getXSDString("_UI_LABEL_DERIVED_BY"); |
| private String BASE_TYPE_ID = "base type"; // XSDEditorPlugin.getXSDString("_UI_LABEL_BASE_TYPE"); |
| |
| private String[] blockOrFinalComboValues = |
| { |
| "", |
| "#all", |
| "extension", |
| "restriction" |
| }; |
| |
| private String derivedByChoicesComboValues[] = |
| { |
| "", |
| XSDConstants.RESTRICTION_ELEMENT_TAG, |
| XSDConstants.EXTENSION_ELEMENT_TAG |
| }; |
| |
| /** |
| * |
| */ |
| public ComplexTypePropertySource() |
| { |
| super(); |
| } |
| /** |
| * @param viewer |
| * @param xsdSchema |
| */ |
| public ComplexTypePropertySource(Viewer viewer, XSDSchema xsdSchema) |
| { |
| super(viewer, xsdSchema); |
| } |
| /** |
| * @param xsdSchema |
| */ |
| public ComplexTypePropertySource(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 |
| boolean isAnonymousType = checkForAnonymousType(element); |
| // The three properties name, base type and derived by have been moved to the general tab |
| // if (isAnonymousType) |
| // { |
| // PropertyDescriptor nameDescriptor = |
| // new PropertyDescriptor( |
| // XSDConstants.NAME_ATTRIBUTE, |
| // XSDConstants.NAME_ATTRIBUTE); |
| // list.add(nameDescriptor); |
| // } |
| // else |
| // { |
| // PropertyDescriptor nameDescriptor = |
| // new TextPropertyDescriptor( |
| // XSDConstants.NAME_ATTRIBUTE, |
| // XSDConstants.NAME_ATTRIBUTE); |
| // list.add(nameDescriptor); |
| // } |
| |
| Element contentModelElement = getDomHelper().getContentModelFromParent(element); |
| // SimpleContentPropertyDescriptor typeDescriptor = new SimpleContentPropertyDescriptor( |
| // BASE_TYPE_ID, |
| // BASE_TYPE_ID, |
| // contentModelElement, xsdSchema); |
| // list.add(typeDescriptor); |
| // XSDComboBoxPropertyDescriptor derivedByDescriptor = |
| // new XSDComboBoxPropertyDescriptor( |
| // DERIVED_BY_ID, |
| // DERIVED_BY_ID, |
| // derivedByChoicesComboValues); |
| // list.add(derivedByDescriptor); |
| |
| XSDComboBoxPropertyDescriptor abstractDescriptor = |
| new XSDComboBoxPropertyDescriptor( |
| XSDConstants.ABSTRACT_ATTRIBUTE, |
| XSDConstants.ABSTRACT_ATTRIBUTE, |
| trueFalseComboValues); |
| list.add(abstractDescriptor); |
| |
| XSDComboBoxPropertyDescriptor mixedDescriptor = |
| new XSDComboBoxPropertyDescriptor( |
| XSDConstants.MIXED_ATTRIBUTE, |
| XSDConstants.MIXED_ATTRIBUTE, |
| trueFalseComboValues); |
| list.add(mixedDescriptor); |
| |
| XSDComboBoxPropertyDescriptor blockDescriptor = |
| new XSDComboBoxPropertyDescriptor( |
| XSDConstants.BLOCK_ATTRIBUTE, |
| XSDConstants.BLOCK_ATTRIBUTE, |
| blockOrFinalComboValues); |
| list.add(blockDescriptor); |
| XSDComboBoxPropertyDescriptor finalDescriptor = |
| new XSDComboBoxPropertyDescriptor( |
| XSDConstants.FINAL_ATTRIBUTE, |
| XSDConstants.FINAL_ATTRIBUTE, |
| blockOrFinalComboValues); |
| list.add(finalDescriptor); |
| |
| IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()]; |
| list.toArray(result); |
| return result; |
| } |
| |
| public void setInput(Element element) |
| { |
| this.element = element; |
| |
| } |
| |
| /* (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) |
| { |
| String attributeName = (String)id; |
| result = element.getAttribute((String) id); |
| Element contentModelElement = getDomHelper().getContentModelFromParent(element); |
| String baseType = getDomHelper().getBaseType(contentModelElement); |
| |
| if (result == null) |
| { |
| result = ""; |
| } |
| |
| if (attributeName.equals(DERIVED_BY_ID)) |
| { |
| return getDomHelper().getDerivedByName(contentModelElement); |
| } |
| else if (attributeName.equals(BASE_TYPE_ID)) |
| { |
| if (baseType != null) |
| { |
| return baseType; |
| } |
| else |
| { |
| return ""; |
| } |
| } |
| else if (attributeName.equals(XSDConstants.NAME_ATTRIBUTE)) |
| { |
| String name = element.getAttribute(XSDConstants.NAME_ATTRIBUTE); |
| |
| boolean isAnonymousType = checkForAnonymousType(element); |
| if (isAnonymousType) |
| { |
| return "**anonymous**"; |
| } |
| else |
| { |
| return name; |
| } |
| } |
| |
| return result; |
| // if (((String) id).equals(XSDConstants.ABSTRACT_ATTRIBUTE) |
| // || ((String) id).equals(XSDConstants.MIXED_ATTRIBUTE)) |
| // { |
| // } |
| // else if (((String) id).equals(XSDConstants.BLOCK_ATTRIBUTE)) |
| // { |
| // } |
| // else if (((String) id).equals(XSDConstants.FINAL_ATTRIBUTE)) |
| // { |
| // } |
| } |
| 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) |
| { |
| value = ""; |
| } |
| if (value instanceof String) |
| { |
| String newValue = (String)value; |
| String attributeName = (String)id; |
| |
| if (attributeName.equals(XSDConstants.NAME_ATTRIBUTE)) |
| { |
| if (validateName(newValue)) |
| { |
| beginRecording(XSDEditorPlugin.getXSDString("_UI_COMPLEXTYPE_NAME_CHANGE"), element); |
| if (newValue.length() > 0) |
| { |
| // now rename any references to this type |
| if (xsdSchema != null) |
| { |
| XSDConcreteComponent comp = xsdSchema.getCorrespondingComponent(element); |
| if (comp != null && comp instanceof XSDComplexTypeDefinition && comp.getContainer().equals(xsdSchema)) |
| { |
| // XSDComplexTypeDefinition ct = (XSDComplexTypeDefinition)comp; |
| // ct.setName(newValue); |
| GlobalSimpleOrComplexTypeRenamer renamer = new GlobalSimpleOrComplexTypeRenamer((XSDNamedComponent)comp, newValue); |
| renamer.visitSchema(xsdSchema); |
| } |
| } |
| element.setAttribute(XSDConstants.NAME_ATTRIBUTE, newValue); |
| } |
| else |
| { |
| element.removeAttribute(XSDConstants.NAME_ATTRIBUTE); |
| } |
| endRecording(element); |
| } |
| } |
| else if (attributeName.equals(DERIVED_BY_ID)) |
| { |
| Element contentModelElement = getDomHelper().getContentModelFromParent(element); |
| String baseType = getDomHelper().getBaseType(contentModelElement); |
| beginRecording(XSDEditorPlugin.getXSDString("_UI_DERIVEDBY_CHANGE"), element); |
| Element derivedByElem = getDomHelper().getDerivedByElement(element); |
| getDomHelper().changeDerivedByType(contentModelElement, newValue, baseType); |
| endRecording(element); |
| } |
| else if (attributeName.equals(BASE_TYPE_ID)) |
| { |
| String derivedBy = getDomHelper().getDerivedByName(element); |
| |
| SetBaseTypeAction setBaseTypeAction = new SetBaseTypeAction(XSDEditorPlugin.getXSDString("_UI_LABEL_SET_BASE_TYPE")); |
| setBaseTypeAction.setXSDSchema(xsdSchema); |
| setBaseTypeAction.setComplexTypeElement(element); |
| setBaseTypeAction.setType(newValue); |
| setBaseTypeAction.setDerivedBy(derivedBy); |
| setBaseTypeAction.performAction(); |
| |
| // handleBaseTypeComboChange(newValue); |
| |
| } |
| else |
| { |
| if (attributeName.equals(XSDConstants.ABSTRACT_ATTRIBUTE)) |
| { |
| beginRecording(XSDEditorPlugin.getXSDString("_UI_COMPLEXTYPE_ABSTRACT_CHANGE"), element); |
| } |
| else if (attributeName.equals(XSDConstants.MIXED_ATTRIBUTE)) |
| { |
| beginRecording(XSDEditorPlugin.getXSDString("_UI_COMPLEXTYPE_MIXED_CHANGE"), element); |
| } |
| else if (attributeName.equals(XSDConstants.BLOCK_ATTRIBUTE)) |
| { |
| beginRecording(XSDEditorPlugin.getXSDString("_UI_COMPLEXTYPE_BLOCK_CHANGE"), element); |
| } |
| else if (attributeName.equals(XSDConstants.FINAL_ATTRIBUTE)) |
| { |
| beginRecording(XSDEditorPlugin.getXSDString("_UI_COMPLEXTYPE_FINAL_CHANGE"), element); |
| } |
| |
| if (newValue.length() > 0) |
| { |
| element.setAttribute((String) id, (String)value); |
| } |
| else |
| { |
| element.removeAttribute((String) id); |
| } |
| endRecording(element); |
| } |
| } |
| Runnable delayedUpdate = new Runnable() |
| { |
| public void run() |
| { |
| if (viewer != null) |
| viewer.refresh(); |
| } |
| }; |
| Display.getCurrent().asyncExec(delayedUpdate); |
| |
| } |
| |
| boolean checkForAnonymousType(Element element) |
| { |
| Object parentElement = (Object)element.getParentNode(); |
| boolean isAnonymous = false; |
| if (parentElement != null) |
| { |
| if (XSDDOMHelper.inputEquals(parentElement, XSDConstants.ELEMENT_ELEMENT_TAG, false)) |
| { |
| isAnonymous = true; |
| } |
| } |
| return isAnonymous; |
| } |
| |
| |
| // private void handleBaseTypeComboChange(String newType) |
| // { |
| // String tempChoice = newType; |
| // TypesHelper helper = new TypesHelper(xsdSchema); |
| // if (helper.getBuiltInTypeNamesList().contains(tempChoice) || |
| // helper.getUserSimpleTypeNamesList().contains(tempChoice)) |
| // { |
| // derivedByCombo.setText(XSDConstants.EXTENSION_ELEMENT_TAG); |
| // derivedByCombo.setEnabled(false); |
| // } |
| // else if (helper.getUserComplexTypeNamesList().contains(tempChoice)) |
| // { |
| // Element contentModelElement = getDomHelper().getContentModelFromParent(element); |
| // String derivedByString = getDomHelper().getDerivedByName(contentModelElement); |
| // derivedByCombo.setText(derivedByString); |
| // derivedByCombo.setEnabled(true); |
| // } |
| // else |
| // { |
| // derivedByCombo.setText(""); |
| // derivedByCombo.setEnabled(false); |
| // } |
| // } |
| |
| } |