Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.jst.ws.axis.creation.ui/src/org/eclipse/jst/ws/internal/axis/creation/ui/widgets/bean/ValidateObjectSelectionCommand.java')
-rw-r--r--bundles/org.eclipse.jst.ws.axis.creation.ui/src/org/eclipse/jst/ws/internal/axis/creation/ui/widgets/bean/ValidateObjectSelectionCommand.java172
1 files changed, 0 insertions, 172 deletions
diff --git a/bundles/org.eclipse.jst.ws.axis.creation.ui/src/org/eclipse/jst/ws/internal/axis/creation/ui/widgets/bean/ValidateObjectSelectionCommand.java b/bundles/org.eclipse.jst.ws.axis.creation.ui/src/org/eclipse/jst/ws/internal/axis/creation/ui/widgets/bean/ValidateObjectSelectionCommand.java
deleted file mode 100644
index dac0747df..000000000
--- a/bundles/org.eclipse.jst.ws.axis.creation.ui/src/org/eclipse/jst/ws/internal/axis/creation/ui/widgets/bean/ValidateObjectSelectionCommand.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 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.jst.ws.internal.axis.creation.ui.widgets.bean;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jem.java.JavaClass;
-import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.ws.internal.axis.creation.ui.AxisCreationUIMessages;
-import org.eclipse.jst.ws.internal.common.JavaMOFUtils;
-import org.eclipse.jst.ws.internal.common.ResourceUtils;
-import org.eclipse.jst.ws.internal.consumption.common.JavaResourceFilter;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
-import org.eclipse.wst.common.environment.IEnvironment;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-
-
-public class ValidateObjectSelectionCommand extends AbstractDataModelOperation
-{
- private String JAVA_EXTENSION = ".java"; //$NON-NLS-1$
- private String CLASS_EXTENSION = ".class"; //$NON-NLS-1$
- private IStructuredSelection objectSelection;
- private String serviceProjectName;
-
-
- /**
- * Validates that the selected Java bean can be loaded from the service project. If it can't, an error is displayed.
- */
- public ValidateObjectSelectionCommand()
- {
- super();
- }
- public IStatus execute( IProgressMonitor monitor, IAdaptable adaptable )
- {
- IEnvironment environment = getEnvironment();
- //Make sure a bean is selected
- String javaBeanName = null;
- if (objectSelection != null && !objectSelection.isEmpty())
- {
- Object object = objectSelection.getFirstElement();
- if (object instanceof String)
- {
- javaBeanName = ((String)object);
- }
- else
- {
- //The ObjectSelectionWidget never appeared and so the IStucturedSelection from
- //ObjectSelectionWidgetOutputCommand is the initial selection.
- //Get the Java bean name from the selection.
- try
- {
- System.out.println(object.getClass().toString());
- javaBeanName = getJavaBeanFromObjectSelection(objectSelection);
- } catch (CoreException ce)
- {
- IStatus errorStatus = StatusUtils.errorStatus(AxisCreationUIMessages.MSG_ERROR_CANNOT_NO_JAVA_BEAN);
- environment.getStatusHandler().reportError(errorStatus);
- return errorStatus;
- }
- }
- }
-
- if (javaBeanName==null || javaBeanName.length()==0)
- {
- IStatus errorStatus = StatusUtils.errorStatus(AxisCreationUIMessages.MSG_ERROR_CANNOT_NO_JAVA_BEAN);
- environment.getStatusHandler().reportError(errorStatus);
- return errorStatus;
- }
-
- //Make sure a project is selected
- IProject serviceProject = ProjectUtilities.getProject(serviceProjectName);
- if (serviceProject==null)
- {
- IStatus errorStatus = StatusUtils.errorStatus(AxisCreationUIMessages.MSG_ERROR_NO_PROJECT);
- environment.getStatusHandler().reportError(errorStatus);
- return errorStatus;
- }
-
- //Make sure the selected bean can be loaded from the selected project
- if (javaBeanName.toLowerCase().endsWith(JAVA_EXTENSION)
- || javaBeanName.toLowerCase().endsWith(CLASS_EXTENSION)) {
- javaBeanName = javaBeanName.substring(0, javaBeanName.lastIndexOf('.'));
- }
-
- try
- {
- JavaClass javaClass = JavaMOFUtils.getJavaClass(javaBeanName, serviceProject);
- if (!javaClass.isExistingType())
- {
- IStatus errorStatus = StatusUtils.errorStatus( NLS.bind(AxisCreationUIMessages.MSG_ERROR_CANNOT_LOAD_JAVA_BEAN, new String[] { javaBeanName, serviceProjectName }));
- environment.getStatusHandler().reportError(errorStatus);
- return errorStatus;
- }
- } catch (CoreException ce)
- {
- IStatus errorStatus = StatusUtils.errorStatus( NLS.bind(AxisCreationUIMessages.MSG_ERROR_CANNOT_LOAD_JAVA_BEAN, new String[] { javaBeanName, serviceProjectName }));
- environment.getStatusHandler().reportError(errorStatus);
- return errorStatus;
- }
-
- return Status.OK_STATUS;
- }
-
- /**
- * @param serviceProjectName The serviceProjectName to set.
- */
- public void setServiceProjectName(String serviceProjectName)
- {
- this.serviceProjectName = serviceProjectName;
- }
-
- /**
- * @param objectSelection The objectSelection to set.
- */
- public void setObjectSelection(IStructuredSelection objectSelection)
- {
- this.objectSelection = objectSelection;
- }
-
- private String getJavaBeanFromObjectSelection(IStructuredSelection objectSelection) throws CoreException
- {
- String beanClass = "";
- JavaResourceFilter filter = new JavaResourceFilter();
- //IStructuredSelection selection = initialSelection_;
- //
- if (objectSelection != null)
- {
- Object obj = objectSelection.getFirstElement();
- if (obj != null)
- {
- // get the IResource represented by the selection
- IResource res = null;
-
- res = ResourceUtils.getResourceFromSelection(obj);
-
- if (filter.accepts(res))
- {
- // get the package-qualified class name without file extensions
- String beanPackage = ResourceUtils.getJavaResourcePackageName(res.getFullPath());
- if (beanPackage==null)
- beanPackage = "";
- else
- beanPackage = beanPackage + ".";
-
- beanClass = beanPackage + res.getName();
-
- if (beanClass.toLowerCase().endsWith(".java") || beanClass.toLowerCase().endsWith(".class")) {
- beanClass = beanClass.substring(0,beanClass.lastIndexOf('.'));
- }
- }
- }
- }
-
- //
- return beanClass;
- }
-}

Back to the top

Action.java?h=v200608071825&id=d5a99d46ab4ca80c8cf82f1633a3e9dfcad0e759'>bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateLocalComplexTypeAction.java68
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateLocalSimpleTypeAction.java85
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateSimpleContentAction.java162
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateSimpleTypeAction.java68
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/DOMAttribute.java76
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/DeleteAction.java237
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ISchemaEditorActionConstants.java20
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/MakeAnonymousGlobal.java66
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ModelMessage.java36
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/MoveAction.java182
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/OpenSchemaAction.java64
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ReloadDependenciesAction.java58
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/SetBaseTypeAction.java384
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/XSDEditNamespacesAction.java220
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AbstractCommand.java71
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddAttributeDeclarationCommand.java141
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddComplexTypeDefinitionCommand.java53
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddElementDeclarationCommand.java53
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddModelGroupCommand.java89
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddSimpleTypeDefinitionCommand.java56
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/BaseDragNodesCommand.java102
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/DragNodesCommand.java77
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/XSDDragAndDropManager.java61
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/editparts/AbstractComponentViewerRootEditPart.java63
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ConnectedEditPartFigure.java138
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ConnectionRenderingFigure.java215
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ContainerFigure.java60
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ContainerLayout.java218
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/FillLayout.java162
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectedEditPartFigure.java30
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectedFigure.java18
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectionRenderingViewer.java16
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IExpandable.java19
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/SpacingFigure.java27
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/BaseGraphicalViewer.java198
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/FigureCanvasKeyboardHandler.java102
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/GraphContextMenuProvider.java57
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/GraphicsConstants.java36
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/LinkedGraphViewer.java163
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/PrintGraphAction.java84
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDChildUtility.java285
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDComponentViewer.java105
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphUtil.java35
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphViewer.java574
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphicalViewerKeyHandler.java352
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDInheritanceViewer.java98
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDSubstitutionGroupChildUtility.java46
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDSubstitutionGroupsViewer.java99
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/BaseEditPart.java86
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/CategoryEditPart.java164
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComplexTypeDefinitionEditPart.java210
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComplexTypeInheritedContentEditPart.java145
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComponentViewerRootEditPart.java76
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ElementDeclarationEditPart.java379
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ExpandableGraphNodeEditPart.java189
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/GraphNodeEditPart.java144
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/IFeedbackHandler.java17
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/MessageEditPart.java38
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ModelGroupDefinitionEditPart.java196
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ModelGroupEditPart.java187
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RepeatableGraphNodeEditPart.java72
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RootComplexTypeDefinitionEditPart.java121
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RootModelGroupDefinitionEditPart.java105
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SchemaDirectiveEditPart.java60
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SchemaEditPart.java207
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SubstitutionGroupViewerRootEditPart.java76
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/TopLevelComponentEditPart.java273
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/TypeEditPart.java72
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/WildcardEditPart.java85
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/XSDEditPartFactory.java97
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/ComboBoxCellEditorManager.java205
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/ComponentNameDirectEditManager.java83
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/DirectEditPolicyDelegate.java18
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/DragAndDropCommand.java154
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/DragAndDropEditPolicy.java47
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/GraphNodeDragTracker.java34
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/SelectionHandlesEditPolicyImpl.java257
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/SimpleDirectEditPolicy.java58
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/TextCellEditorManager.java74
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/TypeReferenceDirectEditManager.java118
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/BogusLayout.java61
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/CenterLayout.java118
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/CenteredIconFigure.java39
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/ConnectionFigure.java210
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/ContainerFigure.java71
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/ContainerLayout.java249
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/ExpandableGraphNodeFigure.java133
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/FillLayout.java161
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/FloatableFigure.java29
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/GraphNodeContainerFigure.java29
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/GraphNodeFigure.java184
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/Interactor.java54
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/LabelFigure.java88
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/PostLayoutManager.java19
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/RepeatableGraphNodeFigure.java85
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/RoundedLineBorder.java67
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/model/Category.java266
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/model/ModelAdapter.java27
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/model/ModelAdapterListener.java18
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/model/XSDModelAdapterFactory.java511
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/GenerateDtd.gifbin0 -> 605 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/GenerateJava.gifbin0 -> 609 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/GraphViewElementRef.gifbin0 -> 860 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/NewXSD.gifbin0 -> 3261 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/RegexWizardArrow.gifbin0 -> 54 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/ValidateXSD.gifbin0 -> 558 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAll.gifbin0 -> 88 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAnnotate.gifbin0 -> 594 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAny.gifbin0 -> 613 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAnyAttribute.gifbin0 -> 384 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAppInfo.gifbin0 -> 121 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAttribute.gifbin0 -> 167 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAttributeGroup.gifbin0 -> 235 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAttributeGroupRef.gifbin0 -> 361 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAttributeRef.gifbin0 -> 350 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDChoice.gifbin0 -> 145 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDComplexContent.gifbin0 -> 211 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDComplexType.gifbin0 -> 155 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDDoc.gifbin0 -> 368 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDElement.gifbin0 -> 351 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDElementRef.gifbin0 -> 585 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDExtension.gifbin0 -> 101 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDField.gifbin0 -> 227 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDFile.gifbin0 -> 361 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDGlobalAttribute.gifbin0 -> 167 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDGlobalElement.gifbin0 -> 351 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDGroup.gifbin0 -> 205 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDGroupRef.gifbin0 -> 347 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDImport.gifbin0 -> 114 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDInclude.gifbin0 -> 324 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDKey.gifbin0 -> 323 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDKeyRef.gifbin0 -> 558 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDNotation.gifbin0 -> 177 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDRedefine.gifbin0 -> 373 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSelector.gifbin0 -> 136 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSequence.gifbin0 -> 91 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleContent.gifbin0 -> 210 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleEnum.gifbin0 -> 105 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleList.gifbin0 -> 347 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimplePattern.gifbin0 -> 120 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleRestrict.gifbin0 -> 141 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleType.gifbin0 -> 150 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleUnion.gifbin0 -> 138 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDUnique.gifbin0 -> 210 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/back.gifbin0 -> 873 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/browsebutton.gifbin0 -> 825 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/forward.gifbin0 -> 874 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/generate_xml.gifbin0 -> 612 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/regx_wiz.gifbin0 -> 3241 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/reloadgrammar.gifbin0 -> 365 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/sort.gifbin0 -> 159 bytes-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/preferences/XSDPreferencePage.java259
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AnyAttributePropertySource.java173
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AnyContentPropertyDescriptor.java155
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AnyElementPropertySource.java228
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AppInfoPropertySource.java216
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AttributeGroupRefPropertySource.java172
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AttributePropertySource.java294
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AttributesTable.java331
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/BasePropertySource.java126
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ComplexTypePropertySource.java380
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/DocumentationPropertySource.java243
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/DynamicCellEditor.java1175
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ElementPropertySource.java546
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/EnumerationPropertySource.java131
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/FixedOrDefaultTextPropertyDescriptor.java307
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/GroupRefPropertySource.java229
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ImportPropertySource.java335
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/IncludePropertySource.java238
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/KeyrefPropertySource.java210
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ModelGroupPropertySource.java266
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/NamePropertySource.java219
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/NotationPropertySource.java186
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/OptionsTextCellEditor.java241
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/PatternPropertySource.java272
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ReadOnlyPropertySource.java76
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SchemaDirectiveHelperPropertySource.java191
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SchemaPropertySource.java530
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleContentPropertyDescriptor.java209
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleContentPropertySource.java230
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleRestrictPropertySource.java362
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleTypeListPropertySource.java143
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleTypePropertySource.java183
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleTypeUnionPropertySource.java494
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/TypesPropertyDescriptor.java1160
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/XPathPropertySource.java150
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/XSDComboBoxPropertyDescriptor.java304
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/XSDPropertySheetPage.java119
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/XSDPropertySourceProvider.java285
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AbstractSection.java495
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AbstractSectionDescriptor.java108
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AnnotationSection.java595
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AnnotationSectionDescriptor.java109
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AttributesViewContentProvider.java289
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AttributesViewSection.java460
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AttributesViewSectionDescriptor.java101
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ComplexTypeSection.java222
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ComplexTypeSectionDescriptor.java82
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/EnumerationsSection.java434
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/EnumerationsSectionDescriptor.java87
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/FacetViewer.java498
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/FacetsSection.java802
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/FacetsSectionDescriptor.java87
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/MinMaxSection.java286
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/MinMaxSectionDescriptor.java145
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ModelGroupSection.java144
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ModelGroupSectionDescriptor.java102
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NameSection.java444
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NameSectionDescriptor.java169
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceAndSchemaLocationDescriptor.java87
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceAndSchemaLocationSection.java345
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceProcessContentsSection.java196
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceProcessContentsSectionDescriptor.java84
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceSection.java430
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceSectionDescriptor.java86
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/OtherAttributesSection.java125
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/OtherAttributesSectionDescriptor.java145
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/PatternSection.java165
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/PatternSectionDescriptor.java85
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ReferenceSection.java290
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ReferenceSectionDescriptor.java174
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SchemaLocationDescriptor.java88
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SchemaLocationSection.java183
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleContentBaseTypeOptionsDialog.java158
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleContentUnionMemberTypesDialog.java314
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleTypeSection.java541
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleTypeSectionDescriptor.java91
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleTypeUnionSection.java185
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleTypeUnionSectionDescriptor.java87
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/TextChangeHelper.java102
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/TypesDialog.java722
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/TypesSection.java326
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/TypesSectionDescriptor.java134
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ValueSection.java118
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ValueSectionDescriptor.java82
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDSectionDescriptorProvider.java57
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDSectionLabelProvider.java169
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDTabbedPropertySheetPage.java140
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDWorkbook.java97
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDWorkbookPage.java51
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/CategoryAdapter.java168
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAbstractAdapter.java165
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAdapterFactoryLabelProvider.java160
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAnnotationAdapter.java83
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAttributeDeclarationAdapter.java113
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAttributeGroupDefinitionAdapter.java100
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAttributeUseAdapter.java90
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDComplexTypeDefinitionAdapter.java182
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDContentProvider.java306
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDElementDeclarationAdapter.java193
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDModelAdapterFactoryImpl.java422
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDModelGroupAdapter.java141
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDModelGroupDefinitionAdapter.java96
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDNotationDeclarationAdapter.java44
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDParticleAdapter.java61
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDSchemaAdapter.java405
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDSchemaDirectiveAdapter.java102
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDSimpleTypeDefinitionAdapter.java193
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDWildcardAdapter.java112
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/XSDVisitor.java217
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/BaseCleanup.java107
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/BaseGlobalCleanup.java29
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalAttributeCleanup.java106
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalAttributeGroupCleanup.java102
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalElementCleanup.java85
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalGroupCleanup.java84
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalSimpleOrComplexTypeCleanup.java142
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/XSDExternalFileCleanup.java300
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/BaseRenamer.java61
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalAttributeGroupRenamer.java57
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalAttributeRenamer.java66
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalElementRenamer.java41
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalGroupRenamer.java43
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalSimpleOrComplexTypeRenamer.java91
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/SchemaPrefixChangeHandler.java212
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/TargetNamespaceChangeHandler.java154
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/OpenOnSelectionHelper.java322
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/SelectionAdapter.java83
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/TypesHelper.java762
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/ViewUtility.java429
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/XSDDOMHelper.java1103
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/XSDSchemaHelper.java72
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/widgets/EnumerationsDialog.java106
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/widgets/SetBaseTypeDialog.java180
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/widgets/TypeSection.java340
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/widgets/XSDEditSchemaInfoDialog.java43
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/NewXSDWizard.java168
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/RegexCompositionPage.java965
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/RegexNode.java421
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/RegexTestingPage.java161
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/RegexWizard.java65
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/XSDLocationChoicePage.java71
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/XSDNewFilePage.java130
-rw-r--r--bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/XSDSelectIncludeFileWizard.java371
318 files changed, 52900 insertions, 0 deletions
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/AbstractXSDDataTypeValueExtension.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/AbstractXSDDataTypeValueExtension.java
new file mode 100644
index 0000000000..323cb9480f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/AbstractXSDDataTypeValueExtension.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * 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;
+import java.util.Vector;
+
+import org.eclipse.wst.common.contentmodel.CMNode;
+import org.eclipse.wst.common.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.common.contentmodel.modelquery.extension.DataTypeValueExtension;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.xsd.XSDSchema;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+ /**
+ * This class is used to extend the ModelQuery behaviour so that we can contribute our own
+ * 'allowed values' for attributes or elements (e.g. the 'type' attribute).
+ */
+ public abstract class AbstractXSDDataTypeValueExtension implements DataTypeValueExtension
+ {
+ protected ModelQuery modelQuery;
+
+ public int getType()
+ {
+ return DATA_TYPE_VALUE_EXTENSION;
+ }
+
+ public abstract String getId();
+
+ public AbstractXSDDataTypeValueExtension(ModelQuery modelQuery)
+ {
+ this.modelQuery = modelQuery;
+ if (modelQuery != null && modelQuery.getExtensionManager() != null)
+ {
+ modelQuery.getExtensionManager().addExtension(this);
+ }
+ }
+
+ public void dispose()
+ {
+ if (modelQuery != null && modelQuery.getExtensionManager() != null)
+ {
+ modelQuery.getExtensionManager().removeExtension(this);
+ }
+ }
+
+ protected abstract XSDSchema getEnclosingXSDSchema(Element element);
+
+
+ protected TypesHelper createTypesHelper(XSDSchema schema)
+ {
+ return new TypesHelper(schema);
+ }
+
+ public java.util.List getDataTypeValues(Element element, CMNode cmNode)
+ {
+ java.util.List list = new Vector();
+ if (cmNode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION)
+ {
+ TypesHelper typesHelper = createTypesHelper(getEnclosingXSDSchema(element));
+ String name = cmNode.getNodeName();
+ String currentElementName = element.getLocalName();
+ Node parentNode = element.getParentNode();
+ String parentName = "";
+ if (parentNode != null)
+ {
+ parentName = parentNode.getLocalName();
+ }
+
+ if (checkName(name, "type"))
+ {
+ if (checkName(currentElementName, "attribute"))
+ {
+ list = typesHelper.getBuiltInTypeNamesList();
+ list.addAll(typesHelper.getUserSimpleTypeNamesList());
+ }
+ else if (checkName(currentElementName, "element"))
+ {
+ list = typesHelper.getBuiltInTypeNamesList2();
+ list.addAll(typesHelper.getUserSimpleTypeNamesList());
+ list.addAll(typesHelper.getUserComplexTypeNamesList());
+ }
+ }
+ else if (checkName(name, "itemType"))
+ {
+ if (checkName(currentElementName, "list"))
+ {
+ if (checkName(parentName, "simpleType"))
+ {
+ list = typesHelper.getBuiltInTypeNamesList();
+ list.addAll(typesHelper.getUserSimpleTypeNamesList());
+ }
+ }
+ }
+ else if (checkName(name, "memberTypes"))
+ {
+ if (checkName(currentElementName, "union"))
+ {
+ if (checkName(parentName, "simpleType"))
+ {
+ list = typesHelper.getBuiltInTypeNamesList();
+ list.addAll(typesHelper.getUserSimpleTypeNamesList());
+ }
+ }
+ }
+ else if (checkName(name, "base"))
+ {
+ if (checkName(currentElementName, "restriction"))
+ {
+ if (checkName(parentName, "simpleType"))
+ {
+ list = typesHelper.getBuiltInTypeNamesList();
+ list.addAll(typesHelper.getUserSimpleTypeNamesList());
+ }
+ else if (checkName(parentName, "simpleContent"))
+ {
+ list = typesHelper.getBuiltInTypeNamesList();
+ list.addAll(typesHelper.getUserComplexTypeNamesList());
+ }
+ else if (checkName(parentName, "complexContent"))
+ {
+ list = typesHelper.getBuiltInTypeNamesList();
+ list.addAll(typesHelper.getUserComplexTypeNamesList());
+ }
+ }
+ else if (checkName(currentElementName, "extension"))
+ {
+ if (checkName(parentName, "simpleContent"))
+ {
+ list = typesHelper.getBuiltInTypeNamesList();
+ list.addAll(typesHelper.getUserComplexTypeNamesList());
+ }
+ else if (checkName(parentName, "complexContent"))
+ {
+ list = typesHelper.getBuiltInTypeNamesList();
+ list.addAll(typesHelper.getUserComplexTypeNamesList());
+ }
+ }
+ }
+ else if (checkName(name, "ref"))
+ {
+ if (checkName(currentElementName, "element"))
+ {
+ list = typesHelper.getGlobalElements();
+ }
+ else if (checkName(currentElementName, "attribute"))
+ {
+ list = typesHelper.getGlobalAttributes();
+ }
+ else if (checkName(currentElementName, "attributeGroup"))
+ {
+ list = typesHelper.getGlobalAttributeGroups();
+ }
+ else if (checkName(currentElementName, "group"))
+ {
+ list = typesHelper.getModelGroups();
+ }
+ }
+ else if (checkName(name, "substitutionGroup"))
+ {
+ if (checkName(currentElementName, "element"))
+ {
+ list = typesHelper.getGlobalElements();
+ }
+ }
+/* else if (checkName(name, "refer"))
+ {
+ if (checkName(currentElementName, "keyref"))
+ {
+ list = typesHelper.getKeys();
+ }
+ } */
+
+
+ }
+ return list;
+ }
+
+ protected boolean checkName(String localName, String token)
+ {
+ if (localName != null && localName.trim().equals(token))
+ {
+ return true;
+ }
+ return false;
+ }
+ } \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/AbstractXSDModelQueryContributor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/AbstractXSDModelQueryContributor.java
new file mode 100644
index 0000000000..717afe0c59
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/AbstractXSDModelQueryContributor.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * 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;
+import java.net.URL;
+import java.util.Vector;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.common.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.common.contentmodel.util.NamespaceInfo;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.modelquery.ModelQueryUtil;
+import org.w3c.dom.Document;
+
+public abstract class AbstractXSDModelQueryContributor
+{
+ protected AbstractXSDDataTypeValueExtension xsdDataTypeValueExtension;
+
+ public void setModel(XMLModel model)
+ {
+ // remove our old DataTypeValueExtension
+ //
+ if (xsdDataTypeValueExtension != null)
+ {
+ xsdDataTypeValueExtension.dispose();
+ xsdDataTypeValueExtension = null;
+ }
+
+ setImplicitGrammar(model.getDocument());
+
+ // add a new DataTypeValueExtension
+ //
+ ModelQuery modelQuery = ModelQueryUtil.getModelQuery(model.getDocument());
+ xsdDataTypeValueExtension = createXSDDataTypeValueExtension(modelQuery);
+ }
+
+ protected void setImplicitGrammar(Document document)
+ {
+// DOMExtension domExtension = DOMExtensionProviderRegistry.getInstance().getDOMExtension(document);
+// if (domExtension != null)
+// {
+ String uri = "platform:/plugin/org.eclipse.wst.xsd.ui/w3c/schemaForCodeAssist.xsd";
+ uri = resolvePlatformUrl(uri);
+ if (uri != null)
+ {
+ Vector list = new Vector();
+ NamespaceInfo info = new NamespaceInfo("http://www.w3.org/2001/XMLSchema", "xsd", uri);
+ info.setProperty("isImplied", "true");
+ list.add(info);
+// domExtension.setImplictNamespaceInfoList(list);
+ }
+// }
+ }
+
+ protected static String resolvePlatformUrl(String urlspec)
+ {
+ String result = null;
+ try
+ {
+ urlspec = urlspec.replace('\\', '/');
+ URL url = new URL(urlspec);
+ URL resolvedURL = Platform.resolve(url);
+ result = resolvedURL.toString();
+ }
+ catch (Exception e)
+ {
+ }
+ return result;
+ }
+
+ public abstract AbstractXSDDataTypeValueExtension createXSDDataTypeValueExtension(ModelQuery modelQuery);
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDActionBarContributor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDActionBarContributor.java
new file mode 100644
index 0000000000..e227044de9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDActionBarContributor.java
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * 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;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.actions.RetargetAction;
+import org.eclipse.ui.part.EditorActionBarContributor;
+import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+import org.eclipse.wst.xsd.ui.internal.actions.ISchemaEditorActionConstants;
+import org.eclipse.wst.xsd.ui.internal.actions.ReloadDependenciesAction;
+
+public class XSDActionBarContributor extends MultiPageEditorActionBarContributor
+{
+ protected XSDEditor xsdEditor;
+ protected XSDTextEditor textEditor;
+
+ protected ReloadDependenciesAction reloadDependenciesAction;
+
+ protected List fPartListeners= new ArrayList();
+
+ protected RetargetAction retargetReloadDependenciesAction;
+
+ /**
+ * Constructor for XSDActionBarContributor.
+ */
+ public XSDActionBarContributor()
+ {
+ super();
+
+ // Reload Dependencies
+ reloadDependenciesAction = new ReloadDependenciesAction(XSDEditorPlugin.getXSDString("_UI_MENU_RELOAD_DEPENDENCIES"));
+ retargetReloadDependenciesAction = new RetargetAction(ISchemaEditorActionConstants.RETARGET_RELOAD_DEPENDENCIES_ACTION_ID, XSDEditorPlugin.getXSDString("_UI_MENU_RELOAD_DEPENDENCIES"));
+ retargetReloadDependenciesAction.setToolTipText(XSDEditorPlugin.getXSDString("_UI_MENU_RELOAD_DEPENDENCIES_TOOLTIP"));
+ retargetReloadDependenciesAction.setImageDescriptor(
+ ImageDescriptor.createFromFile(XSDEditorPlugin.getPlugin().getClass(), "icons/reloadgrammar.gif"));
+ fPartListeners.add(retargetReloadDependenciesAction);
+ }
+
+ protected void updateActions()
+ {
+ if (xsdEditor != null && xsdEditor.getCurrentPageType().equals(XSDEditorPlugin.GRAPH_PAGE))
+ {
+ IAction deleteAction = xsdEditor.getGraphViewer().getComponentViewer().getMenuListener().getDeleteAction();
+ getActionBars().setGlobalActionHandler(ActionFactory.DELETE.getId(), deleteAction);
+
+ IAction printGraphAction = xsdEditor.getGraphViewer().getPrintGraphAction();
+ getActionBars().setGlobalActionHandler(ActionFactory.PRINT.getId(), printGraphAction);
+ }
+ else
+ {
+ getActionBars().setGlobalActionHandler(ActionFactory.DELETE.getId(), null);
+ // always enable print regardless of whether we are on source or design
+ updateAction(ActionFactory.PRINT.getId(), ITextEditorActionConstants.PRINT, true);
+ }
+ }
+
+ public void setActivePage(IEditorPart activeEditor)
+ {
+ updateActions();
+ getActionBars().updateActionBars();
+ }
+
+ protected void updateAction(String globalActionId, String textEditorActionId, boolean enable)
+ {
+ getActionBars().setGlobalActionHandler(globalActionId,
+ enable ? getAction(textEditor, textEditorActionId) :
+ null);
+ }
+
+ /**
+ * Returns the action registed with the given text editor.
+ * @return IAction or null if editor is null.
+ */
+ protected IAction getAction(ITextEditor editor, String actionID)
+ {
+ try
+ {
+ return (editor == null ? null : editor.getAction(actionID));
+ }
+ catch (Exception e)
+ {
+ return null;
+ }
+ }
+
+ private IMenuManager editMenu;
+
+ /*
+ * @see EditorActionBarContributor#contributeToMenu(IMenuManager)
+ */
+ public void addToMenu(IMenuManager menuManager)
+ {
+ editMenu = menuManager.findMenuUsingPath(IWorkbenchActionConstants.M_EDIT);
+
+ MenuManager treeMenu = new MenuManager(XSDEditorPlugin.getXSDString("_UI_MENU_XSD_EDITOR"));
+ menuManager.insertAfter(IWorkbenchActionConstants.MB_ADDITIONS, treeMenu);
+
+ treeMenu.add(new Separator("group1"));
+// Add retarget actions
+
+ treeMenu.add(retargetReloadDependenciesAction);
+
+ treeMenu.add(new Separator("group2"));
+ }
+
+ /**
+ * @see EditorActionBarContributor#contributeToToolBar(IToolBarManager)
+ */
+ public void addToToolBar(IToolBarManager toolBarManager)
+ {
+ toolBarManager.add(new Separator("XMLSchema.2"));
+// Add retarget actions
+ toolBarManager.add(retargetReloadDependenciesAction);
+
+ toolBarManager.add(new Separator("XMLSchema.1"));
+
+ toolBarManager.add(new Separator());
+ }
+
+ public void contributeToToolBar(IToolBarManager toolBarManager)
+ {
+ addToToolBar(toolBarManager);
+ }
+
+ public void contributeToMenu(IMenuManager menuManager)
+ {
+ addToMenu(menuManager);
+ }
+
+ /**
+ * @see org.eclipse.ui.IEditorActionBarContributor#setActiveEditor(IEditorPart)
+ */
+ public void setActiveEditor(IEditorPart targetEditor)
+ {
+ super.setActiveEditor(targetEditor);
+
+ if (targetEditor instanceof XSDEditor)
+ {
+ xsdEditor = (XSDEditor) targetEditor;
+ reloadDependenciesAction.setEditor((XSDEditor)targetEditor);
+
+ textEditor = ((XSDEditor)targetEditor).getXSDTextEditor();
+ if (textEditor != null)
+ {
+ updateActions();
+ getActionBars().updateActionBars();
+ }
+ }
+ }
+
+ public void init(IActionBars bars, IWorkbenchPage page)
+ {
+ Iterator e = fPartListeners.iterator();
+ while (e.hasNext())
+ {
+ page.addPartListener((RetargetAction) e.next());
+ }
+
+ // register actions that have a dynamic editor.
+
+ bars.setGlobalActionHandler(ISchemaEditorActionConstants.RETARGET_RELOAD_DEPENDENCIES_ACTION_ID, reloadDependenciesAction);
+
+ super.init(bars, page);
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDContentOutlinePage.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDContentOutlinePage.java
new file mode 100644
index 0000000000..9821602216
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDContentOutlinePage.java
@@ -0,0 +1,375 @@
+/*******************************************************************************
+ * 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;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+import org.eclipse.wst.xsd.ui.internal.actions.OpenSchemaAction;
+import org.eclipse.wst.xsd.ui.internal.provider.CategoryAdapter;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.w3c.dom.Element;
+
+public class XSDContentOutlinePage extends ContentOutlinePage
+{
+ protected XSDEditor xsdEditor;
+ protected int level = 0;
+ protected Object model;
+ protected ITreeContentProvider contentProvider;
+ protected ILabelProvider labelProvider;
+ protected XSDSelectionManager selectionManager;
+ protected SelectionManagerSelectionChangeListener selectionManagerSelectionChangeListener = new SelectionManagerSelectionChangeListener();
+ protected TreeSelectionChangeListener treeSelectionChangeListener = new TreeSelectionChangeListener();
+ XSDTextEditor xsdTextEditor;
+
+ /**
+ *
+ */
+ public XSDContentOutlinePage(XSDTextEditor xsdTextEditor)
+ {
+ super();
+ this.xsdTextEditor = xsdTextEditor;
+ }
+
+ public void setModel(Object newModel)
+ {
+ model = newModel;
+ }
+
+ public void setContentProvider(ITreeContentProvider contentProvider)
+ {
+ this.contentProvider = contentProvider;
+ }
+
+ public void setLabelProvider(ILabelProvider labelProvider)
+ {
+ this.labelProvider = labelProvider;
+ }
+
+ // expose
+ public TreeViewer getTreeViewer()
+ {
+ return super.getTreeViewer();
+ }
+
+ public void createControl(Composite parent)
+ {
+ super.createControl(parent);
+ getTreeViewer().setContentProvider(contentProvider);
+ getTreeViewer().setLabelProvider(labelProvider);
+ getTreeViewer().setInput(model);
+ getTreeViewer().addSelectionChangedListener(this);
+ MenuManager menuManager = new MenuManager("#popup");//$NON-NLS-1$
+ menuManager.setRemoveAllWhenShown(true);
+ Menu menu = menuManager.createContextMenu(getTreeViewer().getControl());
+ getTreeViewer().getControl().setMenu(menu);
+ XSDMenuListener menuListener = new XSDMenuListener(xsdTextEditor.getXSDEditor().getSelectionManager());
+ menuManager.addMenuListener(menuListener);
+ setSelectionManager(xsdTextEditor.getXSDEditor().getSelectionManager());
+ // cs... why are we doing this from the outline view?
+ //
+ //xsdTextEditor.getXSDEditor().getSelectionManager().setSelection(new
+ // StructuredSelection(xsdTextEditor.getXSDSchema()));
+ XSDKeyListener keyListener = new XSDKeyListener(getTreeViewer(), menuListener);
+ getTreeViewer().getControl().addKeyListener(keyListener);
+ // drill down from outline view
+ getTreeViewer().getControl().addMouseListener(new MouseAdapter()
+ {
+ public void mouseDoubleClick(MouseEvent e)
+ {
+ ISelection iSelection = getTreeViewer().getSelection();
+ if (iSelection instanceof StructuredSelection)
+ {
+ StructuredSelection selection = (StructuredSelection)iSelection;
+ Object obj = selection.getFirstElement();
+ if (obj instanceof XSDConcreteComponent)
+ {
+ XSDConcreteComponent comp = (XSDConcreteComponent)obj;
+ if (comp.getContainer() instanceof XSDSchema)
+ {
+ xsdTextEditor.getXSDEditor().getGraphViewer().setInput(obj);
+ }
+ }
+ }
+
+ }
+ });
+ }
+ class XSDKeyListener extends KeyAdapter
+ {
+ TreeViewer viewer;
+ XSDMenuListener menuListener;
+
+ public XSDKeyListener(TreeViewer viewer, XSDMenuListener menuListener)
+ {
+ super();
+ this.viewer = viewer;
+ this.menuListener = menuListener;
+ }
+
+ /**
+ * @see org.eclipse.swt.events.KeyAdapter#keyReleased(KeyEvent)
+ */
+ public void keyReleased(KeyEvent e)
+ {
+ if (e.character == SWT.DEL)
+ {
+ menuListener.getDeleteAction().run();
+ }
+ else if (e.keyCode == SWT.F3) // open editor on any
+ // include/import/redefine
+ {
+ if (e.widget instanceof Tree)
+ {
+ Tree tree = (Tree) e.widget;
+ TreeItem[] selection = tree.getSelection();
+ if (selection.length > 0)
+ {
+ if (selection[0].getData() instanceof XSDSchemaDirective)
+ {
+ XSDSchemaDirective comp = (XSDSchemaDirective) selection[0].getData();
+ OpenSchemaAction openSchema = new OpenSchemaAction(XSDEditorPlugin.getXSDString("_UI_ACTION_OPEN_SCHEMA"), comp);
+ openSchema.run();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public void setExpandToLevel(int i)
+ {
+ level = i;
+ }
+
+ public void setInput(Object value)
+ {
+ getTreeViewer().setInput(value);
+ getTreeViewer().expandToLevel(level);
+ }
+
+ // public ISelection getSelection()
+ // {
+ // if (getTreeViewer() == null)
+ // return StructuredSelection.EMPTY;
+ // return getTreeViewer().getSelection();
+ // }
+ public void setSelectionManager(XSDSelectionManager newSelectionManager)
+ {
+ TreeViewer treeViewer = getTreeViewer();
+ // disconnect from old one
+ if (selectionManager != null)
+ {
+ selectionManager.removeSelectionChangedListener(selectionManagerSelectionChangeListener);
+ treeViewer.removeSelectionChangedListener(treeSelectionChangeListener);
+ }
+ selectionManager = newSelectionManager;
+ // connect to new one
+ if (selectionManager != null)
+ {
+ selectionManager.addSelectionChangedListener(selectionManagerSelectionChangeListener);
+ treeViewer.addSelectionChangedListener(treeSelectionChangeListener);
+ }
+ }
+ class SelectionManagerSelectionChangeListener implements ISelectionChangedListener
+ {
+ public void selectionChanged(SelectionChangedEvent event)
+ {
+ if (event.getSelectionProvider() != getTreeViewer())
+ {
+ getTreeViewer().setSelection(event.getSelection(), true);
+ }
+ }
+ }
+ class TreeSelectionChangeListener implements ISelectionChangedListener
+ {
+ public void selectionChanged(SelectionChangedEvent event)
+ {
+ if (selectionManager != null)
+ {
+ ISelection selection = event.getSelection();
+ if (selection instanceof IStructuredSelection)
+ {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+ Object o = structuredSelection.getFirstElement();
+ // TODO ...
+ // we need to implement a selectionManagerMapping extension point
+ // so that extensions can specify how they'd like to map view objects
+ // to selection objects
+ //
+ if (o instanceof Element)
+ {
+ try
+ {
+ Object modelObject = xsdTextEditor.getXSDSchema().getCorrespondingComponent((Element) o);
+ if (modelObject != null)
+ {
+ o = modelObject;
+ }
+ }
+ catch (Exception e)
+ {
+ }
+ }
+ else if (o instanceof CategoryAdapter)
+ {
+ // todo... we need to ensure we eliminate the propagation
+ // of 'view' specific objects into the SelectionManager.
+ // We need to do some work to ensure all views utilize the 'Category' model object
+ // so we can get rid of this CategoryAdapter class.
+// CategoryAdapter adapter = (CategoryAdapter) o;
+// o = adapter.getXSDSchema();
+ }
+ if (o != null)
+ {
+ selectionManager.setSelection(new StructuredSelection(o), getTreeViewer());
+ }
+ else
+ {
+ // selectionManager.setSelection(new StructuredSelection(),
+ // getTreeViewer());
+ }
+ }
+ }
+ }
+ }
+ FilterAction referenceAction, inheritedAction;
+
+ public void setActionBars(IActionBars actionBars)
+ {
+ super.setActionBars(actionBars);
+ // Uncomment to add sort action
+ // SortAction sortAction = new SortAction();
+ //
+ // actionBars.getToolBarManager().add(sortAction);
+ // sortAction.setChecked(false);
+ referenceAction = new FilterAction(new ReferenceFilter("Reference Content"), XSDEditorPlugin.getXSDString("_UI_OUTLINE_SHOW_REFERENCES"), ImageDescriptor.createFromFile(XSDEditorPlugin
+ .getPlugin().getClass(), "icons/XSDElementRef.gif"));
+ boolean initialRef = xsdTextEditor.getXSDModelAdapterFactory().getShowReferences();
+ referenceAction.setChecked(initialRef);
+ inheritedAction = new FilterAction(new ReferenceFilter("Inherited Content"), XSDEditorPlugin.getXSDString("_UI_OUTLINE_SHOW_INHERITED"), ImageDescriptor.createFromFile(XSDEditorPlugin.getPlugin()
+ .getClass(), "icons/XSDComplexContent.gif"));
+ boolean initialInherited = xsdTextEditor.getXSDModelAdapterFactory().getShowReferences();
+ IMenuManager menu = actionBars.getMenuManager();
+ menu.add(referenceAction);
+ menu.add(inheritedAction);
+ }
+
+ private void updateActions(Action current)
+ {
+ if (referenceAction.isChecked())
+ {
+ xsdTextEditor.getXSDModelAdapterFactory().setShowReferences(true);
+ }
+ else
+ {
+ xsdTextEditor.getXSDModelAdapterFactory().setShowReferences(false);
+ }
+ if (inheritedAction.isChecked())
+ {
+ xsdTextEditor.getXSDModelAdapterFactory().setShowInherited(true);
+ }
+ else
+ {
+ xsdTextEditor.getXSDModelAdapterFactory().setShowInherited(false);
+ }
+ }
+ private Sorter sorter = new Sorter();
+ public class Sorter extends org.eclipse.jface.viewers.ViewerSorter
+ {
+ }
+ public class SortAction extends Action
+ {
+ public SortAction()
+ {
+ super("Sort", ImageDescriptor.createFromFile(XSDEditorPlugin.getPlugin().getClass(), "icons/sort.gif"));
+ }
+
+ public void run()
+ {
+ getTreeViewer().getControl().setVisible(false);
+ Object[] expandedElements = getTreeViewer().getExpandedElements();
+ getTreeViewer().setSorter(isChecked() ? sorter : null);
+ Object input = getTreeViewer().getInput();
+ getTreeViewer().setInput(input);
+ getTreeViewer().setExpandedElements(expandedElements);
+ getTreeViewer().getControl().setVisible(true);
+ }
+
+ public void setChecked(boolean checked)
+ {
+ super.setChecked(checked);
+ setToolTipText(checked ? XSDEditorPlugin.getXSDString("_UI_OUTLINE_DO_NOT_SORT") : XSDEditorPlugin.getXSDString("_UI_OUTLINE_SORT"));
+ }
+ }
+ public class FilterAction extends Action
+ {
+ ViewerFilter filter;
+
+ public FilterAction(ViewerFilter filter, String label, ImageDescriptor image)
+ {
+ super(label, image);
+ this.filter = filter;
+ setChecked(false);
+ }
+
+ public void run()
+ {
+ updateActions(this);
+ if (isChecked())
+ {
+ getTreeViewer().resetFilters();
+ getTreeViewer().addFilter(filter);
+ }
+ else
+ {
+ getTreeViewer().removeFilter(filter);
+ }
+ }
+ }
+ class ReferenceFilter extends ViewerFilter // Dummy filter
+ {
+ public ReferenceFilter(String elementTag)
+ {
+ this.elementTag = elementTag;
+ }
+ protected String elementTag;
+
+ public boolean select(Viewer viewer, Object parentElement, Object element)
+ {
+ return true;
+ }
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditor.java
new file mode 100644
index 0000000000..9f436f4673
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditor.java
@@ -0,0 +1,1140 @@
+/*******************************************************************************
+ * 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;
+
+import java.util.ArrayList;
+import java.util.EventObject;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.emf.common.command.BasicCommandStack;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CommandStackListener;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.editors.text.JavaFileEditorInput;
+import org.eclipse.ui.views.properties.PropertySheet;
+import org.eclipse.wst.common.ui.properties.ITabbedPropertySheetPageContributor;
+import org.eclipse.wst.sse.core.INodeAdapter;
+import org.eclipse.wst.sse.core.INodeNotifier;
+import org.eclipse.wst.sse.core.IStructuredModel;
+import org.eclipse.wst.sse.core.exceptions.SourceEditingRuntimeException;
+import org.eclipse.wst.sse.core.internal.nls.ResourceHandler;
+import org.eclipse.wst.sse.core.internal.undo.StructuredTextUndoManager;
+import org.eclipse.wst.sse.core.undo.IStructuredTextUndoManager;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.internal.document.XMLModelImpl;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphViewer;
+import org.eclipse.wst.xsd.ui.internal.util.OpenOnSelectionHelper;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDPackage;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.impl.XSDSchemaImpl;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.ProcessingInstruction;
+
+// public class XSDEditor extends StructuredTextMultiPageEditorPart
+public class XSDEditor extends XSDMultiPageEditorPart implements ITabbedPropertySheetPageContributor
+{
+ protected XSDTextEditor textEditor;
+ IFile resourceFile;
+ XSDSelectionManager xsdSelectionManager;
+
+ private IStructuredModel result;
+ private XMLModelImpl model;
+
+ public XSDEditor()
+ {
+ super();
+ xsdSelectionManager = new XSDSelectionManager();
+ }
+
+ InternalPartListener partListener = new InternalPartListener(this);
+
+ // show outline view - defect 266116
+ public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException
+ {
+ super.init(site, editorInput);
+
+ IWorkbenchWindow dw=PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ IWorkbenchPage page=dw.getActivePage();
+ getSite().getPage().addPartListener(partListener);
+ try
+ {
+ if (page != null)
+ {
+// page.showView("org.eclipse.ui.views.ContentOutline");
+ page.showView("org.eclipse.ui.views.PropertySheet");
+ }
+ } catch (PartInitException e)
+ {
+// e.printStackTrace();
+ }
+ }
+
+ // For team support
+ // protected PropertyDirtyChangeListener propertyChangeListener;
+
+ /**
+ * Creates the pages of this multi-page editor.
+ * <p>
+ * Subclasses of <code>MultiPageEditor</code> must implement this method.
+ * </p>
+ */
+ protected void createPages()
+ {
+ try
+ {
+ if (!loadFile())
+ return;
+
+ // source page MUST be created before design page, now
+ createSourcePage();
+
+ addSourcePage();
+ buildXSDModel();
+
+ // comment this line out to hide the graph page
+ //
+ createAndAddGraphPage();
+
+ int pageIndexToShow = getDefaultPageTypeIndex();
+ setActivePage(pageIndexToShow);
+
+ addCommandStackListener();
+
+ XSDEditorPlugin.getPlugin().getPreferenceStore().addPropertyChangeListener(preferenceStoreListener);
+ }
+ catch (PartInitException exception)
+ {
+ throw new SourceEditingRuntimeException(ResourceHandler.getString("An_error_has_occurred_when1_ERROR_")); //$NON-NLS-1$ = "An error has occurred when initializing the input for the the editor's source page."
+ }
+ }
+
+ public String[] getPropertyCategories()
+ {
+ return new String[] { "general", "namespace", "other", "attributes", "documentation", "facets" }; //$NON-NLS-1$
+ }
+
+ /**
+ * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySheetPageContributor#getContributorId()
+ */
+ public String getContributorId()
+ {
+ return "org.eclipse.wst.xsd.ui.internal.XSDEditor";
+ //return getSite().getId();
+ }
+
+ protected CommandStackListener commandStackListener;
+ protected void addCommandStackListener()
+ {
+ if (commandStackListener == null)
+ {
+ IStructuredTextUndoManager undoManager = getModel().getUndoManager();
+ commandStackListener = new CommandStackListener()
+ {
+ /**
+ * @see org.eclipse.emf.common.command.CommandStackListener#commandStackChanged(EventObject)
+ */
+ public void commandStackChanged(EventObject event)
+ {
+ Object obj = event.getSource();
+ if (obj instanceof BasicCommandStack)
+ {
+ BasicCommandStack stack = (BasicCommandStack) obj;
+ Command recentCommand = stack.getMostRecentCommand();
+ Command redoCommand = stack.getRedoCommand();
+ Command undoCommand = stack.getUndoCommand();
+ if (recentCommand == redoCommand)
+ {
+ // there must have been an undo reset info tasks
+ resetInformationTasks();
+ }
+ }
+ }
+ };
+
+//TODO WTP Port undoManager.getCommandStack().addCommandStackListener(commandStackListener);
+
+ }
+ }
+
+ protected void pageChange(int arg)
+ {
+ super.pageChange(arg);
+ }
+
+ protected void removeCommandStackListener()
+ {
+ if (commandStackListener != null)
+ {
+ IStructuredTextUndoManager undoManager = getModel().getUndoManager();
+//TODO WTP Port undoManager.getCommandStack().removeCommandStackListener(commandStackListener);
+ }
+ }
+
+ // This is from the IValidateEditEditor interface
+/* public void undoChange()
+ {
+ StructuredTextUndoManager undoManager = textEditor.getModel().getUndoManager();
+ undoManager.undo();
+ // Make the editor clean
+ textEditor.getModel().setDirtyState(false);
+ } */
+
+ private class PreferenceStoreListener implements IPropertyChangeListener
+ {
+ /**
+ * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(PropertyChangeEvent)
+ */
+ public void propertyChange(PropertyChangeEvent event)
+ {
+ }
+ }
+
+ protected IPropertyChangeListener preferenceStoreListener = new PreferenceStoreListener();
+
+ protected int getDefaultPageTypeIndex()
+ {
+ int pageIndex = sourcePageIndex;
+
+ if (XSDEditorPlugin.getPlugin().getDefaultPage().equals(XSDEditorPlugin.GRAPH_PAGE))
+ {
+ if (graphPageIndex != -1)
+ pageIndex = graphPageIndex;
+ }
+
+ return pageIndex;
+ }
+
+ int currentPage = -1;
+ public String getCurrentPageType()
+ {
+ // should update pref. for valid pages
+ if (getActivePage() != -1)
+ {
+ currentPage = getActivePage();
+ }
+ if (currentPage == graphPageIndex)
+ {
+ return XSDEditorPlugin.GRAPH_PAGE;
+ }
+ else
+ {
+ return XSDEditorPlugin.SOURCE_PAGE;
+ }
+ }
+
+ public Object getActivePart()
+ {
+ return getSite().getWorkbenchWindow().getActivePage().getActivePart();
+ }
+
+ public void dispose()
+ {
+// propertyChangeListener.dispose();
+ removeCommandStackListener();
+
+ XSDEditorPlugin.getPlugin().setDefaultPage(getCurrentPageType());
+ XSDEditorPlugin.getPlugin().getPreferenceStore().removePropertyChangeListener(preferenceStoreListener);
+
+ getSite().getPage().removePartListener(partListener);
+
+ super.dispose();
+ }
+
+ protected boolean loadFile()
+ {
+ Object input = getEditorInput();
+
+ if (input instanceof IFileEditorInput)
+ {
+ resourceFile = ((IFileEditorInput) input).getFile();
+ }
+ else if (input instanceof JavaFileEditorInput)
+ {
+ IPath path = ((JavaFileEditorInput)input).getPath(input);
+ String ext = path.getFileExtension();
+ if (ext != null && ext.equals("xsd"))
+ {
+ return true;
+ }
+ return false;
+ }
+ else
+ {
+// XSDEditorPlugin.getPlugin().getMsgLogger().write("###Error...XSDEditor::createPages() .. Can't find input..Exiting..");
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Method openOnGlobalReference.
+ * The comp argument is a resolved xsd schema object from another file. This is created and called from another
+ * schema model to allow F3 navigation to open a new editor and choose the referenced object within that editor context
+ * @param comp
+ */
+ public void openOnGlobalReference(XSDConcreteComponent comp)
+ {
+ openOnSelectionHelper.openOnGlobalReference(comp);
+ }
+
+ protected OpenOnSelectionHelper openOnSelectionHelper;
+
+ public OpenOnSelectionHelper getOpenOnSelectionHelper()
+ {
+ return openOnSelectionHelper;
+ }
+
+ /**
+ * @see org.eclipse.wst.xsd.ui.internal.XSDMultiPageEditorPart#createTextEditor()
+ */
+ protected StructuredTextEditor createTextEditor()
+ {
+ return new XSDTextEditor(this);
+ }
+
+ /*
+ * @see StructuredTextMultiPageEditorPart#createSourcePage()
+ */
+ protected void createSourcePage() throws PartInitException
+ {
+ super.createSourcePage();
+
+ textEditor = (XSDTextEditor) getTextEditor();
+
+ openOnSelectionHelper = new OpenOnSelectionHelper(textEditor);
+ }
+
+ int sourcePageIndex = -1;
+ /**
+ * Adds the source page of the multi-page editor.
+ */
+ protected void addSourcePage() throws PartInitException {
+
+ sourcePageIndex = addPage(textEditor, getEditorInput());
+ setPageText(sourcePageIndex, XSDEditorPlugin.getXSDString("_UI_TAB_SOURCE"));
+
+ // defect 223043 ... do textEditor.setModel() here instead of in createSourcePage()
+ // the update's critical, to get viewer selection manager and highlighting to work
+ IEditorInput editorInput = getEditorInput();
+ if (editorInput instanceof IFileEditorInput)
+ {
+ textEditor.setModel((IFileEditorInput)getEditorInput());
+ }
+ else
+ {
+// textEditor.setModel(editorInput);
+ }
+ textEditor.update();
+ firePropertyChange(PROP_TITLE);
+ }
+
+ int graphPageIndex = -1;
+ XSDGraphViewer graphViewer;
+
+ /**
+ * Creates the graph page and adds it to the multi-page editor.
+ */
+ protected void createAndAddGraphPage() throws PartInitException
+ {
+ graphViewer = new XSDGraphViewer(this);
+ graphViewer.setSchema(xsdSchema);
+ Control graphControl = graphViewer.createControl(getContainer());
+ graphPageIndex = addPage(graphControl);
+ setPageText(graphPageIndex, XSDEditorPlugin.getXSDString("_UI_TAB_GRAPH"));
+
+ // graphViewer.setViewerSelectionManager(textEditor.getViewerSelectionManager());
+ graphViewer.setSelectionManager(getSelectionManager());
+
+ // this forces the editor to initially select the top level schema object
+ //
+ getSelectionManager().setSelection(new StructuredSelection(textEditor.getXSDSchema()));
+ }
+
+ /*
+ * @see IAdaptable#getAdapter(Class)
+ */
+ public Object getAdapter(Class key)
+ {
+ Object result = null;
+ if (key == ISelectionProvider.class)
+ {
+ result = xsdSelectionManager;
+ }
+ else
+ {
+ result = textEditor.getAdapter(key);
+ }
+ return result;
+ }
+
+ public XSDSelectionManager getSelectionManager()
+ {
+ return xsdSelectionManager;
+ }
+
+ /**
+ * @see org.eclipse.wst.xsd.ui.internal.XSDMultiPageEditorPart#doSaveAs()
+ */
+ public void doSaveAs()
+ {
+ super.doSaveAs();
+ }
+
+ public void doSave(org.eclipse.core.runtime.IProgressMonitor monitor)
+ {
+ super.doSave(monitor);
+ }
+
+ protected XSDSchema xsdSchema;
+ protected ResourceSet resourceSet;
+
+ public void reparseSchema()
+ {
+ Document document = ((XMLModel)getModel()).getDocument();
+ createSchema(document.getDocumentElement());
+ }
+
+ public XSDSchema createSchema(Node node)
+ {
+ try
+ {
+ EPackage.Registry reg = EPackage.Registry.INSTANCE;
+ XSDPackage xsdPackage = (XSDPackage)reg.getEPackage(XSDPackage.eNS_URI);
+ xsdSchema = xsdPackage.getXSDFactory().createXSDSchema();
+
+ // Force the loading of the "meta" schema for schema instance instance.
+ //
+ String schemaForSchemaNamespace = node.getNamespaceURI();
+ XSDSchemaImpl.getSchemaForSchema(schemaForSchemaNamespace);
+
+ resourceSet = XSDSchemaImpl.createResourceSet();
+ resourceSet.setURIConverter(new XSDURIConverter(resourceFile));
+
+ String pathName = "";
+ // If the resource is in the workspace....
+ // otherwise the user is trying to open an external file
+ if (resourceFile != null)
+ {
+ pathName = resourceFile.getFullPath().toString();
+ Resource resource = resourceSet.getResource(URI.createPlatformResourceURI(pathName), true);
+// resource.getContents().add(xsdSchema);
+ resourceSet.getResources().add(resource);
+
+ Object obj = resource.getContents().get(0);
+ if (obj instanceof XSDSchema)
+ {
+ xsdSchema = (XSDSchema)obj;
+ }
+
+// URIConverter uriConverter = resourceSet.getURIConverter();
+// resourceSet.setURIConverter(new XSDURIConverter(resourceFile));
+
+ xsdSchema.setElement((Element)node);
+ resource.setModified(false);
+ }
+ else
+ {
+ xsdSchema.setElement((Element)node);
+ }
+ }
+ catch (StackOverflowError e)
+ {
+// XSDEditorPlugin.getPlugin().getMsgLogger().write("Stack overflow encountered. Possibly an invalid recursive circular schema");
+ }
+ catch (Exception ex)
+ {
+// ex.printStackTrace();
+ }
+
+ return xsdSchema;
+ }
+
+ class XSDDocumentAdapter extends DocumentAdapter
+ {
+ INodeNotifier currentNotifier;
+ int currentEventType;
+
+ public XSDDocumentAdapter(Document document)
+ {
+ super(document);
+ }
+
+ boolean handlingNotifyChanged = false;
+
+ public void notifyChanged(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int index)
+ {
+ if (eventType == INodeNotifier.REMOVE) // don't handle remove events
+ {
+ return;
+ }
+
+ if (!handlingNotifyChanged)
+ {
+ handlingNotifyChanged = true;
+ try
+ {
+ // delay handle events only in the source view
+ if (getCurrentPageType() == XSDEditorPlugin.SOURCE_PAGE &&
+ !(getActivePart() instanceof PropertySheet) &&
+ !(getActivePart() instanceof org.eclipse.ui.views.contentoutline.ContentOutline)) {
+ startDelayedEvent(notifier, eventType, feature, oldValue, newValue, index);
+ //handleNotifyChange(notifier, eventType, feature, oldValue, newValue, index);
+ }
+ else // all other views, just handle the events right away
+ {
+ handleNotifyChange(notifier, eventType, feature, oldValue, newValue, index);
+ }
+ }
+ catch (Exception e)
+ {
+// XSDEditorPlugin.getPlugin().getMsgLogger().write(e);
+ }
+ handlingNotifyChanged = false;
+ }
+ }
+
+ public void handleNotifyChange(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int index)
+ {
+// System.out.println(eventType + " : HandleNotifyChange " + notifier.hashCode() + " notifier " + notifier);
+ switch (eventType)
+ {
+ case INodeNotifier.ADD:
+ {
+ if (newValue instanceof Element)
+ {
+ adapt((Element)newValue);
+// Add updateParentForDerivation(node, listener);
+ }
+ break;
+ }
+ case INodeNotifier.CHANGE:
+ {
+ Node node = (Node)notifier;
+ XSDConcreteComponent listener = xsdSchema.getCorrespondingComponent(node);
+ listener.elementAttributesChanged((Element)node);
+ listener.elementChanged((Element)node);
+ break;
+ }
+ case INodeNotifier.STRUCTURE_CHANGED:
+ case INodeNotifier.CONTENT_CHANGED:
+ {
+ Node node = (Node)notifier;
+ XSDConcreteComponent listener = xsdSchema.getCorrespondingComponent(node);
+ if (node.getNodeType() == Node.ELEMENT_NODE)
+ {
+ listener.elementContentsChanged((Element)node);
+ break;
+ }
+ else if (node.getNodeType() == Node.DOCUMENT_NODE)
+ {
+ Element docElement = ((Document)node).getDocumentElement();
+ // Need to add check if doc element is being edited in the source
+ if (docElement != null)
+ {
+ String prefix = docElement.getPrefix();
+ String xmlnsString = prefix == null? "xmlns" : "xmlns:" + prefix;
+ Attr attr = docElement.getAttributeNode(xmlnsString);
+ boolean doParse = false;
+ if (attr != null)
+ {
+ if (attr.getValue().equals("http://www.w3.org/2001/XMLSchema") && docElement.getLocalName().equals("schema"))
+ {
+ // We have a viable schema so parse it
+ doParse = true;
+ }
+ }
+
+ if (doParse)
+ {
+ adapt(docElement);
+ xsdSchema.setElement(docElement);
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ protected DelayedEvent delayedTask;
+ protected void startDelayedEvent(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int index)
+ {
+// System.out.println("start delayed event");
+ // check if there is already a delayed task for the same notifier and eventType
+// if (delayedTask != null)
+// {
+// Notifier aNotifier = delayedTask.getNotifier();
+// int anEventType = delayedTask.getEventType();
+// if (notifier == aNotifier && anEventType == eventType)
+// {
+// // same event, just different data, delay new event
+// delayedTask.setCancel(true);
+// }
+// }
+
+ delayedTask = new DelayedEvent();
+
+ delayedTask.setNotifier(notifier);
+ delayedTask.setEventType(eventType);
+ delayedTask.setFeature(feature);
+ delayedTask.setOldValue(oldValue);
+ delayedTask.setNewValue(newValue);
+ delayedTask.setIndex(index);
+
+ Display.getDefault().timerExec(400,delayedTask);
+ }
+
+ class DelayedEvent implements Runnable
+ {
+ INodeNotifier notifier;
+ int eventType;
+ Object feature;
+ Object oldValue;
+ Object newValue;
+ int index;
+ boolean cancelEvent = false;
+
+ /*
+ * @see Runnable#run()
+ */
+ public void run()
+ {
+ if (!cancelEvent)
+ {
+ handleNotifyChange(notifier, eventType, feature, oldValue, newValue, index);
+ if (delayedTask == this)
+ {
+ delayedTask = null;
+ }
+ }
+ }
+
+ public void setCancel(boolean flag)
+ {
+ cancelEvent = flag;
+ }
+
+ public void setNotifier(INodeNotifier notifier)
+ {
+ this.notifier = notifier;
+ }
+
+ public void setEventType(int eventType)
+ {
+ this.eventType = eventType;
+ }
+
+ public void setFeature(Object feature)
+ {
+ this.feature = feature;
+ }
+
+ public void setOldValue(Object oldValue)
+ {
+ this.oldValue = oldValue;
+ }
+
+ public void setNewValue(Object newValue)
+ {
+ this.newValue = newValue;
+ }
+
+ public void setIndex(int index)
+ {
+ this.index = index;
+ }
+
+ public INodeNotifier getNotifier()
+ {
+ return notifier;
+ }
+
+ public int getEventType()
+ {
+ return eventType;
+ }
+
+ public Object getNewValue()
+ {
+ return newValue;
+ }
+
+ public Object getOldValue()
+ {
+ return oldValue;
+ }
+
+ }
+ }
+
+ abstract class DocumentAdapter implements INodeAdapter
+ {
+ public DocumentAdapter(Document document)
+ {
+ ((INodeNotifier)document).addAdapter(this);
+ adapt(document.getDocumentElement());
+ }
+
+ public void adapt(Element element)
+ {
+ if (((INodeNotifier)element).getExistingAdapter(this) == null)
+ {
+
+ ((INodeNotifier)element).addAdapter(this);
+
+ for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling())
+ {
+ if (child.getNodeType() == Node.ELEMENT_NODE)
+ {
+ adapt((Element)child);
+ }
+ }
+ }
+ }
+
+ public boolean isAdapterForType(Object type)
+ {
+ return type == this;
+ }
+
+ abstract public void notifyChanged
+ (INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int index);
+ }
+
+
+ /**
+ * Method createDefaultSchemaNode. Should only be called to insert a schema node into an empty document
+ */
+ public void createDefaultSchemaNode()
+ {
+ Document document = ((XMLModel)getModel()).getDocument();
+ if (document.getChildNodes().getLength() == 0)
+ {
+ // if it is a completely empty file, then add the encoding and version processing instruction
+//TODO String encoding = EncodingHelper.getDefaultEncodingTag();
+ String encoding = "UTF-8";
+ ProcessingInstruction instr = document.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"" + encoding + "\"");
+ document.appendChild(instr);
+ }
+
+ // Create a default schema tag now
+
+ // String defaultPrefixForTargetNamespace = getFileResource().getProjectRelativePath().removeFileExtension().lastSegment();
+ String defaultPrefixForTargetNamespace = "tns";
+ String prefixForSchemaNamespace = "";
+ String schemaNamespaceAttribute = "xmlns";
+ if (XSDEditorPlugin.getPlugin().isQualifyXMLSchemaLanguage())
+ {
+ // Added this if check before disallowing blank prefixes in the preferences...
+ // Can take this out. See also NewXSDWizard
+ if (XSDEditorPlugin.getPlugin().getXMLSchemaPrefix().trim().length() > 0)
+ {
+ prefixForSchemaNamespace = XSDEditorPlugin.getPlugin().getXMLSchemaPrefix() + ":";
+ schemaNamespaceAttribute += ":" + XSDEditorPlugin.getPlugin().getXMLSchemaPrefix();
+ }
+ }
+
+ document.appendChild(document.createTextNode("\n"));
+ Element element = document.createElement(prefixForSchemaNamespace + XSDConstants.SCHEMA_ELEMENT_TAG);
+
+ element.setAttribute(schemaNamespaceAttribute,"http://www.w3.org/2001/XMLSchema");
+
+ String defaultTargetURI = XSDEditorPlugin.getPlugin().getXMLSchemaTargetNamespace();
+ element.setAttribute(XSDConstants.TARGETNAMESPACE_ATTRIBUTE, defaultTargetURI);
+ element.setAttribute("xmlns:" + defaultPrefixForTargetNamespace, defaultTargetURI);
+
+ document.appendChild(element);
+ }
+
+ public void buildXSDModel()
+ {
+ try
+ {
+ Document document = ((XMLModel)getModel()).getDocument();
+ if (document.getChildNodes().getLength() == 0)
+ {
+ // this is an empty document. Create a default schema tag now
+ createDefaultSchemaNode();
+ }
+
+ createSchema(document.getDocumentElement());
+
+ XSDDocumentAdapter documentAdapter =
+ new XSDDocumentAdapter(((XMLModel)getModel()).getDocument());
+ }
+ catch (Exception e)
+ {
+// XSDEditorPlugin.getPlugin().getMsgLogger().write("Failed to create Model");
+// XSDEditorPlugin.getPlugin().getMsgLogger().write(e);
+// e.printStackTrace();
+ }
+
+
+
+// XSDResourceFactoryImpl.validate(xsdSchema, input.getFile().getContents(true));
+ }
+
+// private void updateParentForDerivation(Node node, XSDConcreteComponent correspondingComponent)
+// {
+// if (XSDDOMHelper.inputEquals(node, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false)||
+// XSDDOMHelper.inputEquals(node,XSDConstants.COMPLEXCONTENT_ELEMENT_TAG,false))
+// {
+// XSDComplexTypeDefinition xsdComplexTypeDefinition =
+// correspondingComponent.getContainer() instanceof XSDComplexTypeDefinition ?
+// (XSDComplexTypeDefinition)correspondingComponent.getContainer() :
+// null;
+// if (xsdComplexTypeDefinition != null)
+// {
+// xsdComplexTypeDefinition.elementContentsChanged(xsdComplexTypeDefinition.getElement());
+// }
+// }
+// }
+
+// private void checkUnion(Node node, XSDConcreteComponent correspondingComponent, int i)
+// {
+// // bug 219967 - union changes to restriction
+// if (XSDDOMHelper.inputEquals(node, XSDConstants.UNION_ELEMENT_TAG, false))
+// {
+//// XSDConcreteComponent comp = correspondingComponent.getContainer();
+//// if (comp != null)
+//// {
+//// switch (i)
+//// {
+//// case 1:
+//// comp.elementAttributesChanged((Element)node);
+//// break;
+//// case 4:
+//// comp.elementContentsChanged((Element)node);
+//// break;
+//// }
+//// }
+// }
+// else
+// {
+// switch (i)
+// {
+// case 1:
+// case 4:
+// // do both types of updates since sometimes the attributes have changed indirectly
+// // because the content has changed
+// correspondingComponent.elementAttributesChanged((Element)node);
+// correspondingComponent.elementContentsChanged((Element)node);
+// break;
+// }
+// }
+// }
+
+// private void updateMap(XSDConcreteComponent listener, Element documentElement)
+// {
+// boolean handleChangeInSchema = false;
+// if (listener instanceof XSDSchema)
+// {
+// if (!handleChangeInSchema)
+// {
+// handleChangeInSchema = true;
+// XSDSchema xsdSchema = (XSDSchema)listener;
+// java.util.Map prefixToNameSpaceMap = xsdSchema.getQNamePrefixToNamespaceMap();
+// String targetNamespace = xsdSchema.getTargetNamespace();
+//// System.out.println("targetNamespace = " + targetNamespace);
+//
+// NamedNodeMap attributes = documentElement.getAttributes();
+// int length = attributes.getLength();
+//
+// ArrayList keyList = new ArrayList();
+// keyList.addAll(prefixToNameSpaceMap.keySet());
+//
+// String key;
+//
+//
+// // update the map when the prefix is changed
+// CHECK: for (int i = 0; i < length; i++)
+// {
+// Attr attr = (Attr)attributes.item(i);
+// String name = attr.getNodeName();
+//
+// if (isValidXMLNSAttribute(name))
+//// if (name.startsWith("xmlns"))
+// {
+// String value = attr.getNodeValue();
+// if (value == null)
+// {
+// break CHECK;
+// }
+// int index = name.indexOf(":");
+// key = index == -1 ? null : name.substring(index + 1);
+//// System.out.println(" Attribute key is " + key + " , value = " + value);
+//// System.out.println(" map.get(key) = " + prefixToNameSpaceMap.get(key));
+// if (!prefixToNameSpaceMap.containsKey(key))
+// {
+// for (Iterator iter = keyList.iterator(); iter.hasNext(); )
+// {
+// String aPrefix = (String)iter.next();
+//// System.out.println(" --> A Map Prefix is " + aPrefix);
+//// System.out.println(" --> model map.get(prefix) " + prefixToNameSpaceMap.get(aPrefix));
+// if (prefixToNameSpaceMap.get(aPrefix) != null)
+// {
+// if (prefixToNameSpaceMap.get(aPrefix).equals(value))
+// {
+// prefixToNameSpaceMap.remove(aPrefix);
+// }
+// }
+// }
+// }
+// else if (prefixToNameSpaceMap.containsKey(key))
+// {
+// if (prefixToNameSpaceMap.get(key) != null)
+// {
+// if (!prefixToNameSpaceMap.get(key).equals(value))
+// {
+// Set entrySet = prefixToNameSpaceMap.entrySet();
+// for (Iterator iter = entrySet.iterator(); iter.hasNext(); )
+// {
+// Map.Entry aMapEntry = (Map.Entry)iter.next();
+// if ( (key != null && (aMapEntry.getKey() != null && aMapEntry.getKey().equals(key)))
+// || (key == null && (aMapEntry.getKey() == null)))
+// {
+// aMapEntry.setValue(value);
+// }
+// }
+// }
+// }
+// else
+// {
+// Set entrySet = prefixToNameSpaceMap.entrySet();
+// for (Iterator iter = entrySet.iterator(); iter.hasNext(); )
+// {
+// Map.Entry aMapEntry = (Map.Entry)iter.next();
+// if ( (key != null && (aMapEntry.getKey() != null && aMapEntry.getKey().equals(key)))
+// || (key == null && (aMapEntry.getKey() == null)))
+// {
+// aMapEntry.setValue(value);
+// }
+// }
+// }
+// }
+// }
+// }
+//
+// boolean modelMapPrefixFound = false;
+// for (Iterator iter = keyList.iterator(); iter.hasNext(); )
+// {
+// String aPrefix = (String)iter.next();
+// modelMapPrefixFound = false;
+// attributes = documentElement.getAttributes();
+// length = attributes.getLength();
+//
+// for (int i = 0; i < length; i++)
+// {
+// Attr attr = (Attr)attributes.item(i);
+// if (attr != null)
+// {
+// String name = attr.getNodeName();
+//
+// // if (name.startsWith("xmlns"))
+// if (isValidXMLNSAttribute(name))
+// {
+// String value = attr.getNodeValue();
+// int index = name.indexOf(":");
+// key = index == -1 ? null : name.substring(index + 1);
+// if (aPrefix == null && key == null)
+// {
+// modelMapPrefixFound = true;
+// }
+// else if (aPrefix != null && (aPrefix.equals(key)))
+// {
+// modelMapPrefixFound = true;
+// if ((prefixToNameSpaceMap.get(key) != null && !prefixToNameSpaceMap.get(key).equals(value))
+// || (prefixToNameSpaceMap.get(key) == null && value != null))
+// {
+// if (value != null && value.length() > 0)
+// {
+// prefixToNameSpaceMap.put(aPrefix, value);
+// }
+// }
+// }
+// else if (key != null && (key.equals(aPrefix)))
+// {
+// modelMapPrefixFound = true;
+// }
+// }
+// }
+// }
+// if (!modelMapPrefixFound)
+// {
+// prefixToNameSpaceMap.remove(aPrefix);
+// }
+// }
+//
+// // to ensure map is recreated
+//// XSDSchemaHelper.updateElement(xsdSchema);
+//// reparseSchema();
+//
+// handleChangeInSchema = false;
+//
+//// System.out.println("XSDeditor Map is " + prefixToNameSpaceMap.values());
+//// System.out.println("XSDeditor Map keys are " + prefixToNameSpaceMap.keySet());
+//
+// }
+// }
+// }
+
+ /**
+ * Returns the xsdSchema.
+ * @return XSDSchema
+ */
+ public XSDSchema getXSDSchema()
+ {
+ return xsdSchema;
+ }
+
+
+ /**
+ * Returns the resourceFile.
+ * @return IFile
+ */
+ public IFile getFileResource()
+ {
+ return resourceFile;
+ }
+
+ /**
+ * Get the IDocument from the text viewer
+ */
+ public IDocument getEditorIDocument()
+ {
+ IDocument document = textEditor.getTextViewer().getDocument();
+ return document;
+ }
+
+ /**
+ * Create ref integrity tasks in task list
+ */
+ public void createTasksInTaskList(ArrayList messages)
+ {
+// DisplayErrorInTaskList tasks = new DisplayErrorInTaskList(getEditorIDocument(), getFileResource(), messages);
+// tasks.run();
+ }
+
+ public void resetInformationTasks()
+ {
+// DisplayErrorInTaskList.removeInfoMarkers(getFileResource());
+ }
+
+ public XSDGraphViewer getGraphViewer()
+ {
+ return graphViewer;
+ }
+
+// /**
+// * @see org.eclipse.ui.part.MultiPageEditorPart#handlePropertyChange(int)
+// */
+// protected void handlePropertyChange(int propertyId)
+// {
+// super.handlePropertyChange(propertyId);
+//
+// if (propertyId == IEditorPart.PROP_INPUT)
+// {
+// setInput(textEditor.getEditorInput());
+// resourceFile = ((IFileEditorInput) getEditorInput()).getFile();
+// setTitle(resourceFile.getName());
+//// outline.setModel(getModel());
+//
+// // even though we've set title etc., several times already!
+// // only now is all prepared for it.
+// firePropertyChange(IWorkbenchPart.PROP_TITLE);
+// firePropertyChange(PROP_DIRTY);
+// }
+// else if (propertyId == IEditorPart.PROP_TITLE)
+// {
+// if (getEditorInput() != textEditor.getEditorInput())
+// {
+// setInput(textEditor.getEditorInput());
+// }
+// }
+// }
+
+ public IEditorPart getActiveEditorPage()
+ {
+ return getActiveEditor();
+ }
+
+ public XSDTextEditor getXSDTextEditor()
+ {
+ return textEditor;
+ }
+
+ class InternalPartListener implements IPartListener
+ {
+ XSDEditor editor;
+ public InternalPartListener(XSDEditor editor)
+ {
+ this.editor = editor;
+ }
+
+ public void partActivated(IWorkbenchPart part)
+ {
+ if (part == editor)
+ {
+ ISelection selection = getSelectionManager().getSelection();
+ if (selection != null)
+ {
+ getSelectionManager().setSelection(selection);
+ }
+ }
+ }
+
+ public void partBroughtToTop(IWorkbenchPart part)
+ {
+ }
+
+ public void partClosed(IWorkbenchPart part)
+ {
+ }
+
+
+ public void partDeactivated(IWorkbenchPart part)
+ {
+ }
+
+ public void partOpened(IWorkbenchPart part)
+ {
+ }
+ }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorAdapter.java
new file mode 100644
index 0000000000..7591376fb3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorAdapter.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * 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;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.text.IDocument;
+
+public interface XSDEditorAdapter
+{
+ public IFile getFileResource();
+
+ public IDocument getEditorIDocument();
+
+ public void createTasksInTaskList(ArrayList messages);
+
+ public void resetInformationTasks();
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorContextIds.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorContextIds.java
new file mode 100644
index 0000000000..8f95f5c6eb
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorContextIds.java
@@ -0,0 +1,460 @@
+/*******************************************************************************
+ * 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;
+
+/**
+ * Context help id constants.
+ */
+public interface XSDEditorContextIds
+{
+ public static final String PLUGIN_NAME = "org.eclipse.wst.xsd.ui.internal";
+
+ /* CONTEXT_IDs New XSD Wizard uses the WizardNewFileCreationPage from org.eclipse.ui.dialogs */
+
+ /* CONTEXT_IDs for XSDEditor follow the xsdexxx context IDs */
+
+ /* CONTEXT_ID xsde0010 for XSD Editor Design View */
+ public static final String XSDE_SCHEMA_DESIGN_VIEW = PLUGIN_NAME + ".xsde0010";
+ /* no CONTEXT_ID for File Name Text Edit (not editable) */
+ /* CONTEXT_ID xsde0020 for Version Text Edit */
+ public static final String XSDE_SCHEMA_VERSION = PLUGIN_NAME + ".xsde0020";
+ /* CONTEXT_ID xsde0030 for Language Text Edit */
+ public static final String XSDE_SCHEMA_LANGUAGE = PLUGIN_NAME + ".xsde0030";
+ /* CONTEXT_ID xsde0040 for Namespace Group */
+ public static final String XSDE_SCHEMA_NAMESPACE_GROUP = PLUGIN_NAME + ".xsde0040";
+ /* CONTEXT_ID xsde0050 for Prefix Text Edit */
+ public static final String XSDE_SCHEMA_PREFIX = PLUGIN_NAME + ".xsde0050";
+ /* CONTEXT_ID xsde0060 for Target namespace Text Edit */
+ public static final String XSDE_SCHEMA_TARGET_NAMESPACE = PLUGIN_NAME + ".xsde0060";
+ /* CONTEXT_ID xsde0070 for Apply Push Button */
+ public static final String XSDE_SCHEMA_APPLY = PLUGIN_NAME + ".xsde0070";
+ /* CONTEXT_ID xsde0080 for Attribute form default Combo Box */
+ public static final String XSDE_SCHEMA_ATTRIBUTE = PLUGIN_NAME + ".xsde0080";
+ /* CONTEXT_ID xsde0090 for Element form default Combo Box */
+ public static final String XSDE_SCHEMA_ELEMENT = PLUGIN_NAME + ".xsde0090";
+ /* CONTEXT_ID xsde0100 for Block default Combo Box */
+ public static final String XSDE_SCHEMA_BLOCK = PLUGIN_NAME + ".xsde0100";
+ /* CONTEXT_ID xsde0110 for Final Default Combo Box */
+ public static final String XSDE_SCHEMA_FINAL = PLUGIN_NAME + ".xsde0110";
+
+
+ /* CONTEXT_ID xsde0200 for Annotations Comment Group - only used generically */
+ /* CONTEXT_ID - used in Documentation Design View */
+ /* CONTEXT_ID - used in App Info Design View */
+ public static final String XSDE_ANNOTATION_COMMENT_GROUP = PLUGIN_NAME + ".xsde0200";
+ /* CONTEXT_ID xsde0210 for Annotations Comment Group - only used generically */
+ /* CONTEXT_ID - used in Documentation Design View */
+ /* CONTEXT_ID - used in App Info Design View */
+ public static final String XSDE_ANNOTATION_COMMENT = PLUGIN_NAME + ".xsde0210";
+
+ /* CONTEXT_ID xsde0300 for Documentation Design View */
+ public static final String XSDE_DOCUMENTATION_DESIGN_VIEW = PLUGIN_NAME + ".xsde0300";
+ /* CONTEXT_ID xsde0310 for Source Text Edit */
+ public static final String XSDE_DOCUMENTATION_SOURCE = PLUGIN_NAME + ".xsde0310";
+ /* CONTEXT_ID xsde0320 for Language Text Edit */
+ public static final String XSDE_DOCUMENTATION_LANGUAGE = PLUGIN_NAME + ".xsde0320";
+ /* CONTEXT_ID Comment Group is from Annotations Window xsde0200 */
+ /* CONTEXT_ID Comment Multi-line Edit is from Annotations Window xsd0210 */
+
+ /* CONTEXT_ID xsde0400 for App Info Design View */
+ public static final String XSDE_APP_INFO_DESIGN_VIEW = PLUGIN_NAME + ".xsde0400";
+ /* CONTEXT_ID xsde0410 for App Info Source Text Edit */
+ public static final String XSDE_APP_INFO_SOURCE = PLUGIN_NAME + ".xsde0410";
+ /* CONTEXT_ID Comment Group is from Annotations Window xsde0200 */
+ /* CONTEXT_ID Comment Multi-line Edit is from Annotations Window xsd0210 */
+
+ /* CONTEXT_ID xsde0500 for Complex Type Design View */
+ public static final String XSDE_COMPLEX_DESIGN_VIEW = PLUGIN_NAME + ".xsde0500";
+ /* CONTEXT_ID xsde0510 for Name Text Edit */
+ public static final String XSDE_COMPLEX_NAME = PLUGIN_NAME + ".xsde0510";
+ /* CONTEXT_ID xsde0520 for Abstract Combo Box */
+ public static final String XSDE_COMPLEX_ABSTRACT = PLUGIN_NAME + ".xsde0520";
+ /* CONTEXT_ID xsde0530 for Mixed Combo Box */
+ public static final String XSDE_COMPLEX_MIXED = PLUGIN_NAME + ".xsde0530";
+ /* CONTEXT_ID xsde0540 for Block Combo Box */
+ public static final String XSDE_COMPLEX_BLOCK = PLUGIN_NAME + ".xsde0540";
+ /* CONTEXT_ID xsde0550 for Final Combo Box */
+ public static final String XSDE_COMPLEX_FINAL = PLUGIN_NAME + ".xsde0550";
+
+ /* CONTEXT_ID xsde0600 for Simple Type Design View */
+ public static final String XSDE_SIMPLE_DESIGN_VIEW = PLUGIN_NAME + ".xsde0600";
+ /* CONTEXT_ID xsde0610 for Name Text Edit */
+ public static final String XSDE_SIMPLE_NAME = PLUGIN_NAME + ".xsde0610";
+
+ /* CONTEXT_ID for Global Element and Element Design Views are the same */
+ /* CONTEXT_ID xsde0700 for Element Design View */
+ public static final String XSDE_ELEMENT_DESIGN_VIEW = PLUGIN_NAME + ".xsde0700";
+ /* CONTEXT_ID xsde0710 for Element Name Text Edit */
+ public static final String XSDE_ELEMENT_NAME = PLUGIN_NAME + ".xsde0710";
+ /* CONTEXT_ID Type Information Group is from Type Helper xsde0900 */
+ /* CONTEXT_ID Built-in simple type Radio Button is from Type Helper xsde0920 */
+ /* CONTEXT_ID User-defined simple type Radio Button is from Type Helper xsde0930 */
+ /* CONTEXT_ID User-defined complex type Radio Button is from Type Helper xsde0940 */
+ /* CONTEXT_ID Type information Combo Box is from Type Helper xsde0950 */
+ /* CONTEXT_ID xsde0720 for Abstract Check Box */
+ public static final String XSDE_ELEMENT_ABSTRACT = PLUGIN_NAME + ".xsde0720";
+ /* CONTEXT_ID xsde0730 for Nillable Check Box */
+ public static final String XSDE_ELEMENT_NILLABLE = PLUGIN_NAME + ".xsde0730";
+ /* CONTEXT_ID xsde0740 for Value Group */
+ public static final String XSDE_ELEMENT_VALUE = PLUGIN_NAME + ".xsde0740";
+ /* CONTEXT_ID xsde0750 for Fixed Radio Button */
+ public static final String XSDE_ELEMENT_FIXED = PLUGIN_NAME + ".xsde0750";
+ /* CONTEXT_ID xsde0760 for Default Radio Button */
+ public static final String XSDE_ELEMENT_DEFAULT = PLUGIN_NAME + ".xsde0760";
+ /* CONTEXT_ID xsde0770 for Value Group */
+ public static final String XSDE_ELEMENT_VALUE_GROUP = PLUGIN_NAME + ".xsde0770";
+ /* CONTEXT_ID xsde0780 for Minimum Text Edit */
+ public static final String XSDE_ELEMENT_MINIMUM = PLUGIN_NAME + ".xsde0780";
+ /* CONTEXT_ID xsde0790 for Maximum Text Edit */
+ public static final String XSDE_ELEMENT_MAXIMUM = PLUGIN_NAME + ".xsde0790";
+ /* CONTEXT_ID xsde0800 for Block Combo Box */
+ public static final String XSDE_ELEMENT_BLOCK = PLUGIN_NAME + ".xsde0800";
+ /* CONTEXT_ID xsde0810 for Final Combo Box */
+ public static final String XSDE_ELEMENT_FINAL = PLUGIN_NAME + ".xsde0810";
+ /* CONTEXT_ID xsde0820 for Substitution Group Combo Box */
+ public static final String XSDE_ELEMENT_SUBSTITUTION = PLUGIN_NAME + ".xsde0820";
+ /* CONTEXT_ID xsde0830 for Form Qualification Combo Box */
+ public static final String XSDE_ELEMENT_FORM = PLUGIN_NAME + ".xsde0830";
+
+ /* CONTEXT_ID xsde0900 for Type Helper Group - only used generically */
+ /* CONTEXT_ID - used in Global Element Design View */
+ /* CONTEXT_ID - used in Global Attribute Design View */
+ /* CONTEXT_ID - used in Simple Content Design View */
+ /* CONTEXT_ID - used in Restriction Design View */
+ /* CONTEXT_ID - used in List Design View */
+ /* CONTEXT_ID - used in Union Design View */
+ public static final String XSDE_TYPE_HELPER_GROUP = PLUGIN_NAME + ".xsde0900";
+ /* CONTEXT_ID xsde0910 for None Radio Button - only used generically */
+ /* CONTEXT_ID - used in Simple Content Design View */
+ /* CONTEXT_ID - used in Restriction Design View */
+ /* CONTEXT_ID - used in List Design View */
+ /* CONTEXT_ID - used in Union Design View */
+ public static final String XSDE_TYPE_HELPER_NONE = PLUGIN_NAME + ".xsde0910";
+ /* CONTEXT_ID xsde0920 for Built-in simple type Radio Button - only used generically */
+ /* CONTEXT_ID - used in Global Element Design View */
+ /* CONTEXT_ID - used in Global Attribute Design View */
+ /* CONTEXT_ID - used in Simple Content Design View */
+ /* CONTEXT_ID - used in Restriction Design View */
+ /* CONTEXT_ID - used in List Design View */
+ /* CONTEXT_ID - used in Union Design View */
+ public static final String XSDE_TYPE_HELPER_BUILT_IN = PLUGIN_NAME + ".xsde0920";
+ /* CONTEXT_ID xsde0930 for User-defined simple type Radio Button - only used generically */
+ /* CONTEXT_ID - used in Global Element Design View */
+ /* CONTEXT_ID - used in Global Attribute Design View */
+ /* CONTEXT_ID - used in Simple Content Design View */
+ /* CONTEXT_ID - used in Restriction Design View */
+ /* CONTEXT_ID - used in List Design View */
+ /* CONTEXT_ID - used in Union Design View */
+ public static final String XSDE_TYPE_HELPER_USER_DEFINED_SIMPLE = PLUGIN_NAME + ".xsde0930";
+ /* CONTEXT_ID xsde0940 for User-defined complex type Radio Button - only used generically */
+ /* CONTEXT_ID - used in Global Element Design View */
+ public static final String XSDE_TYPE_HELPER_USER_DEFINED_COMPLEX = PLUGIN_NAME + ".xsde0940";
+ /* CONTEXT_ID xsde0950 for Type information Combo Box - only used generically */
+ /* CONTEXT_ID - used in Global Element Design View */
+ /* CONTEXT_ID - used in Global Attribute Design View */
+ /* CONTEXT_ID - used in Simple Content Design View */
+ /* CONTEXT_ID - used in Restriction Design View */
+ /* CONTEXT_ID - used in List Design View */
+ public static final String XSDE_TYPE_HELPER_TYPE = PLUGIN_NAME + ".xsde0950";
+
+ /* CONTEXT_ID xsde1000 for Attribute Design View */
+ public static final String XSDE_ATTRIBUTE_DESIGN_VIEW = PLUGIN_NAME + ".xsde1000";
+ /* CONTEXT_ID xsde1010 for Attribute Name Text Edit */
+ public static final String XSDE_ATTRIBUTE_NAME = PLUGIN_NAME + ".xsde1010";
+ /* CONTEXT_ID Type Information Group is from Type Helper xsde0900 */
+ /* CONTEXT_ID Built-in simple type Radio Button is from Type Helper xsde0920 */
+ /* CONTEXT_ID User-defined simple type Radio Button is from Type Helper xsde0930 */
+ /* CONTEXT_ID Type information Combo Box is from Type Helper xsde0950 */
+ /* CONTEXT_ID xsde1020 for Value Group */
+ public static final String XSDE_ATTRIBUTE_VALUE_GROUP = PLUGIN_NAME + ".xsde1020";
+ /* CONTEXT_ID xsde1030 for Fixed Radio Button */
+ public static final String XSDE_ATTRIBUTE_FIXED = PLUGIN_NAME + ".xsde1030";
+ /* CONTEXT_ID xsde1040 for Default Radio Button */
+ public static final String XSDE_ATTRIBUTE_DEFAULT = PLUGIN_NAME + ".xsde1040";
+ /* CONTEXT_ID xsde1050 for Value Text Edit */
+ public static final String XSDE_ATTRIBUTE_VALUE = PLUGIN_NAME + ".xsde1050";
+ /* CONTEXT_ID xsde1060 for Usage Combo Box */
+ public static final String XSDE_ATTRIBUTE_USAGE = PLUGIN_NAME + ".xsde1060";
+ /* CONTEXT_ID xsde1070 for Form qualificaiton Combo Box */
+ public static final String XSDE_ATTRIBUTE_FORM = PLUGIN_NAME + ".xsde1070";
+
+ /* CONTEXT_ID xsde1100 for Element Ref Window Design View */
+ public static final String XSDE_ELEMENT_REF_DESIGN_VIEW = PLUGIN_NAME + ".xsde1100";
+ /* CONTEXT_ID xsde1110 for Reference Name Combo Box */
+ public static final String XSDE_ELEMENT_REF_REFERENCE = PLUGIN_NAME + ".xsde1110";
+ /* CONTEXT_ID xsde1120 for Minimum Text Edit */
+ public static final String XSDE_ELEMENT_REF_MINIMUM = PLUGIN_NAME + ".xsde1120";
+ /* CONTEXT_ID xsde1130 for Maximum Text Edit */
+ public static final String XSDE_ELEMENT_REF_MAXIMUM = PLUGIN_NAME + ".xsde1130";
+
+ /* CONTEXT_ID xsde1200 for Simple Content Design View - used generically */
+ /* CONTEXT_ID - used in Simple Content Design View */
+ /* CONTEXT_ID - used in Complex Content Design View */
+ public static final String XSDE_SIMPLE_CONTENT_DESIGN_VIEW = PLUGIN_NAME + ".xsde1200";
+ /* CONTEXT_ID Base Type Group is from Type Helper xsde0900 */
+ /* CONTEXT_ID None Radio Button is from Type Helper xsde0910 */
+ /* CONTEXT_ID Built-in simple type Radio Button is from Type Helper xsde0920 */
+ /* CONTEXT_ID User-defined simple type Radio Button is from Type Helper xsde0930 */
+ /* CONTEXT_ID Type information Combo Box is from Type Helper xsde0950 */
+ /* CONTEXT_ID xsde1210 for Derived by Combo Box - used generically */
+ /* CONTEXT_ID - used in Simple Content Design View */
+ /* CONTEXT_ID - used in Complex Content Design View */
+ public static final String XSDE_SIMPLE_CONTENT_DERIVED = PLUGIN_NAME + ".xsde1210";
+
+ /* CONTEXT_ID xsde1300 for Restriction Design View */
+ public static final String XSDE_RESTRICTION_DESIGN_VIEW = PLUGIN_NAME + ".xsde1300";
+ /* CONTEXT_ID Base Type Group is from Type Helper xsde0900 */
+ /* CONTEXT_ID None Radio Button is from Type Helper xsde0910 */
+ /* CONTEXT_ID Built-in simple type Radio Button is from Type Helper xsde0920 */
+ /* CONTEXT_ID User-defined simple type Radio Button is from Type Helper xsde0930 */
+ /* CONTEXT_ID Type information Combo Box is from Type Helper xsde0950 */
+ /* CONTEXT_ID xsde1310 for Facets Group */
+ public static final String XSDE_RESTRICTION_FACETS_GROUP = PLUGIN_NAME + ".xsde1310";
+ /* CONTEXT_ID xsde1320 for Facets Table */
+ public static final String XSDE_RESTRICTION_FACETS = PLUGIN_NAME + ".xsde1320";
+
+ /* CONTEXT_ID xsde1400 for List Design View */
+ public static final String XSDE_LIST_DESIGN_VIEW = PLUGIN_NAME + ".xsde1400";
+ /* CONTEXT_ID Base Type Group is from Type Helper xsde0900 */
+ /* CONTEXT_ID None Radio Button is from Type Helper xsde0910 */
+ /* CONTEXT_ID Built-in simple type Radio Button is from Type Helper xsde0920 */
+ /* CONTEXT_ID User-defined simple type Radio Button is from Type Helper xsde0930 */
+ /* CONTEXT_ID Type information Combo Box is from Type Helper xsde0950 */
+
+ /* CONTEXT_ID xsde1500 for Attribute Group Design View */
+ public static final String XSDE_ATTRIBUTE_GROUP_DESIGN_VIEW = PLUGIN_NAME + ".xsde1500";
+ /* CONTEXT_ID xsde1510 for Name Text Edit */
+ public static final String XSDE_ATTRIBUTE_GROUP_NAME = PLUGIN_NAME + ".xsde1510";
+
+ /* CONTEXT_ID for Global Attribute and Attribute Design Views are the same */
+ /* CONTEXT_ID xsde1600 for Attribute Group Reference Design View */
+ public static final String XSDE_ATTRIBUTE_GROUP_REF_DESIGN_VIEW = PLUGIN_NAME + ".xsde1600";
+ /* CONTEXT_ID xsde1610 for Reference Name Combo Box */
+ public static final String XSDE_ATTRIBUTE_GROUP_REF_NAME = PLUGIN_NAME + ".xsde1610";
+
+ /* CONTEXT_ID xsde1700 for Attribute Reference Design View */
+ public static final String XSDE_ATTRIBUTE_REF_DESIGN_VIEW = PLUGIN_NAME + ".xsde1700";
+ /* CONTEXT_ID xsde1710 for Reference Name Combo Box */
+ public static final String XSDE_ATTRIBUTE_REF_NAME = PLUGIN_NAME + ".xsde1710";
+
+ /* CONTEXT_ID xsde1800 for Pattern Design View */
+ public static final String XSDE_PATTERN_DESIGN_VIEW = PLUGIN_NAME + ".xsde1800";
+ /* CONTEXT_ID xsde1810 for Value Text Edit */
+ public static final String XSDE_PATTERN_VALUE = PLUGIN_NAME + ".xsde1810";
+ /* CONTEXT_ID xsde1820 for Create Regular Expression Push Button */
+ public static final String XSDE_PATTERN_REGULAR = PLUGIN_NAME + ".xsde1820";
+
+ /* CONTEXT_ID xsde1900 for Enum Design View */
+ public static final String XSDE_ENUM_DESIGN_VIEW = PLUGIN_NAME + ".xsde1900";
+ /* CONTEXT_ID xsde1910 for Value Text Edit */
+ public static final String XSDE_ENUM_VALUE = PLUGIN_NAME + ".xsde1910";
+
+ /* CONTEXT_ID xsde2000 for Include Design Page */
+ public static final String XSDE_INCLUDE_DESIGN_VIEW = PLUGIN_NAME + ".xsde2000";
+ /* no CONTEXT_ID for Schema Location Text Edit (not editable) */
+ /* CONTEXT_ID Select Push Button is from Include Helper xsde2100 */
+
+ /* CONTEXT_ID xsde2100 for Include Helper Select Push Button - used generically */
+ /* CONTEXT_ID - used in Include Design View */
+ /* CONTEXT_ID - used in Import Design View */
+ public static final String XSDE_INCLUDE_HELPER_SELECT = PLUGIN_NAME + ".xsde2100";
+
+ /* CONTEXT_ID xsde2200 for Import Design Page */
+ public static final String XSDE_IMPORT_DESIGN_VIEW = PLUGIN_NAME + ".xsde2200";
+ /* no CONTEXT_ID for Schema Location Text Edit (not editable) */
+ /* CONTEXT_ID Select Push Button is from Include Helper xsde2100 */
+ /* CONTEXT_ID xsde2210 for Prefix Text Edit */
+ public static final String XSDE_IMPORT_PREFIX = PLUGIN_NAME + ".xsde2210";
+ /* no CONTEXT_ID for Namespace Text Edit (not editable) */
+
+ /* CONTEXT_ID xsde2300 for Redefine Design View */
+ public static final String XSDE_REDEFINE_DESIGN_VIEW = PLUGIN_NAME + ".xsde2300";
+ /* no CONTEXT_ID for Schema Location Text Edit (not editable) */
+ /* CONTEXT_ID Select Push Button is from Include Helper xsde2100 */
+
+ /* CONTEXT_ID xsde2400 for Group Design View */
+ public static final String XSDE_GROUP_DESIGN_VIEW = PLUGIN_NAME + ".xsde2400";
+ /* CONTEXT_ID xsde2410 for Name Text Edit */
+ public static final String XSDE_GROUP_NAME = PLUGIN_NAME + ".xsde2410";
+
+ /* CONTEXT_ID xsde2500 for Group Scope Design View */
+ public static final String XSDE_GROUP_SCOPE_DESIGN_VIEW = PLUGIN_NAME + ".xsde2500";
+ /* CONTEXT_ID xsde2510 for Content model Group */
+ public static final String XSDE_GROUP_SCOPE_CONTENT_GROUP = PLUGIN_NAME + ".xsde2510";
+ /* CONTEXT_ID xsde2520 for Sequence Radio Button */
+ public static final String XSDE_GROUP_SCOPE_SEQUENCE = PLUGIN_NAME + ".xsde2520";
+ /* CONTEXT_ID xsde2530 for Choice Radio Button */
+ public static final String XSDE_GROUP_SCOPE_CHOICE = PLUGIN_NAME + ".xsde2530";
+ /* CONTEXT_ID xsde2540 for All Radio Button */
+ public static final String XSDE_GROUP_SCOPE_ALL = PLUGIN_NAME + ".xsde2540";
+ /* CONTEXT_ID xsde2550 for Minimum Text Edit */
+ public static final String XSDE_GROUP_SCOPE_MINIMUM = PLUGIN_NAME + ".xsde2550";
+ /* CONTEXT_ID xsde2560 for Maximum Text Edit*/
+ public static final String XSDE_GROUP_SCOPE_MAXIMUM = PLUGIN_NAME + ".xsde2560";
+
+ /* CONTEXT_ID xsde2600 for Group Ref Design View */
+ public static final String XSDE_GROUP_REF_DESIGN_VIEW = PLUGIN_NAME + ".xsde2600";
+ /* CONTEXT_ID xsde2610 for Reference name Combo Box */
+ public static final String XSDE_GROUP_REF_REFERENCE = PLUGIN_NAME + ".xsde2610";
+ /* CONTEXT_ID xsde2620 for Minimum Text Edit */
+ public static final String XSDE_GROUP_REF_MINIMUM = PLUGIN_NAME + ".xsde2620";
+ /* CONTEXT_ID xsde2630 for Maximum Text Edit */
+ public static final String XSDE_GROUP_REF_MAXIMUM = PLUGIN_NAME + ".xsde2630";
+
+ /* CONTEXT_ID xsde2700 for Unique Design View */
+ public static final String XSDE_UNIQUE_DESIGN_VIEW = PLUGIN_NAME + ".xsde2700";
+ /* CONTEXT_ID Name Text Edit is from Unique Base xsde2800 */
+ /* CONTEXT_ID Selector Group is from Unique Base xsde2810 */
+ /* CONTEXT_ID Selector Mulit-line Edit is from Unique Base xsde2820 */
+ /* CONTEXT_ID Fields Group is from Unique Base xsde2830 */
+ /* CONTEXT_ID Source Text Edit is from Unique Base xsde2840 */
+ /* CONTEXT_ID Add Push Button is from Unique Base xsde2850 */
+ /* CONTEXT_ID Remove Push Button is from Unique Base xsde2860 */
+ /* CONTEXT_ID Target List Box is from Unique Base xsde2870 */
+
+ /* CONTEXT_ID xsde2800 for Unique Base Name Text Edit - used generically */
+ /* CONTEXT_ID - used in Unique Design View */
+ /* CONTEXT_ID - used in Key Design View */
+ /* CONTEXT_ID - used in Key Ref Design View */
+ public static final String XSDE_UNIQUE_BASE_NAME = PLUGIN_NAME + ".xsde2800";
+ /* CONTEXT_ID xsde2810 for Selector Group - used generically */
+ /* CONTEXT_ID - used in Unique Design View */
+ /* CONTEXT_ID - used in Key Design View */
+ /* CONTEXT_ID - used in Key Ref Design View */
+ public static final String XSDE_UNIQUE_BASE_SELECTOR_GROUP = PLUGIN_NAME + ".xsde2810";
+ /* CONTEXT_ID xsde2820 for Selector Multi-line Edit - used generically */
+ /* CONTEXT_ID - used in Unique Design View */
+ /* CONTEXT_ID - used in Key Design View */
+ /* CONTEXT_ID - used in Key Ref Design View */
+ public static final String XSDE_UNIQUE_BASE_SELECTOR = PLUGIN_NAME + ".xsde2820";
+ /* CONTEXT_ID xsde2830 for Fields Group - used generically */
+ /* CONTEXT_ID - used in Unique Design View */
+ /* CONTEXT_ID - used in Key Design View */
+ /* CONTEXT_ID - used in Key Ref Design View */
+ public static final String XSDE_UNIQUE_BASE_FIELDS_GROUP = PLUGIN_NAME + ".xsde2830";
+ /* CONTEXT_ID xsde2840 for Source Text Edit - used generically */
+ /* CONTEXT_ID - used in Unique Design View */
+ /* CONTEXT_ID - used in Key Design View */
+ /* CONTEXT_ID - used in Key Ref Design View */
+ public static final String XSDE_UNIQUE_BASE_SOURCE = PLUGIN_NAME + ".xsde2840";
+ /* CONTEXT_ID xsde2850 for Add Push Button - used generically */
+ /* CONTEXT_ID - used in Unique Design View */
+ /* CONTEXT_ID - used in Key Design View */
+ /* CONTEXT_ID - used in Key Ref Design View */
+ public static final String XSDE_UNIQUE_BASE_ADD = PLUGIN_NAME + ".xsde2850";
+ /* CONTEXT_ID xsde2860 for Remove Push Button - used generically */
+ /* CONTEXT_ID - used in Unique Design View */
+ /* CONTEXT_ID - used in Key Design View */
+ /* CONTEXT_ID - used in Key Ref Design View */
+ public static final String XSDE_UNIQUE_BASE_REMOVE = PLUGIN_NAME + ".xsde2860";
+ /* CONTEXT_ID xsde2870 for Target List Box - used generically */
+ /* CONTEXT_ID - used in Unique Design View */
+ /* CONTEXT_ID - used in Key Design View */
+ /* CONTEXT_ID - used in Key Ref Design View */
+ public static final String XSDE_UNIQUE_BASE_TARGET = PLUGIN_NAME + ".xsde2870";
+
+ /* CONTEXT_ID xsde2900 for Key Design View */
+ public static final String XSDE_KEY_DESIGN_VIEW = PLUGIN_NAME + ".xsde2900";
+ /* CONTEXT_ID Name Text Edit is from Unique Base xsde2800 */
+ /* CONTEXT_ID Selector Group is from Unique Base xsde2810 */
+ /* CONTEXT_ID Selector Mulit-line Edit is from Unique Base xsde2820 */
+ /* CONTEXT_ID Fields Group is from Unique Base xsde2830 */
+ /* CONTEXT_ID Source Text Edit is from Unique Base xsde2840 */
+ /* CONTEXT_ID Add Push Button is from Unique Base xsde2850 */
+ /* CONTEXT_ID Remove Push Button is from Unique Base xsde2860 */
+ /* CONTEXT_ID Target List Box is from Unique Base xsde2870 */
+ /* CONTEXT_ID xsde2900 for Key Design View */
+
+ /* CONTEXT_ID xsde2950 for Key Ref Design View */
+ public static final String XSDE_KEY_REF_DESIGN_VIEW = PLUGIN_NAME + ".xsde2950";
+ /* CONTEXT_ID Name Text Edit is from Unique Base xsde2800 */
+ /* CONTEXT_ID xsde2960 for Reference Key Combo Box */
+ public static final String XSDE_KEY_REF_REFERENCE = PLUGIN_NAME + ".xsde2960";
+ /* CONTEXT_ID Selector Group is from Unique Base xsde2810 */
+ /* CONTEXT_ID Selector Mulit-line Edit is from Unique Base xsde2820 */
+ /* CONTEXT_ID Fields Group is from Unique Base xsde2830 */
+ /* CONTEXT_ID Source Text Edit is from Unique Base xsde2840 */
+ /* CONTEXT_ID Add Push Button is from Unique Base xsde2850 */
+ /* CONTEXT_ID Remove Push Button is from Unique Base xsde2860 */
+ /* CONTEXT_ID Target List Box is from Unique Base xsde2870 */
+
+ /* CONTEXT_ID xsde3000 for Any Element Design View */
+ public static final String XSDE_ANY_ELEMENT_VIEW = PLUGIN_NAME + ".xsde3000";
+ /* CONTEXT_ID xsde3010 for Namespace Text Edit */
+ public static final String XSDE_ANY_ELEMENT_NAMESPACE = PLUGIN_NAME + ".xsde3010";
+ /* CONTEXT_ID xsde3020 for Process Contents Combo Box */
+ public static final String XSDE_ANY_ELEMENT_PROCESS = PLUGIN_NAME + ".xsde3020";
+ /* CONTEXT_ID xsde3030 for Minimum Text Edit */
+ public static final String XSDE_ANY_ELEMENT_MINIMUM = PLUGIN_NAME + ".xsde3030";
+ /* CONTEXT_ID xsde3040 for Maximum Text Edit */
+ public static final String XSDE_ANY_ELEMENT_MAXIMUM = PLUGIN_NAME + ".xsde3040";
+
+ /* CONTEXT_ID xsde3100 for Any Attribute Design View */
+ public static final String XSDE_ANY_ATTRIBUTE_VIEW = PLUGIN_NAME + ".xsde3100";
+ /* CONTEXT_ID xsde3110 for Namespace Text Edit */
+ public static final String XSDE_ANY_ATTRIBUTE_NAMESPACE = PLUGIN_NAME + ".xsde3110";
+ /* CONTEXT_ID xsde3120 for Process Contents Combo Box */
+ public static final String XSDE_ANY_ATTRIBUTE_PROCESS = PLUGIN_NAME + ".xsde3120";
+
+ /* no CONTEXT_ID for Union Design View - uses a generic interface */
+ /* CONTEXT_ID Type Information Group is from Type Helper xsde0900 */
+ /* CONTEXT_ID Built-in simple type Radio Button is from Type Helper xsde0920 */
+ /* CONTEXT_ID User-defined simple type Radio Button is from Type Helper xsde0930 */
+ /* CONTEXT_ID Type information Combo Box is from Type Helper xsde0950 */
+
+ /* CONTEXT_ID xsde3200 for Notation Design View */
+ public static final String XSDE_NOTATION_VIEW = PLUGIN_NAME + ".xsde3200";
+
+ /* CONTEXT_ID xsde4000 for Source View */
+ public static final String XSDE_SOURCE_VIEW = PLUGIN_NAME + ".xsde4000";
+
+ /* CONTEXT_IDs for Regular Expression Wizard follow the xsdrxxx context IDs */
+
+ /* CONTEXT_ID xsdr0010 for Compose Regular Expression Page */
+ public static final String XSDR_COMPOSITION_PAGE = PLUGIN_NAME + ".xsdr0010";
+ /* CONTEXT_ID xsdr0015 for Token Contents Combo Box */
+ public static final String XSDR_COMPOSITION_TOKEN = PLUGIN_NAME + ".xsdr0015";
+ /* CONTEXT_ID xsdr0020 for Occurrece Group */
+ public static final String XSDR_COMPOSITION_OCCURRENCE_GROUP = PLUGIN_NAME + ".xsdr0020";
+ /* CONTEXT_ID xsdr0030 for Just once Radio Button */
+ public static final String XSDR_COMPOSITION_JUST_ONCE = PLUGIN_NAME + ".xsdr0030";
+ /* CONTEXT_ID xsdr0040 for Zero or more Radio Button */
+ public static final String XSDR_COMPOSITION_ZERO_OR_MORE = PLUGIN_NAME + ".xsdr0040";
+ /* CONTEXT_ID xsdr0050 for One or more Radio Button */
+ public static final String XSDR_COMPOSITION_ONE_OR_MORE = PLUGIN_NAME + ".xsdr0050";
+ /* CONTEXT_ID xsdr0060 for Optional Radio Button */
+ public static final String XSDR_COMPOSITION_OPTIONAL = PLUGIN_NAME + ".xsdr0060";
+ /* CONTEXT_ID xsdr0070 for Repeat Radio Button */
+ public static final String XSDR_COMPOSITION_REPEAT = PLUGIN_NAME + ".xsdr0070";
+ /* CONTEXT_ID xsdr0080 for Range Radio Button */
+ public static final String XSDR_COMPOSITION_RANGE = PLUGIN_NAME + ".xsdr0080";
+ /* CONTEXT_ID xsdr0090 for Repeat Text Edit */
+ public static final String XSDR_COMPOSITION_REPEAT_TEXT = PLUGIN_NAME + ".xsdr0090";
+ /* CONTEXT_ID xsdr0100 for Range Minimum Text Edit */
+ public static final String XSDR_COMPOSITION_RANGE_MIN = PLUGIN_NAME + ".xsdr0100";
+ /* CONTEXT_ID xsdr0110 for Range Maximum Text Edit */
+ public static final String XSDR_COMPOSITION_RANGE_MAX = PLUGIN_NAME + ".xsdr0110";
+ /* CONTEXT_ID xsdr0120 for Add Push Button */
+ public static final String XSDR_COMPOSITION_ADD = PLUGIN_NAME + ".xsdr0120";
+ /* CONTEXT_ID xsdr0130 for Current Regular Expression Text Edit */
+ public static final String XSDR_COMPOSITION_CURRENT = PLUGIN_NAME + ".xsdr0130";
+
+ /* CONTEXT_ID xsdr0200 for Test Regular Expression Page */
+ public static final String XSDR_TEST_PAGE = PLUGIN_NAME + ".xsdr0200";
+ /* no CONTEXT_ID for Regular Expression Text Edit (not editable) */
+ /* CONTEXT_ID xsdr0210 for Sample Text Text Edit */
+ public static final String XSDR_TEST_SAMPLE = PLUGIN_NAME + ".xsdr0210";
+
+ /* CONTEXT_IDs for Preferences Page follows the xsdpxxx context IDs */
+
+ /* CONTEXT_ID xsdp0010 for XML Schema Preferences Page */
+ public static final String XSDP_PREFERENCE_PAGE = PLUGIN_NAME + ".xsdp0010";
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorPlugin.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorPlugin.java
new file mode 100644
index 0000000000..e1e7e27f72
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorPlugin.java
@@ -0,0 +1,349 @@
+/*******************************************************************************
+ * 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;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.text.MessageFormat;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.wst.sse.core.IModelManager;
+import org.eclipse.wst.sse.core.IModelManagerPlugin;
+
+
+public class XSDEditorPlugin extends AbstractUIPlugin
+{
+ public final static String PLUGIN_ID = "org.eclipse.wst.xsd.ui";
+ public final static String XSD_EDITOR_ID = "org.eclipse.wst.xsd.ui.XSDEditor";
+
+ public final static String DEFAULT_TARGET_NAMESPACE = "http://tempuri.org";
+
+ protected static XSDEditorPlugin plugin;
+ // protected XMLSchemaPackage xmlschemaPackage;
+// KCPort private static MsgLogger myMsgLogger;
+
+ public XSDEditorPlugin(IPluginDescriptor descriptor)
+ {
+ super(descriptor);
+ plugin = this;
+// KCPort myMsgLogger = getMsgLogger();
+ //myMsgLogger.write(Level.CONFIG, new BuildInfo());
+ //myMsgLogger.write(Level.CONFIG, BuildInfo.getWSABuildLevel());
+ }
+
+ /**
+ * Copy the w3c XMLSchema.dtd and datatypes.dtd into the plugin metadata directory
+ * for validation purposes
+ */
+ public void startup()
+ {
+ modelManager = getModelManager();
+ }
+
+ private static IModelManager modelManager;
+
+ public static IModelManager getModelManager() {
+ IModelManagerPlugin plugin = (IModelManagerPlugin) Platform.getPlugin(IModelManagerPlugin.ID);
+ return plugin.getModelManager();
+ }
+
+
+ /**
+ * Get the Install URL
+ */
+ public static URL getInstallURL()
+ {
+ return getPlugin().getDescriptor().getInstallURL();
+ }
+
+ /**
+ * Return the plugin physical directory location
+ */
+ public static IPath getPluginLocation()
+ {
+ try
+ {
+ IPath installPath = new Path(getInstallURL().toExternalForm()).removeTrailingSeparator();
+ String installStr = Platform.asLocalURL(new URL(installPath.toString())).getFile();
+ return new Path(installStr);
+ }
+ catch (IOException e)
+ {
+
+ }
+ return null;
+ }
+
+ /**
+ * Get the metadata directory for this plugin
+ */
+ public static String getMetaDataDirectory()
+ {
+ return getPlugin().getStateLocation().toOSString();
+ }
+
+ /**
+ * Get the one xmlschema package.
+ */
+// public XMLSchemaPackage getXMLSchemaPackage()
+// {
+// return xmlschemaPackage;
+// }
+
+// /**
+// * Get the one xmlschema factory.
+// */
+// public XMLSchemaFactory getXMLSchemaFactory()
+// {
+// return (XMLSchemaFactory)xmlschemaPackage.getEFactoryInstance();
+// }
+
+ /**
+ * Get the singleton instance.
+ */
+ public static XSDEditorPlugin getPlugin()
+ {
+ return plugin;
+ }
+
+ public static Image getXSDImage(String iconName)
+ {
+ return getPlugin().getImage(iconName);
+ }
+
+ public Image getImage(String iconName)
+ {
+ ImageRegistry imageRegistry = getImageRegistry();
+
+ if (imageRegistry.get(iconName) != null)
+ {
+ return imageRegistry.get(iconName);
+ }
+ else
+ {
+ imageRegistry.put(iconName, ImageDescriptor.createFromFile(getClass(), iconName));
+ return imageRegistry.get(iconName);
+ }
+ }
+
+ public static String getXSDString(String key)
+ {
+ return Platform.getResourceBundle(plugin.getBundle()).getString(key);
+ }
+
+ /**
+ * This gets the string resource and does one substitution.
+ */
+ public String getString(String key, Object s1)
+ {
+ return MessageFormat.format(Platform.getResourceBundle(getBundle()).getString(key), new Object [] { s1 });
+ }
+
+// public IWorkspace getWorkspace()
+// {
+// return ResourcesPlugin.getWorkspace();
+// }
+
+ public static Shell getShell()
+ {
+ return getPlugin().getWorkbench().getActiveWorkbenchWindow().getShell();
+ }
+
+ /**
+ * Get the xml schema default namespace prefix
+ */
+ public String getXMLSchemaPrefix()
+ {
+ return getPreferenceStore().getString(CONST_XSD_DEFAULT_PREFIX_TEXT);
+ }
+
+ /**
+ * Get the xml schema default target namespace
+ */
+ public String getXMLSchemaTargetNamespace()
+ {
+ return getPreferenceStore().getString(CONST_DEFAULT_TARGET_NAMESPACE);
+ }
+
+ /**
+ * Get the xml schema language qualification
+ */
+ public boolean isQualifyXMLSchemaLanguage()
+ {
+ return getPreferenceStore().getBoolean(CONST_XSD_LANGUAGE_QUALIFY);
+ }
+
+ /**
+ * Method isCombinedDesignAndSourceView.
+ * @return boolean if the editor should have a single page that is
+ * a combined design and source page
+ */
+ public boolean isCombinedDesignAndSourceView()
+ {
+ return COMBINED_LAYOUT.equals(getPreferenceStore().getString(EDITOR_LAYOUT));
+ }
+
+ public int getDesignLayout()
+ {
+ if (TOP_LAYOUT.equals(getPreferenceStore().getString(DESIGN_LAYOUT)))
+ {
+ return SWT.VERTICAL;
+ }
+ else if (BOTTOM_LAYOUT.equals(getPreferenceStore().getString(DESIGN_LAYOUT)))
+ {
+ return SWT.VERTICAL;
+ }
+ else if (LEFT_LAYOUT.equals(getPreferenceStore().getString(DESIGN_LAYOUT)))
+ {
+ return SWT.HORIZONTAL;
+ }
+ else if (RIGHT_LAYOUT.equals(getPreferenceStore().getString(DESIGN_LAYOUT)))
+ {
+ return SWT.HORIZONTAL;
+ }
+ return SWT.HORIZONTAL;
+ }
+
+ public String getDesignLayoutPosition()
+ {
+ if (TOP_LAYOUT.equals(getPreferenceStore().getString(DESIGN_LAYOUT)))
+ {
+ return TOP_LAYOUT;
+ }
+ else if (BOTTOM_LAYOUT.equals(getPreferenceStore().getString(DESIGN_LAYOUT)))
+ {
+ return BOTTOM_LAYOUT;
+ }
+ else if (LEFT_LAYOUT.equals(getPreferenceStore().getString(DESIGN_LAYOUT)))
+ {
+ return LEFT_LAYOUT;
+ }
+ else if (RIGHT_LAYOUT.equals(getPreferenceStore().getString(DESIGN_LAYOUT)))
+ {
+ return RIGHT_LAYOUT;
+ }
+ return RIGHT_LAYOUT;
+ }
+
+ /*---------------------------------------------------------------------------*/
+ /* the following methods are impls for the IPluginHelper interface */
+ /*---------------------------------------------------------------------------*/
+// public void setMsgLoggerConfig(Hashtable msgLoggerConfig)
+// {
+// getMsgLogger().setMsgLoggerConfig(msgLoggerConfig);
+// }
+//
+// public Hashtable getMsgLoggerConfig(Plugin plugin)
+// {
+// return (new PluginHelperImpl().getMsgLoggerConfig(plugin));
+// }
+//
+// public Hashtable getMsgLoggerConfig()
+// {
+// return (getMsgLoggerConfig(this));
+// }
+//
+// /**
+// * XSDEditor and XSDModel use the same logger. See plugin.xml
+// */
+// public MsgLogger getMsgLogger()
+// {
+// if (myMsgLogger == null)
+// {
+// myMsgLogger = (MsgLogger) MsgLogger.getFactory().getLogger(new PluginHelperImpl().getMsgLoggerName(this), this);
+// }
+// return (myMsgLogger);
+// }
+
+ public static final String CONST_XSD_DEFAULT_PREFIX_TEXT = "org.eclipse.wst.xmlschema.xsdDefaultPrefixText";
+ public static final String CONST_XSD_LANGUAGE_QUALIFY = "org.eclipse.wst.xmlschema.xsdQualify";
+ public static final String CONST_DEFAULT_TARGET_NAMESPACE = "org.eclipse.wst.xmlschema.defaultTargetnamespaceText";
+
+ // Preference to store which page should come up as the default page in the editor. This setting is based
+ // on the page that was left showing the last time the editor was closed.
+ public static String DEFAULT_PAGE = "org.eclipse.wst.xsd.ui.internal.defaultPage";
+ public static String DESIGN_PAGE = "org.eclipse.wst.xsd.ui.internal.designPage";
+ public static String SOURCE_PAGE = "org.eclipse.wst.xsd.ui.internal.sourcePage";
+ public static String GRAPH_PAGE = "org.eclipse.wst.xsd.ui.internal.graphPage";
+
+ public static String EDITOR_LAYOUT = "org.eclipse.wst.xsd.ui.internal.editorlayout";
+ public static String COMBINED_LAYOUT = "org.eclipse.wst.xsd.ui.internal.combined";
+ public static String SEPARATE_LAYOUT = "org.eclipse.wst.xsd.ui.internal.separate";
+
+ public static String DESIGN_LAYOUT = "org.eclipse.wst.xsd.ui.internal.designlayout";
+ public static String TOP_LAYOUT = "org.eclipse.wst.xsd.ui.internal.top";
+ public static String BOTTOM_LAYOUT = "org.eclipse.wst.xsd.ui.internal.bottom";
+ public static String LEFT_LAYOUT = "org.eclipse.wst.xsd.ui.internal.left";
+ public static String RIGHT_LAYOUT = "org.eclipse.wst.xsd.ui.internal.right";
+
+ /**
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#initializeDefaultPreferences(IPreferenceStore)
+ */
+ protected void initializeDefaultPreferences(IPreferenceStore store)
+ {
+ super.initializeDefaultPreferences(store);
+
+ store.setDefault(CONST_XSD_DEFAULT_PREFIX_TEXT, "xsd");
+ store.setDefault(CONST_XSD_LANGUAGE_QUALIFY, false);
+
+ store.setDefault(DEFAULT_PAGE, DESIGN_PAGE);
+ store.setDefault(EDITOR_LAYOUT, COMBINED_LAYOUT);
+ store.setDefault(DESIGN_LAYOUT, RIGHT_LAYOUT);
+
+ store.setDefault(XSDEditorPlugin.CONST_DEFAULT_TARGET_NAMESPACE, DEFAULT_TARGET_NAMESPACE);
+ }
+
+ public void setDefaultPage(String page)
+ {
+ getPreferenceStore().setValue(DEFAULT_PAGE, page);
+ }
+
+ /**
+ * Method getDefaultPage.
+ * @return String value of the string constant that is the default page the editor should turn to when
+ * first opened. Changes to the last visible page when the editor was closed
+ */
+ public String getDefaultPage()
+ {
+ return getPreferenceStore().getString(DEFAULT_PAGE);
+ }
+
+ protected URL baseURL;
+ public URL getBaseURL()
+ {
+ return getDescriptor().getInstallURL();
+ }
+
+ public Image getIconImage(String object)
+ {
+ try
+ {
+ return ExtendedImageRegistry.getInstance().getImage(new URL(getBaseURL() + "icons/" + object + ".gif"));
+ }
+ catch (MalformedURLException exception)
+ {
+ System.out.println("Failed to load image for '" + object + "'");
+ }
+ return null;
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDMenuListener.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDMenuListener.java
new file mode 100644
index 0000000000..72ce37c79d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDMenuListener.java
@@ -0,0 +1,1975 @@
+/*******************************************************************************
+ * 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;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.wst.xsd.ui.internal.actions.AddEnumsAction;
+import org.eclipse.wst.xsd.ui.internal.actions.AddModelGroupAction;
+import org.eclipse.wst.xsd.ui.internal.actions.BackAction;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateAnnotationAction;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateElementAction;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateGroupAction;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateIdentityConstraintsAction;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateLocalComplexTypeAction;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateLocalSimpleTypeAction;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateSimpleContentAction;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateSimpleTypeAction;
+import org.eclipse.wst.xsd.ui.internal.actions.DOMAttribute;
+import org.eclipse.wst.xsd.ui.internal.actions.DeleteAction;
+import org.eclipse.wst.xsd.ui.internal.actions.MakeAnonymousGlobal;
+import org.eclipse.wst.xsd.ui.internal.actions.OpenSchemaAction;
+import org.eclipse.wst.xsd.ui.internal.actions.SetBaseTypeAction;
+import org.eclipse.wst.xsd.ui.internal.actions.XSDEditNamespacesAction;
+import org.eclipse.wst.xsd.ui.internal.graph.model.Category;
+import org.eclipse.wst.xsd.ui.internal.provider.CategoryAdapter;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDCompositor;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class XSDMenuListener implements IMenuListener
+{
+ protected ISelectionProvider selectionProvider;
+ //protected XSDTextEditor textEditor;
+ protected DeleteAction deleteAction;
+// protected IAction undoAction, redoAction;
+ protected CreateElementAction addComplexTypeAction;
+ protected XSDSchema xsdSchema;
+ protected boolean isReadOnly;
+
+ /**
+ * Constructor for XSDMenuListener.
+ */
+ public XSDMenuListener(ISelectionProvider selectionProvider)
+ {
+ super();
+ this.selectionProvider = selectionProvider;
+
+ deleteAction = new DeleteAction(XSDEditorPlugin.getXSDString("_UI_ACTION_DELETE"), null, getXSDSchema());
+ deleteAction.setSelectionProvider(selectionProvider);
+ selectionProvider.addSelectionChangedListener(deleteAction);
+ }
+
+ public void setSelectionProvider(ISelectionProvider selectionProvider)
+ {
+ this.selectionProvider = selectionProvider;
+ }
+
+ protected XSDSchema getXSDSchema()
+ {
+ return xsdSchema;
+ }
+
+ protected Object getSelectedElement()
+ {
+ ISelection selection = selectionProvider.getSelection();
+ if (selection.isEmpty())
+ {
+ return null;
+ }
+ return ((IStructuredSelection) selection).getFirstElement();
+ }
+
+ protected void updateXSDSchema()
+ {
+ Object object = getSelectedElement();
+ if (object instanceof XSDConcreteComponent)
+ {
+ xsdSchema = ((XSDConcreteComponent)object).getSchema();
+ boolean flag = true;
+ isReadOnly = false;
+ if (xsdSchema == null)
+ {
+ return;
+ }
+ while (flag)
+ {
+ List list = xsdSchema.getReferencingDirectives();
+ if (list.size() > 0)
+ {
+ isReadOnly = true;
+ XSDSchemaDirective xsdSchemaDirective = (XSDSchemaDirective)list.get(0);
+ if (xsdSchemaDirective.getSchema() != null)
+ {
+ xsdSchema = xsdSchemaDirective.getSchema();
+ }
+ else
+ {
+ flag = false;
+ }
+ }
+ else
+ {
+ flag = false;
+ }
+ }
+ }
+ else if (object instanceof Category)
+ {
+ Category cg = (Category)object;
+ xsdSchema = cg.getXSDSchema();
+ }
+ else if (object instanceof CategoryAdapter)
+ {
+ CategoryAdapter category = (CategoryAdapter)object;
+ xsdSchema = category.getXSDSchema();
+ }
+ }
+
+ /*
+ * @see IMenuListener#menuAboutToShow(IMenuManager)
+ */
+ public void menuAboutToShow(IMenuManager manager)
+ {
+ isReadOnly = false;
+ updateXSDSchema();
+ if (xsdSchema == null)
+ {
+ return;
+ }
+
+ deleteAction.setXSDSchema(xsdSchema);
+ deleteAction.setEnabled(!isReadOnly);
+
+ BackAction backAction = new BackAction(XSDEditorPlugin.getXSDString("_UI_ACTION_BACK_TO_SCHEMA_VIEW")); //$NON-NLS-1$
+ backAction.setXSDSchema(getXSDSchema());
+ backAction.setSelectionProvider(selectionProvider);
+
+ Object selectedElementObj = getSelectedElement();
+
+ if (selectedElementObj instanceof XSDSchema || selectedElementObj instanceof Category || selectedElementObj instanceof CategoryAdapter)
+ {
+ backAction.setEnabled(false);
+ }
+ manager.add(backAction);
+ manager.add(new Separator());
+// if (undoAction == null && textEditor != null)
+// {
+// undoAction = textEditor.getAction(org.eclipse.ui.texteditor.ITextEditorActionConstants.UNDO);
+// redoAction = textEditor.getAction(org.eclipse.ui.texteditor.ITextEditorActionConstants.REDO);
+// }
+ // Element selectedElement = getSelectedElement();
+
+ Element selectedElement = null;
+
+ if (selectedElementObj instanceof Element)
+ {
+ selectedElement = (Element) selectedElementObj;
+ }
+ else if (selectedElementObj instanceof XSDConcreteComponent)
+ {
+ selectedElement = ((XSDConcreteComponent) selectedElementObj).getElement();
+ }
+ else if (selectedElementObj instanceof Category || selectedElementObj instanceof CategoryAdapter)
+ {
+ int groupType = -1;
+ if (selectedElementObj instanceof Category)
+ {
+ Category category = (Category) selectedElementObj;
+ groupType = category.getGroupType();
+ }
+ // todo... We need to ensure we eliminate the need for
+ // this case. The XSDMenuListener class should not have
+ // view dependant code. We need to do some work to ensure all
+ // views utilize the 'Category' model object
+ else if (selectedElementObj instanceof CategoryAdapter)
+ {
+ CategoryAdapter categoryAdapter = (CategoryAdapter) selectedElementObj;
+ groupType = categoryAdapter.getGroupType();
+ }
+ ArrayList attributes = null;
+ Element parent = getXSDSchema().getElement();
+ Node relativeNode = null;
+ switch (groupType)
+ {
+ case Category.TYPES : {
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("ComplexType")));
+ Action action = addCreateElementAction(manager, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_COMPLEX_TYPE"), attributes, parent, relativeNode);
+ ((CreateElementAction) action).setIsGlobal(true);
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("SimpleType")));
+ Action action2 = addCreateSimpleTypeAction(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SIMPLE_TYPE"), attributes, parent, relativeNode);
+ ((CreateElementAction) action2).setIsGlobal(true);
+ break;
+ }
+ case Category.ELEMENTS : {
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.ELEMENT_ELEMENT_TAG, "GlobalElement")));
+ attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+ Action action = addCreateElementAction(manager, XSDConstants.ELEMENT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ELEMENT"), attributes, parent, relativeNode);
+ ((CreateElementAction) action).setIsGlobal(true);
+ break;
+ }
+ case Category.GROUPS : {
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.GROUP_ELEMENT_TAG, "Group")));
+ CreateGroupAction groupAction = addCreateGroupAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_GROUP"), attributes, parent, relativeNode);
+ groupAction.setIsGlobal(true);
+ break;
+ }
+ case Category.ATTRIBUTES : {
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.ATTRIBUTE_ELEMENT_TAG, "GlobalAttribute")));
+ attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+ Action action = addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_GLOBAL_ATTRIBUTE"), attributes, parent, relativeNode);
+ ((CreateElementAction) action).setIsGlobal(true);
+ break;
+ }
+ case Category.ATTRIBUTE_GROUPS : {
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, "AttributeGroup")));
+ Action action = addCreateElementAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP"), attributes, parent, relativeNode);
+ ((CreateElementAction) action).setIsGlobal(true);
+ break;
+ }
+ case Category.NOTATIONS : {
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.NOTATION_ELEMENT_TAG, "Notation")));
+ attributes.add(new DOMAttribute(XSDConstants.PUBLIC_ATTRIBUTE, ""));
+ Action action = addCreateElementAction(manager, XSDConstants.NOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_NOTATION"), attributes, parent, relativeNode);
+ ((CreateElementAction) action).setIsGlobal(true);
+ break;
+ }
+ case Category.DIRECTIVES : {
+ boolean b = true;
+ NodeList children = parent.getChildNodes();
+ int length = children.getLength();
+ Node effectiveRelativeNode = parent.getFirstChild();
+ for (int i = 0; i < length && b; i++)
+ {
+ Node child = children.item(i);
+ if (child != null && child instanceof Element)
+ {
+ if (XSDDOMHelper.inputEquals((Element) child, XSDConstants.INCLUDE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals((Element) child, XSDConstants.IMPORT_ELEMENT_TAG, false)
+ || XSDDOMHelper.inputEquals((Element) child, XSDConstants.REDEFINE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals((Element) child, XSDConstants.ANNOTATION_ELEMENT_TAG, false))
+ {
+ effectiveRelativeNode = child;
+ }
+ else
+ {
+ b = false;
+ }
+ }
+ }
+ relativeNode = effectiveRelativeNode != null ? XSDDOMHelper.getNextElementNode(effectiveRelativeNode) : null;
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.SCHEMALOCATION_ATTRIBUTE, ""));
+ Action action = addCreateElementAction(manager, XSDConstants.INCLUDE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_INCLUDE"), attributes, parent, relativeNode);
+ ((CreateElementAction) action).setIsGlobal(true);
+ action = addCreateElementAction(manager, XSDConstants.IMPORT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_IMPORT"), null, parent, relativeNode);
+ ((CreateElementAction) action).setIsGlobal(true);
+ action = addCreateElementAction(manager, XSDConstants.REDEFINE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_REDEFINE"), attributes, parent, relativeNode);
+ ((CreateElementAction) action).setIsGlobal(true);
+ break;
+ }
+ case Category.ANNOTATIONS : {
+ Action action = addCreateElementAction(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), null, parent, relativeNode);
+ ((CreateElementAction) action).setIsGlobal(true);
+ break;
+ }
+ }
+// manager.add(new Separator());
+// if (undoAction != null)
+// {
+// manager.add(undoAction);
+// manager.add(redoAction);
+// }
+ return;
+ }
+ if (selectedElement != null)
+ {
+ // Add context menu items for selected element
+ addContextItems(manager, selectedElement, null);
+ manager.add(new Separator());
+ //else
+// if (textEditor != null)
+// {
+// Document document = getXSDSchema().getDocument();
+// if (document != null)
+// {
+// Element docElement = getXSDSchema().getDocument().getDocumentElement();
+// if (!XSDDOMHelper.inputEquals(docElement, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+// // if (list.getLength() == 0)
+// {
+// // no schema tag. Enable the Add Schema action
+// AddSchemaNodeAction action = new AddSchemaNodeAction(XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SCHEMA_NODE"));
+// action.setEditor((XSDEditor) textEditor.getEditorPart());
+// manager.add(action);
+// }
+// }
+// }
+ }
+// manager.add(new Separator());
+// if (undoAction != null)
+// {
+// manager.add(undoAction);
+// manager.add(redoAction);
+// }
+
+ manager.add(new Separator());
+ if (deleteAction != null)
+ {
+ manager.add(deleteAction);
+ }
+ }
+
+ protected String getBuiltInStringQName()
+ {
+ String stringName = "string";
+ if (getXSDSchema() != null)
+ {
+ String schemaForSchemaPrefix = getXSDSchema().getSchemaForSchemaQNamePrefix();
+ if (schemaForSchemaPrefix != null && schemaForSchemaPrefix.length() > 0)
+ {
+ String prefix = getXSDSchema().getSchemaForSchemaQNamePrefix();
+ if (prefix != null && prefix.length() > 0)
+ {
+ stringName = prefix + ":" + stringName;
+ }
+ }
+ }
+ return stringName;
+ }
+
+ /**
+ * Method addContextItems.
+ *
+ * @param manager
+ * @param parent -
+ * menu items should be context sensitive to this node
+ * @param relativeNode -
+ * anything inserted, should be inserted before this node (which is a
+ * child of the parent node. A value of null means add to the end
+ */
+ protected void addContextItems(IMenuManager manager, Element parent, Node relativeNode)
+ {
+ ArrayList attributes = null;
+ if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+ { //
+ addSchemaElementItems(manager, parent, relativeNode);
+ manager.add(new Separator());
+ boolean b = true;
+ NodeList children = parent.getChildNodes();
+ Node effectiveRelativeNode = parent.getFirstChild();
+ for (int i = 0; i < children.getLength() && b; i++)
+ {
+ Node child = children.item(i);
+ if (child != null && child instanceof Element)
+ {
+ if (XSDDOMHelper.inputEquals((Element) child, XSDConstants.INCLUDE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals((Element) child, XSDConstants.IMPORT_ELEMENT_TAG, false)
+ || XSDDOMHelper.inputEquals((Element) child, XSDConstants.REDEFINE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals((Element) child, XSDConstants.ANNOTATION_ELEMENT_TAG, false))
+ {
+ effectiveRelativeNode = child;
+ }
+ else
+ {
+ b = false;
+ }
+ }
+ }
+ relativeNode = effectiveRelativeNode != null ? effectiveRelativeNode.getNextSibling() : null;
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.SCHEMALOCATION_ATTRIBUTE, ""));
+ addCreateElementAction(manager, XSDConstants.INCLUDE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_INCLUDE"), attributes, parent, relativeNode);
+ addCreateElementAction(manager, XSDConstants.IMPORT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_IMPORT"), null, parent, relativeNode);
+ addCreateElementAction(manager, XSDConstants.REDEFINE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_REDEFINE"), attributes, parent, relativeNode);
+ attributes = null;
+ addCreateAnnotationAction(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), null, parent, relativeNode);
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false))
+ { //
+ addCreateElementAction(manager, XSDConstants.DOCUMENTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_DOC"), attributes, parent, null);
+ addCreateElementAction(manager, XSDConstants.APPINFO_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_APP_INFO"), attributes, parent, null);
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ELEMENT_ELEMENT_TAG, false))
+ { //
+ Element parentNode = (Element) parent.getParentNode();
+ boolean isGlobalElement = false;
+ if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+ {
+ isGlobalElement = true;
+ }
+ boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+ parent.getFirstChild());
+ boolean simpleTypeExists = elementExists(XSDConstants.SIMPLETYPE_ELEMENT_TAG, parent);
+ boolean complexTypeExists = elementExists(XSDConstants.COMPLEXTYPE_ELEMENT_TAG, parent);
+ manager.add(new Separator());
+ if (annotationExists)
+ {
+ Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+ if (!(simpleTypeExists || complexTypeExists) && annotationNode != null)
+ {
+ //addCreateLocalSimpleTypeActionIfNotExist(manager,
+ // XSDConstants.SIMPLETYPE_ELEMENT_TAG,
+ // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"),
+ // attributes, parent, annotationNode.getNextSibling());
+ //addCreateLocalComplexTypeActionIfNotExist(manager,
+ // XSDConstants.COMPLEXTYPE_ELEMENT_TAG, "Add Local Complex Type",
+ // attributes, parent, annotationNode.getNextSibling());
+ manager.add(new Separator());
+ }
+ }
+ else
+ {
+ // Should still be able to add the content models if the anonymous type
+ // exists,
+ // ie. with attributes
+ // if (!(simpleTypeExists || complexTypeExists))
+ // {
+ //addCreateLocalSimpleTypeActionIfNotExist(manager,
+ // XSDConstants.SIMPLETYPE_ELEMENT_TAG,
+ // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"),
+ // attributes, parent, parent.getFirstChild());
+ //addCreateLocalComplexTypeActionIfNotExist(manager,
+ // XSDConstants.COMPLEXTYPE_ELEMENT_TAG, "Add Local Complex Type",
+ // attributes, parent, parent.getFirstChild());
+ XSDConcreteComponent concreteComponent = getXSDSchema().getCorrespondingComponent(parent);
+ if (concreteComponent != null)
+ {
+ AddModelGroupAction addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.SEQUENCE_LITERAL);
+ addModelGroupAction.setEnabled(!isReadOnly);
+ manager.add(addModelGroupAction);
+
+ addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.CHOICE_LITERAL);
+ addModelGroupAction.setEnabled(!isReadOnly);
+ manager.add(addModelGroupAction);
+
+ addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.ALL_LITERAL);
+ addModelGroupAction.setEnabled(!isReadOnly);
+ manager.add(addModelGroupAction);
+
+ manager.add(new Separator());
+ }
+ // }
+ }
+// attributes = new ArrayList();
+// attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, "New_Unique"));
+// addCreateIdentityConstraintsAction(manager, XSDConstants.UNIQUE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_UNIQUE"), attributes, parent, null);
+// attributes = new ArrayList();
+// attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, "New_Key"));
+// addCreateIdentityConstraintsAction(manager, XSDConstants.KEY_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_KEY"), attributes, parent, null);
+// attributes = new ArrayList();
+// attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, "New_KeyRef"));
+// addCreateIdentityConstraintsAction(manager, XSDConstants.KEYREF_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_KEY_REF"), attributes, parent, null);
+ XSDDOMHelper domHelper = new XSDDOMHelper();
+ Element anonymousType = (Element) domHelper.getChildNode(parent, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+ if (anonymousType != null)
+ {
+ manager.add(new Separator());
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("ComplexType")));
+ addMoveAnonymousGlobal(manager, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_MAKE_ANONYMOUS_TYPE_GLOBAL"), attributes, anonymousType, null);
+ attributes = null;
+ }
+ anonymousType = (Element) domHelper.getChildNode(parent, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+ if (anonymousType != null)
+ {
+ manager.add(new Separator());
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("SimpleType")));
+ addMoveAnonymousGlobal(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_MAKE_ANONYMOUS_TYPE_GLOBAL"), attributes, anonymousType, null);
+ attributes = null;
+ }
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.SEQUENCE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals(parent, XSDConstants.CHOICE_ELEMENT_TAG, false))
+ { //
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ manager.add(new Separator());
+ addCreateElementAction(manager, XSDConstants.CHOICE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CHOICE"), attributes, parent, null);
+ addCreateElementAction(manager, XSDConstants.SEQUENCE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SEQUENCE"), attributes, parent, null);
+ addCreateElementRefAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ADD_GROUP_REF"), parent, null);
+ manager.add(new Separator());
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ELEMENT_ELEMENT_TAG, "Element", false)));
+ attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+ addCreateElementAction(manager, XSDConstants.ELEMENT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ELEMENT"), attributes, parent, null);
+ addCreateElementRefAction(manager, XSDConstants.ELEMENT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ELEMENT_REF"), parent, null);
+ manager.add(new Separator());
+ attributes = null;
+ addCreateElementAction(manager, XSDConstants.ANY_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANY_ELEMENT"), attributes, parent, null);
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ALL_ELEMENT_TAG, false))
+ { //
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ manager.add(new Separator());
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ELEMENT_ELEMENT_TAG, "Element", false)));
+ attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+ addCreateElementAction(manager, XSDConstants.ELEMENT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ELEMENT"), attributes, parent, null);
+ addCreateElementRefAction(manager, XSDConstants.ELEMENT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ELEMENT_REF"), parent, null);
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, false))
+ { //
+ boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+ parent.getFirstChild());
+ boolean anyAttributeExists = elementExists(XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, parent);
+ Node anyAttributeNode = null;
+ manager.add(new Separator());
+ if (anyAttributeExists)
+ {
+ anyAttributeNode = getFirstChildNodeIfExists(parent, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false);
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+ attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+ addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, anyAttributeNode);
+ attributes = null;
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, anyAttributeNode);
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, anyAttributeNode);
+ }
+ else
+ {
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+ attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+ addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+ attributes = null;
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, parent.getLastChild());
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, parent.getLastChild());
+ }
+ attributes = null;
+ addCreateElementActionIfNotExist(manager, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANY_ATTRIBUTE"), attributes, parent, null);
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.NOTATION_ELEMENT_TAG, false))
+ { //
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, null);
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+ { //
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ boolean restrictionExists = elementExists(XSDConstants.RESTRICTION_ELEMENT_TAG, parent);
+ boolean unionExists = elementExists(XSDConstants.UNION_ELEMENT_TAG, parent);
+ boolean listExists = elementExists(XSDConstants.LIST_ELEMENT_TAG, parent);
+ if (!(restrictionExists || unionExists || listExists))
+ {
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.BASE_ATTRIBUTE, getBuiltInStringQName()));
+ addCreateElementActionIfNotExist(manager, XSDConstants.RESTRICTION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_RESTRICTION"), attributes, parent, null);
+ attributes = null;
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE, getBuiltInStringQName()));
+ addCreateElementActionIfNotExist(manager, XSDConstants.UNION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_UNION"), attributes, parent, null);
+ attributes = null;
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.ITEMTYPE_ATTRIBUTE, getBuiltInStringQName()));
+ addCreateElementActionIfNotExist(manager, XSDConstants.LIST_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LIST"), attributes, parent, null);
+ attributes = null;
+ }
+ if (XSDDOMHelper.inputEquals(parent.getParentNode(), XSDConstants.ELEMENT_ELEMENT_TAG, false))
+ {
+ manager.add(new Separator());
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("SimpleType")));
+ addMoveAnonymousGlobal(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_MAKE_ANONYMOUS_TYPE_GLOBAL"), attributes, parent, null);
+ attributes = null;
+ }
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.GROUP_ELEMENT_TAG, false))
+ { //
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ addCreateElementActionIfNotExist(manager, XSDConstants.SEQUENCE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CONTENT_MODEL"), attributes, parent, null);
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, false))
+ { //
+ boolean annotationExists = false;
+ boolean contentExists = false;
+ boolean complexOrSimpleContentExists = false;
+ boolean anyAttributeExists = false;
+ Node annotationNode = null;
+ Node contentNode = null;
+ Node anyAttributeNode = null;
+ NodeList children = parent.getChildNodes();
+ for (int i = 0; i < children.getLength(); i++)
+ {
+ Node child = children.item(i);
+ if (child != null && child instanceof Element)
+ {
+ if (XSDDOMHelper.inputEquals((Element) child, XSDConstants.ANNOTATION_ELEMENT_TAG, false))
+ {
+ annotationNode = child;
+ annotationExists = true;
+ }
+ else if (XSDDOMHelper.inputEquals((Element) child, XSDConstants.SEQUENCE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals((Element) child, XSDConstants.ALL_ELEMENT_TAG, false)
+ || XSDDOMHelper.inputEquals((Element) child, XSDConstants.CHOICE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals((Element) child, XSDConstants.GROUP_ELEMENT_TAG, true)
+ || XSDDOMHelper.inputEquals((Element) child, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals((Element) child, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+ {
+ contentExists = true;
+ contentNode = child;
+ if (XSDDOMHelper.inputEquals((Element) child, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals((Element) child, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+ {
+ complexOrSimpleContentExists = true;
+ }
+ }
+ else if (XSDDOMHelper.inputEquals((Element) child, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false))
+ {
+ anyAttributeExists = true;
+ anyAttributeNode = child;
+ }
+ }
+ }
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ manager.add(new Separator());
+ addSetBaseTypeAction(manager, parent);
+ XSDConcreteComponent concreteComponent = getXSDSchema().getCorrespondingComponent(parent);
+ if (annotationExists)
+ {
+ if (!contentExists)
+ {
+ // Add content model
+ // addCreateElementAction(manager, XSDConstants.SEQUENCE_ELEMENT_TAG,
+ // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CONTENT_MODEL"),
+ // attributes, parent, annotationNode.getNextSibling());
+ if (concreteComponent != null)
+ {
+ AddModelGroupAction addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.SEQUENCE_LITERAL);
+ addModelGroupAction.setEnabled(!isReadOnly);
+ manager.add(addModelGroupAction);
+
+ addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.CHOICE_LITERAL);
+ addModelGroupAction.setEnabled(!isReadOnly);
+ manager.add(addModelGroupAction);
+
+ addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.ALL_LITERAL);
+ addModelGroupAction.setEnabled(!isReadOnly);
+ manager.add(addModelGroupAction);
+
+ }
+ // Temporarily remove this until we provide a graphical rep of these
+ // components
+ // addCreateSimpleContentAction(manager,
+ // XSDConstants.SIMPLECONTENT_ELEMENT_TAG,
+ // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SIMPLE_CONTENT"),
+ // attributes,
+ // parent, annotationNode.getNextSibling());
+ // addCreateSimpleContentAction(manager,
+ // XSDConstants.COMPLEXCONTENT_ELEMENT_TAG,
+ // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_COMPLEX_CONTENT"),
+ // attributes,
+ // parent, annotationNode.getNextSibling());
+ addCreateElementRefAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ADD_GROUP_REF"), parent, annotationNode.getNextSibling());
+ attributes = null;
+ }
+ }
+ else
+ {
+ if (!contentExists)
+ {
+ // Add content model
+ // addCreateElementAction(manager, XSDConstants.SEQUENCE_ELEMENT_TAG,
+ // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CONTENT_MODEL"),
+ // attributes, parent, parent.getFirstChild());
+ if (concreteComponent != null)
+ {
+ AddModelGroupAction addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.SEQUENCE_LITERAL);
+ addModelGroupAction.setEnabled(!isReadOnly);
+ manager.add(addModelGroupAction);
+
+ addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.CHOICE_LITERAL);
+ addModelGroupAction.setEnabled(!isReadOnly);
+ manager.add(addModelGroupAction);
+
+ addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.ALL_LITERAL);
+ addModelGroupAction.setEnabled(!isReadOnly);
+ manager.add(addModelGroupAction);
+
+ }
+ // Temporarily remove this until we provide a graphical rep of these
+ // components
+ // addCreateSimpleContentAction(manager,
+ // XSDConstants.SIMPLECONTENT_ELEMENT_TAG,
+ // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SIMPLE_CONTENT"),
+ // attributes,
+ // parent, parent.getFirstChild());
+ // addCreateSimpleContentAction(manager,
+ // XSDConstants.COMPLEXCONTENT_ELEMENT_TAG,
+ // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_COMPLEX_CONTENT"),
+ // attributes,
+ // parent, parent.getFirstChild());
+ addCreateElementRefAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ADD_GROUP_REF"), parent, parent.getFirstChild());
+ attributes = null;
+ }
+ }
+ manager.add(new Separator());
+ if (anyAttributeExists)
+ {
+ if (!complexOrSimpleContentExists)
+ {
+// attributes = new ArrayList();
+// attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+// attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+// addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, anyAttributeNode);
+// attributes = null;
+// // ARE ATTRIBUTE GROUPS ALLOWED ?
+// // addCreateElementAction(manager,
+// // XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG,
+// // "_UI_ACTION_ADD_ATTRIBUTE_GROUP", attributes, parent,
+// // anyAttributeNode);
+// addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, anyAttributeNode);
+// addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, anyAttributeNode);
+ }
+ }
+ else
+ {
+ if (!complexOrSimpleContentExists)
+ {
+// attributes = new ArrayList();
+// attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+// attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+// addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+// attributes = null;
+// // ARE ATTRIBUTE GROUPS ALLOWED ?
+// // addCreateElementAction(manager,
+// // XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG,
+// // "_UI_ACTION_ADD_ATTRIBUTE_GROUP", attributes, parent,
+// // parent.getLastChild());
+// addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, parent.getLastChild());
+// addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, parent.getLastChild());
+// attributes = null;
+// addCreateElementActionIfNotExist(manager, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANY_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+ }
+ }
+ if (XSDDOMHelper.inputEquals(parent.getParentNode(), XSDConstants.ELEMENT_ELEMENT_TAG, false))
+ {
+ manager.add(new Separator());
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("ComplexType")));
+ addMoveAnonymousGlobal(manager, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_MAKE_ANONYMOUS_TYPE_GLOBAL"), attributes, parent, null);
+ attributes = null;
+ }
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+ { //
+ XSDDOMHelper xsdDOMHelper = new XSDDOMHelper();
+ Element derivedByNode = xsdDOMHelper.getDerivedByElement(parent);
+ String derivedByName = xsdDOMHelper.getDerivedByName(parent);
+ boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+ parent.getFirstChild());
+ manager.add(new Separator());
+ if (derivedByNode == null)
+ {
+ TypesHelper typesHelper = new TypesHelper(getXSDSchema());
+ String firstType = "";
+ List listOfCT = typesHelper.getUserComplexTypeNamesList();
+ if (listOfCT.size() > 0)
+ {
+ firstType = (String) (listOfCT).get(0);
+ }
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.BASE_ATTRIBUTE, firstType));
+ addCreateElementActionIfNotExist(manager, XSDConstants.RESTRICTION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_RESTRICTION"), attributes, parent, null);
+ addCreateElementActionIfNotExist(manager, XSDConstants.EXTENSION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_EXTENSION"), attributes, parent, null);
+ }
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false))
+ { //
+ XSDDOMHelper xsdDOMHelper = new XSDDOMHelper();
+ Element derivedByNode = xsdDOMHelper.getDerivedByElement(parent);
+ String derivedByName = xsdDOMHelper.getDerivedByName(parent);
+ boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+ parent.getFirstChild());
+ manager.add(new Separator());
+ if (derivedByNode == null)
+ {
+ TypesHelper typesHelper = new TypesHelper(getXSDSchema());
+ String firstType = "";
+ List listOfCT = typesHelper.getUserComplexTypeNamesList();
+ if (listOfCT.size() > 0)
+ {
+ firstType = (String) (listOfCT).get(0);
+ }
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.BASE_ATTRIBUTE, firstType));
+ addCreateElementActionIfNotExist(manager, XSDConstants.RESTRICTION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_RESTRICTION"), attributes, parent, null);
+ addCreateElementActionIfNotExist(manager, XSDConstants.EXTENSION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_EXTENSION"), attributes, parent, null);
+ }
+ /*
+ * for combined SimpleContent and derivedBy nodes (but without
+ * restrictions) XSDDOMHelper xsdDOMHelper = new XSDDOMHelper(); Element
+ * derivedByNode = xsdDOMHelper.getDerivedByElement(parent); String
+ * derivedByName = xsdDOMHelper.getDerivedByName(parent);
+ *
+ * if (derivedByNode != null) { if (derivedByName.equals("restriction")) {
+ * addCreateElementActionIfNotExist(manager,
+ * XSDConstants.SIMPLETYPE_ELEMENT_TAG, "_UI_ACTION_ADD_SIMPLE_TYPE",
+ * attributes, derivedByNode, relativeNode); }
+ * addCreateElementActionIfNotExist(manager,
+ * XSDConstants.ANNOTATION_ELEMENT_TAG, "_UI_ACTION_ADD_ANNOTATION",
+ * attributes, derivedByNode, relativeNode);
+ * addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG,
+ * "_UI_ACTION_ADD_ATTRIBUTE", attributes, derivedByNode, relativeNode);
+ * attributes = new ArrayList(); attributes.add(new
+ * DOMAttribute(XSDConstants.REF_ATTRIBUTE, ""));
+ * addCreateElementAction(manager,
+ * XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG,
+ * "_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF", attributes, derivedByNode,
+ * relativeNode); attributes = new ArrayList();
+ * addCreateElementActionIfNotExist(manager,
+ * XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, "_UI_ACTION_ADD_ANY_ATTRIBUTE",
+ * attributes, derivedByNode, relativeNode); } else { TypesHelper
+ * typesHelper = new TypesHelper(getXSDSchema()); String firstType =
+ * (String)(typesHelper.getBuiltInTypeNamesList()).get(0); attributes =
+ * new ArrayList(); attributes.add(new
+ * DOMAttribute(XSDConstants.BASE_ATTRIBUTE, firstType));
+ *
+ * addCreateElementActionIfNotExist(manager,
+ * XSDConstants.ANNOTATION_ELEMENT_TAG, "_UI_ACTION_ADD_ANNOTATION",
+ * attributes, parent, relativeNode);
+ * addCreateElementActionIfNotExist(manager,
+ * XSDConstants.RESTRICTION_ELEMENT_TAG, "_UI_ACTION_ADD_RESTRICTION",
+ * attributes, parent, relativeNode);
+ * addCreateElementActionIfNotExist(manager,
+ * XSDConstants.EXTENSION_ELEMENT_TAG, "_UI_ACTION_ADD_EXTENSION",
+ * attributes, parent, relativeNode); }
+ */
+ // addCreateElementActionIfNotExist(manager,
+ // XSDConstants.SEQUENCE_ELEMENT_TAG,
+ // "_UI_ACTION_ADD_CONTENT_MODEL", attributes, parent, relativeNode);
+ // attributes = new ArrayList();
+ // attributes.add(new DOMAttribute(XSDConstants.REF_ATTRIBUTE, ""));
+ // addCreateElementActionIfNotExist(manager,
+ // XSDConstants.GROUP_ELEMENT_TAG,
+ // "_UI_ADD_GROUP_REF", attributes, parent, relativeNode);
+ // addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG,
+ // "_UI_ACTION_ADD_ATTRIBUTE", attributes, parent, relativeNode);
+ // attributes = new ArrayList();
+ // attributes.add(new DOMAttribute(XSDConstants.REF_ATTRIBUTE, ""));
+ // addCreateElementAction(manager,
+ // XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG,
+ // "_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF", attributes, parent,
+ // relativeNode);
+ // addCreateElementActionIfNotExist(manager,
+ // XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, "_UI_ACTION_ADD_ANY_ATTRIBUTE",
+ // attributes, parent, relativeNode);
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.RESTRICTION_ELEMENT_TAG, false))
+ {
+ Element parentNode = (Element) parent.getParentNode();
+ // <simpleContent>
+ // <restriction>
+ // ...
+ if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false))
+ {
+ boolean annotationExists = false;
+ boolean anyAttributeExists = false;
+ Node anyAttributeNode = null;
+ anyAttributeExists = elementExists(XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, parent);
+ annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent
+ .getFirstChild());
+ if (annotationExists)
+ {
+ Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+ //addCreateLocalSimpleTypeActionIfNotExist(manager,
+ // XSDConstants.SIMPLETYPE_ELEMENT_TAG,
+ // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"),
+ // attributes, parent, annotationNode.getNextSibling());
+ }
+ else
+ {
+ //addCreateLocalSimpleTypeActionIfNotExist(manager,
+ // XSDConstants.SIMPLETYPE_ELEMENT_TAG,
+ // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"),
+ // attributes, parent, parent.getFirstChild());
+ }
+ /*
+ * addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG,
+ * "_UI_ACTION_ADD_ATTRIBUTE", attributes, parent, relativeNode);
+ * attributes = new ArrayList(); attributes.add(new
+ * DOMAttribute(XSDConstants.REF_ATTRIBUTE, ""));
+ * addCreateElementAction(manager,
+ * XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG,
+ * "_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF", attributes, parent,
+ * relativeNode); attributes = new ArrayList();
+ * addCreateElementActionIfNotExist(manager,
+ * XSDConstants.ANYATTRIBUTE_ELEMENT_TAG,
+ * "_UI_ACTION_ADD_ANY_ATTRIBUTE", attributes, parent, relativeNode);
+ */
+ manager.add(new Separator());
+ if (anyAttributeExists)
+ {
+ anyAttributeNode = getFirstChildNodeIfExists(parent, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false);
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+ attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+ addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, anyAttributeNode);
+ attributes = null;
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, anyAttributeNode);
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, anyAttributeNode);
+ }
+ else
+ {
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+ attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+ addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+ attributes = null;
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, parent.getLastChild());
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, parent.getLastChild());
+ }
+ attributes = null;
+ addCreateElementActionIfNotExist(manager, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANY_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+ }
+ // <simpleType>
+ // <restriction>
+ // ...
+ else if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+ {
+ boolean annotationExists = false;
+ attributes = null;
+ annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent
+ .getFirstChild());
+ if (annotationExists)
+ {
+ Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+ addCreateLocalSimpleTypeActionIfNotExist(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"), attributes, parent, annotationNode
+ .getNextSibling());
+ }
+ else
+ {
+ addCreateLocalSimpleTypeActionIfNotExist(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"), attributes, parent, parent
+ .getFirstChild());
+ }
+ manager.add(new Separator());
+ addCreateElementAction(manager, XSDConstants.PATTERN_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_PATTERN"), attributes, parent, null);
+ addCreateElementAction(manager, XSDConstants.ENUMERATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ENUM"), attributes, parent, null);
+ addEnumsAction(manager, XSDConstants.ENUMERATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ENUMS"), attributes, parent, null);
+ }
+ // <complexContent>
+ // <restriction>
+ // ...
+ else if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+ {
+ boolean annotationExists = false;
+ boolean anyAttributeExists = false;
+ Node anyAttributeNode = null;
+ boolean sequenceExists = elementExists(XSDConstants.SEQUENCE_ELEMENT_TAG, parent);
+ boolean choiceExists = elementExists(XSDConstants.CHOICE_ELEMENT_TAG, parent);
+ boolean allExists = elementExists(XSDConstants.ALL_ELEMENT_TAG, parent);
+ boolean groupExists = elementExists(XSDConstants.GROUP_ELEMENT_TAG, parent);
+ anyAttributeExists = elementExists(XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, parent);
+ annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent
+ .getFirstChild());
+ manager.add(new Separator());
+ if (annotationExists)
+ {
+ if (!(sequenceExists || choiceExists || allExists || groupExists))
+ {
+ Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+ addCreateElementActionIfNotExist(manager, XSDConstants.SEQUENCE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CONTENT_MODEL"), attributes, parent, annotationNode
+ .getNextSibling());
+ // addCreateGroupAction(manager, XSDConstants.GROUP_ELEMENT_TAG,
+ // "_UI_ACTION_ADD_GROUP", attributes, parent,
+ // annotationNode.getNextSibling());
+ addCreateElementRefAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ADD_GROUP_REF"), parent, annotationNode.getNextSibling());
+ }
+ }
+ else
+ {
+ if (!(sequenceExists || choiceExists || allExists || groupExists))
+ {
+ addCreateElementActionIfNotExist(manager, XSDConstants.SEQUENCE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CONTENT_MODEL"), attributes, parent, parent.getFirstChild());
+ // addCreateGroupAction(manager, XSDConstants.GROUP_ELEMENT_TAG,
+ // "_UI_ACTION_ADD_GROUP", attributes, parent,
+ // parent.getFirstChild());
+ addCreateElementRefAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ADD_GROUP_REF"), parent, parent.getFirstChild());
+ }
+ }
+ manager.add(new Separator());
+ if (anyAttributeExists)
+ {
+ anyAttributeNode = getFirstChildNodeIfExists(parent, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false);
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+ attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+ addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, anyAttributeNode);
+ attributes = null;
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, anyAttributeNode);
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, anyAttributeNode);
+ }
+ else
+ {
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+ attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+ addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+ attributes = null;
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, parent.getLastChild());
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, parent.getLastChild());
+ }
+ attributes = null;
+ addCreateElementActionIfNotExist(manager, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANY_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+ }
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.EXTENSION_ELEMENT_TAG, false))
+ { //
+ Element parentNode = (Element) parent.getParentNode();
+ // <simpleContent>
+ // <extension>
+ // ...
+ if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false))
+ {
+ boolean annotationExists = false;
+ boolean anyAttributeExists = false;
+ Node anyAttributeNode = null;
+ anyAttributeExists = elementExists(XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, parent);
+ annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent
+ .getFirstChild());
+ manager.add(new Separator());
+ if (anyAttributeExists)
+ {
+ anyAttributeNode = getFirstChildNodeIfExists(parent, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false);
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+ attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+ addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, anyAttributeNode);
+ attributes = null;
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, anyAttributeNode);
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, anyAttributeNode);
+ }
+ else
+ {
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+ attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+ addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+ attributes = null;
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, parent.getLastChild());
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, parent.getLastChild());
+ }
+ attributes = null;
+ addCreateElementActionIfNotExist(manager, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANY_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+ }
+ // <complexContent>
+ // <extension>
+ // ...
+ else if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+ {
+ boolean annotationExists = false;
+ boolean anyAttributeExists = false;
+ Node anyAttributeNode = null;
+ boolean sequenceExists = elementExists(XSDConstants.SEQUENCE_ELEMENT_TAG, parent);
+ boolean choiceExists = elementExists(XSDConstants.CHOICE_ELEMENT_TAG, parent);
+ boolean allExists = elementExists(XSDConstants.ALL_ELEMENT_TAG, parent);
+ boolean groupExists = elementExists(XSDConstants.GROUP_ELEMENT_TAG, parent);
+ anyAttributeExists = elementExists(XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, parent);
+ annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent
+ .getFirstChild());
+ manager.add(new Separator());
+ if (annotationExists)
+ {
+ if (!(sequenceExists || choiceExists || allExists || groupExists))
+ {
+ Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+ addCreateElementActionIfNotExist(manager, XSDConstants.SEQUENCE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CONTENT_MODEL"), attributes, parent, annotationNode
+ .getNextSibling());
+ // addCreateGroupAction(manager, XSDConstants.GROUP_ELEMENT_TAG,
+ // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_GROUP"), attributes,
+ // parent,
+ // annotationNode.getNextSibling());
+ addCreateElementRefAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ADD_GROUP_REF"), parent, annotationNode.getNextSibling());
+ }
+ }
+ else
+ {
+ if (!(sequenceExists || choiceExists || allExists || groupExists))
+ {
+ addCreateElementActionIfNotExist(manager, XSDConstants.SEQUENCE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CONTENT_MODEL"), attributes, parent, parent.getFirstChild());
+ // addCreateGroupAction(manager, XSDConstants.GROUP_ELEMENT_TAG,
+ // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_GROUP"), attributes,
+ // parent,
+ // parent.getFirstChild());
+ addCreateElementRefAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ADD_GROUP_REF"), parent, parent.getFirstChild());
+ }
+ }
+ manager.add(new Separator());
+ if (anyAttributeExists)
+ {
+ anyAttributeNode = getFirstChildNodeIfExists(parent, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false);
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+ attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+ addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, anyAttributeNode);
+ attributes = null;
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, anyAttributeNode);
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, anyAttributeNode);
+ }
+ else
+ {
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+ attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+ addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+ attributes = null;
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, parent.getLastChild());
+ addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, parent.getLastChild());
+ }
+ attributes = null;
+ addCreateElementActionIfNotExist(manager, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANY_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+ }
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.REDEFINE_ELEMENT_TAG, false))
+ { //
+ addCreateElementAction(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, null);
+ addCreateElementAction(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SIMPLE_TYPE"), attributes, parent, null);
+ addCreateElementAction(manager, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_COMPLEX_TYPE"), attributes, parent, null);
+ addCreateGroupAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_GROUP"), attributes, parent, null);
+ addCreateElementAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP"), attributes, parent, null);
+ manager.add(new Separator());
+ addOpenSchemaAction(manager, XSDEditorPlugin.getXSDString("_UI_ACTION_OPEN_SCHEMA"), parent);
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.LIST_ELEMENT_TAG, false))
+ { //
+ boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+ parent.getFirstChild());
+ manager.add(new Separator());
+ addCreateLocalSimpleTypeActionIfNotExist(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"), attributes, parent, null);
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.UNION_ELEMENT_TAG, false))
+ { //
+ boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+ parent.getFirstChild());
+ manager.add(new Separator());
+ addCreateLocalSimpleTypeAction(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"), attributes, parent, null);
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.UNIQUE_ELEMENT_TAG, false))
+ { //
+ boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+ parent.getFirstChild());
+ manager.add(new Separator());
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.XPATH_ATTRIBUTE, ""));
+ if (annotationExists)
+ {
+ Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+ addCreateElementActionIfNotExist(manager, XSDConstants.SELECTOR_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SELECTOR"), attributes, parent, annotationNode.getNextSibling());
+ }
+ else
+ {
+ addCreateElementActionIfNotExist(manager, XSDConstants.SELECTOR_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SELECTOR"), attributes, parent, parent.getFirstChild());
+ }
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.XPATH_ATTRIBUTE, ""));
+ addCreateElementAction(manager, XSDConstants.FIELD_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_FIELD"), attributes, parent, null);
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.KEYREF_ELEMENT_TAG, false))
+ { //
+ boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+ parent.getFirstChild());
+ manager.add(new Separator());
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.XPATH_ATTRIBUTE, ""));
+ if (annotationExists)
+ {
+ Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+ addCreateElementActionIfNotExist(manager, XSDConstants.SELECTOR_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SELECTOR"), attributes, parent, annotationNode.getNextSibling());
+ }
+ else
+ {
+ addCreateElementActionIfNotExist(manager, XSDConstants.SELECTOR_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SELECTOR"), attributes, parent, parent.getFirstChild());
+ }
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.XPATH_ATTRIBUTE, ""));
+ addCreateElementAction(manager, XSDConstants.FIELD_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_FIELD"), attributes, parent, null);
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.KEY_ELEMENT_TAG, false))
+ { //
+ boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+ parent.getFirstChild());
+ manager.add(new Separator());
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.XPATH_ATTRIBUTE, ""));
+ if (annotationExists)
+ {
+ Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+ addCreateElementActionIfNotExist(manager, XSDConstants.SELECTOR_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SELECTOR"), attributes, parent, annotationNode.getNextSibling());
+ }
+ else
+ {
+ addCreateElementActionIfNotExist(manager, XSDConstants.SELECTOR_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SELECTOR"), attributes, parent, parent.getFirstChild());
+ }
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.XPATH_ATTRIBUTE, ""));
+ addCreateElementAction(manager, XSDConstants.FIELD_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_FIELD"), attributes, parent, null);
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.IMPORT_ELEMENT_TAG, false))
+ {
+ addCreateElementActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ manager.add(new Separator());
+ addOpenSchemaAction(manager, XSDEditorPlugin.getXSDString("_UI_ACTION_OPEN_SCHEMA"), parent);
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.SELECTOR_ELEMENT_TAG, false))
+ {
+ addCreateElementActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.FIELD_ELEMENT_TAG, false))
+ {
+ addCreateElementActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.INCLUDE_ELEMENT_TAG, false))
+ {
+ addCreateElementActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ manager.add(new Separator());
+ addOpenSchemaAction(manager, XSDEditorPlugin.getXSDString("_UI_ACTION_OPEN_SCHEMA"), parent);
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ANY_ELEMENT_TAG, false))
+ {
+ addCreateElementActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false))
+ {
+ addCreateElementActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false))
+ {
+ addCreateElementActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ addCreateLocalSimpleTypeActionIfNotExist(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"), attributes, parent, null);
+ }
+ // Facets all have optional annotation nodes
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.MINEXCLUSIVE_ELEMENT_TAG, false))
+ {
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.MININCLUSIVE_ELEMENT_TAG, false))
+ {
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.MAXEXCLUSIVE_ELEMENT_TAG, false))
+ {
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.MAXINCLUSIVE_ELEMENT_TAG, false))
+ {
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.TOTALDIGITS_ELEMENT_TAG, false))
+ {
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.FRACTIONDIGITS_ELEMENT_TAG, false))
+ {
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.LENGTH_ELEMENT_TAG, false))
+ {
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.MINLENGTH_ELEMENT_TAG, false))
+ {
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.MAXLENGTH_ELEMENT_TAG, false))
+ {
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ENUMERATION_ELEMENT_TAG, false))
+ {
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.WHITESPACE_ELEMENT_TAG, false))
+ {
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.PATTERN_ELEMENT_TAG, false))
+ {
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, true))
+ {
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, true))
+ {
+ addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ELEMENT_ELEMENT_TAG, true))
+ {
+ // TODO common this up with the non-ref case
+// addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+ XSDConcreteComponent xsdConcreteComponent = (XSDConcreteComponent)getXSDSchema().getCorrespondingComponent(parent);
+ if (xsdConcreteComponent instanceof XSDElementDeclaration)
+ {
+ XSDElementDeclaration xsdElementDeclaration = (XSDElementDeclaration)xsdConcreteComponent;
+ XSDElementDeclaration resolvedElementDeclaration = xsdElementDeclaration.getResolvedElementDeclaration();
+ if (resolvedElementDeclaration.getRootContainer() == xsdSchema)
+ {
+ parent = resolvedElementDeclaration.getElement();
+
+ Element parentNode = (Element) parent.getParentNode();
+
+ boolean isGlobalElement = false;
+ if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+ {
+ isGlobalElement = true;
+ }
+ boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+ parent.getFirstChild());
+ boolean simpleTypeExists = elementExists(XSDConstants.SIMPLETYPE_ELEMENT_TAG, parent);
+ boolean complexTypeExists = elementExists(XSDConstants.COMPLEXTYPE_ELEMENT_TAG, parent);
+ manager.add(new Separator());
+ if (annotationExists)
+ {
+ Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+ if (!(simpleTypeExists || complexTypeExists) && annotationNode != null)
+ {
+ //addCreateLocalSimpleTypeActionIfNotExist(manager,
+ // XSDConstants.SIMPLETYPE_ELEMENT_TAG,
+ // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"),
+ // attributes, parent, annotationNode.getNextSibling());
+ //addCreateLocalComplexTypeActionIfNotExist(manager,
+ // XSDConstants.COMPLEXTYPE_ELEMENT_TAG, "Add Local Complex Type",
+ // attributes, parent, annotationNode.getNextSibling());
+ manager.add(new Separator());
+ }
+ }
+ else
+ {
+ // Should still be able to add the content models if the anonymous type
+ // exists,
+ // ie. with attributes
+ // if (!(simpleTypeExists || complexTypeExists))
+ // {
+ //addCreateLocalSimpleTypeActionIfNotExist(manager,
+ // XSDConstants.SIMPLETYPE_ELEMENT_TAG,
+ // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"),
+ // attributes, parent, parent.getFirstChild());
+ //addCreateLocalComplexTypeActionIfNotExist(manager,
+ // XSDConstants.COMPLEXTYPE_ELEMENT_TAG, "Add Local Complex Type",
+ // attributes, parent, parent.getFirstChild());
+ XSDConcreteComponent concreteComponent = getXSDSchema().getCorrespondingComponent(parent);
+ if (concreteComponent != null)
+ {
+ AddModelGroupAction addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.SEQUENCE_LITERAL);
+ addModelGroupAction.setEnabled(!isReadOnly);
+ manager.add(addModelGroupAction);
+
+ addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.CHOICE_LITERAL);
+ addModelGroupAction.setEnabled(!isReadOnly);
+ manager.add(addModelGroupAction);
+
+ addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.ALL_LITERAL);
+ addModelGroupAction.setEnabled(!isReadOnly);
+ manager.add(addModelGroupAction);
+
+ manager.add(new Separator());
+ }
+ // }
+ }
+ // attributes = new ArrayList();
+ // attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, "New_Unique"));
+ // addCreateIdentityConstraintsAction(manager, XSDConstants.UNIQUE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_UNIQUE"), attributes, parent, null);
+ // attributes = new ArrayList();
+ // attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, "New_Key"));
+ // addCreateIdentityConstraintsAction(manager, XSDConstants.KEY_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_KEY"), attributes, parent, null);
+ // attributes = new ArrayList();
+ // attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, "New_KeyRef"));
+ // addCreateIdentityConstraintsAction(manager, XSDConstants.KEYREF_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_KEY_REF"), attributes, parent, null);
+ XSDDOMHelper domHelper = new XSDDOMHelper();
+ Element anonymousType = (Element) domHelper.getChildNode(parent, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+ if (anonymousType != null)
+ {
+ manager.add(new Separator());
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("ComplexType")));
+ addMoveAnonymousGlobal(manager, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_MAKE_ANONYMOUS_TYPE_GLOBAL"), attributes, anonymousType, null);
+ attributes = null;
+ }
+ anonymousType = (Element) domHelper.getChildNode(parent, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+ if (anonymousType != null)
+ {
+ manager.add(new Separator());
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("SimpleType")));
+ addMoveAnonymousGlobal(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_MAKE_ANONYMOUS_TYPE_GLOBAL"), attributes, anonymousType, null);
+ attributes = null;
+ }
+ }
+ }
+ }
+ /*
+ * These have none else if (XSDDOMHelper.inputEquals(parent,
+ * XSDConstants.DOCUMENTATION_ELEMENT_TAG, false)) { } else if
+ * (XSDDOMHelper.inputEquals(parent, XSDConstants.APPINFO_ELEMENT_TAG,
+ * false)) { }
+ */
+ }
+
+ protected void addContextInsertItems(IMenuManager manager, Element parent, Element currentElement, Node relativeNode)
+ {
+ ArrayList attributes = null;
+ if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.INCLUDE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals(currentElement, XSDConstants.IMPORT_ELEMENT_TAG, false)
+ || XSDDOMHelper.inputEquals(currentElement, XSDConstants.REDEFINE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals(currentElement, XSDConstants.ANNOTATION_ELEMENT_TAG, false))
+ {
+ if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+ {
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.SCHEMALOCATION_ATTRIBUTE, ""));
+ addCreateElementAction(manager, XSDConstants.INCLUDE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_INCLUDE"), attributes, parent, relativeNode);
+ addCreateElementAction(manager, XSDConstants.IMPORT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_IMPORT"), null, parent, relativeNode);
+ addCreateElementAction(manager, XSDConstants.REDEFINE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_REDEFINE"), attributes, parent, relativeNode);
+ attributes = null;
+ addCreateElementAction(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), null, parent, relativeNode);
+ }
+ }
+ else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+ {
+ if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+ {
+ addSchemaElementItems(manager, parent, relativeNode);
+ }
+ // else if (XSDDOMHelper.inputEquals(parent,
+ // XSDConstants.LIST_ELEMENT_TAG,
+ // false))
+ // {
+ // addCreateElementAction(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG,
+ // "_UI_ACTION_ADD_SIMPLE_TYPE", attributes, parent, relativeNode);
+ // }
+ else if (XSDDOMHelper.inputEquals(parent, XSDConstants.UNION_ELEMENT_TAG, false))
+ {
+ addCreateLocalSimpleTypeAction(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"), attributes, parent, relativeNode);
+ }
+ }
+ else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, false))
+ {
+ if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+ {
+ addSchemaElementItems(manager, parent, relativeNode);
+ }
+ }
+ else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.GROUP_ELEMENT_TAG, false))
+ {
+ if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+ {
+ addSchemaElementItems(manager, parent, relativeNode);
+ }
+ }
+ else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, false))
+ {
+ if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+ {
+ addSchemaElementItems(manager, parent, relativeNode);
+ }
+ }
+ else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.ELEMENT_ELEMENT_TAG, false))
+ {
+ if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+ {
+ addSchemaElementItems(manager, parent, relativeNode);
+ }
+ }
+ else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false))
+ {
+ if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+ {
+ addSchemaElementItems(manager, parent, relativeNode);
+ }
+ }
+ else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.NOTATION_ELEMENT_TAG, false))
+ {
+ if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+ {
+ addSchemaElementItems(manager, parent, relativeNode);
+ }
+ }
+ else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.DOCUMENTATION_ELEMENT_TAG, false))
+ {
+ addCreateElementAction(manager, XSDConstants.DOCUMENTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_DOC"), attributes, parent, relativeNode);
+ addCreateElementAction(manager, XSDConstants.APPINFO_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_APP_INFO"), attributes, parent, relativeNode);
+ }
+ else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.APPINFO_ELEMENT_TAG, false))
+ {
+ addCreateElementAction(manager, XSDConstants.DOCUMENTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_DOC"), attributes, parent, relativeNode);
+ addCreateElementAction(manager, XSDConstants.APPINFO_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_APP_INFO"), attributes, parent, relativeNode);
+ }
+ }
+
+ protected String getNewGlobalName(String elementTag, String description)
+ {
+ return getNewGlobalName(elementTag, description, false);
+ }
+
+ protected String getNewGlobalTypeName(String description)
+ {
+ return getNewGlobalName(null, description, true);
+ }
+
+ protected String getNewGlobalName(String elementTag, String description, boolean isSimpleOrComplexType)
+ {
+ return getNewName(getXSDSchema().getDocument(), elementTag, description, isSimpleOrComplexType);
+ }
+
+ // TODO.. .we need to rewrite this code to me model driven... not document driven
+ //
+ protected String getNewName(Node parentNode, String elementTag, String description, boolean isSimpleOrComplexType)
+ {
+ NodeList list = null;
+ NodeList typeList2 = null;
+ // if the global name is for a simple or complex type, we ignore the
+ // elementTag and populate 2 lists
+ // one to look for all simple types and the other to look for all complex
+ // types
+ if (isSimpleOrComplexType)
+ {
+ if (parentNode instanceof Document)
+ {
+ list = ((Document) parentNode).getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+ typeList2 = ((Document) parentNode).getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+ }
+ else if (parentNode instanceof Element)
+ {
+ list = ((Element) parentNode).getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+ typeList2 = ((Element) parentNode).getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+ }
+ }
+ else
+ {
+ if (parentNode instanceof Document)
+ {
+ list = ((Document) parentNode).getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, elementTag);
+ }
+ else if (parentNode instanceof Element)
+ {
+ list = ((Element) parentNode).getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, elementTag);
+ }
+ }
+ String name = "New" + description;
+ if (list == null || list.getLength() == 0 && (typeList2 != null && typeList2.getLength() == 0))
+ {
+ return name;
+ }
+ for (int i = 1; i < 100; i++)
+ {
+ boolean newName = false;
+ for (int j = 0; j < list.getLength(); j++)
+ {
+ String currName = ((Element) list.item(j)).getAttribute(XSDConstants.NAME_ATTRIBUTE);
+ if (currName == null || currName.length() == 0)
+ {
+ continue;
+ }
+ if (currName.equals(name))
+ {
+ name = "New" + description + String.valueOf(i);
+ newName = true;
+ break;
+ }
+ }
+ // if there is another type list and we haven't created a new name, then
+ // check the type list
+ if (typeList2 != null && !newName)
+ {
+ for (int j = 0; j < typeList2.getLength(); j++)
+ {
+ String currName = ((Element) typeList2.item(j)).getAttribute(XSDConstants.NAME_ATTRIBUTE);
+ if (currName == null || currName.length() == 0)
+ {
+ continue;
+ }
+ if (currName.equals(name))
+ {
+ name = "New" + description + String.valueOf(i);
+ break;
+ }
+ }
+ }
+ }
+ return name;
+ }
+
+ protected String getFirstGlobalElementTagName(String elementTag)
+ {
+ //XMLModel model = getXMLModel();
+ //if (model != null)
+ {
+ String targetNamespace = "";
+ XSDSchema schema = getXSDSchema();
+ TypesHelper helper = new TypesHelper(schema);
+ String prefix = "";
+ if (schema != null)
+ {
+ prefix = helper.getPrefix(schema.getTargetNamespace(), true);
+ }
+ // get the schema node
+ NodeList slist = schema.getDocument().getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, XSDConstants.SCHEMA_ELEMENT_TAG);
+ Node schemaNode = null;
+ if (slist != null && slist.getLength() > 0)
+ {
+ schemaNode = slist.item(0);
+ }
+ NodeList list = null;
+ // get the schema's direct children - hence, globals
+ if (schemaNode != null)
+ {
+ list = schemaNode.getChildNodes();
+ }
+ String name = null;
+ if (list != null)
+ {
+ // Performance issue perhaps?
+ for (int i = 0; i < list.getLength(); i++)
+ {
+ if (list.item(i) instanceof Element)
+ {
+ if (list.item(i).getLocalName().equals(elementTag))
+ {
+ name = ((Element) list.item(i)).getAttribute(XSDConstants.NAME_ATTRIBUTE);
+ if (name != null && name.length() > 0)
+ {
+ return prefix + name;
+ }
+ }
+ }
+ }
+ }
+ if (elementTag.equals(XSDConstants.ELEMENT_ELEMENT_TAG))
+ {
+ return helper.getGlobalElement(schema);
+ }
+ else if (elementTag.equals(XSDConstants.ATTRIBUTE_ELEMENT_TAG))
+ {
+ return helper.getGlobalAttribute(schema);
+ }
+ else if (elementTag.equals(XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG))
+ {
+ return helper.getGlobalAttributeGroup(schema);
+ }
+ else if (elementTag.equals(XSDConstants.GROUP_ELEMENT_TAG))
+ {
+ return helper.getModelGroup(schema);
+ }
+ }
+ return null;
+ }
+
+ protected void addSchemaElementItems(IMenuManager manager, Element parent, Node relativeNode)
+ {
+ ArrayList attributes = null;
+ // Add Edit Namespaces menu action
+ //////////////// Externalize String below!!!!!
+ XSDEditNamespacesAction nsAction = new XSDEditNamespacesAction(XSDEditorPlugin.getXSDString("_UI_ACTION_EDIT_NAMESPACES"), parent, relativeNode, getXSDSchema());
+ manager.add(nsAction);
+ manager.add(new Separator());
+ DOMAttribute nameAttribute = new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("ComplexType"));
+ attributes = new ArrayList();
+ attributes.add(nameAttribute);
+ Action action = addCreateElementAction(manager, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_COMPLEX_TYPE"), attributes, parent, relativeNode);
+ ((CreateElementAction) action).setIsGlobal(true);
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("SimpleType")));
+ action = addCreateElementAction(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SIMPLE_TYPE"), attributes, parent, relativeNode);
+ ((CreateElementAction) action).setIsGlobal(true);
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.ELEMENT_ELEMENT_TAG, "GlobalElement")));
+ attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+ action = addCreateElementAction(manager, XSDConstants.ELEMENT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_GLOBAL_ELEMENT"), attributes, parent, relativeNode);
+ ((CreateElementAction) action).setIsGlobal(true);
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.ATTRIBUTE_ELEMENT_TAG, "GlobalAttribute")));
+ attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+ action = addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_GLOBAL_ATTRIBUTE"), attributes, parent, relativeNode);
+ ((CreateElementAction) action).setIsGlobal(true);
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, "AttributeGroup")));
+ action = addCreateElementAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP"), attributes, parent, relativeNode);
+ ((CreateElementAction) action).setIsGlobal(true);
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.GROUP_ELEMENT_TAG, "Group")));
+ CreateGroupAction groupAction = addCreateGroupAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_GROUP"), attributes, parent, relativeNode);
+ groupAction.setIsGlobal(true);
+ attributes = new ArrayList();
+ attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.NOTATION_ELEMENT_TAG, "Notation")));
+ attributes.add(new DOMAttribute(XSDConstants.PUBLIC_ATTRIBUTE, ""));
+ action = addCreateElementAction(manager, XSDConstants.NOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_NOTATION"), attributes, parent, relativeNode);
+ ((CreateElementAction) action).setIsGlobal(true);
+ action = addCreateElementAction(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), null, parent, relativeNode);
+ ((CreateElementAction) action).setIsGlobal(true);
+ }
+
+ // returns whether element exists already
+ protected boolean addCreateElementActionIfNotExist(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+ {
+ // if
+ // (!(parent.getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001,
+ // elementTag).getLength() > 0))
+ // XSDDOMHelper helper = new XSDDOMHelper();
+ // if (helper.getChildNode(parent, elementTag) == null)
+ if (getFirstChildNodeIfExists(parent, elementTag, false) == null)
+ {
+ addCreateElementAction(manager, elementTag, label, attributes, parent, relativeNode);
+ return false;
+ }
+ return true;
+ }
+
+ protected Action addCreateElementAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+ {
+ CreateElementAction action = new CreateElementAction(label);
+ action.setElementTag(elementTag);
+ action.setAttributes(attributes);
+ action.setParentNode(parent);
+ action.setRelativeNode(relativeNode);
+ action.setXSDSchema(getXSDSchema());
+ action.setSelectionProvider(selectionProvider);
+ action.setEnabled(!isReadOnly);
+ manager.add(action);
+ return action;
+ }
+
+ protected void addCreateElementAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode, boolean isEnabled)
+ {
+ Action action = addCreateElementAction(manager, elementTag, label, attributes, parent, relativeNode);
+ action.setEnabled(isEnabled);
+ }
+
+ protected void addCreateElementRefAction(IMenuManager manager, String elementTag, String label, Element parent, Node relativeNode)
+ {
+ ArrayList attributes = new ArrayList();
+ String ref = getFirstGlobalElementTagName(elementTag);
+ attributes.add(new DOMAttribute(XSDConstants.REF_ATTRIBUTE, ref));
+ Action action = addCreateElementAction(manager, elementTag, label, attributes, parent, relativeNode);
+ action.setEnabled(ref != null);
+ if (ref != null)
+ {
+ action.setEnabled(!isReadOnly);
+ }
+ }
+
+ protected void addCreateSimpleContentAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+ {
+ // if
+ // (!(parent.getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001,
+ // elementTag).getLength() > 0))
+ if (getFirstChildNodeIfExists(parent, elementTag, false) == null)
+ {
+ CreateSimpleContentAction action = new CreateSimpleContentAction(label, getXSDSchema());
+ action.setElementTag(elementTag);
+ action.setAttributes(attributes);
+ action.setParentNode(parent);
+ action.setRelativeNode(relativeNode);
+ action.setEnabled(!isReadOnly);
+ manager.add(action);
+ }
+ }
+
+ protected CreateGroupAction addCreateGroupAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+ {
+ CreateGroupAction action = new CreateGroupAction(label, getXSDSchema());
+ action.setElementTag(elementTag);
+ action.setAttributes(attributes);
+ action.setParentNode(parent);
+ action.setRelativeNode(relativeNode);
+ action.setXSDSchema(getXSDSchema());
+ action.setSelectionProvider(selectionProvider);
+ action.setEnabled(!isReadOnly);
+ manager.add(action);
+ return action;
+ }
+
+ protected void addCreateIdentityConstraintsAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+ {
+ CreateIdentityConstraintsAction action = new CreateIdentityConstraintsAction(label, getXSDSchema());
+ action.setElementTag(elementTag);
+ action.setAttributes(attributes);
+ action.setParentNode(parent);
+ action.setRelativeNode(relativeNode);
+ action.setXSDSchema(getXSDSchema());
+ action.setSelectionProvider(selectionProvider);
+ action.setEnabled(!isReadOnly);
+ manager.add(action);
+ }
+
+ protected void addEnumsAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+ {
+ AddEnumsAction action = new AddEnumsAction(label);
+ action.setElementTag(elementTag);
+ action.setAttributes(attributes);
+ action.setParentNode(parent);
+ action.setRelativeNode(relativeNode);
+ action.setDescription(XSDEditorPlugin.getXSDString("_UI_ENUMERATIONS_DIALOG_TITLE"));
+ action.setEnabled(!isReadOnly);
+ manager.add(action);
+ }
+
+ protected Action addCreateSimpleTypeAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+ {
+ CreateSimpleTypeAction action = new CreateSimpleTypeAction(label);
+ action.setElementTag(elementTag);
+ action.setAttributes(attributes);
+ action.setParentNode(parent);
+ action.setRelativeNode(relativeNode);
+ action.setXSDSchema(getXSDSchema());
+ action.setSelectionProvider(selectionProvider);
+ action.setEnabled(!isReadOnly);
+ manager.add(action);
+ return action;
+ }
+
+ protected boolean addCreateLocalSimpleTypeActionIfNotExist(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+ {
+ // if
+ // (!(parent.getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001,
+ // elementTag).getLength() > 0))
+ // XSDDOMHelper helper = new XSDDOMHelper();
+ // if (helper.getChildNode(parent, elementTag) == null)
+ if (getFirstChildNodeIfExists(parent, elementTag, false) == null)
+ {
+ addCreateLocalSimpleTypeAction(manager, elementTag, label, attributes, parent, relativeNode);
+ return false;
+ }
+ return true;
+ }
+
+ protected void addSetBaseTypeAction(IMenuManager manager, Element element)
+ {
+ SetBaseTypeAction action = new SetBaseTypeAction(XSDEditorPlugin.getXSDString("_UI_ACTION_SET_BASE_TYPE"));// +
+ // "...");
+ action.setComplexTypeElement(element);
+ action.setXSDSchema(getXSDSchema());
+ action.setEnabled(!isReadOnly);
+ manager.add(action);
+ }
+
+ protected void addCreateLocalSimpleTypeAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+ {
+ CreateLocalSimpleTypeAction action = new CreateLocalSimpleTypeAction(label);
+ action.setElementTag(elementTag);
+ action.setAttributes(attributes);
+ action.setParentNode(parent);
+ action.setRelativeNode(relativeNode);
+ action.setXSDSchema(getXSDSchema());
+ action.setSelectionProvider(selectionProvider);
+ action.setEnabled(!isReadOnly);
+ manager.add(action);
+ }
+
+ protected boolean addCreateLocalComplexTypeActionIfNotExist(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+ {
+ if (getFirstChildNodeIfExists(parent, elementTag, false) == null)
+ {
+ addCreateLocalComplexTypeAction(manager, elementTag, label, attributes, parent, relativeNode);
+ return false;
+ }
+ return true;
+ }
+
+ protected void addCreateLocalComplexTypeAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+ {
+ CreateLocalComplexTypeAction action = new CreateLocalComplexTypeAction(label);
+ action.setElementTag(elementTag);
+ action.setAttributes(attributes);
+ action.setParentNode(parent);
+ action.setRelativeNode(relativeNode);
+ action.setXSDSchema(getXSDSchema());
+ action.setSelectionProvider(selectionProvider);
+ action.setEnabled(!isReadOnly);
+ manager.add(action);
+ }
+
+ protected boolean addCreateAnnotationActionIfNotExist(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+ {
+ // if
+ // (!(parent.getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001,
+ // elementTag).getLength() > 0))
+ // XSDDOMHelper helper = new XSDDOMHelper();
+ // if (helper.getChildNode(parent, elementTag) == null)
+ // CS... I comment the
+ //
+ //if (getFirstChildNodeIfExists(parent, elementTag, false) == null)
+ //{
+ // addCreateAnnotationAction(manager,elementTag,label,attributes,parent,relativeNode);
+ // return false;
+ //}
+ //return true;
+ return false;
+ }
+
+ protected void addOpenSchemaAction(IMenuManager manager, String label, Element parent)
+ {
+ OpenSchemaAction openAction = new OpenSchemaAction(label, getXSDSchema().getCorrespondingComponent(parent));
+ manager.add(openAction);
+ }
+
+ protected void addMoveAnonymousGlobal(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+ {
+ MakeAnonymousGlobal action = new MakeAnonymousGlobal(label, parent, getXSDSchema());
+ action.setElementTag(elementTag);
+ action.setAttributes(attributes);
+ action.setParentNode(getXSDSchema().getElement());
+ action.setRelativeNode(relativeNode);
+ action.setEnabled(!isReadOnly);
+ manager.add(action);
+ }
+
+ protected void addCreateAnnotationAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+ {
+ CreateAnnotationAction action = new CreateAnnotationAction(label);
+ action.setElementTag(elementTag);
+ action.setAttributes(attributes);
+ action.setParentNode(parent);
+ action.setRelativeNode(relativeNode);
+ action.setEnabled(!isReadOnly);
+ manager.add(action);
+ }
+
+ protected Node getFirstChildNodeIfExists(Node parent, String elementTag, boolean isRef)
+ {
+ if (parent == null)
+ return null;
+ NodeList children = parent.getChildNodes();
+ Node targetNode = null;
+ for (int i = 0; i < children.getLength(); i++)
+ {
+ Node child = children.item(i);
+ if (child != null && child instanceof Element)
+ {
+ if (XSDDOMHelper.inputEquals((Element) child, elementTag, isRef))
+ {
+ targetNode = child;
+ break;
+ }
+ }
+ }
+ return targetNode;
+ }
+
+ protected boolean elementExists(String elementTag, Element parent)
+ {
+ if (!(parent.getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, elementTag).getLength() > 0))
+ {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Returns the deleteAction.
+ *
+ * @return DeleteAction
+ */
+ public DeleteAction getDeleteAction()
+ {
+ return deleteAction;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDMultiPageEditorPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDMultiPageEditorPart.java
new file mode 100644
index 0000000000..b11e09a305
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDMultiPageEditorPart.java
@@ -0,0 +1,726 @@
+/*******************************************************************************
+ * 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;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
+import org.eclipse.core.internal.resources.ResourceException;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextInputListener;
+import org.eclipse.swt.events.ShellAdapter;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorActionBarContributor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IPropertyListener;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IGotoMarker;
+import org.eclipse.ui.part.MultiPageEditorPart;
+import org.eclipse.ui.part.MultiPageEditorSite;
+import org.eclipse.wst.sse.core.IStructuredModel;
+import org.eclipse.wst.sse.core.exceptions.SourceEditingRuntimeException;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.nls.ResourceHandler;
+import org.eclipse.wst.xml.core.XMLPreferenceNames;
+import org.eclipse.wst.xml.ui.StructuredTextEditorXML;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+public class XSDMultiPageEditorPart extends MultiPageEditorPart implements IPropertyListener
+{
+
+ /**
+ *
+ */
+ public XSDMultiPageEditorPart()
+ {
+ super();
+ }
+
+ /**
+ * Internal part activation listener
+ */
+ class PartListener extends ShellAdapter implements IPartListener {
+ private IWorkbenchPart fActivePart;
+ private boolean fIsHandlingActivation = false;
+
+ private void handleActivation() {
+
+ if (fIsHandlingActivation)
+ return;
+
+ if (fActivePart == XSDMultiPageEditorPart.this) {
+ fIsHandlingActivation = true;
+ try {
+ safelySanityCheckState();
+ }
+ finally {
+ fIsHandlingActivation = false;
+ }
+ }
+ }
+
+ /**
+ * @see IPartListener#partActivated(IWorkbenchPart)
+ */
+ public void partActivated(IWorkbenchPart part) {
+ fActivePart = part;
+ handleActivation();
+ }
+
+ /**
+ * @see IPartListener#partBroughtToTop(IWorkbenchPart)
+ */
+ public void partBroughtToTop(IWorkbenchPart part) {
+ }
+
+ /**
+ * @see IPartListener#partClosed(IWorkbenchPart)
+ */
+ public void partClosed(IWorkbenchPart part) {
+ }
+
+ /**
+ * @see IPartListener#partDeactivated(IWorkbenchPart)
+ */
+ public void partDeactivated(IWorkbenchPart part) {
+ fActivePart = null;
+ }
+
+ /**
+ * @see IPartListener#partOpened(IWorkbenchPart)
+ */
+ public void partOpened(IWorkbenchPart part) {
+ }
+
+ /*
+ * @see ShellListener#shellActivated(ShellEvent)
+ */
+ public void shellActivated(ShellEvent e) {
+ handleActivation();
+ }
+ }
+
+ class TextInputListener implements ITextInputListener {
+ public void inputDocumentAboutToBeChanged(IDocument oldInput, IDocument newInput) {
+ }
+
+ public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
+ }
+ }
+
+ /** The source page index. */
+ private int fSourcePageIndex;
+ /** The text editor. */
+ private StructuredTextEditor fTextEditor;
+
+ private PartListener partListener;
+
+
+ /*
+ * This method is just to make firePropertyChanged accessbible from some
+ * (anonomous) inner classes.
+ */
+ protected void _firePropertyChange(int property) {
+ super.firePropertyChange(property);
+ }
+
+ /**
+ * Adds the source page of the multi-page editor.
+ */
+ protected void addSourcePage() throws PartInitException {
+ try {
+ fSourcePageIndex = addPage(fTextEditor, getEditorInput());
+ setPageText(fSourcePageIndex, XSDEditorPlugin.getXSDString("_UI_TAB_SOURCE")); //$NON-NLS-1$
+ // the update's critical, to get viewer selection manager and
+ // highlighting to work
+ fTextEditor.update();
+
+ firePropertyChange(PROP_TITLE);
+
+ // Changes to the Text Viewer's document instance should also force an
+ // input refresh
+ fTextEditor.getTextViewer().addTextInputListener(new TextInputListener());
+ }
+ catch (PartInitException exception) {
+ // dispose editor
+ dispose();
+
+ throw new SourceEditingRuntimeException(ResourceHandler.getString("An_error_has_occurred_when1_ERROR_")); //$NON-NLS-1$
+ }
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.MultiPageEditorPart#createPages()
+ */
+ protected void createPages()
+ {
+ try
+ {
+ // source page MUST be created before design page, now
+ createSourcePage();
+ addSourcePage();
+ setActivePage();
+
+ // future_TODO: add a catch block here for any exception the design
+ // page throws and convert it into a more informative message.
+ }
+ catch (PartInitException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * @see org.eclipse.ui.part.MultiPageEditorPart#createSite(org.eclipse.ui.IEditorPart)
+ */
+ protected IEditorSite createSite(IEditorPart editor) {
+ IEditorSite site = null;
+ if (editor == fTextEditor) {
+ site = new MultiPageEditorSite(this, editor) {
+ /**
+ * @see org.eclipse.ui.part.MultiPageEditorSite#getActionBarContributor()
+ */
+ public IEditorActionBarContributor getActionBarContributor() {
+ IEditorActionBarContributor contributor = super.getActionBarContributor();
+ IEditorActionBarContributor multiContributor = XSDMultiPageEditorPart.this.getEditorSite().getActionBarContributor();
+// if (multiContributor instanceof XMLMultiPageEditorActionBarContributor) {
+// contributor = ((XMLMultiPageEditorActionBarContributor) multiContributor).sourceViewerActionContributor;
+// }
+ return contributor;
+ }
+ };
+ }
+ else {
+ site = super.createSite(editor);
+ }
+ return site;
+ }
+
+ /**
+ * Creates the source page of the multi-page editor.
+ */
+ protected void createSourcePage() throws PartInitException {
+ fTextEditor = createTextEditor();
+ fTextEditor.setEditorPart(this);
+
+ // Set the SourceViewerConfiguration now so the text editor won't use
+ // the default configuration first
+ // and switch to the StructuredTextViewerConfiguration later.
+ // DMW removed setSourceViewerConfiguration 3/26/2003 since added
+ // createPartControl to our text editor.
+ // fTextEditor.setSourceViewerConfiguration();
+ fTextEditor.addPropertyListener(this);
+ }
+
+ /**
+ * Method createTextEditor.
+ *
+ * @return StructuredTextEditor
+ */
+ protected StructuredTextEditor createTextEditor() {
+ return new StructuredTextEditorXML();
+ }
+
+ public void dispose()
+ {
+ IWorkbenchWindow window = getSite().getWorkbenchWindow();
+ window.getPartService().removePartListener(partListener);
+ window.getShell().removeShellListener(partListener);
+
+ getSite().getPage().removePartListener(partListener);
+ if (fTextEditor != null) {
+ fTextEditor.removePropertyListener(this);
+ }
+
+ // moved to last when added window ... seems like
+ // we'd be in danger of losing some data, like site,
+ // or something.
+ super.dispose();
+ }
+
+ /*
+ * (non-Javadoc) Saves the contents of this editor. <p> Subclasses must
+ * override this method to implement the open-save-close lifecycle for an
+ * editor. For greater details, see <code> IEditorPart </code></p>
+ *
+ * @see IEditorPart
+ */
+ public void doSave(IProgressMonitor monitor) {
+ fTextEditor.doSave(monitor);
+ // // this is a temporary way to force validation.
+ // // when the validator is a workbench builder, the following lines
+ // can be removed
+ // if (fDesignViewer != null)
+ // fDesignViewer.saveOccurred();
+
+ }
+
+ /*
+ * (non-Javadoc) Saves the contents of this editor to another object. <p>
+ * Subclasses must override this method to implement the open-save-close
+ * lifecycle for an editor. For greater details, see <code> IEditorPart
+ * </code></p>
+ *
+ * @see IEditorPart
+ */
+ public void doSaveAs() {
+ fTextEditor.doSaveAs();
+ // 253619
+ // following used to be executed here, but is
+ // now called "back" from text editor (since
+ // mulitiple paths to the performSaveAs in StructuredTextEditor.
+ //doSaveAsForStructuredTextMulitPagePart();
+ }
+
+ private void editorInputIsAcceptable(IEditorInput input) throws PartInitException {
+ if (input instanceof IFileEditorInput) {
+ // verify that it can be opened
+ CoreException[] coreExceptionArray = new CoreException[1];
+ if (fileDoesNotExist((IFileEditorInput) input, coreExceptionArray)) {
+ // todo use message formatter for {0}
+ Throwable coreException = coreExceptionArray[0];
+ if (coreException instanceof ResourceException) {
+ // I'm assuming this is always 'does not exist'
+ // we'll refresh local go mimic behavior of default
+ // editor, where the
+ // troublesome file is refreshed (and will cause it to
+ // 'disappear' from Navigator.
+ try {
+ ((IFileEditorInput) input).getFile().refreshLocal(IResource.DEPTH_ZERO, new NullProgressMonitor());
+ }
+ catch (CoreException ce) {
+ // very unlikely
+// Logger.logException(ce);
+ }
+ throw new PartInitException(ResourceHandler.getString("23concat_EXC_", (new Object[]{input.getName()}))); //$NON-NLS-1$
+ //$NON-NLS-1$ = "Resource {0} does not exist."
+ }
+ else {
+ throw new PartInitException(ResourceHandler.getString("32concat_EXC_", (new Object[]{input.getName()}))); //$NON-NLS-1$
+ //$NON-NLS-1$ = "Editor could not be open on {0}"
+ }
+ }
+ }
+ else if (input instanceof IStorageEditorInput) {
+ InputStream contents = null;
+ try {
+ contents = ((IStorageEditorInput) input).getStorage().getContents();
+ }
+ catch (CoreException noStorageExc) {
+ }
+ if (contents == null) {
+ throw new PartInitException(ResourceHandler.getString("32concat_EXC_", (new Object[]{input.getName()}))); //$NON-NLS-1$
+ }
+ else {
+ try {
+ contents.close();
+ }
+ catch (IOException e) {
+ }
+ }
+ }
+ }
+
+ // void doSaveAsForStructuredTextMulitPagePart() {
+ // setPageText(getActivePage(), fTextEditor.getTitle());
+ // setInput(fTextEditor.getEditorInput());
+ // if (fDesignViewer != null) {
+ // //fDesignViewer.setEditorInput(fTextEditor.getEditorInput());
+ // fDesignViewer.setModel(getModel());
+ // fDesignViewer.saveAsOccurred();
+ // }
+ // // even though we've set title etc., several times already!
+ // // only now is all prepared for it.
+ // firePropertyChange(IWorkbenchPart.PROP_TITLE);
+ // firePropertyChange(PROP_DIRTY);
+ // }
+ /*
+ * (non-Javadoc) Initializes the editor part with a site and input. <p>
+ * Subclasses of <code> EditorPart </code> must implement this method.
+ * Within the implementation subclasses should verify that the input type
+ * is acceptable and then save the site and input. Here is sample code:
+ * </p><pre> if (!(input instanceof IFileEditorInput)) throw new
+ * PartInitException("Invalid Input: Must be IFileEditorInput");
+ * setSite(site); setInput(editorInput); </pre>
+ */
+ protected boolean fileDoesNotExist(IFileEditorInput input, Throwable[] coreException) {
+ boolean result = false;
+ InputStream inStream = null;
+ if ((!(input.exists())) || (!(input.getFile().exists()))) {
+ result = true;
+ }
+ else {
+ try {
+ inStream = input.getFile().getContents(true);
+ }
+ catch (CoreException e) {
+ // very likely to be file not found
+ result = true;
+ coreException[0] = e;
+ }
+ finally {
+ if (input != null) {
+ try {
+ if (inStream != null) {
+ inStream.close();
+ }
+ }
+ catch (IOException e) {
+
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ public Object getAdapter(Class key) {
+ Object result = null;
+
+ // DMW: I'm bullet-proofing this because
+ // its been reported (on 4.03 version) a null pointer sometimes
+ // happens here on startup, when an editor has been left
+ // open when workbench shutdown.
+ if (fTextEditor != null) {
+ result = fTextEditor.getAdapter(key);
+ }
+ return result;
+ }
+
+ /**
+ * IExtendedMarkupEditor method
+ */
+ public Node getCaretNode() {
+ if (getTextEditor() == null)
+ return null;
+
+ return getTextEditor().getCaretNode();
+ }
+
+ /**
+ * IExtendedSimpleEditor method
+ */
+ public int getCaretPosition() {
+ if (getTextEditor() == null)
+ return -1;
+
+ return getTextEditor().getCaretPosition();
+ }
+
+ /**
+ * IExtendedSimpleEditor method
+ */
+ public IDocument getDocument() {
+ if (getTextEditor() == null)
+ return null;
+
+ return getTextEditor().getDocument();
+ }
+
+ /**
+ * IExtendedMarkupEditor method
+ */
+ public Document getDOMDocument() {
+ if (getTextEditor() == null)
+ return null;
+
+ return getTextEditor().getDOMDocument();
+ }
+
+ /**
+ * IExtendedSimpleEditor method
+ */
+ public IEditorPart getEditorPart() {
+ return this;
+ }
+
+ protected IStructuredModel getModel() {
+ IStructuredModel model = null;
+ if (fTextEditor != null)
+ model = fTextEditor.getModel();
+ return model;
+ }
+
+ protected IPreferenceStore getPreferenceStore() {
+ return XSDEditorPlugin.getPlugin().getPreferenceStore();
+ }
+
+ /**
+ * IExtendedMarkupEditor method
+ */
+ public List getSelectedNodes() {
+ if (getTextEditor() == null)
+ return null;
+ return getTextEditor().getSelectedNodes();
+ }
+
+ /**
+ * IExtendedSimpleEditor method
+ */
+ public Point getSelectionRange() {
+ if (getTextEditor() == null)
+ return new Point(-1, -1);
+
+ return getTextEditor().getSelectionRange();
+ }
+
+ public StructuredTextEditor getTextEditor() {
+ return fTextEditor;
+ }
+
+ /*
+ * (non-Javadoc) Method declared on IWorkbenchPart.
+ */
+ public String getTitle() {
+ String title = null;
+ if (getTextEditor() == null) {
+ if (getEditorInput() != null) {
+ title = getEditorInput().getName();
+ }
+ }
+ else {
+ title = getTextEditor().getTitle();
+ }
+ if (title == null) {
+ title = getPartName();
+ }
+ return title;
+ }
+
+ /*
+ * (non-Javadoc) Sets the cursor and selection state for this editor to
+ * the passage defined by the given marker. <p> Subclasses may override.
+ * For greater details, see <code> IEditorPart </code></p>
+ *
+ * @see IEditorPart
+ */
+ public void gotoMarker(IMarker marker) {
+ // (pa) 20020217 this was null when opening an editor that was
+ // already open
+ if (fTextEditor != null) {
+ IGotoMarker markerGotoer = (IGotoMarker) fTextEditor.getAdapter(IGotoMarker.class);
+ markerGotoer.gotoMarker(marker);
+ }
+ }
+
+ public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+ editorInputIsAcceptable(input);
+ try {
+ super.init(site, input);
+ if (partListener == null) {
+ partListener = new PartListener();
+ }
+ //getSite().getPage().addPartListener(partListner);
+ // we want to listen for our own activation
+ IWorkbenchWindow window = getSite().getWorkbenchWindow();
+ window.getPartService().addPartListener(partListener);
+ window.getShell().addShellListener(partListener);
+ }
+ catch (Exception e) {
+ if (e instanceof SourceEditingRuntimeException) {
+ Throwable t = ((SourceEditingRuntimeException) e).getOriginalException();
+ if (t instanceof IOException) {
+ System.out.println(t);
+ // file not found
+ }
+ }
+ }
+ setPartName(input.getName());
+ }
+
+ /*
+ * (non-Javadoc) Returns whether the "save as" operation is supported by
+ * this editor. <p> Subclasses must override this method to implement the
+ * open-save-close lifecycle for an editor. For greater details, see
+ * <code> IEditorPart </code></p>
+ *
+ * @see IEditorPart
+ */
+ public boolean isSaveAsAllowed() {
+ return fTextEditor != null && fTextEditor.isSaveAsAllowed();
+ }
+
+ /*
+ * (non-Javadoc) Returns whether the contents of this editor should be
+ * saved when the editor is closed. <p> This method returns <code> true
+ * </code> if and only if the editor is dirty ( <code> isDirty </code> ).
+ * </p>
+ */
+ public boolean isSaveOnCloseNeeded() {
+ // overriding super class since it does a lowly isDirty!
+ if (fTextEditor != null)
+ return fTextEditor.isSaveOnCloseNeeded();
+ return isDirty();
+ }
+
+ /**
+ * Notifies this multi-page editor that the page with the given id has
+ * been activated. This method is called when the user selects a different
+ * tab.
+ *
+ * @param newPageIndex
+ * the index of the activated page
+ */
+ protected void pageChange(int newPageIndex) {
+ super.pageChange(newPageIndex);
+
+ saveLastActivePageIndex(newPageIndex);
+ }
+
+ /**
+ * Posts the update code "behind" the running operation.
+ */
+ protected void postOnDisplayQue(Runnable runnable) {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
+ if (windows != null && windows.length > 0) {
+ Display display = windows[0].getShell().getDisplay();
+ display.asyncExec(runnable);
+ }
+ else
+ runnable.run();
+ }
+
+ /**
+ * Indicates that a property has changed.
+ *
+ * @param source
+ * the object whose property has changed
+ * @param propId
+ * the id of the property which has changed; property ids are
+ * generally defined as constants on the source class
+ */
+ public void propertyChanged(Object source, int propId) {
+ switch (propId) {
+ // had to implement input changed "listener" so that
+ // strucutedText could tell it containing editor that
+ // the input has change, when a 'resource moved' event is
+ // found.
+ case IEditorPart.PROP_INPUT :
+ case IEditorPart.PROP_DIRTY : {
+ if (source == fTextEditor) {
+ if (fTextEditor.getEditorInput() != getEditorInput()) {
+ setInput(fTextEditor.getEditorInput());
+ // title should always change when input changes.
+ // create runnable for following post call
+ Runnable runnable = new Runnable() {
+ public void run() {
+ _firePropertyChange(IWorkbenchPart.PROP_TITLE);
+ }
+ };
+ // Update is just to post things on the display queue
+ // (thread). We have to do this to get the dirty
+ // property to get updated after other things on the
+ // queue are executed.
+ postOnDisplayQue(runnable);
+ }
+ }
+ break;
+ }
+ case IWorkbenchPart.PROP_TITLE : {
+ // update the input if the title is changed
+ if (source == fTextEditor) {
+ if (fTextEditor.getEditorInput() != getEditorInput()) {
+ setInput(fTextEditor.getEditorInput());
+ }
+ }
+ break;
+ }
+ default : {
+ // propagate changes. Is this needed? Answer: Yes.
+ if (source == fTextEditor) {
+ firePropertyChange(propId);
+ }
+ break;
+ }
+ }
+
+ }
+
+ protected void safelySanityCheckState() {
+ // If we're called before editor is created, simply ignore since we
+ // delegate this function to our embedded TextEditor
+ if (getTextEditor() == null)
+ return;
+
+ getTextEditor().safelySanityCheckState(getEditorInput());
+
+ }
+
+ protected void saveLastActivePageIndex(int newPageIndex) {
+ // save the last active page index to preference manager
+ getPreferenceStore().setValue(XMLPreferenceNames.LAST_ACTIVE_PAGE, newPageIndex);
+ }
+
+ /**
+ * Sets the currently active page.
+ */
+ protected void setActivePage() {
+ // retrieve the last active page index from preference manager
+ int activePageIndex = getPreferenceStore().getInt(XMLPreferenceNames.LAST_ACTIVE_PAGE);
+
+ // We check this range since someone could hand edit the XML
+ // preference file to an invalid value ... which I know from
+ // experience :( ... if they do, we'll reset to default and continue
+ // rather than throw an assertion error in the setActivePage(int)
+ // method.
+ if (activePageIndex < 0 || activePageIndex >= getPageCount()) {
+ activePageIndex = fSourcePageIndex;
+ }
+ setActivePage(activePageIndex);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput)
+ */
+ protected void setInput(IEditorInput input) {
+ // If driven from the Source page, it's "model" may not be up to date
+ // with the input just yet. We'll rely on later notification from the
+ // TextViewer to set us straight
+ super.setInput(input);
+ setPartName(input.getName());
+ }
+
+ /**
+ * IExtendedMarkupEditor method
+ */
+ public IStatus validateEdit(Shell context) {
+ if (getTextEditor() == null)
+ return new Status(IStatus.ERROR, XSDEditorPlugin.PLUGIN_ID, IStatus.INFO, "", null); //$NON-NLS-1$
+
+ return getTextEditor().validateEdit(context);
+ }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDSelectionManager.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDSelectionManager.java
new file mode 100644
index 0000000000..ad2673aed1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDSelectionManager.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * 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;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+
+public class XSDSelectionManager implements ISelectionProvider, ISelectionChangedListener
+{
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+ */
+ public void addSelectionChangedListener(ISelectionChangedListener listener)
+ {
+ listenerList.add(listener);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
+ */
+ public ISelection getSelection()
+ {
+ return currentSelection;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+ */
+ public void removeSelectionChangedListener(ISelectionChangedListener listener)
+ {
+ listenerList.remove(listener);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
+ */
+ public void setSelection(ISelection selection)
+ {
+ setSelection(selection, this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ public void selectionChanged(SelectionChangedEvent event)
+ {
+ if (enableNotify)
+ {
+ setSelection(event.getSelection(), event.getSelectionProvider());
+ }
+ }
+
+
+ protected List listenerList = new ArrayList();
+ protected ISelection currentSelection;
+ protected boolean enableNotify = true;
+
+ public void setSelection(ISelection selection, ISelectionProvider source)
+ {
+ //System.out.println("SelectionManager.setSelection() " + selection + ", " + source);
+ if (enableNotify)
+ {
+ currentSelection = selection;
+ enableNotify = false;
+ try
+ {
+ SelectionChangedEvent event = new SelectionChangedEvent(source, selection);
+ List copyOfListenerList = new ArrayList(listenerList);
+ for (Iterator i = copyOfListenerList.iterator(); i.hasNext(); )
+ {
+ ISelectionChangedListener listener = (ISelectionChangedListener)i.next();
+ listener.selectionChanged(event);
+ }
+ }
+ finally
+ {
+ enableNotify = true;
+ }
+ }
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDTextEditor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDTextEditor.java
new file mode 100644
index 0000000000..0c6773f4d6
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDTextEditor.java
@@ -0,0 +1,405 @@
+/*******************************************************************************
+ * 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;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.ResourceBundle;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.wst.common.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.sse.ui.StructuredTextViewer;
+import org.eclipse.wst.sse.ui.edit.util.StructuredTextEditorActionConstants;
+import org.eclipse.wst.sse.ui.internal.openon.OpenOnAction;
+import org.eclipse.wst.sse.ui.nls.ResourceHandler;
+import org.eclipse.wst.sse.ui.view.events.INodeSelectionListener;
+import org.eclipse.wst.sse.ui.view.events.NodeSelectionChangedEvent;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xml.ui.StructuredTextEditorXML;
+import org.eclipse.wst.xsd.ui.internal.properties.section.XSDTabbedPropertySheetPage;
+import org.eclipse.wst.xsd.ui.internal.provider.CategoryAdapter;
+import org.eclipse.wst.xsd.ui.internal.provider.XSDAdapterFactoryLabelProvider;
+import org.eclipse.wst.xsd.ui.internal.provider.XSDContentProvider;
+import org.eclipse.wst.xsd.ui.internal.provider.XSDModelAdapterFactoryImpl;
+import org.eclipse.wst.xsd.ui.internal.util.SelectionAdapter;
+import org.eclipse.xsd.XSDComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+public class XSDTextEditor extends StructuredTextEditorXML implements INodeSelectionListener, ISelectionChangedListener
+{
+ protected XSDSelectionManager xsdSelectionManager;
+ protected XSDModelAdapterFactoryImpl xsdModelAdapterFactory;
+ protected static XSDAdapterFactoryLabelProvider adapterFactoryLabelProvider;
+ protected InternalSelectionProvider internalSelectionProvider = new InternalSelectionProvider();
+
+ public XSDTextEditor(XSDEditor xsdEditor)
+ {
+ super();
+ xsdSelectionManager = xsdEditor.getSelectionManager();
+ xsdSelectionManager.addSelectionChangedListener(this);
+
+ setHelpContextId(XSDEditorContextIds.XSDE_SOURCE_VIEW);
+
+ xsdModelAdapterFactory = new XSDModelAdapterFactoryImpl();
+ adapterFactoryLabelProvider = new XSDAdapterFactoryLabelProvider(xsdModelAdapterFactory);
+ }
+
+ public void dispose()
+ {
+ super.dispose();
+ xsdSelectionManager.removeSelectionChangedListener(this);
+ }
+
+ public XSDModelAdapterFactoryImpl getXSDModelAdapterFactory()
+ {
+ return xsdModelAdapterFactory;
+ }
+
+ public static XSDAdapterFactoryLabelProvider getLabelProvider()
+ {
+ return adapterFactoryLabelProvider;
+ }
+
+ public Object getAdapter(Class required) {
+
+ if (IPropertySheetPage.class.equals(required))
+ {
+ fPropertySheetPage = new XSDTabbedPropertySheetPage(getXSDEditor());
+
+ ((XSDTabbedPropertySheetPage)fPropertySheetPage).setXSDModelAdapterFactory(xsdModelAdapterFactory);
+ ((XSDTabbedPropertySheetPage)fPropertySheetPage).setSelectionManager(getXSDEditor().getSelectionManager());
+ ((XSDTabbedPropertySheetPage)fPropertySheetPage).setXSDSchema(getXSDSchema());
+
+ return fPropertySheetPage;
+ }
+ else if (IContentOutlinePage.class.equals(required))
+ {
+ if (fOutlinePage == null || fOutlinePage.getControl() == null || fOutlinePage.getControl().isDisposed())
+ {
+ XSDContentOutlinePage outlinePage = new XSDContentOutlinePage(this);
+ XSDContentProvider xsdContentProvider = new XSDContentProvider(xsdModelAdapterFactory);
+ xsdContentProvider.setXSDSchema(getXSDSchema());
+ outlinePage.setContentProvider(xsdContentProvider);
+ outlinePage.setLabelProvider(adapterFactoryLabelProvider);
+ outlinePage.setModel(getXSDSchema().getDocument());
+
+ // Update outline selection from source editor selection:
+ getViewerSelectionManager().addNodeSelectionListener(this);
+ internalSelectionProvider.addSelectionChangedListener(getViewerSelectionManager());
+ internalSelectionProvider.setEventSource(outlinePage);
+
+ fOutlinePage = outlinePage;
+ }
+ return fOutlinePage;
+ }
+
+ return super.getAdapter(required);
+ }
+
+ XSDModelQueryContributor xsdModelQueryContributor = new XSDModelQueryContributor();
+
+ protected XSDContentOutlinePage outlinePage;
+
+ /*
+ * @see StructuredTextEditor#getContentOutlinePage()
+ */
+ public IContentOutlinePage getContentOutlinePage()
+ {
+ return fOutlinePage;
+ }
+
+ // used to map selections from the outline view to the source view
+ // this class thinks of selections in terms of DOM element
+ class InternalSelectionProvider extends SelectionAdapter
+ {
+ protected Object getObjectForOtherModel(Object object)
+ {
+ Node node = null;
+
+ if (object instanceof Node)
+ {
+ node = (Node)object;
+ }
+ else if (object instanceof XSDComponent)
+ {
+ node = ((XSDComponent)object).getElement();
+ }
+ else if (object instanceof CategoryAdapter)
+ {
+ node = ((CategoryAdapter)object).getXSDSchema().getElement();
+ }
+
+ // the text editor can only accept sed nodes!
+ //
+ if (!(node instanceof XMLNode))
+ {
+ node = null;
+ }
+ return node;
+ }
+ }
+
+ public void selectionChanged(SelectionChangedEvent event)
+ {
+ // here we convert the model selection to a node selection req'd for the source view
+ //
+ internalSelectionProvider.setSelection(event.getSelection());
+ }
+
+ public void nodeSelectionChanged(NodeSelectionChangedEvent event)
+ {
+ // here we convert an node seleciton to a model selection as req'd by the other views
+ //
+ if (!event.getSource().equals(internalSelectionProvider) && getXSDEditor().getActiveEditorPage() != null)
+ {
+ Element element = null;
+ List list = event.getSelectedNodes();
+ for (Iterator i = list.iterator(); i.hasNext();)
+ {
+ Node node = (Node)i.next();
+ if (node != null)
+ {
+ if (node.getNodeType() == Node.ELEMENT_NODE)
+ {
+ element = (Element)node;
+ break;
+ }
+ else if (node.getNodeType() == Node.ATTRIBUTE_NODE)
+ {
+ element = ((Attr)node).getOwnerElement();
+ break;
+ }
+ }
+ }
+
+ Object o = element;
+ if (element != null)
+ {
+ Object modelObject = getXSDSchema().getCorrespondingComponent(element);
+ if (modelObject != null)
+ {
+ o = modelObject;
+ }
+ }
+
+ if (o != null)
+ {
+ xsdSelectionManager.setSelection(new StructuredSelection(o), internalSelectionProvider);
+ }
+ else
+ {
+ xsdSelectionManager.setSelection(new StructuredSelection(), internalSelectionProvider);
+ }
+ }
+ }
+
+
+ /*
+ * @see ITextEditor#doRevertToSaved()
+ */
+ public void doRevertToSaved()
+ {
+ super.doRevertToSaved();
+ }
+
+ /*
+ * @see StructuredTextEditor#update()
+ */
+ public void update()
+ {
+ super.update();
+ if (outlinePage != null)
+ outlinePage.setModel(getModel());
+ }
+
+ protected Composite client;
+
+ protected void addOpenOnSelectionListener()
+ {
+ getTextViewer().getTextWidget().addKeyListener(new KeyAdapter()
+ {
+ /**
+ * @see org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events.KeyEvent)
+ */
+ public void keyReleased(KeyEvent arg0)
+ {
+ if (arg0.keyCode == SWT.F3)
+ {
+ getXSDEditor().getOpenOnSelectionHelper().openOnSelection();
+ }
+ }
+
+ });
+ }
+
+ // private static Color dividerColor;
+
+ protected ISourceViewer createSourceViewer(Composite parent, IVerticalRuler verticalRuler, int styles) {
+
+ fAnnotationAccess= createAnnotationAccess();
+ fOverviewRuler= createOverviewRuler(getSharedColors());
+
+ StructuredTextViewer sourceViewer = createStructedTextViewer(parent, verticalRuler, styles);
+ initSourceViewer(sourceViewer);
+
+ // end of super createSourceViewer
+
+ //StructuredAnnotationAccess annotationAccess = new StructuredAnnotationAccess();
+ // DefaultMarkerAnnotationAccess annotationAccess = new DefaultMarkerAnnotationAccess();
+
+ // ISharedTextColors sharedColors = getTextColorsCache();
+//// fOverviewRuler = new OverviewRuler(annotationAccess, OVERVIEW_RULER_WIDTH, sharedColors);
+ // fOverviewRuler = new OverviewRuler(createAnnotationAccess(), 12, sharedColors);
+
+// fOverviewRuler.addHeaderAnnotationType(StructuredAnnotationType.ERROR);
+// fOverviewRuler.addHeaderAnnotationType(StructuredAnnotationType.WARNING);
+
+ // fSourceViewerDecorationSupport = new SourceViewerDecorationSupport(sourceViewer, fOverviewRuler, annotationAccess, sharedColors);
+ //configureSourceViewerDecorationSupport(fSourceViewerDecorationSupport);
+
+// The following method was removed
+// sourceViewer.setEditor(this);
+
+ return sourceViewer;
+ }
+
+ /*
+ * @see StructuredTextEditor#setModel(IFileEditorInput)
+ */
+ public void setModel(IFileEditorInput input)
+ {
+ super.setModel(input);
+ if (getModel() instanceof XMLModel)
+ {
+ xsdModelQueryContributor.setModel((XMLModel)getModel());
+ }
+ file = input.getFile();
+ }
+
+ protected IFile file;
+
+
+ /**
+ * Gets the xsdSchema.
+ * @return Returns a XSDSchema
+ */
+ public XSDSchema getXSDSchema()
+ {
+ return ((XSDEditor)getEditorPart()).getXSDSchema();
+ }
+
+ public XSDEditor getXSDEditor()
+ {
+ return (XSDEditor)getEditorPart();
+ }
+
+ /**
+ * @see org.eclipse.ui.texteditor.AbstractTextEditor#safelySanityCheckState(IEditorInput)
+ */
+ public void safelySanityCheckState(IEditorInput input)
+ {
+ super.safelySanityCheckState(input);
+ }
+
+ protected class WrappedOpenFileAction extends OpenOnAction
+ {
+ /**
+ * Constructor for WrappedAction.
+ * @param bundle
+ * @param prefix
+ * @param editor
+ */
+ public WrappedOpenFileAction(
+ ResourceBundle bundle,
+ String prefix,
+ ITextEditor editor)
+ {
+ super(bundle, prefix, editor);
+ }
+
+ /**
+ * @see org.eclipse.jface.action.IAction#run()
+ */
+ public void run()
+ {
+ if (!getXSDEditor().getOpenOnSelectionHelper().openOnSelection())
+ {
+ super.run();
+ }
+ }
+ }
+
+ protected WrappedOpenFileAction wrappedAction;
+ private static final String DOT = "."; //$NON-NLS-1$
+
+ /**
+ * @see org.eclipse.ui.texteditor.AbstractTextEditor#createActions()
+ */
+ protected void createActions()
+ {
+ super.createActions();
+ addOpenOnSelectionListener();
+ ResourceBundle resourceBundle = ResourceHandler.getResourceBundle(); //ResourceBundle.getBundle(RESOURCE_BUNDLE_NAME);
+
+ wrappedAction = new WrappedOpenFileAction(resourceBundle, StructuredTextEditorActionConstants.ACTION_NAME_OPEN_FILE + DOT, this);
+ setAction(StructuredTextEditorActionConstants.ACTION_NAME_OPEN_FILE, wrappedAction);
+
+ }
+
+
+ class XSDModelQueryContributor extends AbstractXSDModelQueryContributor
+ {
+ public AbstractXSDDataTypeValueExtension createXSDDataTypeValueExtension(ModelQuery modelQuery)
+ {
+ return new XSDDataTypeValueExtension(modelQuery);
+ }
+ }
+
+
+ class XSDDataTypeValueExtension extends AbstractXSDDataTypeValueExtension
+ {
+ public XSDDataTypeValueExtension(ModelQuery modelQuery)
+ {
+ super(modelQuery);
+ }
+
+ public String getId()
+ {
+ return "XSDDataTypeValueExtension";
+ }
+
+ protected XSDSchema getEnclosingXSDSchema(Element element)
+ {
+ return getXSDSchema();
+ }
+ }
+
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDURIConverter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDURIConverter.java
new file mode 100644
index 0000000000..58f639bbdb
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDURIConverter.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * 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;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.impl.URIConverterImpl;
+import org.eclipse.wst.xml.uriresolver.util.IdResolver;
+import org.eclipse.wst.xml.uriresolver.util.IdResolverImpl;
+
+public class XSDURIConverter extends URIConverterImpl
+{
+ IFile resourceFile;
+ public XSDURIConverter(IFile resourceFile)
+ {
+ super();
+ this.resourceFile = resourceFile;
+ }
+
+ /**
+ * @see org.eclipse.emf.ecore.resource.URIConverter#createInputStream(URI)
+ */
+ public InputStream createInputStream(URI uri) throws IOException
+ {
+ String scheme = uri.scheme();
+ URI mappedURI = uri;
+ if (scheme != null && !scheme.equals("file") && !scheme.equals("platform"))
+ // if ("http".equals(scheme))
+ {
+ String theURI = uri.toString();
+ IdResolver idResolver = new IdResolverImpl(theURI);
+ String result = idResolver.resolveId("/", null, theURI);
+ if (result != null)
+ {
+ mappedURI = createURI(result);
+ }
+ }
+ return super.createURLInputStream(mappedURI);
+ }
+
+ public static URI createURI(String uriString)
+ {
+ if (hasProtocol(uriString))
+ return URI.createURI(uriString);
+ else
+ return URI.createFileURI(uriString);
+ }
+
+ private static boolean hasProtocol(String uri)
+ {
+ boolean result = false;
+ if (uri != null)
+ {
+ int index = uri.indexOf(":");
+ if (index != -1 && index > 2) // assume protocol with be length 3 so that the'C' in 'C:/' is not interpreted as a protocol
+ {
+ result = true;
+ }
+ }
+ return result;
+ }
+
+ private String getRelativePathToSchema(String a, String b)
+ {
+ String result;
+ if (b.startsWith(a))
+ {
+ result = b.substring(a.length() + 1);
+ return result;
+ }
+ else
+ {
+ return b;
+ }
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AbstractAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AbstractAction.java
new file mode 100644
index 0000000000..b421416adf
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AbstractAction.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.xsd.XSDConcreteComponent;
+
+public class AbstractAction extends Action
+{
+ XSDConcreteComponent xsdConcreteComponent;
+
+ /**
+ * @param text
+ */
+ public AbstractAction(String text, XSDConcreteComponent xsdConcreteComponent)
+ {
+ super(text);
+ this.xsdConcreteComponent = xsdConcreteComponent;
+ }
+
+ /**
+ * @param text
+ * @param image
+ */
+ public AbstractAction(String text, ImageDescriptor image, XSDConcreteComponent xsdConcreteComponent)
+ {
+ super(text, image);
+ this.xsdConcreteComponent = xsdConcreteComponent;
+ }
+
+ /**
+ * @param text
+ * @param style
+ */
+ public AbstractAction(String text, int style)
+ {
+ super(text, style);
+ }
+
+ public DocumentImpl getDocument()
+ {
+ return (DocumentImpl) xsdConcreteComponent.getElement().getOwnerDocument();
+ }
+
+ public void beginRecording(String description)
+ {
+ getDocument().getModel().beginRecording(this, description);
+ }
+
+ public void endRecording()
+ {
+ DocumentImpl doc = (DocumentImpl) getDocument();
+
+ doc.getModel().endRecording(this);
+ }
+
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddAttributeAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddAttributeAction.java
new file mode 100644
index 0000000000..f1a9f3ffe3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddAttributeAction.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * 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.actions;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.wst.xsd.ui.internal.commands.AddAttributeDeclarationCommand;
+import org.eclipse.xsd.XSDConcreteComponent;
+
+public class AddAttributeAction extends AbstractAction
+{
+ protected AddAttributeDeclarationCommand command;
+
+ public AddAttributeAction(String text, XSDConcreteComponent parent)
+ {
+ super(text, parent);
+ command = new AddAttributeDeclarationCommand(parent);
+ }
+
+ public AddAttributeAction(String text, ImageDescriptor image, XSDConcreteComponent parent)
+ {
+ super(text, image, parent);
+ command = new AddAttributeDeclarationCommand(parent);
+ }
+
+ public void run()
+ {
+ beginRecording(getText());
+ command.run();
+
+ endRecording();
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddEnumsAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddEnumsAction.java
new file mode 100644
index 0000000000..ecc2f4b9d4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddEnumsAction.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * 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.actions;
+
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.xsd.ui.internal.widgets.EnumerationsDialog;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+
+/**
+ * Pattern is scoped to Enum Type
+ */
+public class AddEnumsAction extends CreateElementAction
+{
+ public AddEnumsAction(String label)
+ {
+ super(label);
+ }
+
+ public Element createAndAddNewChildElement(String token)
+ {
+ String prefix = parentNode.getPrefix();
+ prefix = (prefix == null) ? "" : (prefix + ":");
+ Element childNode = getDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + elementTag);
+ if (getAttributes() != null)
+ {
+ List attributes = getAttributes();
+ for (int i = 0; i < attributes.size(); i++)
+ {
+ DOMAttribute attr = (DOMAttribute) attributes.get(i);
+ childNode.setAttribute(attr.getName(), attr.getValue());
+ }
+ }
+ if (getRelativeNode() == null)
+ {
+ parentNode.appendChild(childNode);
+ }
+ else
+ {
+ ((Element)parentNode).insertBefore(childNode,getRelativeNode());
+ }
+ childNode.setAttribute("value", token);
+ return childNode;
+ }
+
+ public void run()
+ {
+ Display display = Display.getCurrent();
+ // if it is null, get the default one
+ display = display == null ? Display.getDefault() : display;
+ Shell parentShell = display.getActiveShell();
+ EnumerationsDialog dialog = new EnumerationsDialog(parentShell);
+ dialog.setBlockOnOpen(true);
+ int result = dialog.open();
+
+ if (result == Window.OK)
+ {
+ beginRecording(getDescription());
+
+ String text = dialog.getText();
+ String delimiter = dialog.getDelimiter();
+ StringTokenizer tokenizer = new StringTokenizer(text, delimiter);
+ while (tokenizer.hasMoreTokens())
+ {
+ String token = tokenizer.nextToken();
+ if (dialog.isPreserveWhitespace() == false)
+ {
+ token = token.trim();
+ }
+
+ Element child = createAndAddNewChildElement(token);
+ formatChild(child);
+ }
+ endRecording();
+ }
+ }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddModelGroupAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddModelGroupAction.java
new file mode 100644
index 0000000000..47773c2422
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddModelGroupAction.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.wst.xsd.ui.internal.commands.AddModelGroupCommand;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDCompositor;
+import org.eclipse.xsd.XSDConcreteComponent;
+
+
+public class AddModelGroupAction extends Action
+{
+ protected AddModelGroupCommand command;
+
+ public static String getLabel(XSDCompositor compositor)
+ {
+ String result = XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SEQUENCE"); //$NON-NLS-1$
+ if (compositor != null)
+ {
+ if (compositor == XSDCompositor.CHOICE_LITERAL)
+ {
+ result = XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CHOICE"); //$NON-NLS-1$
+ }
+ else if (compositor == XSDCompositor.ALL_LITERAL)
+ {
+ result = XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ALL");//$NON-NLS-1$
+ }
+ }
+ return result;
+ }
+
+ public AddModelGroupAction(XSDConcreteComponent parent, XSDCompositor compositor)
+ {
+ command = new AddModelGroupCommand(parent, compositor);
+ setText(getLabel(compositor));
+ }
+
+ public void run()
+ {
+ command.run();
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddSchemaNodeAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddSchemaNodeAction.java
new file mode 100644
index 0000000000..31a89501c6
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddSchemaNodeAction.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditor;
+
+
+public class AddSchemaNodeAction extends Action
+{
+ /**
+ * Constructor for AddSchemaNodeAction.
+ */
+ public AddSchemaNodeAction()
+ {
+ super();
+ }
+
+ /**
+ * Constructor for AddSchemaNodeAction.
+ * @param text
+ */
+ public AddSchemaNodeAction(String text)
+ {
+ super(text);
+ }
+
+ /**
+ * Constructor for AddSchemaNodeAction.
+ * @param text
+ * @param image
+ */
+ public AddSchemaNodeAction(String text, ImageDescriptor image)
+ {
+ super(text, image);
+ }
+
+ public void setEditor(XSDEditor editor)
+ {
+ this.editor = editor;
+ }
+
+ protected XSDEditor editor;
+
+ /**
+ * @see org.eclipse.jface.action.IAction#run()
+ */
+ public void run()
+ {
+ editor.createDefaultSchemaNode();
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/BackAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/BackAction.java
new file mode 100644
index 0000000000..0ab518d244
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/BackAction.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphViewer;
+import org.eclipse.xsd.XSDSchema;
+
+/**
+ * @author kchong
+ *
+ * <a href="mailto:kchong@ca.ibm.com">kchong@ca.ibm.com</a>
+ *
+ */
+public class BackAction extends Action
+{
+ ISelectionProvider selectionProvider;
+ XSDGraphViewer xsdGraphViewer;
+ XSDSchema xsdSchema;
+
+ /**
+ *
+ */
+ public BackAction()
+ {
+ super();
+ }
+
+ /**
+ * @param text
+ */
+ public BackAction(String text)
+ {
+ super(text);
+ }
+
+ public BackAction(String text, XSDGraphViewer viewer)
+ {
+ super(text);
+ xsdGraphViewer = viewer;
+ }
+
+ /**
+ * @param text
+ * @param image
+ */
+ public BackAction(String text, ImageDescriptor image)
+ {
+ super(text, image);
+ }
+
+ /**
+ * @param text
+ * @param style
+ */
+ public BackAction(String text, int style)
+ {
+ super(text, style);
+ }
+
+ public void setSelectionProvider(ISelectionProvider selectionProvider)
+ {
+ this.selectionProvider = selectionProvider;
+ }
+
+ public void setXSDSchema(XSDSchema xsdSchema)
+ {
+ this.xsdSchema = xsdSchema;
+ }
+
+ /*
+ * @see IAction#run()
+ */
+ public void run()
+ {
+ StructuredSelection selection = new StructuredSelection(xsdSchema);
+ selectionProvider.setSelection(selection);
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateAnnotationAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateAnnotationAction.java
new file mode 100644
index 0000000000..698d433eea
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateAnnotationAction.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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.actions;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class CreateAnnotationAction extends CreateElementAction
+{
+ XSDSchema xsdSchema;
+ Element documentationNode;
+
+ public CreateAnnotationAction()
+ {
+ super();
+ }
+
+ public CreateAnnotationAction(String text)
+ {
+ super(text);
+ }
+
+ public CreateAnnotationAction(String text, ImageDescriptor image)
+ {
+ super(text, image);
+ }
+
+ public Element createAndAddNewChildElement()
+ {
+ Element childNode = super.createAndAddNewChildElement();
+
+ String prefix = parentNode.getPrefix();
+ prefix = (prefix == null) ? "" : (prefix + ":");
+ documentationNode = getDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + XSDConstants.DOCUMENTATION_ELEMENT_TAG);
+ childNode.appendChild(documentationNode);
+
+ formatChild(childNode);
+ formatChild(documentationNode);
+ formatChild(childNode);
+
+ return childNode;
+ }
+
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateAttributeAndRequired.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateAttributeAndRequired.java
new file mode 100644
index 0000000000..6a634e2b88
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateAttributeAndRequired.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * 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.actions;
+
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.wst.sse.core.format.IStructuredFormatProcessor;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xml.core.format.FormatProcessorXML;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDFactory;
+import org.eclipse.xsd.XSDSchema;
+import org.w3c.dom.Element;
+
+/*
+ * Class which creates an Attribute and necessary Elements required before
+ * an Attribute can be added. For example, if we wish to add an Attribute
+ * to a GlobalElement without a ComplexType, a ComplexType will be created.
+ */
+public class CreateAttributeAndRequired extends Action {
+ String elementTag;
+ String label;
+ List attributes;
+ XSDSchema xsdSchema;
+ ISelectionProvider selectionProvider;
+ Object parent;
+
+ public CreateAttributeAndRequired(String elementTag, String label, List attributes, XSDSchema xsdSchema, ISelectionProvider selProvider, Object parent) {
+ super(label);
+
+ this.elementTag = elementTag;
+ this.label = label;
+ this.attributes = attributes;
+ this.xsdSchema = xsdSchema;
+ this.selectionProvider = selProvider;
+ this.parent = parent;
+ }
+
+ public void run() {
+ if (parent instanceof XSDElementDeclaration) {
+ XSDElementDeclaration ed = (XSDElementDeclaration) parent;
+ beginRecording(ed.getElement());
+ ed.setTypeDefinition(null);
+ XSDComplexTypeDefinition td = XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
+ ed.setAnonymousTypeDefinition(td);
+
+ CreateElementAction action = new CreateElementAction(label);
+ action.setElementTag(elementTag);
+ action.setAttributes(attributes);
+ action.setParentNode(td.getElement());
+ action.setRelativeNode(null);
+ action.setXSDSchema(xsdSchema);
+ action.setSelectionProvider(selectionProvider);
+ action.run();
+
+ formatChild(td.getElement());
+ if (td.getAttributeContents().size() > 0)
+ {
+ selectObject(td.getAttributeContents().get(0));
+ }
+ endRecording(ed.getElement());
+ }
+ }
+
+ protected void beginRecording(Element element) {
+ ((DocumentImpl) element.getOwnerDocument()).getModel().beginRecording(this, getText());
+ }
+
+ protected void endRecording(Element element) {
+ ((DocumentImpl) element.getOwnerDocument()).getModel().endRecording(this);
+ }
+
+ public void selectObject(Object object) {
+ if (selectionProvider != null)
+ {
+ selectionProvider.setSelection(new StructuredSelection(object));
+ }
+ }
+
+ protected void formatChild(Element child)
+ {
+ if (child instanceof XMLNode)
+ {
+ XMLModel model = ((XMLNode)child).getModel();
+ try
+ {
+ // tell the model that we are about to make a big model change
+ model.aboutToChangeModel();
+
+ IStructuredFormatProcessor formatProcessor = new FormatProcessorXML();
+ formatProcessor.formatNode(child);
+ }
+ finally
+ {
+ // tell the model that we are done with the big model change
+ model.changedModel();
+ }
+ }
+ }
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateElementAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateElementAction.java
new file mode 100644
index 0000000000..b3b34e76e2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateElementAction.java
@@ -0,0 +1,271 @@
+/*******************************************************************************
+ * 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.actions;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.wst.sse.core.format.IStructuredFormatProcessor;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xml.core.format.FormatProcessorXML;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+
+public class CreateElementAction extends Action
+{
+ protected String description;
+ protected Element parentNode;
+
+ protected ISelectionProvider selectionProvider;
+ protected XSDSchema xsdSchema;
+
+ /**
+ * Constructor for CreateElementAction.
+ */
+ public CreateElementAction()
+ {
+ super();
+ }
+ /**
+ * Constructor for CreateElementAction.
+ * @param text
+ */
+ public CreateElementAction(String text)
+ {
+ super(text);
+ }
+ /**
+ * Constructor for CreateElementAction.
+ * @param text
+ * @param image
+ */
+ public CreateElementAction(String text, ImageDescriptor image)
+ {
+ super(text, image);
+ }
+
+ public void setXSDSchema(XSDSchema xsdSchema)
+ {
+ this.xsdSchema = xsdSchema;
+ }
+
+ public void setSelectionProvider(ISelectionProvider selectionProvider)
+ {
+ this.selectionProvider = selectionProvider;
+ }
+
+ /**
+ * Gets the parentNode.
+ * @return Returns a Element
+ */
+ public Element getParentNode()
+ {
+ return parentNode;
+ }
+
+ /**
+ * Sets the parentNode.
+ * @param parentNode The parentNode to set
+ */
+ public void setParentNode(Element parentNode)
+ {
+ this.parentNode = parentNode;
+ }
+
+ boolean isGlobal = false;
+
+ public void setIsGlobal(boolean isGlobal)
+ {
+ this.isGlobal = isGlobal;
+ }
+
+ public boolean getIsGlobal()
+ {
+ return isGlobal;
+ }
+
+ protected Node relativeNode;
+ protected String elementTag;
+ public void setElementTag(String elementTag)
+ {
+ this.elementTag = elementTag;
+ }
+
+ public DocumentImpl getDocument()
+ {
+ return (DocumentImpl) getParentNode().getOwnerDocument();
+ }
+
+ public void beginRecording(String description)
+ {
+ getDocument().getModel().beginRecording(this, description);
+ }
+
+ public void endRecording()
+ {
+ DocumentImpl doc = (DocumentImpl) getDocument();
+
+ doc.getModel().endRecording(this);
+ }
+
+ public Element createAndAddNewChildElement()
+ {
+ String prefix = parentNode.getPrefix();
+ prefix = (prefix == null) ? "" : (prefix + ":");
+ Element childNode = getDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + elementTag);
+ if (getAttributes() != null)
+ {
+ List attributes = getAttributes();
+ for (int i = 0; i < attributes.size(); i++)
+ {
+ DOMAttribute attr = (DOMAttribute) attributes.get(i);
+ childNode.setAttribute(attr.getName(), attr.getValue());
+ }
+ }
+ if (getRelativeNode() == null)
+ {
+ parentNode.appendChild(childNode);
+ }
+ else
+ {
+ ((Element)parentNode).insertBefore(childNode,getRelativeNode());
+ }
+
+ if (isGlobal && getRelativeNode() == null)
+ {
+ Text textNode = getDocument().createTextNode("\n\n");
+ parentNode.appendChild(textNode);
+ }
+ else if (isGlobal && getRelativeNode() != null)
+ {
+ Text textNode = getDocument().createTextNode("\n\n");
+ parentNode.insertBefore(textNode, getRelativeNode());
+ }
+
+ formatChild(childNode);
+
+ return childNode;
+ }
+
+ protected void formatChild(Element child)
+ {
+ if (child instanceof XMLNode)
+ {
+ XMLModel model = ((XMLNode)child).getModel();
+ try
+ {
+ // tell the model that we are about to make a big model change
+ model.aboutToChangeModel();
+
+ IStructuredFormatProcessor formatProcessor = new FormatProcessorXML();
+ formatProcessor.formatNode(child);
+ }
+ finally
+ {
+ // tell the model that we are done with the big model change
+ model.changedModel();
+ }
+ }
+ }
+ /*
+ * @see IAction#run()
+ */
+ public void run()
+ {
+ beginRecording(getDescription());
+ Element child = createAndAddNewChildElement();
+ endRecording();
+
+ if (selectionProvider != null)
+ {
+ final XSDConcreteComponent comp = xsdSchema.getCorrespondingComponent(child);
+// selectionProvider.setSelection(new StructuredSelection(comp));
+
+ Runnable runnable = new Runnable()
+ {
+ public void run()
+ {
+ selectionProvider.setSelection(new StructuredSelection(comp));
+ }
+ };
+ Display.getDefault().timerExec(50,runnable);
+
+ }
+ }
+
+ /**
+ * Gets the relativeNode.
+ * @return Returns a Element
+ */
+ public Node getRelativeNode()
+ {
+ return relativeNode;
+ }
+
+ /**
+ * Sets the relativeNode.
+ * @param relativeNode The relativeNode to set
+ */
+ public void setRelativeNode(Node relativeNode)
+ {
+ this.relativeNode = relativeNode;
+ }
+
+ /**
+ * Gets the description.
+ * @return Returns a String
+ */
+ public String getDescription()
+ {
+ if (description == null)
+ {
+ return getText();
+ }
+ return description;
+ }
+
+ /**
+ * Sets the description.
+ * @param description The description to set
+ */
+ public void setDescription(String description)
+ {
+ this.description = description;
+ }
+
+ protected List attributes;
+ /**
+ * Gets the nameAttribute.
+ * @return Returns a String
+ */
+ public List getAttributes()
+ {
+ return attributes;
+ }
+
+ /**
+ * Sets the attributes.
+ * @param attributes The attributes to set
+ */
+ public void setAttributes(List attributes)
+ {
+ this.attributes = attributes;
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateGroupAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateGroupAction.java
new file mode 100644
index 0000000000..f9eadae541
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateGroupAction.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * 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.actions;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+
+public class CreateGroupAction extends CreateElementAction
+{
+ XSDSchema xsdSchema;
+
+ /**
+ * Constructor for CreateGroupAction.
+ */
+ public CreateGroupAction()
+ {
+ super();
+ }
+ /**
+ * Constructor for CreateGroupAction.
+ * @param text
+ */
+ public CreateGroupAction(String text)
+ {
+ super(text);
+ }
+ /**
+ * Constructor for CreateGroupAction.
+ * @param text
+ * @param XSDSchema
+ */
+ public CreateGroupAction(String text, XSDSchema xsdSchema)
+ {
+ super(text);
+ this.xsdSchema = xsdSchema;
+ }
+ /**
+ * Constructor for CreateGroupAction.
+ * @param text
+ * @param image
+ */
+ public CreateGroupAction(String text, ImageDescriptor image)
+ {
+ super(text, image);
+ }
+
+ public Element createAndAddNewChildElement()
+ {
+ XSDConcreteComponent xsdComp = xsdSchema.getCorrespondingComponent(parentNode);
+ Element childNode = super.createAndAddNewChildElement();
+
+ String prefix = parentNode.getPrefix();
+ prefix = (prefix == null) ? "" : (prefix + ":");
+ Element contentModelNode = getDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + XSDConstants.SEQUENCE_ELEMENT_TAG);
+ childNode.appendChild(contentModelNode);
+
+ formatChild(childNode);
+
+ xsdComp.setElement(parentNode);
+
+ return childNode;
+ }
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateIdentityConstraintsAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateIdentityConstraintsAction.java
new file mode 100644
index 0000000000..ca933f334e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateIdentityConstraintsAction.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * 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.actions;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class CreateIdentityConstraintsAction extends CreateElementAction
+{
+ XSDSchema xsdSchema;
+
+ /**
+ * Constructor for CreateIdentityConstraintsAction.
+ */
+ public CreateIdentityConstraintsAction()
+ {
+ super();
+ }
+ /**
+ * Constructor for CreateIdentityConstraintsAction.
+ * @param text
+ */
+ public CreateIdentityConstraintsAction(String text)
+ {
+ super(text);
+ }
+ /**
+ * Constructor for CreateIdentityConstraintsAction.
+ * @param text
+ * @param XSDSchema
+ */
+ public CreateIdentityConstraintsAction(String text, XSDSchema xsdSchema)
+ {
+ super(text);
+ this.xsdSchema = xsdSchema;
+ }
+ /**
+ * Constructor for CreateIdentityConstraintsAction.
+ * @param text
+ * @param image
+ */
+ public CreateIdentityConstraintsAction(String text, ImageDescriptor image)
+ {
+ super(text, image);
+ }
+
+ public Element createAndAddNewChildElement()
+ {
+ Element childNode = super.createAndAddNewChildElement();
+
+ String prefix = parentNode.getPrefix();
+ prefix = (prefix == null) ? "" : (prefix + ":");
+ Element selectorNode = getDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + XSDConstants.SELECTOR_ELEMENT_TAG);
+
+ DOMAttribute attr = new DOMAttribute(XSDConstants.XPATH_ATTRIBUTE, "");
+ selectorNode.setAttribute(attr.getName(), attr.getValue());
+
+ childNode.appendChild(selectorNode);
+
+ return childNode;
+ }
+
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateLocalComplexTypeAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateLocalComplexTypeAction.java
new file mode 100644
index 0000000000..e8b0cd027a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateLocalComplexTypeAction.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * 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.actions;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+
+public class CreateLocalComplexTypeAction extends CreateElementAction
+{
+ /**
+ * Constructor for CreateLocalComplexTypeAction.
+ */
+ public CreateLocalComplexTypeAction()
+ {
+ super();
+ }
+ /**
+ * Constructor for CreateLocalComplexTypeAction.
+ * @param text
+ */
+ public CreateLocalComplexTypeAction(String text)
+ {
+ super(text);
+ }
+ /**
+ * Constructor for CreateLocalComplexTypeAction.
+ * @param text
+ * @param image
+ */
+ public CreateLocalComplexTypeAction(String text, ImageDescriptor image)
+ {
+ super(text, image);
+ }
+
+ public Element createAndAddNewChildElement()
+ {
+ XSDConcreteComponent xsdComp = xsdSchema.getCorrespondingComponent(parentNode);
+
+ Element childNode = super.createAndAddNewChildElement();
+
+ if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.ELEMENT_ELEMENT_TAG, false))
+ {
+ parentNode.removeAttribute(XSDConstants.TYPE_ATTRIBUTE);
+ }
+
+ String prefix = parentNode.getPrefix();
+ prefix = (prefix == null) ? "" : (prefix + ":");
+ childNode.appendChild(getDocument().createElement(prefix + XSDConstants.SEQUENCE_ELEMENT_TAG));
+
+ formatChild(childNode);
+
+ xsdComp.setElement(parentNode);
+
+ return childNode;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateLocalSimpleTypeAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateLocalSimpleTypeAction.java
new file mode 100644
index 0000000000..d2e1065c41
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateLocalSimpleTypeAction.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * 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.actions;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+public class CreateLocalSimpleTypeAction extends CreateElementAction
+{
+ XSDSchema xsdSchema;
+
+ /**
+ * Constructor for CreateLocalSimpleTypeAction.
+ */
+ public CreateLocalSimpleTypeAction()
+ {
+ super();
+ }
+ /**
+ * Constructor for CreateLocalSimpleTypeAction.
+ * @param text
+ */
+ public CreateLocalSimpleTypeAction(String text)
+ {
+ super(text);
+ }
+
+ /**
+ * Constructor for CreateLocalSimpleTypeAction.
+ * @param text
+ * @param image
+ */
+ public CreateLocalSimpleTypeAction(String text, ImageDescriptor image)
+ {
+ super(text, image);
+ }
+
+ public Element createAndAddNewChildElement()
+ {
+ Element childNode = super.createAndAddNewChildElement();
+
+ if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.UNION_ELEMENT_TAG, false))
+ {
+// parentNode.removeAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE);
+ }
+ else if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.LIST_ELEMENT_TAG, false))
+ {
+ parentNode.removeAttribute(XSDConstants.ITEMTYPE_ATTRIBUTE);
+ }
+ else if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false))
+ {
+ parentNode.removeAttribute(XSDConstants.TYPE_ATTRIBUTE);
+ }
+ else if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.RESTRICTION_ELEMENT_TAG, false))
+ {
+ Node parent = parentNode.getParentNode();
+ if (XSDDOMHelper.inputEquals(parent, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+ {
+ parentNode.removeAttribute(XSDConstants.BASE_ATTRIBUTE);
+ }
+ }
+ else if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.ELEMENT_ELEMENT_TAG, false))
+ {
+ parentNode.removeAttribute(XSDConstants.TYPE_ATTRIBUTE);
+ }
+
+ formatChild(childNode);
+
+ return childNode;
+ }
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateSimpleContentAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateSimpleContentAction.java
new file mode 100644
index 0000000000..9c49936348
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateSimpleContentAction.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * 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.actions;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+/**
+ * @version 1.0
+ * @author
+ */
+public class CreateSimpleContentAction extends CreateElementAction
+{
+ XSDSchema xsdSchema;
+ //IDocument document;
+
+ /**
+ * Constructor for CreateSimpleContentAction.
+ */
+ public CreateSimpleContentAction()
+ {
+ super();
+ }
+ /**
+ * Constructor for CreateSimpleContentAction.
+ * @param text
+ */
+ public CreateSimpleContentAction(String text)
+ {
+ super(text);
+ }
+ /**
+ * Constructor for CreateSimpleContentAction.
+ * @param text
+ * @param XSDSchema
+ */
+ public CreateSimpleContentAction(String text, XSDSchema xsdSchema)
+ {
+ super(text);
+ this.xsdSchema = xsdSchema;
+ }
+ /**
+ * Constructor for CreateSimpleContentAction.
+ * @param text
+ * @param image
+ */
+ public CreateSimpleContentAction(String text, ImageDescriptor image)
+ {
+ super(text, image);
+ }
+
+ public Element createAndAddNewChildElement()
+ {
+ Element childNode = super.createAndAddNewChildElement();
+
+ String prefix = parentNode.getPrefix();
+ prefix = (prefix == null) ? "" : (prefix + ":");
+ Element derivedByNode = getDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + "restriction");
+ childNode.appendChild(derivedByNode);
+ Element sequence = null;
+
+ if (XSDDOMHelper.inputEquals(childNode, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+ {
+ sequence = getDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + "sequence");
+ derivedByNode.appendChild(sequence);
+ }
+
+ // now add the required base attribute for the derived by node
+ TypesHelper typesHelper = new TypesHelper(xsdSchema);
+ List listOfCT = typesHelper.getUserComplexTypeNamesList();
+ String firstType = "";
+ if (listOfCT.size() > 0)
+ {
+ firstType = (String)(listOfCT).get(0);
+ }
+ DOMAttribute attr = new DOMAttribute(XSDConstants.BASE_ATTRIBUTE, firstType);
+ derivedByNode.setAttribute(attr.getName(), attr.getValue());
+
+ formatChild(derivedByNode);
+ if (sequence != null)
+ {
+ formatChild(sequence);
+ formatChild(derivedByNode);
+ }
+ formatChild(childNode);
+
+
+ return childNode;
+ }
+
+ /*
+ * @see IAction#run()
+ */
+ public void run()
+ {
+ ArrayList message = new ArrayList();
+ beginRecording(getDescription());
+
+ Element child = createAndAddNewChildElement();
+ endRecording();
+
+ NodeList children = parentNode.getChildNodes();
+/*
+ for (int i=0; i < children.getLength(); i++)
+ {
+ Node aChild = children.item(i);
+ if (aChild != null && aChild instanceof Element)
+ {
+ if (XSDDOMHelper.inputEquals((Element)aChild, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false) ||
+ XSDDOMHelper.inputEquals((Element)aChild, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, true))
+ {
+ // REMOVE ATTRIBUTES AND ATTRIBUTE GROUP REFS FROM COMPLEX TYPES LIST OF CHILDREN
+ message.addElement(new ModelMessage
+ (XSDPlugin.getSchemaString("_INFO_REMOVE_ATTRIBUTE_FROM") +
+ " <" + parentNode.getAttribute("name") + ">", aChild));
+ }
+ }
+ }
+ domainModel.createMarkers(message);
+*/
+ for (int i=0; i < children.getLength(); i++)
+ {
+ Node aChild = children.item(i);
+ if (aChild != null && aChild instanceof Element)
+ {
+ if (XSDDOMHelper.inputEquals((Element)aChild, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false) ||
+ XSDDOMHelper.inputEquals((Element)aChild, XSDConstants.ATTRIBUTE_ELEMENT_TAG, true) ||
+ XSDDOMHelper.inputEquals((Element)aChild, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false) ||
+ XSDDOMHelper.inputEquals((Element)aChild, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, true))
+ {
+ // REMOVE ATTRIBUTES AND ATTRIBUTE GROUP REFS FROM COMPLEX TYPES LIST OF CHILDREN
+// KCPort TODO
+// ErrorMessage aTask = new ErrorMessage();
+// Node parent = aChild;
+// if (parent instanceof NodeImpl)
+// {
+// aTask.setModelObject(parent);
+// }
+// aTask.setLocalizedMessage(XSDPlugin.getSchemaString("_INFO_REMOVE_ATTRIBUTE_FROM") + " <" + parentNode.getAttribute("name") + ">");
+// message.add(aTask);
+ }
+ }
+ }
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateSimpleTypeAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateSimpleTypeAction.java
new file mode 100644
index 0000000000..5e5c29cce1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateSimpleTypeAction.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * 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.actions;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+public class CreateSimpleTypeAction extends CreateElementAction
+{
+ /**
+ *
+ */
+ public CreateSimpleTypeAction()
+ {
+ super();
+ }
+
+ /**
+ * @param text
+ */
+ public CreateSimpleTypeAction(String text)
+ {
+ super(text);
+ }
+
+ public CreateSimpleTypeAction(String text, XSDSchema xsdSchema)
+ {
+ super(text);
+ this.xsdSchema = xsdSchema;
+ }
+
+ /**
+ * @param text
+ * @param image
+ */
+ public CreateSimpleTypeAction(String text, ImageDescriptor image)
+ {
+ super(text, image);
+ }
+
+ public Element createAndAddNewChildElement()
+ {
+ XSDConcreteComponent xsdComp = xsdSchema.getCorrespondingComponent(parentNode);
+ Element childNode = super.createAndAddNewChildElement();
+
+ String prefix = parentNode.getPrefix();
+ prefix = (prefix == null) ? "" : (prefix + ":");
+ Element contentModelNode = getDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + XSDConstants.RESTRICTION_ELEMENT_TAG);
+ contentModelNode.setAttribute(XSDConstants.BASE_ATTRIBUTE, prefix + "string");
+ childNode.appendChild(contentModelNode);
+
+ formatChild(childNode);
+
+ xsdComp.setElement(parentNode);
+
+ return childNode;
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/DOMAttribute.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/DOMAttribute.java
new file mode 100644
index 0000000000..5580b40fc4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/DOMAttribute.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * 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.actions;
+
+// TODO Remove this
+
+/**
+ * @version 1.0
+ * @author
+ */
+public class DOMAttribute
+{
+ /**
+ * Constructor for DOMAttribute.
+ */
+ public DOMAttribute()
+ {
+ super();
+ }
+
+ /**
+ * Constructor for DOMAttribute.
+ */
+ public DOMAttribute(String name, String value)
+ {
+ super();
+ this.name = name;
+ this.value = value;
+ }
+
+ protected String name, value;
+ /**
+ * Gets the value.
+ * @return Returns a String
+ */
+ public String getValue()
+ {
+ return value;
+ }
+
+ /**
+ * Sets the value.
+ * @param value The value to set
+ */
+ public void setValue(String value)
+ {
+ this.value = value;
+ }
+
+ /**
+ * Gets the name.
+ * @return Returns a String
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+ /**
+ * Sets the name.
+ * @param name The name to set
+ */
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/DeleteAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/DeleteAction.java
new file mode 100644
index 0000000000..097a4a3fae
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/DeleteAction.java
@@ -0,0 +1,237 @@
+/*******************************************************************************
+ * 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.actions;
+
+import java.util.Iterator;
+
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.actions.SelectionListenerAction;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.refactor.delete.BaseGlobalCleanup;
+import org.eclipse.wst.xsd.ui.internal.refactor.delete.GlobalAttributeCleanup;
+import org.eclipse.wst.xsd.ui.internal.refactor.delete.GlobalAttributeGroupCleanup;
+import org.eclipse.wst.xsd.ui.internal.refactor.delete.GlobalElementCleanup;
+import org.eclipse.wst.xsd.ui.internal.refactor.delete.GlobalGroupCleanup;
+import org.eclipse.wst.xsd.ui.internal.refactor.delete.GlobalSimpleOrComplexTypeCleanup;
+import org.eclipse.wst.xsd.ui.internal.refactor.delete.XSDExternalFileCleanup;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDImport;
+import org.eclipse.xsd.XSDInclude;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDRedefine;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Node;
+
+
+public class DeleteAction extends SelectionListenerAction
+{
+ protected IEditorPart editor;
+ protected XSDSchema xsdSchema;
+ protected ISelectionProvider selectionProvider;
+ protected XSDConcreteComponent parentXSDComponent;
+
+ /**
+ * Constructor for DeleteAction.
+ * @param text
+ */
+ public DeleteAction(String text, IEditorPart editor, XSDSchema xsdSchema)
+ {
+ super(text);
+ this.editor = editor;
+ this.xsdSchema = xsdSchema;
+ }
+
+ public void setSelectionProvider(ISelectionProvider selectionProvider)
+ {
+ this.selectionProvider = selectionProvider;
+ }
+
+ public IEditorPart getEditor()
+ {
+ return editor;
+ }
+
+ public XSDSchema getSchema()
+ {
+ return xsdSchema;
+ }
+
+ public void setXSDSchema(XSDSchema xsdSchema)
+ {
+ this.xsdSchema = xsdSchema;
+ }
+
+ /*
+ * @see IAction#run()
+ */
+ public void run()
+ {
+ IStructuredSelection selection = getStructuredSelection();
+
+ if (selection.isEmpty())
+ {
+ return;
+ }
+
+ Iterator iter = selection.iterator();
+ DocumentImpl doc = null;
+ while (iter.hasNext())
+ {
+ Object obj = iter.next();
+ Node node = null;
+ if (obj instanceof Node)
+ {
+ node = (Node)obj;
+ }
+ else if (obj instanceof XSDConcreteComponent)
+ {
+ xsdSchema = ((XSDConcreteComponent)obj).getSchema();
+
+ node = ((XSDConcreteComponent)obj).getElement();
+ if (node instanceof XMLNode)
+ {
+ parentXSDComponent = ((XSDConcreteComponent)obj).getContainer();
+
+ if (parentXSDComponent instanceof XSDParticle)
+ {
+ // need to get the modelGroup
+ parentXSDComponent = parentXSDComponent.getContainer();
+ }
+ }
+
+ }
+ if (!XSDDOMHelper.inputEquals(node, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+ {
+ if (node instanceof XMLNode)
+ {
+ if (doc == null)
+ {
+ doc = (DocumentImpl) node.getOwnerDocument();
+ doc.getModel().beginRecording(this, XSDEditorPlugin.getXSDString("_UI_ACTION_DELETE_NODES"));
+ }
+
+ boolean refresh = cleanupReferences(node);
+ if (node != null)
+ {
+ XSDDOMHelper.removeNodeAndWhitespace(node);
+ }
+
+ // Workaround to reset included elements in XSD model
+ if (refresh)
+ {
+ // getEditor().reparseSchema();
+ // getEditor().getGraphViewer().setSchema(getEditor().getXSDSchema());
+ }
+ }
+ }
+ }
+
+ if (parentXSDComponent != null && selectionProvider != null)
+ {
+ selectionProvider.setSelection(new StructuredSelection(parentXSDComponent));
+ }
+
+ if (doc != null)
+ {
+ doc.getModel().endRecording(this);
+ }
+ }
+
+ protected boolean cleanupReferences(Node deletedNode)
+ {
+ boolean refresh = false;
+ XSDConcreteComponent comp = getSchema().getCorrespondingComponent(deletedNode);
+
+ if (comp instanceof XSDInclude ||
+ comp instanceof XSDImport ||
+ comp instanceof XSDRedefine)
+ {
+ XSDSchema resolvedSchema = ((XSDSchemaDirective)comp).getResolvedSchema();
+ XSDSchema referencedSchema = null;
+ if (comp instanceof XSDInclude)
+ {
+ referencedSchema = ((XSDInclude)comp).getIncorporatedSchema();
+ refresh = true;
+ }
+ else if (comp instanceof XSDRedefine)
+ {
+ referencedSchema = ((XSDRedefine)comp).getIncorporatedSchema();
+ refresh = true;
+ }
+ else if (comp instanceof XSDImport)
+ {
+ XSDImport imp = (XSDImport)comp;
+ referencedSchema = ((XSDImport)comp).getResolvedSchema();
+ refresh = true;
+ }
+
+ if (referencedSchema != null)
+ {
+ XSDExternalFileCleanup cleanHelper = new XSDExternalFileCleanup(referencedSchema);
+ cleanHelper.visitSchema(getSchema());
+ // populate messages
+// TODO getEditor().createTasksInTaskList(cleanHelper.getMessages());
+ }
+ if (comp instanceof XSDImport)
+ {
+ TypesHelper typesHelper = new TypesHelper(getSchema());
+ typesHelper.updateMapAfterDelete((XSDImport)comp);
+ }
+ }
+ else if (getSchema().equals(comp.getContainer()))
+ {
+ BaseGlobalCleanup cleanHelper = null;
+ // Only need to clean up references if the component being deleted is global scoped
+ if (comp instanceof XSDElementDeclaration)
+ {
+ cleanHelper = new GlobalElementCleanup(comp);
+ }
+ else if (comp instanceof XSDModelGroupDefinition)
+ {
+ cleanHelper = new GlobalGroupCleanup(comp);
+ }
+ else if (comp instanceof XSDTypeDefinition)
+ {
+ cleanHelper = new GlobalSimpleOrComplexTypeCleanup(comp);
+ }
+ else if (comp instanceof XSDAttributeDeclaration)
+ {
+ cleanHelper = new GlobalAttributeCleanup(comp);
+ }
+ else if (comp instanceof XSDAttributeGroupDefinition)
+ {
+ cleanHelper = new GlobalAttributeGroupCleanup(comp);
+ }
+
+
+ if (cleanHelper != null)
+ {
+ cleanHelper.visitSchema(getSchema());
+ }
+ }
+ return refresh;
+ }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ISchemaEditorActionConstants.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ISchemaEditorActionConstants.java
new file mode 100644
index 0000000000..6033b722de
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ISchemaEditorActionConstants.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * 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.actions;
+
+public interface ISchemaEditorActionConstants
+{
+ public static final String RETARGET_VALIDATE_SCHEMA_ACTION_ID = "retargetValidateSchemaAction"; //$NON-NLS-1$
+ public static final String RETARGET_RELOAD_DEPENDENCIES_ACTION_ID = "retargetReloadDependenciesAction"; //$NON-NLS-1$
+ public static final String RETARGET_GENERATE_JAVA_ACTION_ID = "retargetGenerateJavaAction"; //$NON-NLS-1$
+ public static final String RETARGET_GENERATE_DTD_ACTION_ID = "retargetGenerateDtdAction"; //$NON-NLS-1$
+ public static final String RETARGET_GENERATE_XML_ACTION_ID = "retargetGenerateXMLAction"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/MakeAnonymousGlobal.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/MakeAnonymousGlobal.java
new file mode 100644
index 0000000000..9a9638a03f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/MakeAnonymousGlobal.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * 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.actions;
+
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+public class MakeAnonymousGlobal extends CreateElementAction
+{
+ XSDSchema xsdSchema;
+ Element type;
+
+ public MakeAnonymousGlobal(String text, Element type, XSDSchema xsdSchema)
+ {
+ super(text);
+ this.xsdSchema = xsdSchema;
+ this.type = type;
+ isGlobal = true;
+ }
+
+ public Element createAndAddNewChildElement()
+ {
+ // create the new global type
+ Element childNode = super.createAndAddNewChildElement();
+ // add the anonymous type's children to the new global type
+ if (type.hasChildNodes())
+ {
+ NodeList nodes = type.getChildNodes();
+ // use clones so we don't have a refresh problem
+ for (int i = 0; i < nodes.getLength(); i++)
+ {
+ Node node = nodes.item(i);
+ childNode.appendChild(node.cloneNode(true));
+ }
+ }
+
+ // clean up the element whose type was anonymous
+ // and set its type attribute to the new global type
+ TypesHelper helper = new TypesHelper(xsdSchema);
+ String prefix = helper.getPrefix(xsdSchema.getTargetNamespace(), true);
+ helper = null;
+
+ Element parentElementOfAnonymousType = (Element)type.getParentNode();
+
+ parentElementOfAnonymousType.removeChild(type);
+ parentElementOfAnonymousType.setAttribute(XSDConstants.TYPE_ATTRIBUTE, prefix + childNode.getAttribute(XSDConstants.NAME_ATTRIBUTE));
+
+ formatChild(childNode);
+
+ return childNode;
+ }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ModelMessage.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ModelMessage.java
new file mode 100644
index 0000000000..aa30618d02
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ModelMessage.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.actions;
+
+import org.w3c.dom.Node;
+
+public class ModelMessage
+{
+ protected String message;
+ protected Node node;
+
+ public ModelMessage(String message, Node node)
+ {
+ this.message = message;
+ this.node = node;
+ }
+
+ public String getMessage()
+ {
+ return message;
+ }
+
+ public Node getNode()
+ {
+ return node;
+ }
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/MoveAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/MoveAction.java
new file mode 100644
index 0000000000..741f7d0dd2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/MoveAction.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * 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.actions;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+
+public class MoveAction extends Action
+{
+ protected List selectedNodes;
+ protected Node parentNode;
+ protected Node refChild;
+
+ /**
+ * Constructor for DeleteAction.
+ * @param text
+ */
+ public MoveAction(Node parentNode, List selectedNodes, Node refChild)
+ {
+ this.parentNode = parentNode;
+ this.selectedNodes = selectedNodes;
+ this.refChild = refChild;
+ }
+
+ public MoveAction(XSDConcreteComponent parentComponent, List selectedComponents, XSDConcreteComponent refChildComponent)
+ {
+ selectedNodes = new ArrayList(selectedComponents.size());
+ for (Iterator i = selectedComponents.iterator(); i.hasNext(); )
+ {
+ XSDConcreteComponent concreteComponent = (XSDConcreteComponent)i.next();
+ selectedNodes.add(concreteComponent.getElement());
+ }
+ parentNode = parentComponent.getElement();
+ refChild = refChildComponent != null ? refChildComponent.getElement() : null;
+ }
+
+ public boolean canMove()
+ {
+ // TODO... there are likely more restriction to consider here
+ boolean result = true;
+ for (Iterator i = selectedNodes.iterator(); i.hasNext(); )
+ {
+ Node child = (Node)i.next();
+ if (isDecendantOrSelf(child, parentNode))
+ {
+ result = false;
+ break;
+ }
+ }
+ return result;
+ }
+
+ protected boolean isDecendantOrSelf(Node potentialParent, Node node)
+ {
+ boolean result = false;
+ while (node != null)
+ {
+ if (node == potentialParent)
+ {
+ result = true;
+ break;
+ }
+ node = node.getParentNode();
+ }
+ return result;
+ }
+
+
+ protected void beginRecording()
+ {
+ XMLModel model = getModel();
+ if (model != null)
+ {
+ model.beginRecording(this, "Move");
+ }
+ }
+
+ protected void endRecording()
+ {
+ XMLModel model = getModel();
+ if (model != null)
+ {
+ model.endRecording(this);
+ }
+ }
+
+ protected XMLModel getModel()
+ {
+ XMLModel model = null;
+ if (parentNode instanceof XMLNode)
+ {
+ model = ((XMLNode)parentNode).getModel();
+ }
+ return model;
+ }
+
+
+
+ /*
+ * @see IAction#run()
+ */
+ public void run()
+ {
+ beginRecording();
+ try
+ {
+ for (Iterator i = selectedNodes.iterator(); i.hasNext(); )
+ {
+ Node child = (Node)i.next();
+ repositionBefore(parentNode, child, refChild);
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ endRecording();
+ }
+
+
+ public void repositionBefore(Node parent, Node child, Node refChild)
+ {
+ // TODO... when the refChild (inserting as the last element) we need to
+ // special case the way we preserve indentation
+ Node oldParent = child.getParentNode();
+ if (oldParent != null && refChild != child)
+ {
+ // consider any indentation text node that preceeds the child
+ //
+ Node textNode = isWhitespaceTextNode(child.getPreviousSibling()) ? child.getPreviousSibling() : null;
+
+ // remove the child
+ //
+ oldParent.removeChild(child);
+
+ // Instead of inserting the child immediatlely infront of the refChild, we first check to see if there
+ // is an indentation text node preceeding the refChild. If we find such a node, we perform the insertion
+ // so that the child is inserted before the indentation text node.
+ Node adjustedRefChild = refChild;
+ if (refChild != null && isWhitespaceTextNode(refChild.getPreviousSibling()))
+ {
+ adjustedRefChild = refChild.getPreviousSibling();
+ }
+
+ // reposition the child and any indentation text node
+ //
+ parent.insertBefore(child, adjustedRefChild);
+ if (textNode != null)
+ {
+ oldParent.removeChild(textNode);
+ parent.insertBefore(textNode, child);
+ }
+ }
+ }
+
+
+ protected static boolean isWhitespaceTextNode(Node node)
+ {
+ boolean result = false;
+ if (node != null && node.getNodeType() == Node.TEXT_NODE)
+ {
+ String data = ((Text)node).getData();
+ result = (data == null || data.trim().length() == 0);
+ }
+ return result;
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/OpenSchemaAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/OpenSchemaAction.java
new file mode 100644
index 0000000000..6ba1ee9e9d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/OpenSchemaAction.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.wst.xml.uriresolver.util.URIHelper;
+import org.eclipse.wst.xsd.ui.internal.util.OpenOnSelectionHelper;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.eclipse.xsd.impl.XSDImportImpl;
+import org.w3c.dom.Node;
+
+
+public class OpenSchemaAction extends Action
+{
+ XSDConcreteComponent component;
+ public OpenSchemaAction(String label, XSDConcreteComponent component)
+ {
+ super(label);
+ this.component = component;
+ }
+
+ public void run()
+ {
+ if (component != null)
+ {
+ revealObject();
+ }
+ }
+
+ boolean lastResult = false;
+ protected boolean revealObject()
+ {
+ Node element = component.getElement();
+ String schemaLocation = "";
+ XSDSchemaDirective dir;
+ if (component instanceof XSDSchemaDirective)
+ {
+ dir = (XSDSchemaDirective)component;
+ // force load of imported schema
+ if (dir instanceof XSDImportImpl)
+ {
+ ((XSDImportImpl)dir).importSchema();
+ }
+ if (dir.getResolvedSchema() != null)
+ {
+ schemaLocation = URIHelper.removePlatformResourceProtocol(dir.getResolvedSchema().getSchemaLocation());
+ if (schemaLocation != null)
+ {
+ OpenOnSelectionHelper.openXSDEditor(schemaLocation);
+ }
+ }
+ }
+ return lastResult;
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ReloadDependenciesAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ReloadDependenciesAction.java
new file mode 100644
index 0000000000..73e239f2f1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ReloadDependenciesAction.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditor;
+
+
+public class ReloadDependenciesAction extends Action
+{
+ /**
+ * Constructor for ReloadDependenciesAction.
+ */
+ public ReloadDependenciesAction()
+ {
+ super();
+ }
+
+ /**
+ * Constructor for ReloadDependenciesAction.
+ * @param text
+ */
+ public ReloadDependenciesAction(String text)
+ {
+ super(text);
+ }
+
+ /**
+ * Constructor for ReloadDependenciesAction.
+ * @param text
+ * @param image
+ */
+ public ReloadDependenciesAction(String text, ImageDescriptor image)
+ {
+ super(text, image);
+ }
+
+ public void setEditor(XSDEditor editor)
+ {
+ this.editor = editor;
+ }
+
+ protected XSDEditor editor;
+
+ public void run()
+ {
+ editor.reparseSchema();
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/SetBaseTypeAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/SetBaseTypeAction.java
new file mode 100644
index 0000000000..27bbabbee7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/SetBaseTypeAction.java
@@ -0,0 +1,384 @@
+/*******************************************************************************
+ * 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.actions;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.sse.core.format.IStructuredFormatProcessor;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xml.core.format.FormatProcessorXML;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.wst.xsd.ui.internal.widgets.SetBaseTypeDialog;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+public class SetBaseTypeAction extends Action
+{
+ XSDSchema xsdSchema;
+ Element element;
+ String type = "";
+ String derivedByString = "";
+ XSDDOMHelper domHelper;
+
+ /**
+ * Constructor for SetBaseTypeAction.
+ */
+ public SetBaseTypeAction()
+ {
+ super();
+ domHelper = new XSDDOMHelper();
+ }
+ /**
+ * Constructor for SetBaseTypeAction.
+ * @param arg0
+ */
+ public SetBaseTypeAction(String arg0)
+ {
+ super(arg0);
+ domHelper = new XSDDOMHelper();
+ }
+ /**
+ * Constructor for SetBaseTypeAction.
+ * @param arg0
+ * @param arg1
+ */
+ public SetBaseTypeAction(String arg0, ImageDescriptor arg1)
+ {
+ super(arg0, arg1);
+ domHelper = new XSDDOMHelper();
+ }
+ /**
+ * Constructor for SetBaseTypeAction.
+ * @param arg0
+ * @param arg1
+ */
+ public SetBaseTypeAction(String arg0, int arg1)
+ {
+ super(arg0, arg1);
+ domHelper = new XSDDOMHelper();
+ }
+
+
+ public void setXSDSchema(XSDSchema schema)
+ {
+ this.xsdSchema = schema;
+ }
+
+ public void setComplexTypeElement(Element element)
+ {
+ this.element = element;
+ }
+
+ public void setType(String type)
+ {
+ this.type = type;
+ }
+
+ public void setDerivedBy(String derivedByString)
+ {
+ this.derivedByString = derivedByString;
+ }
+
+ public void run()
+ {
+ Display display = Display.getCurrent();
+ // if it is null, get the default one
+ display = display == null ? Display.getDefault() : display;
+ Shell parentShell = display.getActiveShell();
+
+ SetBaseTypeDialog dialog = new SetBaseTypeDialog(parentShell, xsdSchema, element);
+ dialog.setBlockOnOpen(true);
+
+ Element contentModelElement = domHelper.getContentModelFromParent(element);
+ if (contentModelElement != null)
+ {
+ // to set the current values to show in the dialog
+ if (XSDDOMHelper.inputEquals(contentModelElement, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false) ||
+ XSDDOMHelper.inputEquals(contentModelElement, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false))
+ {
+ Element derivedByElement = domHelper.getDerivedByElementFromComplexType(element);
+ if (derivedByElement != null)
+ {
+ String currentBaseType = derivedByElement.getAttribute(XSDConstants.BASE_ATTRIBUTE);
+ dialog.setCurrentBaseType(currentBaseType);
+ dialog.setCurrentDerivedBy(derivedByElement.getLocalName());
+ }
+ else
+ {
+ dialog.setCurrentBaseType("");
+ dialog.setCurrentDerivedBy("");
+ }
+ }
+ }
+
+ int result = dialog.open();
+
+ if (result == Window.OK)
+ {
+ type = dialog.getBaseType();
+ derivedByString = dialog.getDerivedBy();
+ performAction();
+ }
+ }
+
+ XSDTypeDefinition newTypeDefinition = null;
+ public XSDTypeDefinition getXSDTypeDefinition()
+ {
+ return newTypeDefinition;
+ }
+
+ public void performAction()
+ {
+ TypesHelper helper = new TypesHelper(xsdSchema);
+
+ XSDConcreteComponent xsdComp = xsdSchema.getCorrespondingComponent(element);
+
+ Element contentModelElement = domHelper.getContentModelFromParent(element);
+ boolean contentModelExists = true;
+ if (contentModelElement == null)
+ {
+ contentModelExists = false;
+ }
+
+// get XSD component of the new type chosen
+ newTypeDefinition = null;
+ for (Iterator i = xsdSchema.getTypeDefinitions().iterator(); i.hasNext(); )
+ {
+ XSDTypeDefinition typeDef = (XSDTypeDefinition)i.next();
+ if (typeDef.getQName().equals(type))
+ {
+ newTypeDefinition = typeDef;
+ break;
+ }
+ }
+
+ boolean needsComplexContent = false;
+ boolean needsSimpleContent = false;
+
+ if (helper.getBuiltInTypeNamesList().contains(type) ||
+ helper.getUserSimpleTypeNamesList().contains(type))
+// if (newTypeDefinition instanceof XSDSimpleTypeDefinition)
+ {
+ needsSimpleContent = true;
+ }
+ else if (newTypeDefinition instanceof XSDComplexTypeDefinition)
+ {
+ needsComplexContent = true;
+// XSDComplexTypeDefinition newCTObj = (XSDComplexTypeDefinition)newTypeDefinition;
+// XSDContentTypeCategory category = newCTObj.getContentTypeCategory();
+ }
+
+ beginRecording(XSDEditorPlugin.getXSDString("_UI_LABEL_SET_BASE_TYPE"), element);
+ String prefix = element.getPrefix();
+ prefix = (prefix == null) ? "" : (prefix + ":");
+
+ DOMAttribute attr = new DOMAttribute(XSDConstants.BASE_ATTRIBUTE, type);
+ boolean hasChildrenElements = domHelper.hasElementChildren(element);
+ if (!contentModelExists) // if no content model exists, then add the new nodes
+ {
+ if (helper.getBuiltInTypeNamesList().contains(type) ||
+ helper.getUserSimpleTypeNamesList().contains(type))
+ {
+ updateModelAndDerivedByKind(prefix + XSDConstants.SIMPLECONTENT_ELEMENT_TAG, prefix + XSDConstants.EXTENSION_ELEMENT_TAG, attr);
+ }
+ else if (helper.getUserComplexTypeNamesList().contains(type))
+ {
+ if (derivedByString.equals("")) // default
+ {
+ derivedByString = XSDConstants.EXTENSION_ELEMENT_TAG;
+ }
+ Element derivedByElement = updateModelAndDerivedByKind(prefix + XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, prefix + derivedByString, attr);
+ Element newModelGroupElement = element.getOwnerDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + XSDConstants.SEQUENCE_ELEMENT_TAG);
+ derivedByElement.appendChild(newModelGroupElement);
+ formatChild(derivedByElement);
+ }
+ }
+ else // else there is a content model
+ {
+ if (type.equals("")) // the chosen type is blank, ie. there is no base type
+ {
+ Element derivedByElement = domHelper.getDerivedByElementFromComplexType(element);
+ Element sourceContentModelElement = domHelper.getContentModelFromParent(derivedByElement);
+ // Retain the content model if there is one from the complex or simple content derive by element
+ if (XSDDOMHelper.inputEquals(sourceContentModelElement, XSDConstants.SEQUENCE_ELEMENT_TAG, false) ||
+ XSDDOMHelper.inputEquals(sourceContentModelElement, XSDConstants.CHOICE_ELEMENT_TAG, false) ||
+ XSDDOMHelper.inputEquals(sourceContentModelElement, XSDConstants.ALL_ELEMENT_TAG, false))
+ {
+ Element newNode = domHelper.cloneElement(element, sourceContentModelElement);
+ element.replaceChild(newNode, contentModelElement);
+ formatChild(element);
+ }
+ else // otherwise just add the nodes
+ {
+ XSDDOMHelper.removeNodeAndWhitespace(contentModelElement);
+ Element newSequenceElement = element.getOwnerDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + XSDConstants.SEQUENCE_ELEMENT_TAG);
+ element.appendChild(newSequenceElement);
+ formatChild(newSequenceElement);
+ }
+ }
+ else // a base type is specified
+ {
+ Element sequenceChoiceOrAllElement = null; // copy the model to reposition it off of the new derived by element
+ if (XSDDOMHelper.inputEquals(contentModelElement, XSDConstants.SEQUENCE_ELEMENT_TAG, false) ||
+ XSDDOMHelper.inputEquals(contentModelElement, XSDConstants.CHOICE_ELEMENT_TAG, false) ||
+ XSDDOMHelper.inputEquals(contentModelElement, XSDConstants.ALL_ELEMENT_TAG, false))
+ {
+ sequenceChoiceOrAllElement = domHelper.cloneElement(element, contentModelElement);
+ }
+
+ if (needsComplexContent)
+ {
+ if (!(XSDDOMHelper.inputEquals(contentModelElement, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false)))
+ {
+ domHelper.changeContentModel(element, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, sequenceChoiceOrAllElement);
+ contentModelElement = domHelper.getContentModelFromParent(element);
+ }
+ }
+ if (needsSimpleContent)
+ {
+ if (!(XSDDOMHelper.inputEquals(contentModelElement, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false)))
+ {
+ // we don't want to append the element content to a simple content
+ sequenceChoiceOrAllElement = null;
+ domHelper.changeContentModel(element, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, sequenceChoiceOrAllElement);
+ contentModelElement = domHelper.getContentModelFromParent(element);
+ }
+ }
+
+ Element derivedByElement = domHelper.getDerivedByElementFromComplexType(element);
+ if (derivedByElement == null)
+ {
+ if (derivedByString == null || (derivedByString != null && derivedByString.equals("")))
+ {
+ derivedByString = XSDConstants.EXTENSION_ELEMENT_TAG; // since there is no derivedByElement
+ }
+ derivedByElement = element.getOwnerDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, derivedByString);
+ contentModelElement.appendChild(derivedByElement);
+ formatChild(contentModelElement);
+ if (sequenceChoiceOrAllElement != null)
+ {
+ derivedByElement.appendChild(sequenceChoiceOrAllElement);
+ formatChild(derivedByElement);
+ }
+ }
+ else
+ {
+ if (helper.getBuiltInTypeNamesList().contains(type) ||
+ helper.getUserSimpleTypeNamesList().contains(type))
+ {
+ derivedByString = XSDConstants.EXTENSION_ELEMENT_TAG;
+ Element aContentModelElement = domHelper.getContentModelFromParent(derivedByElement);
+ if (aContentModelElement != null)
+ {
+ XSDDOMHelper.removeNodeAndWhitespace(aContentModelElement);
+ }
+ }
+ domHelper.changeDerivedByType(contentModelElement, derivedByString, type);
+ }
+ derivedByElement.setAttribute(attr.getName(), attr.getValue());
+ }
+ }
+
+ xsdComp.setElement(element);
+ endRecording(element);
+ }
+
+ private Element updateModelAndDerivedByKind(String modelType, String derivedByKind, DOMAttribute attr)
+ {
+ Element newContentModelElement = element.getOwnerDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, modelType);
+ element.appendChild(newContentModelElement);
+
+ Element newDerivedByElement = element.getOwnerDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, derivedByKind);
+ newContentModelElement.appendChild(newDerivedByElement);
+
+ newDerivedByElement.setAttribute(attr.getName(), attr.getValue());
+
+ NodeList children = element.getChildNodes();
+ int length = children.getLength();
+ ArrayList nodesToRemove = new ArrayList();
+ for (int i = 0; i < length; i++)
+ {
+ Node node = children.item(i);
+ if (XSDDOMHelper.inputEquals(node, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false) ||
+ XSDDOMHelper.inputEquals(node, XSDConstants.ATTRIBUTE_ELEMENT_TAG, true) ||
+ XSDDOMHelper.inputEquals(node, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, true) ||
+ XSDDOMHelper.inputEquals(node, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false))
+ {
+ newDerivedByElement.appendChild(node.cloneNode(true));
+ nodesToRemove.add(node);
+ }
+ }
+ for (Iterator i = nodesToRemove.iterator(); i.hasNext(); )
+ {
+ XSDDOMHelper.removeNodeAndWhitespace((Node)i.next());
+ }
+
+ formatChild(newContentModelElement);
+
+ return newDerivedByElement;
+ }
+
+ protected void formatChild(Element child)
+ {
+ if (child instanceof XMLNode)
+ {
+ XMLModel model = ((XMLNode)child).getModel();
+ try
+ {
+ // tell the model that we are about to make a big model change
+ model.aboutToChangeModel();
+
+ IStructuredFormatProcessor formatProcessor = new FormatProcessorXML();
+ formatProcessor.formatNode(child);
+ }
+ finally
+ {
+ // tell the model that we are done with the big model change
+ model.changedModel();
+ }
+ }
+
+ }
+
+ public DocumentImpl getDocument(Element element)
+ {
+ return (DocumentImpl) element.getOwnerDocument();
+ }
+
+ public void beginRecording(String description, Element element)
+ {
+ getDocument(element).getModel().beginRecording(this, description);
+ }
+
+ public void endRecording(Element element)
+ {
+ DocumentImpl doc = (DocumentImpl) getDocument(element);
+
+ doc.getModel().endRecording(this);
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/XSDEditNamespacesAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/XSDEditNamespacesAction.java
new file mode 100644
index 0000000000..640355ba23
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/XSDEditNamespacesAction.java
@@ -0,0 +1,220 @@
+/*******************************************************************************
+ * 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.actions;
+
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.common.contentmodel.util.DOMNamespaceInfoManager;
+import org.eclipse.wst.common.contentmodel.util.NamespaceInfo;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.wst.xml.ui.actions.ReplacePrefixAction;
+import org.eclipse.wst.xml.ui.util.XMLCommonResources;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.SchemaPrefixChangeHandler;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.TargetNamespaceChangeHandler;
+import org.eclipse.wst.xsd.ui.internal.util.XSDSchemaHelper;
+import org.eclipse.wst.xsd.ui.internal.widgets.XSDEditSchemaInfoDialog;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+public class XSDEditNamespacesAction extends Action {
+ private Element element;
+ private Node node;
+ private String resourceLocation;
+ private XSDSchema xsdSchema;
+ private DOMNamespaceInfoManager namespaceInfoManager = new DOMNamespaceInfoManager();
+
+ public XSDEditNamespacesAction(String label, Element element, Node node) {
+ super();
+ setText(label);
+
+ this.element = element;
+ this.node = node;
+ ///////////////////// This needs to be changed....
+ this.resourceLocation = "dummy";
+ }
+
+ public XSDEditNamespacesAction(String label, Element element, Node node, XSDSchema schema) {
+ this (label, element, node);
+ xsdSchema = schema;
+ }
+
+ public void run() {
+ if (element != null)
+ {
+ Shell shell = XMLCommonResources.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell();
+ String targetNamespace = null;
+ if (xsdSchema != null) {
+ targetNamespace = xsdSchema.getTargetNamespace();
+ }
+ XSDEditSchemaInfoDialog dialog = new XSDEditSchemaInfoDialog(shell, new Path(resourceLocation), targetNamespace);
+
+ List namespaceInfoList = namespaceInfoManager.getNamespaceInfoList(element);
+ List oldNamespaceInfoList = NamespaceInfo.cloneNamespaceInfoList(namespaceInfoList);
+
+ // here we store a copy of the old info for each NamespaceInfo
+ // this info will be used in createPrefixMapping() to figure out how to update the document
+ // in response to these changes
+ for (Iterator i = namespaceInfoList.iterator(); i.hasNext(); )
+ {
+ NamespaceInfo info = (NamespaceInfo)i.next();
+ NamespaceInfo oldCopy = new NamespaceInfo(info);
+ info.setProperty("oldCopy", oldCopy);
+ }
+
+ dialog.setNamespaceInfoList(namespaceInfoList);
+ dialog.create();
+ //dialog.getShell().setSize(500, 300);
+ dialog.getShell().setText(XMLCommonResources.getInstance().getString("_UI_MENU_EDIT_SCHEMA_INFORMATION_TITLE"));
+ dialog.setBlockOnOpen(true);
+ dialog.open();
+ String xsdPrefix = "";
+
+ if (dialog.getReturnCode() == Window.OK)
+ {
+ Element xsdSchemaElement = xsdSchema.getElement();
+ DocumentImpl doc = (DocumentImpl) xsdSchemaElement.getOwnerDocument();
+
+ List newInfoList = dialog.getNamespaceInfoList();
+
+ // see if we need to rename any prefixes
+ Map prefixMapping = createPrefixMapping(oldNamespaceInfoList, namespaceInfoList);
+
+ Map map2 = new Hashtable();
+ String xsdNS = "";
+ for (Iterator iter = newInfoList.iterator(); iter.hasNext(); )
+ {
+ NamespaceInfo ni = (NamespaceInfo)iter.next();
+ String pref = ni.prefix;
+ String uri = ni.uri;
+ if (pref == null) pref = "";
+ if (uri == null) uri = "";
+ if (XSDConstants.isSchemaForSchemaNamespace(uri))
+ {
+ xsdPrefix = pref;
+ }
+ map2.put(pref, uri);
+ }
+
+ if (map2.size() > 0)
+ {
+ try {
+
+ doc.getModel().beginRecording(this, XSDEditorPlugin.getXSDString("_UI_NAMESPACE_CHANGE"));
+
+ if (xsdPrefix != null && xsdPrefix.length() == 0)
+ {
+ xsdSchema.setSchemaForSchemaQNamePrefix(null);
+ }
+ else
+ {
+ xsdSchema.setSchemaForSchemaQNamePrefix(xsdPrefix);
+ }
+
+ SchemaPrefixChangeHandler spch = new SchemaPrefixChangeHandler(xsdSchema, xsdPrefix);
+ spch.resolve();
+
+ xsdSchema.setTargetNamespace(dialog.getTargetNamespace());
+
+ namespaceInfoManager.removeNamespaceInfo(element);
+ namespaceInfoManager.addNamespaceInfo(element, newInfoList, false);
+
+// manager.getModel().aboutToChangeModel();
+ ReplacePrefixAction replacePrefixAction = new ReplacePrefixAction(null, element, prefixMapping);
+ replacePrefixAction.run();
+
+ TargetNamespaceChangeHandler targetNamespaceChangeHandler = new TargetNamespaceChangeHandler(xsdSchema, targetNamespace, dialog.getTargetNamespace());
+ targetNamespaceChangeHandler.resolve();
+
+ } finally {
+// manager.getModel().changedModel();
+
+ XSDSchemaHelper.updateElement(xsdSchema);
+ doc.getModel().endRecording(this);
+ }
+ }
+ }
+
+ }
+ }
+
+ protected Map createPrefixMapping(List oldList, List newList)
+ {
+ Map map = new Hashtable();
+
+ Hashtable oldURIToPrefixTable = new Hashtable();
+ for (Iterator i = oldList.iterator(); i.hasNext(); )
+ {
+ NamespaceInfo oldInfo = (NamespaceInfo)i.next();
+ oldURIToPrefixTable.put(oldInfo.uri, oldInfo);
+ }
+
+ for (Iterator i = newList.iterator(); i.hasNext(); )
+ {
+ NamespaceInfo newInfo = (NamespaceInfo)i.next();
+ NamespaceInfo oldInfo = (NamespaceInfo)oldURIToPrefixTable.get(newInfo.uri != null ? newInfo.uri : "");
+
+
+ // if oldInfo is non null ... there's a matching URI in the old set
+ // we can use its prefix to detemine out mapping
+ //
+ // if oldInfo is null ... we use the 'oldCopy' we stashed away
+ // assuming that the user changed the URI and the prefix
+ if (oldInfo == null)
+ {
+ oldInfo = (NamespaceInfo)newInfo.getProperty("oldCopy");
+ }
+
+ if (oldInfo != null)
+ {
+ String newPrefix = newInfo.prefix != null ? newInfo.prefix : "";
+ String oldPrefix = oldInfo.prefix != null ? oldInfo.prefix : "";
+ if (!oldPrefix.equals(newPrefix))
+ {
+ map.put(oldPrefix, newPrefix);
+ }
+ }
+ }
+ return map;
+ }
+
+// private void updateAllNodes(Element element, String prefix)
+// {
+// element.setPrefix(prefix);
+// NodeList list = element.getChildNodes();
+// if (list != null)
+// {
+// for (int i=0; i < list.getLength(); i++)
+// {
+// Node child = list.item(i);
+// if (child != null && child instanceof Element)
+// {
+// child.setPrefix(prefix);
+// if (child.hasChildNodes())
+// {
+// updateAllNodes((Element)child, prefix);
+// }
+// }
+// }
+// }
+// }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AbstractCommand.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AbstractCommand.java
new file mode 100644
index 0000000000..9d8c0a1e09
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AbstractCommand.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * 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 org.eclipse.wst.sse.core.format.IStructuredFormatProcessor;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xml.core.format.FormatProcessorXML;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.w3c.dom.Element;
+
+public abstract class AbstractCommand
+{
+ private XSDConcreteComponent parent;
+ private XSDConcreteComponent model;
+
+ protected AbstractCommand(XSDConcreteComponent parent)
+ {
+ this.parent = parent;
+ }
+
+ public abstract void run();
+
+ protected XSDConcreteComponent getParent()
+ {
+ return parent;
+ }
+
+ public XSDConcreteComponent getModelObject()
+ {
+ return model;
+ }
+
+ protected void setModelObject(XSDConcreteComponent model)
+ {
+ this.model = model;
+ }
+
+ // Establish part-whole relationship
+ protected abstract boolean adopt(XSDConcreteComponent model);
+
+ protected void formatChild(Element child)
+ {
+ if (child instanceof XMLNode)
+ {
+ XMLModel model = ((XMLNode)child).getModel();
+ try
+ {
+ // tell the model that we are about to make a big model change
+ model.aboutToChangeModel();
+
+ IStructuredFormatProcessor formatProcessor = new FormatProcessorXML();
+ formatProcessor.formatNode(child);
+ }
+ finally
+ {
+ // tell the model that we are done with the big model change
+ model.changedModel();
+ }
+ }
+ }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddAttributeDeclarationCommand.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddAttributeDeclarationCommand.java
new file mode 100644
index 0000000000..7be73f07d1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddAttributeDeclarationCommand.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * 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$
+ StringBuffer candidateNameSB = new StringBuffer("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);
+ }
+ }
+ }
+
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddComplexTypeDefinitionCommand.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddComplexTypeDefinitionCommand.java
new file mode 100644
index 0000000000..72da36a17a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddComplexTypeDefinitionCommand.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * 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 org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDFactory;
+import org.eclipse.xsd.XSDSchema;
+
+public final class AddComplexTypeDefinitionCommand extends AbstractCommand
+{
+ private String name;
+
+ public AddComplexTypeDefinitionCommand
+ (XSDConcreteComponent parent,
+ String name)
+ {
+ super(parent);
+ this.name = name; // this may be null for anonymous type
+ }
+
+ public void run()
+ {
+ XSDComplexTypeDefinition typeDef =
+ XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
+ typeDef.setName(name);
+
+ if (adopt(typeDef))
+ setModelObject(typeDef);
+ }
+
+ protected boolean adopt(XSDConcreteComponent model)
+ {
+ XSDConcreteComponent parent = getParent();
+ if (parent instanceof XSDSchema)
+ ((XSDSchema)parent).getTypeDefinitions().add(model);
+ else if (parent instanceof XSDElementDeclaration)
+ ((XSDElementDeclaration)parent).setAnonymousTypeDefinition((XSDComplexTypeDefinition)model);
+ else
+ return false; // invalid parent
+
+ return true;
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddElementDeclarationCommand.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddElementDeclarationCommand.java
new file mode 100644
index 0000000000..cf161ec268
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddElementDeclarationCommand.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * 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 org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDFactory;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDSchema;
+
+public final class AddElementDeclarationCommand extends AbstractCommand
+{
+ private String name; // element name
+
+ public AddElementDeclarationCommand
+ (XSDConcreteComponent parent,
+ String name)
+ {
+ super(parent);
+ this.name = name;
+ }
+
+ public void run()
+ {
+ XSDElementDeclaration elementDecl =
+ XSDFactory.eINSTANCE.createXSDElementDeclaration();
+ elementDecl.setName(name);
+
+ if (adopt(elementDecl))
+ setModelObject(elementDecl);
+ }
+
+ protected boolean adopt(XSDConcreteComponent model)
+ {
+ XSDConcreteComponent parent = getParent();
+ if (parent instanceof XSDSchema)
+ ((XSDSchema)parent).getElementDeclarations().add(model);
+ else if (parent instanceof XSDParticle)
+ ((XSDParticle)parent).setContent((XSDElementDeclaration)model);
+ else
+ return false; // invalid parent
+
+ return true;
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddModelGroupCommand.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddModelGroupCommand.java
new file mode 100644
index 0000000000..73428f24f3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddModelGroupCommand.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * 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 org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDCompositor;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDFactory;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDParticle;
+
+public class AddModelGroupCommand extends AbstractCommand
+{
+ protected XSDCompositor compositor;
+
+ public AddModelGroupCommand(XSDConcreteComponent parent, XSDCompositor compositor)
+ {
+ super(parent);
+ this.compositor = compositor;
+ }
+
+ public void run()
+ {
+ XSDConcreteComponent parent = getParent();
+ XSDConcreteComponent owner = null;
+ if (parent instanceof XSDElementDeclaration)
+ {
+ XSDElementDeclaration ed = (XSDElementDeclaration)parent;
+ if (ed.getTypeDefinition() != null)
+ {
+ if (ed.getAnonymousTypeDefinition() == null)
+ {
+ ed.setTypeDefinition(null);
+ XSDComplexTypeDefinition td = XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
+ ed.setAnonymousTypeDefinition(td);
+ }
+ owner = ed.getTypeDefinition();
+ }
+ else if (ed.getAnonymousTypeDefinition() == null)
+ {
+ XSDComplexTypeDefinition td = XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
+ ed.setAnonymousTypeDefinition(td);
+ owner = td;
+ }
+ else if (ed.getAnonymousTypeDefinition() instanceof XSDComplexTypeDefinition)
+ {
+ owner = ed.getAnonymousTypeDefinition();
+ }
+ }
+ else if (parent instanceof XSDModelGroup)
+ {
+ ((XSDModelGroup) parent).getContents().add(createModelGroup());
+ }
+ else if (parent instanceof XSDComplexTypeDefinition)
+ {
+ owner = ((XSDComplexTypeDefinition)parent);
+ }
+ if (owner != null)
+ {
+ XSDParticle particle = XSDFactory.eINSTANCE.createXSDParticle();
+ XSDModelGroup modelGroup = createModelGroup();
+ particle.setContent(modelGroup);
+ XSDComplexTypeDefinition ctd = (XSDComplexTypeDefinition)owner;
+ ctd.setContent(particle);
+ formatChild(parent.getElement());
+ }
+ }
+
+ protected boolean adopt(XSDConcreteComponent model)
+ {
+ return false;
+ }
+
+ protected XSDModelGroup createModelGroup()
+ {
+ XSDModelGroup modelGroup = XSDFactory.eINSTANCE.createXSDModelGroup();
+ modelGroup.setCompositor(compositor);
+ return modelGroup;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddSimpleTypeDefinitionCommand.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddSimpleTypeDefinitionCommand.java
new file mode 100644
index 0000000000..b0c347b430
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddSimpleTypeDefinitionCommand.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * 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 org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDFactory;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+
+public final class AddSimpleTypeDefinitionCommand extends AbstractCommand
+{
+ private String name;
+
+ public AddSimpleTypeDefinitionCommand
+ (XSDConcreteComponent parent,
+ String name)
+ {
+ super(parent);
+ this.name = name; // this may be null for anonymous type
+ }
+
+ public void run()
+ {
+ XSDSimpleTypeDefinition typeDef =
+ XSDFactory.eINSTANCE.createXSDSimpleTypeDefinition();
+ typeDef.setName(name);
+
+ if (adopt(typeDef))
+ setModelObject(typeDef);
+ }
+
+ protected boolean adopt(XSDConcreteComponent model)
+ {
+ XSDConcreteComponent parent = getParent();
+ if (parent instanceof XSDSchema)
+ ((XSDSchema)parent).getTypeDefinitions().add(model);
+ else if (parent instanceof XSDElementDeclaration)
+ ((XSDElementDeclaration)parent).setAnonymousTypeDefinition((XSDSimpleTypeDefinition)model);
+ else if (parent instanceof XSDAttributeDeclaration)
+ ((XSDAttributeDeclaration)parent).setAnonymousTypeDefinition((XSDSimpleTypeDefinition)model);
+ else
+ return false; // invalid parent
+
+ return true;
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/BaseDragNodesCommand.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/BaseDragNodesCommand.java
new file mode 100644
index 0000000000..142d4ed02d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/BaseDragNodesCommand.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * 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.dnd;
+
+import java.util.Collection;
+
+import org.eclipse.wst.common.ui.dnd.DefaultDragAndDropCommand;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Node;
+
+
+public abstract class BaseDragNodesCommand extends DefaultDragAndDropCommand
+{
+ /**
+ * Constructor for BaseDragNodesCommand.
+ * @param target
+ * @param location
+ * @param operations
+ * @param operation
+ * @param sources
+ */
+ public BaseDragNodesCommand(
+ Object target,
+ float location,
+ int operations,
+ int operation,
+ Collection sources)
+ {
+ super(target, location, operations, operation, sources);
+ }
+
+ protected boolean isDirectSchemaChild(Node node)
+ {
+ Node parent = node.getParentNode();
+ if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false) &&
+ parent.getParentNode().equals(parent.getOwnerDocument()))
+ {
+ return true;
+ }
+ return false;
+ }
+
+ protected boolean isSiblingNodes(Node first, Node second)
+ {
+ if (first.getParentNode() != null)
+ {
+ return first.getParentNode().equals(second.getParentNode());
+ }
+ return false;
+ }
+
+ protected void beginRecording()
+ {
+ if (target != null)
+ {
+ XMLModel model = getModel((Node)target);
+
+ if (model != null)
+ {
+ model.beginRecording(this, "Move");
+ }
+ }
+ }
+
+ protected void endRecording()
+ {
+ if (target != null)
+ {
+ XMLModel model = getModel((Node)target);
+
+ if (model != null)
+ {
+ model.endRecording(this);
+ }
+ }
+ }
+ protected XMLModel getModel(Node node)
+ {
+ Object object = node.getOwnerDocument();
+ if (object instanceof DocumentImpl)
+ {
+ return ((DocumentImpl) object).getModel();
+ }
+ return null;
+ }
+
+ protected void moveNode(Node referenceNode, Node nodeToMove, boolean isBefore)
+ {
+ XSDDOMHelper.moveNode(referenceNode, nodeToMove, isBefore);
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/DragNodesCommand.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/DragNodesCommand.java
new file mode 100644
index 0000000000..b3692cffb3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/DragNodesCommand.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * 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.dnd;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xml.core.format.NodeFormatter;
+import org.w3c.dom.Node;
+
+public class DragNodesCommand extends BaseDragNodesCommand
+{
+ /**
+ * Constructor for DragNodesCommand.
+ * @param target
+ * @param location
+ * @param operations
+ * @param operation
+ * @param sources
+ */
+ public DragNodesCommand(
+ Object target,
+ float location,
+ int operations,
+ int operation,
+ Collection sources)
+ {
+ super(target, location, operations, operation, sources);
+ }
+
+ /**
+ * @see org.eclipse.wst.common.ui.dnd.DragAndDropCommand#canExecute()
+ */
+ public boolean canExecute()
+ {
+ if (sources.size() > 0)
+ {
+ Node firstSource = (Node) sources.toArray()[0];
+ return isSiblingNodes((Node) target, firstSource);
+ }
+ return false;
+// return isDirectSchemaChild((Node)target);
+ }
+
+
+ /**
+ * @see org.eclipse.wst.common.ui.dnd.DragAndDropCommand#execute()
+ */
+ public void execute()
+ {
+ NodeFormatter formatProcessor = new NodeFormatter();
+ Node referenceNode = (Node) target;
+ Iterator iter = sources.iterator();
+ beginRecording();
+
+ while (iter.hasNext())
+ {
+ Node node = (Node) iter.next();
+ if (isSiblingNodes(referenceNode,node))
+ {
+ moveNode(referenceNode, node, !isAfter());
+ formatProcessor.format((XMLNode)node);
+ }
+ }
+// formatProcessor.format((XMLNode)referenceNode.getParentNode());
+ endRecording();
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/XSDDragAndDropManager.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/XSDDragAndDropManager.java
new file mode 100644
index 0000000000..b00c642e19
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/XSDDragAndDropManager.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * 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.dnd;
+
+import java.util.Collection;
+
+import org.eclipse.wst.common.ui.dnd.DragAndDropCommand;
+import org.eclipse.wst.common.ui.dnd.DragAndDropManager;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Node;
+
+public class XSDDragAndDropManager implements DragAndDropManager
+{
+ /**
+ * Constructor for XSDDragAndDropManager.
+ */
+ public XSDDragAndDropManager()
+ {
+ }
+
+ protected boolean isDirectSchemaChild(Node node)
+ {
+ Node parent = node.getParentNode();
+ if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false) &&
+ parent.getParentNode().equals(parent.getOwnerDocument()))
+ {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * @see org.eclipse.wst.common.ui.dnd.DragAndDropManager#createCommand(Object, float, int, int, Collection)
+ */
+ public DragAndDropCommand createCommand(
+ Object target,
+ float location,
+ int operations,
+ int operation,
+ Collection source)
+ {
+ if (target instanceof Node)
+ {
+ Node node = (Node) target;
+// if (isDirectSchemaChild(node))
+// {
+ return new DragNodesCommand(target, location, operations, operation, source);
+// }
+ }
+ return null;
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/editparts/AbstractComponentViewerRootEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/editparts/AbstractComponentViewerRootEditPart.java
new file mode 100644
index 0000000000..caef3974c8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/editparts/AbstractComponentViewerRootEditPart.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * 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.gef.util.editparts;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Panel;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.wst.xsd.ui.internal.gef.util.figures.ContainerLayout;
+
+
+public abstract class AbstractComponentViewerRootEditPart extends AbstractGraphicalEditPart
+{
+ protected final static String MESSAGE_PLACE_HOLDER = "MESSAGE_PLACE_HOLDER";
+ protected Object input;
+
+ public void setInput(Object input)
+ {
+ this.input = input;
+ refreshChildren();
+ }
+
+ protected IFigure createFigure()
+ {
+ Panel panel = new Panel();
+ ContainerLayout layout = new ContainerLayout();
+ layout.setBorder(60);
+ panel.setLayoutManager(layout);
+ return panel;
+ }
+
+
+ protected List getModelChildren()
+ {
+ List list = new ArrayList();
+ if (input != null)
+ {
+ list.add(input);
+ }
+ else
+ {
+ list.add(MESSAGE_PLACE_HOLDER);
+ }
+ return list;
+ }
+
+ protected abstract EditPart createChild(Object model);
+
+ protected void createEditPolicies()
+ {
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ConnectedEditPartFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ConnectedEditPartFigure.java
new file mode 100644
index 0000000000..f25f67787d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ConnectedEditPartFigure.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * 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.gef.util.figures;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+
+
+public class ConnectedEditPartFigure extends ContainerFigure implements IConnectedEditPartFigure
+{
+ protected EditPart editPart;
+ protected boolean childConnectionsEnabled = true;
+ protected List connectedFigures = new ArrayList();
+ protected int connectionType = RIGHT_CONNECTION;
+
+ public ConnectedEditPartFigure(EditPart editPart)
+ {
+ this.editPart = editPart;
+ }
+
+ public void setChildConnectionsEnabled(boolean enabled)
+ {
+ childConnectionsEnabled = enabled;
+ }
+
+ protected IConnectedEditPartFigure getParentGraphNodeFigure()
+ {
+ IConnectedEditPartFigure result = null;
+ for (EditPart parentEditPart = editPart.getParent(); parentEditPart != null; parentEditPart = parentEditPart.getParent())
+ {
+ IFigure figure = ((AbstractGraphicalEditPart)parentEditPart).getFigure();
+ if (figure instanceof IConnectedEditPartFigure)
+ {
+ IConnectedEditPartFigure graphNodeFigure = (IConnectedEditPartFigure)figure;
+ if (graphNodeFigure.getConnectionFigure() != null)
+ {
+ result = graphNodeFigure;
+ break;
+ }
+ }
+ }
+ return result;
+ }
+
+ public void addNotify()
+ {
+ super.addNotify();
+ if (getConnectionFigure() != null)
+ {
+ IConnectedEditPartFigure parentGraphNodeFigure = getParentGraphNodeFigure();
+ if (parentGraphNodeFigure != null)
+ {
+ parentGraphNodeFigure.addConnectedFigure(this);
+ }
+ }
+ }
+
+ public void removeNotify()
+ {
+ super.removeNotify();
+ if (getConnectionFigure() != null)
+ {
+ IConnectedEditPartFigure parentGraphNodeFigure = getParentGraphNodeFigure();
+ if (parentGraphNodeFigure != null)
+ {
+ parentGraphNodeFigure.removeConnectedFigure(this);
+ }
+ }
+ }
+
+ public void addConnectedFigure(IConnectedEditPartFigure figure)
+ {
+ if (childConnectionsEnabled)
+ {
+ // this test is required since we sometimes receive the 'addNotify' call twice
+ //
+ if (!connectedFigures.contains(figure))
+ {
+ connectedFigures.add(figure);
+ }
+ }
+ }
+
+ public void removeConnectedFigure(IConnectedEditPartFigure figure)
+ {
+ if (childConnectionsEnabled)
+ {
+ connectedFigures.remove(figure);
+ }
+ }
+
+ public IFigure getSelectionFigure()
+ {
+ return this;
+ }
+
+ public IFigure getConnectionFigure()
+ {
+ return this;
+ }
+
+ public List getConnectedFigures(int type)
+ {
+ List list = new ArrayList();
+ for (Iterator i = connectedFigures.iterator(); i.hasNext(); )
+ {
+ IConnectedEditPartFigure figure = (IConnectedEditPartFigure)i.next();
+ //if (type == 0 || type == figure.getConnectionType())
+ {
+ list.add(figure);
+ }
+ }
+ return list;
+ }
+
+ public int getConnectionType()
+ {
+ return connectionType;
+ }
+
+ public void setConnectionType(int type)
+ {
+ connectionType = type;
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ConnectionRenderingFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ConnectionRenderingFigure.java
new file mode 100644
index 0000000000..7192108cd9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ConnectionRenderingFigure.java
@@ -0,0 +1,215 @@
+/*******************************************************************************
+ * 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.gef.util.figures;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.PointList;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.GraphicalEditPart;
+
+
+public class ConnectionRenderingFigure extends RectangleFigure
+{
+ protected boolean isOutlined = true;
+ protected IFigure primaryLayer;
+
+ public ConnectionRenderingFigure(IFigure primaryLayer)
+ {
+ setOpaque(false);
+ this.primaryLayer = primaryLayer;
+ //setFocusTraversable(false);
+ //setEnabled(false);
+ }
+
+ protected boolean isMouseEventTarget()
+ {
+ return false;
+ }
+
+ public boolean containsPoint(int x, int y)
+ {
+ return false;
+ }
+
+ protected void fillShape(Graphics graphics)
+ {
+ graphics.setForegroundColor(ColorConstants.black);
+ drawLines(graphics, primaryLayer);
+ }
+
+ protected void outlineShape(Graphics graphics)
+ {
+ if (isOutlined)
+ {
+ super.outlineShape(graphics);
+ }
+ }
+
+ protected void drawLines(Graphics graphics, IFigure figure)
+ {
+ if (figure instanceof IConnectedEditPartFigure)
+ {
+ IConnectedEditPartFigure graphNodeFigure = (IConnectedEditPartFigure)figure;
+ List connectedFigures = graphNodeFigure.getConnectedFigures(IConnectedEditPartFigure.RIGHT_CONNECTION);
+ int connectedFiguresSize = connectedFigures.size();
+
+ if (connectedFiguresSize > 0)
+ {
+ IConnectedEditPartFigure firstGraphNodeFigure = (IConnectedEditPartFigure)connectedFigures.get(0);
+ Rectangle r = graphNodeFigure.getConnectionFigure().getBounds();
+
+ int x1 = r.x + r.width;
+ int y1 = r.y + r.height/2;
+
+ int startOfChildBox = firstGraphNodeFigure.getConnectionFigure().getBounds().x;
+ int x2 = x1 + (startOfChildBox - x1) / 3;
+ int y2 = y1;
+
+ if (connectedFiguresSize == 1)
+ {
+ graphics.drawLine(x1, y1, startOfChildBox, y2);
+ }
+ else // (connectedFigures.length > 1)
+ {
+ graphics.drawLine(x1, y1, x2, y2);
+
+ int minY = Integer.MAX_VALUE;
+ int maxY = -1;
+
+ for (Iterator i = connectedFigures.iterator(); i.hasNext(); )
+ {
+ IConnectedEditPartFigure connectedFigure = (IConnectedEditPartFigure)i.next();
+ Rectangle childConnectionRectangle = connectedFigure.getConnectionFigure().getBounds();
+ int y = childConnectionRectangle.y + childConnectionRectangle.height / 2;
+ minY = Math.min(minY, y);
+ maxY = Math.max(maxY, y);
+ graphics.drawLine(x2, y, childConnectionRectangle.x, y);
+ }
+ graphics.drawLine(x2, minY, x2, maxY);
+ }
+ }
+ }
+
+ //boolean visitChildren = true;
+ List children = figure.getChildren();
+ for (Iterator i = children.iterator(); i.hasNext(); )
+ {
+ IFigure child = (IFigure)i.next();
+ drawLines(graphics, child);
+ }
+ }
+
+ // This method supports the preview connection line function related to drag and drop
+ //
+ public PointList getConnectionPoints(GraphicalEditPart parentEditPart, GraphicalEditPart childRefEditPart, Rectangle draggedFigureBounds)
+ {
+ PointList pointList = new PointList();
+ int[] data = new int[1];
+ Point a = getConnectionPoint(parentEditPart, childRefEditPart, data);
+ if (a != null)
+ {
+ int draggedFigureBoundsY = draggedFigureBounds.y + draggedFigureBounds.height/2;
+
+ pointList.addPoint(a);
+ //pointList.addPoint(new Point(draggedFigureBounds.x, draggedFigureBoundsY));
+
+ if (data[0] == 0) // insert between 2 items
+ {
+ int x = a.x + (draggedFigureBounds.x - a.x)/2;
+ pointList.addPoint(new Point(x, a.y));
+ pointList.addPoint(new Point(x, draggedFigureBoundsY));
+ pointList.addPoint(new Point(draggedFigureBounds.x, draggedFigureBoundsY));
+ }
+ else // insert at first or last position
+ {
+ pointList.addPoint(new Point(a.x, draggedFigureBoundsY));
+ pointList.addPoint(new Point(draggedFigureBounds.x, draggedFigureBoundsY));
+ }
+ }
+ return pointList;
+ }
+
+
+ // This method supports the preview connection line function related to drag and drop
+ //
+ protected Point getConnectionPoint(GraphicalEditPart parentEditPart, GraphicalEditPart childRefEditPart, int[] data)
+ {
+ Point point = null;
+ List childList = parentEditPart.getChildren();
+
+ if (parentEditPart.getFigure() instanceof IConnectedEditPartFigure && childList.size() > 0)
+ {
+ point = new Point();
+
+ GraphicalEditPart prev = null;
+ GraphicalEditPart next = null;
+
+ for (Iterator i = childList.iterator(); i.hasNext(); )
+ {
+ Object o = i.next();
+ if (o instanceof GraphicalEditPart)
+ {
+ GraphicalEditPart childEditPart = (GraphicalEditPart)o;
+ if (childEditPart.getFigure() instanceof IConnectedEditPartFigure)
+ {
+ if (childEditPart == childRefEditPart)
+ {
+ next = childEditPart;
+ break;
+ }
+ prev = childEditPart;
+ }
+ }
+ }
+
+
+ if (next != null && prev != null)
+ {
+ int ya = getConnectedEditPartConnectionBounds(prev).getCenter().y;
+ int yb = getConnectedEditPartConnectionBounds(next).getCenter().y;
+ point.y = ya + (yb - ya)/2;
+ data[0] = 0;
+ }
+ else if (prev != null) // add it last
+ {
+ point.y = getConnectedEditPartConnectionBounds(prev).getCenter().y;
+ data[0] = 1;
+ }
+ else if (next != null) // add it first!
+ {
+ point.y = getConnectedEditPartConnectionBounds(next).getCenter().y;
+ data[0] = -1;
+ }
+
+ if (next != null || prev != null)
+ {
+ GraphicalEditPart child = prev != null ? prev : next;
+ int startOfChildBox = getConnectedEditPartConnectionBounds(child).x;
+ Rectangle r = getConnectedEditPartConnectionBounds(parentEditPart);
+ int x1 = r.x + r.width;
+ point.x = x1 + (startOfChildBox - x1) / 3;
+ }
+ }
+ return point;
+ }
+
+ protected Rectangle getConnectedEditPartConnectionBounds(GraphicalEditPart editPart)
+ {
+ return ((IConnectedEditPartFigure)editPart.getFigure()).getConnectionFigure().getBounds();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ContainerFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ContainerFigure.java
new file mode 100644
index 0000000000..d7a77ac685
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ContainerFigure.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * 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.gef.util.figures;
+
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.RectangleFigure;
+
+public class ContainerFigure extends RectangleFigure implements IExpandable
+{
+ protected boolean isOutlined = false;
+ protected boolean isExpanded = true;
+
+ public ContainerFigure()
+ {
+ setLayoutManager(new ContainerLayout());
+ setFill(false);
+ }
+
+ public void doLayout()
+ {
+ layout();
+ setValid(true);
+ }
+
+ public ContainerLayout getContainerLayout()
+ {
+ return (ContainerLayout)getLayoutManager();
+ }
+
+ public void setOutlined(boolean isOutlined)
+ {
+ this.isOutlined = isOutlined;
+ }
+
+ protected void outlineShape(Graphics graphics)
+ {
+ if (isOutlined)
+ {
+ super.outlineShape(graphics);
+ }
+ }
+
+ public boolean isExpanded()
+ {
+ return isExpanded;
+ }
+
+ public void setExpanded(boolean isExpanded)
+ {
+ this.isExpanded = isExpanded;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ContainerLayout.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ContainerLayout.java
new file mode 100644
index 0000000000..12f654bd5b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ContainerLayout.java
@@ -0,0 +1,218 @@
+/*******************************************************************************
+ * 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.gef.util.figures;
+
+import java.util.List;
+
+import org.eclipse.draw2d.AbstractLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+
+public class ContainerLayout extends AbstractLayout
+{
+ protected boolean isHorizontal;
+ protected int spacing = 0;
+ protected int border = 0;
+
+ public ContainerLayout()
+ {
+ this(true, 0);
+ }
+
+ public ContainerLayout(boolean isHorizontal, int spacing)
+ {
+ this.isHorizontal = isHorizontal;
+ this.spacing = spacing;
+ }
+
+ public void setHorizontal(boolean isHorizontal)
+ {
+ this.isHorizontal = isHorizontal;
+ }
+
+ public void setSpacing(int spacing)
+ {
+ this.spacing = spacing;
+ }
+
+ public void setBorder(int border)
+ {
+ this.border = border;
+ }
+
+ protected int alignFigure(IFigure parent, IFigure child)
+ {
+ return -1;
+ }
+
+ /**
+ * Calculates and returns the preferred size of the container
+ * given as input.
+ *
+ * @param figure Figure whose preferred size is required.
+ * @return The preferred size of the passed Figure.
+ * @since 2.0
+ */
+ protected Dimension calculatePreferredSizeHelper(IFigure parent)
+ {
+ Dimension preferred = new Dimension();
+ List children = parent.getChildren();
+
+ for (int i=0; i < children.size(); i++)
+ {
+ IFigure child = (IFigure)children.get(i);
+
+ Dimension childSize = child.getPreferredSize();
+
+ if (isHorizontal)
+ {
+ preferred.width += childSize.width;
+ preferred.height = Math.max(preferred.height, childSize.height);
+ }
+ else
+ {
+ preferred.height += childSize.height;
+ preferred.width = Math.max(preferred.width, childSize.width);
+ }
+ }
+
+ int childrenSize = children.size();
+ if (childrenSize > 1)
+ {
+ if (isHorizontal)
+ {
+ preferred.width += spacing * (childrenSize - 1);
+ }
+ else
+ {
+ preferred.height += spacing * (childrenSize - 1);
+ }
+ }
+
+ preferred.width += border * 2;
+ preferred.height += border * 2;
+ preferred.width += parent.getInsets().getWidth();
+ preferred.height += parent.getInsets().getHeight();
+
+ return preferred;
+ }
+
+ protected Dimension calculatePreferredSize(IFigure parent, int width, int height)
+ {
+ Dimension preferred = null;
+
+ // Here we ensure that an unexpanded container is given a size of (0,0)
+ //
+ if (parent instanceof IExpandable)
+ {
+ IExpandable expandableFigure = (IExpandable)parent;
+ if (!expandableFigure.isExpanded())
+ {
+ preferred = new Dimension();
+ }
+ }
+
+ if (preferred == null)
+ {
+ preferred = calculatePreferredSizeHelper(parent);
+ }
+
+ return preferred;
+ }
+
+
+ protected void adjustLayoutLocation(IFigure parent, Dimension dimension)
+ {
+ }
+
+ public void layout(IFigure parent)
+ {
+ List children = parent.getChildren();
+
+ int rx = 0;
+ Dimension dimension = new Dimension();
+
+
+ for (int i=0; i < children.size(); i++)
+ {
+ IFigure child = (IFigure)children.get(i);
+ Dimension childSize = child.getPreferredSize();
+ if (isHorizontal)
+ {
+ dimension.height = Math.max(dimension.height, childSize.height);
+ rx += childSize.width;
+ }
+ else
+ {
+ dimension.width = Math.max(dimension.width, childSize.width);
+ }
+ }
+
+ //dimension.width += parent.getInsets().left;
+ //dimension.height += parent.getInsets().top;
+
+ if (isHorizontal)
+ {
+ dimension.height += border*2;
+ dimension.width += border;
+ }
+ else
+ {
+ dimension.width += border*2;
+ dimension.height += border;
+ }
+ adjustLayoutLocation(parent, dimension);
+
+ for (int i=0; i < children.size(); i++)
+ {
+ IFigure child = (IFigure)children.get(i);
+ Dimension childSize = child.getPreferredSize();
+
+ if (isHorizontal)
+ {
+ int y = -1;
+
+ y = alignFigure(parent, child);
+
+ if (y == -1)
+ {
+ y = (dimension.height - childSize.height) / 2;
+ }
+
+ Rectangle rectangle = new Rectangle(dimension.width, y, childSize.width, childSize.height);
+ rectangle.translate(parent.getClientArea().getLocation());
+
+
+ child.setBounds(rectangle);
+ dimension.width += childSize.width;
+ dimension.width += spacing;
+
+ if (child instanceof SpacingFigure)
+ {
+ int availableHorizontalSpace = parent.getClientArea().width - rx;
+ dimension.width += availableHorizontalSpace;
+ }
+ }
+ else
+ {
+ Rectangle rectangle = new Rectangle(0, dimension.height, childSize.width, childSize.height);
+ rectangle.translate(parent.getClientArea().getLocation());
+
+
+ child.setBounds(rectangle);
+ dimension.height += childSize.height;
+ dimension.height += spacing;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/FillLayout.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/FillLayout.java
new file mode 100644
index 0000000000..1b2976b64e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/FillLayout.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * 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.gef.util.figures;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.AbstractLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+
+public class FillLayout extends AbstractLayout
+{
+ protected boolean isHorizontal = false;
+ protected int spacing = 0;
+ public Dimension min;
+
+ public FillLayout(){}
+
+ public FillLayout(int spacing)
+ {
+ this.spacing = spacing;
+ }
+
+ public void setHorizontal(boolean isHorizontal)
+ {
+ this.isHorizontal = isHorizontal;
+ }
+
+ /**
+ * Calculates and returns the preferred size of the input container.
+ * This is the size of the largest child of the container, as all
+ * other children fit into this size.
+ *
+ * @param figure Container figure for which preferred size is required.
+ * @return The preferred size of the input figure.
+ * @since 2.0
+ */
+
+ protected Dimension calculatePreferredSize(IFigure figure, int width, int height)
+ {
+ Dimension d = calculatePreferredClientAreaSize(figure);
+ d.expand(figure.getInsets().getWidth(),
+ figure.getInsets().getHeight());
+ d.union(getBorderPreferredSize(figure));
+ return d;
+ }
+
+ protected Dimension calculatePreferredClientAreaSize(IFigure figure)
+ {
+ Dimension d = new Dimension();
+ List children = figure.getChildren();
+
+
+ for (Iterator i = children.iterator(); i.hasNext(); )
+ {
+ IFigure child = (IFigure)i.next();
+ Dimension childSize = child.getPreferredSize();
+
+ if (isHorizontal)
+ {
+ d.width += childSize.width;
+ d.height = Math.max(childSize.height, d.height);
+ }
+ else
+ {
+ d.height += childSize.height;
+ d.width = Math.max(childSize.width, d.width);
+ }
+ }
+
+
+ int childrenSize = children.size();
+ if (childrenSize > 0)
+ {
+ if (isHorizontal)
+ {
+ d.width += spacing * (childrenSize - 1);
+ }
+ else
+ {
+ d.height += spacing * (childrenSize - 1);
+ }
+ }
+
+ if (min != null)
+ {
+ d.width = Math.max(d.width, min.width);
+ d.height = Math.max(d.height, min.height);
+ }
+ return d;
+ }
+
+ /*
+ * Returns the minimum size required by the input container.
+ * This is the size of the largest child of the container, as all
+ * other children fit into this size.
+ */
+ public Dimension getMinimumSize(IFigure figure, int width, int height)
+ {
+ Dimension d = new Dimension();
+ List children = figure.getChildren();
+ IFigure child;
+
+ for (int i=0; i < children.size(); i++)
+ {
+ child = (IFigure)children.get(i);
+ d.union(child.getMinimumSize());
+ }
+ d.expand(figure.getInsets().getWidth(),
+ figure.getInsets().getHeight());
+ return d;
+ }
+
+ public Dimension getPreferredSize(IFigure figure, int width, int height)
+ {
+ return calculatePreferredSize(figure, width, height);
+ }
+
+ /*
+ * Lays out the children on top of each other with
+ * their sizes equal to that of the available
+ * paintable area of the input container figure.
+ */
+ public void layout(IFigure figure)
+ {
+ Dimension preferredSize = calculatePreferredClientAreaSize(figure);
+ Rectangle r = figure.getClientArea().getCopy();
+ List children = figure.getChildren();
+
+ int nChildren = children.size();
+ int extraHorizontalSpace = r.width - preferredSize.width;
+
+ for (Iterator i = children.iterator(); i.hasNext(); )
+ {
+ IFigure child = (IFigure)i.next();
+ Dimension preferredChildSize = child.getPreferredSize();
+
+ if (isHorizontal)
+ {
+ int w = preferredChildSize.width + (extraHorizontalSpace / nChildren);
+ child.setBounds(new Rectangle(r.x, r.y, w, Math.max(preferredSize.height, r.height)));
+ r.x += w + spacing;
+ }
+ else
+ {
+ child.setBounds(new Rectangle(r.x, r.y, Math.max(preferredSize.width, r.width), preferredChildSize.height));
+ r.y += preferredChildSize.height + spacing;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectedEditPartFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectedEditPartFigure.java
new file mode 100644
index 0000000000..4c778d7e20
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectedEditPartFigure.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.gef.util.figures;
+
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+
+public interface IConnectedEditPartFigure extends IConnectedFigure
+{
+ public static final int UP_CONNECTION = 1;
+ public static final int DOWN_CONNECTION = 2;
+ public static final int LEFT_CONNECTION = 3;
+ public static final int RIGHT_CONNECTION = 4;
+
+ public IFigure getSelectionFigure();
+ public IFigure getConnectionFigure();
+ public List getConnectedFigures(int type);
+ public int getConnectionType();
+ public void addConnectedFigure(IConnectedEditPartFigure figure);
+ public void removeConnectedFigure(IConnectedEditPartFigure figure);
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectedFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectedFigure.java
new file mode 100644
index 0000000000..4a6d7ded2c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectedFigure.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * 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.gef.util.figures;
+
+import org.eclipse.draw2d.IFigure;
+
+public interface IConnectedFigure extends IFigure
+{
+ public IFigure getConnectionFigure();
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectionRenderingViewer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectionRenderingViewer.java
new file mode 100644
index 0000000000..6ed611d9d7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectionRenderingViewer.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * 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.gef.util.figures;
+
+public interface IConnectionRenderingViewer
+{
+ public ConnectionRenderingFigure getConnectionRenderingFigure();
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IExpandable.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IExpandable.java
new file mode 100644
index 0000000000..161581bb00
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IExpandable.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * 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.gef.util.figures;
+
+import org.eclipse.draw2d.IFigure;
+
+public interface IExpandable extends IFigure
+{
+ boolean isExpanded();
+ void setExpanded(boolean isExpanded);
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/SpacingFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/SpacingFigure.java
new file mode 100644
index 0000000000..e245d6960c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/SpacingFigure.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * 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.gef.util.figures;
+
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+
+public class SpacingFigure extends RectangleFigure
+{
+ public SpacingFigure()
+ {
+ setFill(false);
+ setPreferredSize(new Dimension(0, 0));
+ }
+
+ //protected void outlineShape(Graphics graphics)
+ //{
+ //}
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/BaseGraphicalViewer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/BaseGraphicalViewer.java
new file mode 100644
index 0000000000..63af93228a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/BaseGraphicalViewer.java
@@ -0,0 +1,198 @@
+/*******************************************************************************
+ * 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.graph;
+
+import java.util.Iterator;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.StackLayout;
+import org.eclipse.gef.DefaultEditDomain;
+import org.eclipse.gef.EditDomain;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.KeyHandler;
+import org.eclipse.gef.LayerConstants;
+import org.eclipse.gef.editparts.ScalableRootEditPart;
+import org.eclipse.gef.tools.SelectionTool;
+import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.wst.xsd.ui.internal.XSDEditor;
+import org.eclipse.wst.xsd.ui.internal.XSDMenuListener;
+import org.eclipse.wst.xsd.ui.internal.gef.util.figures.ConnectionRenderingFigure;
+import org.eclipse.wst.xsd.ui.internal.gef.util.figures.IConnectionRenderingViewer;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.CenterLayout;
+import org.eclipse.xsd.XSDConcreteComponent;
+
+
+/**
+ * @author ernest
+ *
+ * To change this generated comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public abstract class BaseGraphicalViewer extends ScrollingGraphicalViewer implements IConnectionRenderingViewer
+{
+ protected FigureCanvasKeyboardHandler figureCanvasKeyboardHandler;
+
+ protected EditDomain editDomain;
+
+ protected boolean isInputEnabled = true;
+
+ protected boolean isSelectionEnabled = true;
+
+ protected ISelectionProvider menuSelectionProvider;
+
+ protected GraphContextMenuProvider menuProvider;
+
+ protected XSDEditor editor;
+
+ protected XSDConcreteComponent input;
+
+ protected ConnectionRenderingFigure connectionRenderingFigure;
+
+ public BaseGraphicalViewer(XSDEditor editor, ISelectionProvider selectionProvider)
+ {
+ super();
+ this.editor = editor;
+ menuSelectionProvider = selectionProvider;
+ }
+
+ public ConnectionRenderingFigure getConnectionRenderingFigure()
+ {
+ return connectionRenderingFigure;
+ }
+
+ public void setInputEnabled(boolean enabled)
+ {
+ isInputEnabled = enabled;
+ }
+
+ public void setSelectionEnabled(boolean enabled)
+ {
+ isSelectionEnabled = enabled;
+ }
+
+ public XSDMenuListener getMenuListener()
+ {
+ return menuProvider.getMenuListener();
+ }
+
+ protected static Color white = null;
+ protected void hookControl()
+ {
+ super.hookControl();
+
+ if (white == null)
+ {
+ white = new Color(getControl().getDisplay(), 255, 255, 255);
+ }
+ getControl().setBackground(white);
+
+ editDomain = new DefaultEditDomain(null);
+ ((DefaultEditDomain)editDomain).setDefaultTool(new SelectionTool());
+ editDomain.loadDefaultTool();
+ editDomain.addViewer(this);
+
+ //jvh - gef port - moved this from below so it is available when adding context menu below
+ menuProvider = new GraphContextMenuProvider(this, menuSelectionProvider, editor.getXSDTextEditor());
+ setContextMenu(menuProvider);
+
+ // add context menu to the graph
+ MenuManager manager = new MenuManager();
+ manager.addMenuListener(getMenuListener()); //jvh - gef port
+ manager.setRemoveAllWhenShown(true);
+ Menu menu = manager.createContextMenu(getControl());
+ getControl().setMenu(menu);
+
+ KeyAdapter keyListener = new KeyAdapter()
+ {
+ /**
+ * @see org.eclipse.swt.events.KeyAdapter#keyReleased(KeyEvent)
+ */
+ public void keyReleased(KeyEvent e)
+ {
+ if (e.character == SWT.DEL)
+ {
+ getMenuListener().getDeleteAction().run();
+ }
+ }
+ };
+
+ setKeyHandler(new XSDGraphicalViewerKeyHandler(this).setParent(new KeyHandler()));
+
+// getControl().addKeyListener(keyListener);
+
+ figureCanvasKeyboardHandler = new FigureCanvasKeyboardHandler();
+ getFigureCanvas().addKeyListener(figureCanvasKeyboardHandler);
+
+ getRootEditPart().activate();
+
+ ScalableRootEditPart graphicalRootEditPart = (ScalableRootEditPart)getRootEditPart();
+
+ // set the layout for the primary layer so that the children are always centered
+ //
+ graphicalRootEditPart.getLayer(LayerConstants.PRIMARY_LAYER).setLayoutManager(new CenterLayout());
+
+ // add the ConnectionRenderingFigure which is responsible for drawing all of the lines in the view
+ //
+ IFigure figure = graphicalRootEditPart.getLayer(LayerConstants.HANDLE_LAYER);
+ figure.setLayoutManager(new StackLayout());
+ connectionRenderingFigure = new ConnectionRenderingFigure(graphicalRootEditPart.getLayer(LayerConstants.PRIMARY_LAYER));
+ figure.add(connectionRenderingFigure);
+
+ figure.validate();
+ }
+
+ public XSDConcreteComponent getInput()
+ {
+ return input;
+ }
+
+ protected EditPart getEditPart(EditPart parent, Object object)
+ {
+ EditPart result = null;
+ for (Iterator i = parent.getChildren().iterator(); i.hasNext(); )
+ {
+ EditPart editPart = (EditPart)i.next();
+ if (editPart.getModel() == object)
+ {
+ result = editPart;
+ break;
+ }
+ }
+
+ if (result == null)
+ {
+ for (Iterator i = parent.getChildren().iterator(); i.hasNext(); )
+ {
+ EditPart editPart = getEditPart((EditPart)i.next(), object);
+ if (editPart != null)
+ {
+ result = editPart;
+ break;
+ }
+ }
+ }
+
+ return result;
+ }
+
+ public abstract void setInput(XSDConcreteComponent comp);
+
+ public abstract void setSelection(XSDConcreteComponent comp);
+
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/FigureCanvasKeyboardHandler.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/FigureCanvasKeyboardHandler.java
new file mode 100644
index 0000000000..158648d1e8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/FigureCanvasKeyboardHandler.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * 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.graph;
+
+import org.eclipse.draw2d.FigureCanvas;
+import org.eclipse.draw2d.RangeModel;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Widget;
+
+public class FigureCanvasKeyboardHandler extends KeyAdapter
+{
+ public static final int H_SCROLL_INCREMENT = 5;
+ public static final int V_SCROLL_INCREMENT = 30;
+
+ /**
+ * Constructor for FigureCanvasKeyboardHandler.
+ */
+ public FigureCanvasKeyboardHandler()
+ {
+ super();
+ }
+
+ public void keyPressed(KeyEvent e)
+ {
+ Widget w = e.widget;
+ if (w instanceof FigureCanvas)
+ {
+ processKey(e.keyCode, (FigureCanvas)w);
+ }
+ }
+
+ private void processKey(int keyCode, FigureCanvas figureCanvas)
+ {
+ switch (keyCode)
+ {
+ case SWT.ARROW_DOWN :
+ scrollVertical(figureCanvas, false);
+ break;
+ case SWT.ARROW_UP :
+ scrollVertical(figureCanvas, true);
+ break;
+ case SWT.ARROW_LEFT :
+ scrollHorizontal(figureCanvas, true);
+ break;
+ case SWT.ARROW_RIGHT :
+ scrollHorizontal(figureCanvas, false);
+ break;
+ case SWT.PAGE_UP :
+ scrollPage(figureCanvas, true);
+ break;
+ case SWT.PAGE_DOWN :
+ scrollPage(figureCanvas, false);
+ break;
+ }
+ }
+
+ private int verifyScrollBarOffset(RangeModel model, int value)
+ {
+ value = Math.max(model.getMinimum(), value);
+ return Math.min(model.getMaximum() - model.getExtent(), value);
+ }
+
+ private void scrollVertical(FigureCanvas figureCanvas, boolean up)
+ {
+ Point location = figureCanvas.getViewport().getViewLocation();
+ int vOffset = up ? -V_SCROLL_INCREMENT : V_SCROLL_INCREMENT;
+ int x = verifyScrollBarOffset(figureCanvas.getViewport().getHorizontalRangeModel(), location.x);
+ int y = verifyScrollBarOffset(figureCanvas.getViewport().getVerticalRangeModel(), location.y + vOffset);
+ figureCanvas.scrollSmoothTo(x, y);
+ }
+
+ private void scrollHorizontal(FigureCanvas figureCanvas, boolean left)
+ {
+ Point location = figureCanvas.getViewport().getViewLocation();
+ int hOffset = left ? -H_SCROLL_INCREMENT : H_SCROLL_INCREMENT;
+ int x = verifyScrollBarOffset(figureCanvas.getViewport().getHorizontalRangeModel(), location.x + hOffset);
+ int y = verifyScrollBarOffset(figureCanvas.getViewport().getVerticalRangeModel(), location.y);
+ figureCanvas.scrollSmoothTo(x, y);
+ }
+
+ private void scrollPage(FigureCanvas figureCanvas, boolean up)
+ {
+ Rectangle clientArea = figureCanvas.getClientArea();
+ int increment = up ? -clientArea.height : clientArea.height;
+ Point location = figureCanvas.getViewport().getViewLocation();
+ int x = verifyScrollBarOffset(figureCanvas.getViewport().getHorizontalRangeModel(), location.x);
+ int y = verifyScrollBarOffset(figureCanvas.getViewport().getVerticalRangeModel(), location.y + increment);
+ figureCanvas.scrollSmoothTo(x, y);
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/GraphContextMenuProvider.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/GraphContextMenuProvider.java
new file mode 100644
index 0000000000..cc092cff1b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/GraphContextMenuProvider.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * 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.graph;
+
+import org.eclipse.gef.ContextMenuProvider;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.wst.xsd.ui.internal.XSDMenuListener;
+import org.eclipse.wst.xsd.ui.internal.XSDTextEditor;
+
+
+public class GraphContextMenuProvider extends ContextMenuProvider
+{
+
+ XSDMenuListener xsdMenuListener;
+
+ /**
+ * Constructor for GraphContextMenuProvider.
+ * @param selectionProvider
+ * @param editor
+ */
+ public GraphContextMenuProvider(
+ EditPartViewer viewer,
+ ISelectionProvider selectionProvider,
+ XSDTextEditor editor)
+ {
+ super(viewer);
+ this.viewer = viewer;
+ xsdMenuListener = new XSDMenuListener(selectionProvider);
+ }
+
+ public XSDMenuListener getMenuListener()
+ {
+ return xsdMenuListener;
+ }
+
+
+ /**
+ * @see org.eclipse.gef.ui.parts.ContextMenuProvider#buildContextMenu(org.eclipse.jface.action.IMenuManager, org.eclipse.gef.EditPartViewer)
+ */
+ public void buildContextMenu(IMenuManager arg0)
+ {
+ xsdMenuListener.menuAboutToShow(arg0);
+ }
+
+ protected EditPartViewer viewer;
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/GraphicsConstants.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/GraphicsConstants.java
new file mode 100644
index 0000000000..691996dec0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/GraphicsConstants.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.graph;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * A collection of color-related constants.
+ */
+public interface GraphicsConstants
+{
+ public final static Display display = Display.getDefault();
+ public final static Color categoryBorderColor = new Color(null, 118, 134, 164);
+ public final static Color elementBorderColor = new Color(null, 138, 154, 184);
+ public final static Color elementBackgroundColor = new Color(null, 236, 242, 252);
+ public final static Color elementLabelColor = new Color(null, 80, 96, 144);
+ public final static Color readOnlyBorderColor = new Color(null, 164, 164, 164);
+
+ public final static Color readOnlyBackgroundColor = ColorConstants.white;
+
+ public final static Font smallFont = new Font(Display.getCurrent(), "Small Fonts", 6, SWT.NONE);
+ public final static Font medium = new Font(Display.getCurrent(), "Tahoma", 8, SWT.NONE);
+ public final static Font mediumBoldFont = new Font(Display.getCurrent(), "Tahoma", 8, SWT.BOLD);
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/LinkedGraphViewer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/LinkedGraphViewer.java
new file mode 100644
index 0000000000..09645a1830
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/LinkedGraphViewer.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * 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.graph;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xsd.ui.internal.XSDEditor;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.w3c.dom.Element;
+
+
+
+public class LinkedGraphViewer
+{
+
+ protected ISelectionProvider menuSelectionProvider;
+ protected XSDEditor editor;
+ protected BaseGraphicalViewer majorViewer, minorViewer;
+
+ /**
+ *
+ */
+ public LinkedGraphViewer(XSDEditor editor, ISelectionProvider selectionProvider)
+ {
+ menuSelectionProvider = selectionProvider;
+ this.editor = editor;
+ }
+
+ public void setMajorViewer(BaseGraphicalViewer majorViewer)
+ {
+ this.majorViewer = majorViewer;
+ }
+
+ public void setMinorViewer(BaseGraphicalViewer minorViewer)
+ {
+ this.minorViewer = minorViewer;
+ }
+
+ protected Composite control;
+ protected SashForm sashForm;
+
+ public Control createControl(Composite parent)
+ {
+ //control = new Composite(parent, SWT.DEFAULT);
+
+ control = sashForm = new SashForm(parent, SWT.VERTICAL | SWT.BORDER);
+ sashForm.setLayoutData(ViewUtility.createFill());
+
+ majorViewer.createControl(sashForm);
+ minorViewer.createControl(sashForm);
+// control.setLayout(new GridLayout());
+// control.setLayoutData(ViewUtility.createFill());
+ return control;
+ }
+
+ public void addSelectionChangedListener(ISelectionChangedListener selectionListener)
+ {
+ if (majorViewer != null)
+ {
+ majorViewer.addSelectionChangedListener(selectionListener);
+ majorViewer.addSelectionChangedListener(majorViewerListener);
+ }
+ if (minorViewer != null)
+ {
+ minorViewer.addSelectionChangedListener(selectionListener);
+ }
+ }
+
+ /**
+ * @return Composite
+ */
+ public Composite getControl()
+ {
+ return control;
+ }
+
+ /**
+ *
+ */
+ protected XSDConcreteComponent getInput()
+ {
+ return majorViewer.getInput();
+ }
+
+ /**
+ * @param schema
+ */
+ protected void setInput(XSDConcreteComponent input)
+ {
+ majorViewer.setInput(input);
+ minorViewer.setInput(input);
+ }
+
+ /**
+ * @param component
+ */
+ public void setSelection(XSDConcreteComponent component)
+ {
+ majorViewer.setSelection(component);
+ }
+
+ protected MajorViewerSelectionChangedListener majorViewerListener = new MajorViewerSelectionChangedListener();
+
+ private class MajorViewerSelectionChangedListener implements ISelectionChangedListener
+ {
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ public void selectionChanged(SelectionChangedEvent event)
+ {
+ ISelection editPartSelection = event.getSelection();
+ List nodeList = new ArrayList();
+ if (editPartSelection instanceof IStructuredSelection)
+ {
+ for (Iterator i = ((IStructuredSelection)editPartSelection).iterator(); i.hasNext(); )
+ {
+ EditPart editPart = (EditPart)i.next();
+ if (editPart != null)
+ {
+ Object model = editPart.getModel();
+ if (model instanceof XSDConcreteComponent)
+ {
+ Element element = ((XSDConcreteComponent)model).getElement();
+
+ // this test ensures that we don't attempt to select an element for an external schema
+ //
+ if (element instanceof XMLNode)
+ {
+ // now update the minor viewer based on the selected component in the major viewer
+ minorViewer.setInput((XSDConcreteComponent)model);
+ minorViewer.setSelection((XSDConcreteComponent)model);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/PrintGraphAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/PrintGraphAction.java
new file mode 100644
index 0000000000..53df913a12
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/PrintGraphAction.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * 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.graph;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.printing.PrintDialog;
+import org.eclipse.swt.printing.Printer;
+import org.eclipse.swt.printing.PrinterData;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+
+
+public class PrintGraphAction extends Action
+{
+ protected XSDComponentViewer componentViewer;
+
+ public PrintGraphAction(XSDComponentViewer componentViewer)
+ {
+ super("Print");
+ this.componentViewer = componentViewer;
+ }
+
+ public void run()
+ {
+ try
+ {
+ PrintDialog dialog = new PrintDialog(Display.getCurrent().getActiveShell());
+ PrinterData data = dialog.open();
+ Printer printer = new Printer(data);
+
+ Control control = componentViewer.getControl();
+ Display display = Display.getCurrent();
+ Image graphImage = new Image(display, control.getSize().x, control.getSize().y);
+ GC graphGC = new GC(control);
+ graphGC.copyArea(graphImage, 0, 0);
+
+ ImageData graphImageData = graphImage.getImageData();
+ graphImageData.transparentPixel = -1;
+
+ Point screenDPI = display.getDPI();
+ Point printerDPI = printer.getDPI();
+ int scaleFactor = printerDPI.x / screenDPI.x;
+ Rectangle trim = printer.computeTrim(0, 0, 0, 0);
+ if (printer.startJob("Print XML Schema Graph"))
+ {
+ GC gc = new GC(printer);
+ if (printer.startPage())
+ {
+ gc.drawImage(
+ graphImage,
+ 0,
+ 0,
+ graphImageData.width,
+ graphImageData.height,
+ -trim.x,
+ -trim.y,
+ scaleFactor * graphImageData.width,
+ scaleFactor * graphImageData.height);
+ printer.endPage();
+ }
+ printer.endJob();
+ }
+ printer.dispose();
+ graphGC.dispose();
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDChildUtility.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDChildUtility.java
new file mode 100644
index 0000000000..887889cc36
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDChildUtility.java
@@ -0,0 +1,285 @@
+/*******************************************************************************
+ * 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.graph;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.XSDWildcard;
+import org.eclipse.xsd.util.XSDSwitch;
+
+
+public class XSDChildUtility
+{
+ static public List getModelChildren(Object model)
+ {
+ XSDChildVisitor visitor = new XSDChildVisitor(model);
+ visitor.visitXSDObject(model);
+ return visitor.list;
+ }
+
+ static public List getImmediateDerivedTypes(XSDComplexTypeDefinition complexType)
+ {
+ ArrayList typesDerivedFrom = new ArrayList();
+
+ // A handy convenience method quickly gets all
+ // typeDefinitions within our schema; note that
+ // whether or not this returns types in included,
+ // imported, or redefined schemas is subject to change
+ List typedefs = complexType.getSchema().getTypeDefinitions();
+
+ for (Iterator iter = typedefs.iterator(); iter.hasNext(); )
+ {
+ XSDTypeDefinition typedef = (XSDTypeDefinition)iter.next();
+ // Walk the baseTypes from this typedef seeing if any
+ // of them match the requested one
+ if (complexType.equals(typedef.getBaseType()))
+ {
+ // We found it, return the original one and continue
+ typesDerivedFrom.add(typedef);
+ }
+ }
+ return typesDerivedFrom;
+ }
+ // TODO... use the XSDVisitor defined in xsdeditor.util instead
+ //
+ public static class XSDChildVisitor extends XSDVisitor
+ {
+ Object root;
+ List list = new ArrayList();
+
+ public XSDChildVisitor(Object root)
+ {
+ this.root = root;
+ }
+
+ public void visitXSDModelGroup(XSDModelGroup xsdModelGroup)
+ {
+ if (xsdModelGroup != root)
+ {
+ list.add(xsdModelGroup);
+ }
+ else
+ {
+ super.visitXSDModelGroup(xsdModelGroup);
+ }
+ }
+
+ public void visitXSDModelGroupDefinition(XSDModelGroupDefinition xsdModelGroupDefinition)
+ {
+ if (xsdModelGroupDefinition != root)
+ {
+ list.add(xsdModelGroupDefinition);
+ }
+ else
+ {
+ super.visitXSDModelGroupDefinition(xsdModelGroupDefinition);
+ }
+ }
+
+ public void visitXSDElementDeclaration(XSDElementDeclaration xsdElementDeclaration)
+ {
+ if (xsdElementDeclaration != root)
+ {
+ list.add(xsdElementDeclaration);
+ }
+ else
+ {
+ super.visitXSDElementDeclaration(xsdElementDeclaration);
+ }
+ }
+
+ public void visitXSDComplexTypeDefinition(XSDComplexTypeDefinition xsdComplexTypeDefinition)
+ {
+ if (xsdComplexTypeDefinition != root)
+ {
+ if (xsdComplexTypeDefinition.getName() != null || getModelChildren(xsdComplexTypeDefinition).size() > 0)
+ {
+ list.add(xsdComplexTypeDefinition);
+ }
+ }
+ else
+ {
+ super.visitXSDComplexTypeDefinition(xsdComplexTypeDefinition);
+ }
+ }
+
+ public void visitXSDWildcard(XSDWildcard xsdWildCard)
+ {
+ if (xsdWildCard != root)
+ {
+ list.add(xsdWildCard);
+ }
+ else
+ {
+ super.visitXSDWildcard(xsdWildCard);
+ }
+ }
+ }
+
+
+ public static class XSDVisitor
+ {
+ int indent = 0;
+
+ public void visitXSDObject(Object object)
+ {
+ if (object == null)
+ return;
+
+ XSDSwitch theSwitch = new XSDSwitch()
+ {
+ public Object caseXSDComplexTypeDefinition(XSDComplexTypeDefinition object)
+ {
+ visitXSDComplexTypeDefinition(object);
+ return null;
+ }
+
+ public Object caseXSDAttributeUse(XSDAttributeUse object)
+ {
+ visitXSDAttributeUse(object);
+ return null;
+ }
+
+ public Object caseXSDElementDeclaration(XSDElementDeclaration object)
+ {
+ visitXSDElementDeclaration(object);
+ return null;
+ }
+
+ public Object caseXSDModelGroupDefinition(XSDModelGroupDefinition object)
+ {
+ visitXSDModelGroupDefinition(object);
+ return super.caseXSDModelGroupDefinition(object);
+ }
+
+ public Object caseXSDModelGroup(XSDModelGroup object)
+ {
+ visitXSDModelGroup(object);
+ return super.caseXSDModelGroup(object);
+ }
+
+ public Object caseXSDParticle(XSDParticle object)
+ {
+ visitXSDParticle(object);
+ return null;
+ }
+
+ public Object caseXSDSchema(XSDSchema object)
+ {
+ visitXSDSchema(object);
+ return null;
+ }
+
+ public Object caseXSDWildcard(XSDWildcard object)
+ {
+ visitXSDWildcard(object);
+ return null;
+ }
+ };
+ theSwitch.doSwitch((EObject)object);
+ }
+
+ public void visitXSDAttributeUse(XSDAttributeUse xsdAttributeUse)
+ {
+// printIndented("@" + xsdAttributeUse.getAttributeDeclaration().getName());
+ }
+
+ public void visitXSDSchema(XSDSchema xsdSchema)
+ {
+// printIndented("XSDSchema");
+ indent += 2;
+ for (Iterator iterator = xsdSchema.getElementDeclarations().iterator(); iterator.hasNext(); )
+ {
+ visitXSDObject(iterator.next());
+ }
+ indent -= 2;
+ }
+
+ public void visitXSDElementDeclaration(XSDElementDeclaration xsdElementDeclaration)
+ {
+// printIndented(xsdElementDeclaration.getName());
+ indent += 2;
+ XSDTypeDefinition td = xsdElementDeclaration.getTypeDefinition();
+ if (td == null)
+ {
+ td = xsdElementDeclaration.getAnonymousTypeDefinition();
+ }
+ visitXSDObject(td);
+ indent -= 2;
+ }
+
+ public void visitXSDComplexTypeDefinition(XSDComplexTypeDefinition xsdComplexTypeDefinition)
+ {
+// printIndented("XSDComplexTypeDefinition : " + xsdComplexTypeDefinition.getContent());
+ indent += 2;
+ for (Iterator i = xsdComplexTypeDefinition.getAttributeUses().iterator(); i.hasNext(); )
+ {
+ visitXSDObject((XSDAttributeUse)i.next());
+ }
+ visitXSDObject(xsdComplexTypeDefinition.getContent());
+ indent -= 2;
+ }
+
+ public void visitXSDModelGroup(XSDModelGroup xsdModelGroup)
+ {
+// printIndented("XSDModelGroup");
+ indent += 2;
+ for (Iterator iterator = xsdModelGroup.getContents().iterator(); iterator.hasNext(); )
+ {
+ visitXSDObject(iterator.next());
+ }
+ indent -= 2;
+ }
+
+ public void visitXSDModelGroupDefinition(XSDModelGroupDefinition xsdModelGroupDefinition)
+ {
+// printIndented("XSDModelGroupDefinition");
+ indent += 2;
+ visitXSDObject(xsdModelGroupDefinition.getResolvedModelGroupDefinition().getModelGroup());
+ indent -= 2;
+ }
+
+ public void visitXSDParticle(XSDParticle xsdParticle)
+ {
+// printIndented("XSDParticle");
+ indent += 2;
+ if (xsdParticle.getContent() != null)
+ visitXSDObject(xsdParticle.getContent());
+ indent -= 2;
+ }
+
+ public void visitXSDWildcard(XSDWildcard object)
+ {
+// printIndented("XSDWildcard");
+ }
+
+ public void printIndented(String string)
+ {
+ //String spaces = "";
+ //for (int i = 0; i < indent; i++)
+ //{
+ // spaces += " ";
+ //}
+ //System.out.println(spaces + string);
+ }
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDComponentViewer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDComponentViewer.java
new file mode 100644
index 0000000000..c5aa0b2a6d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDComponentViewer.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * 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.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.wst.xsd.ui.internal.XSDEditor;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.ComponentViewerRootEditPart;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDSchema;
+
+
+public class XSDComponentViewer extends BaseGraphicalViewer
+{
+ protected ComponentViewerRootEditPart componentViewerRootEditPart;
+ public XSDComponentViewer(XSDEditor editor, ISelectionProvider menuSelectionProvider)
+ {
+ super(editor, menuSelectionProvider);
+ }
+
+ public void setInput(XSDConcreteComponent component)
+ {
+ if (isInputEnabled)
+ {
+ input = null;
+
+ if (component instanceof XSDElementDeclaration ||
+ component instanceof XSDSchema ||
+ component instanceof XSDModelGroup ||
+ component instanceof XSDModelGroupDefinition ||
+ component instanceof XSDComplexTypeDefinition)
+ {
+ input = component;
+ }
+
+ componentViewerRootEditPart.setInput(input);
+ if (!(input instanceof XSDSchema))
+ {
+ editor.getGraphViewer().backButton.setEnabled(true);
+ }
+ }
+ }
+
+ public void setSelection(XSDConcreteComponent component)
+ {
+ if (isSelectionEnabled)
+ {
+ //System.out.println("XSDComponentViewer.setSelection(" + component + ")");
+ List editPartList = new ArrayList();
+ StructuredSelection selection = new StructuredSelection();
+ if (component instanceof XSDElementDeclaration ||
+ component instanceof XSDSchema ||
+ component instanceof XSDModelGroup ||
+ component instanceof XSDModelGroupDefinition ||
+ component instanceof XSDComplexTypeDefinition)
+ {
+ if (component != null)
+ {
+ EditPart editPart = getEditPart(componentViewerRootEditPart, component);
+ if (editPart != null)
+ {
+ // TODO ... take a look at this to figure our why a newly added component
+ // seems to have the wrong bounds at this point... is this a layout issue?
+ // As a temp hack I'm ignoring the selection of component with bounds (x, y) == (0, 0)
+ // Perhaps a delayed selection is required?
+ Rectangle bounds = ((GraphicalEditPart)editPart).getFigure().getBounds();
+ if (bounds.x > 0 || bounds.y > 0)
+ {
+ editPartList.add(editPart);
+ }
+ }
+ }
+ }
+ setSelection(new StructuredSelection(editPartList));
+ }
+ }
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#hookControl()
+ */
+ protected void hookControl()
+ {
+ super.hookControl();
+ componentViewerRootEditPart = new ComponentViewerRootEditPart();
+ setContents(componentViewerRootEditPart);
+ }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphUtil.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphUtil.java
new file mode 100644
index 0000000000..a19f20b5c4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphUtil.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * 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.graph;
+
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.w3c.dom.Element;
+
+
+public class XSDGraphUtil
+{
+ public static boolean isEditable(Object model)
+ {
+ boolean result = false;
+ if (model instanceof XSDConcreteComponent)
+ {
+ Element element = ((XSDConcreteComponent)model).getElement();
+ // this test ensures that we don't attempt to select an element for an external schema
+ //
+ if (element instanceof XMLNode)
+ {
+ result = true;
+ }
+ }
+ return result;
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphViewer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphViewer.java
new file mode 100644
index 0000000000..cec0d4f076
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphViewer.java
@@ -0,0 +1,574 @@
+/*******************************************************************************
+ * 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.graph;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.custom.ViewForm;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.ui.part.PageBook;
+import org.eclipse.wst.xsd.ui.internal.XSDEditor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.XSDSelectionManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.CategoryEditPart;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.TopLevelComponentEditPart;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDNotationDeclaration;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+public class XSDGraphViewer implements ISelectionChangedListener
+{
+ protected PageBook pageBook;
+ protected Control componentViewerControl;
+ protected Control inheritanceViewerControl;
+ protected Control subGroupsViewerControl;
+ protected XSDComponentViewer componentViewer;
+ protected XSDInheritanceViewer inheritanceViewer;
+ protected XSDSubstitutionGroupsViewer subGroupsViewer;
+ protected XSDSelectionManager xsdSelectionManager;
+ protected XSDSchema schema;
+ protected InternalSelectionProvider internalSelectionProvider = new InternalSelectionProvider();
+ protected XSDEditor editor;
+ protected PrintGraphAction printGraphAction;
+ protected SashForm sashForm;
+ protected ToolItem backButton;
+
+ public XSDGraphViewer(XSDEditor editor)
+ {
+ super();
+ this.editor = editor;
+ }
+
+ public void setSchema(XSDSchema schema)
+ {
+ this.schema = schema;
+ }
+ ToolBar graphToolBar; // the toolbar at the top of the graph view
+ ToolItem toolItem; // the view tool item
+ ViewForm form; // view form for holding all the views
+ Composite frameBar; // The composite that contains the toolbar
+ Composite c; // temporary blank page. Clean this up when all views completed
+ LinkedGraphViewer linkInheritanceViewer;
+
+ protected void createInheritanceViewer(Composite parent)
+ {
+ linkInheritanceViewer = new LinkedGraphViewer(editor, internalSelectionProvider);
+ BaseGraphicalViewer graphViewer = new XSDInheritanceViewer(editor, internalSelectionProvider);
+ linkInheritanceViewer.setMajorViewer(graphViewer);
+ graphViewer = new XSDComponentViewer(editor, editor.getSelectionManager());
+ linkInheritanceViewer.setMinorViewer(graphViewer);
+ linkInheritanceViewer.createControl(parent);
+ }
+ LinkedGraphViewer linkSubstitutionGroupViewer;
+
+ protected void createSubstitutionGroupViewer(Composite parent)
+ {
+ linkSubstitutionGroupViewer = new LinkedGraphViewer(editor, internalSelectionProvider);
+ BaseGraphicalViewer graphViewer = new XSDSubstitutionGroupsViewer(editor, internalSelectionProvider);
+ linkSubstitutionGroupViewer.setMajorViewer(graphViewer);
+ graphViewer = new XSDComponentViewer(editor, internalSelectionProvider);
+ linkSubstitutionGroupViewer.setMinorViewer(graphViewer);
+ linkSubstitutionGroupViewer.createControl(parent);
+ }
+ static private Color dividerColor;
+
+ public Control createControl(Composite parent)
+ {
+ pageBook = new PageBook(parent, 0);
+
+ //componentViewer = new XSDComponentViewer(editor, internalSelectionProvider);
+ componentViewer = new XSDComponentViewer(editor, editor.getSelectionManager());
+ ViewUtility util = new ViewUtility();
+ final Composite client;
+ String designLayoutPosition = XSDEditorPlugin.getPlugin().getDesignLayoutPosition();
+ form = new ViewForm(pageBook, SWT.NONE);
+ frameBar = new Composite(form, SWT.NONE);
+ org.eclipse.swt.layout.GridLayout frameLayout = new org.eclipse.swt.layout.GridLayout();
+ frameLayout.marginWidth = 0;
+ frameLayout.marginHeight = 0;
+ frameBar.setLayout(frameLayout);
+ graphToolBar = new ToolBar(frameBar, SWT.FLAT);
+ graphToolBar.addTraverseListener(new TraverseListener()
+ {
+ public void keyTraversed(TraverseEvent e)
+ {
+ if (e.detail == SWT.TRAVERSE_MNEMONIC)
+ e.doit = false;
+ }
+ });
+ backButton = new ToolItem(graphToolBar, SWT.PUSH);
+ backButton.setImage(XSDEditorPlugin.getXSDImage("icons/back.gif")); //$NON-NLS-1$
+ backButton.setToolTipText(XSDEditorPlugin.getXSDString("_UI_HOVER_BACK_TO_SCHEMA_VIEW")); //$NON-NLS-1$
+ backButton.setEnabled(false);
+ backButton.addSelectionListener(new SelectionAdapter()
+ {
+ public void widgetSelected(SelectionEvent e)
+ {
+ editor.getGraphViewer().setInput(editor.getXSDSchema());
+ // internalSelectionProvider.setSelection(new StructuredSelection(editor.getXSDSchema()));
+ editor.getSelectionManager().setSelection(new StructuredSelection(editor.getXSDSchema()));
+ }
+ });
+ // TEMPORARILY REMOVE DIFFERENT VIEWS
+ // toolItem = new ToolItem(graphToolBar, SWT.DROP_DOWN);
+ //
+ // // set default to containment
+ //// toolItem.setText(XSDEditorPlugin.getXSDString("_UI_CONTAINMENT"));
+ // toolItem.addSelectionListener(new SelectionAdapter()
+ // {
+ // public void widgetSelected(SelectionEvent e)
+ // {
+ // Menu menu = new Menu(graphToolBar);
+ // if (menu != null)
+ // {
+ // if (!showGraphMenu(menu))
+ // {
+ // frameBar.setVisible(false);
+ // return;
+ // }
+ // Rectangle b = toolItem.getBounds();
+ // org.eclipse.swt.graphics.Point p = toolItem.getParent().toDisplay(new
+ // org.eclipse.swt.graphics.Point(b.x, b.y + b.height));
+ // menu.setLocation(p.x, p.y);
+ // menu.setVisible(true);
+ // }
+ // }
+ // });
+ form.setTopLeft(frameBar);
+ // createInheritanceViewer(form);
+ // createSubstitutionGroupViewer(form);
+ componentViewerControl = componentViewer.createControl(form);
+ //inheritanceViewerControl = inheritanceViewer.createControl(form);
+ //subGroupsViewerControl = subGroupsViewer.createControl(form);
+ c = ViewUtility.createComposite(form, 1);
+ form.setContent(componentViewerControl);
+ // componentViewerControl.setData("layout ratio", new Float(0.65));
+ form.setData("layout ratio", new Float(0.65));
+ if (dividerColor == null)
+ {
+ dividerColor = new Color(componentViewerControl.getDisplay(), 143, 141, 138);
+ }
+ //KCPort
+ // client.addPaintListener(new PaintListener()
+ // {
+ // /**
+ // * @see org.eclipse.swt.events.PaintListener#paintControl(PaintEvent)
+ // */
+ // public void paintControl(PaintEvent e)
+ // {
+ // Object source = e.getSource();
+ // if (source instanceof Composite)
+ // {
+ // Composite comp = (Composite)source;
+ // Rectangle boundary = comp.getClientArea();
+ // e.gc.setForeground(dividerColor);
+ // e.gc.drawLine(boundary.x, boundary.y, boundary.x + boundary.width,
+ // boundary.y);
+ // editor.setDesignWeights(sashForm.getWeights(), true);
+ // }
+ // }
+ // });
+ // KCPort
+ // designView = new DesignViewer(editor);
+ // final Control design = designView.createControl(client);
+ // design.setLayoutData(ViewUtility.createFill());
+ // client.setData("layout ratio", new Float(0.35));
+ // enableDesignView(editor.isCombinedDesignAndSourceView());
+ // pageBook.showPage(sashForm);
+ pageBook.showPage(form);
+ componentViewer.addSelectionChangedListener(internalSelectionProvider);
+ //inheritanceViewer.addSelectionChangedListener(this);
+ // Temporarily remove graph tool bar
+ // linkInheritanceViewer.addSelectionChangedListener(this);
+ // linkSubstitutionGroupViewer.addSelectionChangedListener(this);
+ printGraphAction = new PrintGraphAction(componentViewer);
+ return pageBook;
+ // return form;
+ }
+
+ private boolean showGraphMenu(Menu menu)
+ {
+ MenuItem containmentMenuItem = new MenuItem(menu, SWT.RADIO);
+ containmentMenuItem.setText(XSDEditorPlugin.getXSDString("_UI_CONTAINMENT"));
+ containmentMenuItem.addSelectionListener(new SelectionAdapter()
+ {
+ public void widgetSelected(SelectionEvent e)
+ {
+ toolItem.setText(XSDEditorPlugin.getXSDString("_UI_CONTAINMENT"));
+ frameBar.layout(true);
+ graphToolBar.layout(true);
+ form.setContent(componentViewerControl);
+ // retrieve latest input which could have changed...from designView ??
+ // get it directly?
+ // KCPort
+ // setInput(designView.getInput());
+ }
+ });
+ MenuItem inheritanceMenuItem = new MenuItem(menu, SWT.RADIO);
+ inheritanceMenuItem.setText(XSDEditorPlugin.getXSDString("_UI_INHERITANCE"));
+ inheritanceMenuItem.addSelectionListener(new SelectionAdapter()
+ {
+ public void widgetSelected(SelectionEvent e)
+ {
+ toolItem.setText(XSDEditorPlugin.getXSDString("_UI_INHERITANCE"));
+ frameBar.layout(true);
+ graphToolBar.layout(true);
+ // form.setContent(inheritanceViewerControl);
+ form.setContent(linkInheritanceViewer.getControl());
+ if (linkInheritanceViewer.getInput() == null)
+ {
+ linkInheritanceViewer.setInput(schema);
+ }
+ }
+ });
+ MenuItem subGroupsMenuItem = new MenuItem(menu, SWT.RADIO);
+ subGroupsMenuItem.setText(XSDEditorPlugin.getXSDString("_UI_SUBSTITUTION_GROUPS"));
+ subGroupsMenuItem.addSelectionListener(new SelectionAdapter()
+ {
+ public void widgetSelected(SelectionEvent e)
+ {
+ toolItem.setText(XSDEditorPlugin.getXSDString("_UI_SUBSTITUTION_GROUPS"));
+ frameBar.layout(true);
+ graphToolBar.layout(true);
+ form.setContent(linkSubstitutionGroupViewer.getControl());
+ // retrieve latest input which could have changed...from designView ??
+ // get it directly?
+ // setInput(designView.getInput());
+ if (linkSubstitutionGroupViewer.getInput() == null)
+ {
+ linkSubstitutionGroupViewer.setInput(schema);
+ }
+ }
+ });
+ if (toolItem.getText().equals(XSDEditorPlugin.getXSDString("_UI_CONTAINMENT")))
+ {
+ containmentMenuItem.setSelection(true);
+ }
+ else if (toolItem.getText().equals(XSDEditorPlugin.getXSDString("_UI_INHERITANCE")))
+ {
+ inheritanceMenuItem.setSelection(true);
+ }
+ else if (toolItem.getText().equals(XSDEditorPlugin.getXSDString("_UI_SUBSTITUTION_GROUPS")))
+ {
+ subGroupsMenuItem.setSelection(true);
+ }
+ return true;
+ }
+
+ public Action getPrintGraphAction()
+ {
+ return printGraphAction;
+ }
+
+ public void updateDesignLayout(int newLayout)
+ {
+ sashForm.setOrientation(newLayout);
+ sashForm.layout();
+ }
+
+ public SashForm getSashForm()
+ {
+ return sashForm;
+ }
+
+ public void enableDesignView(boolean enable)
+ {
+ }
+
+ public XSDComponentViewer getComponentViewer()
+ {
+ return componentViewer;
+ }
+
+ public void setBackButtonEnabled(boolean state)
+ {
+ backButton.setEnabled(state);
+ }
+
+ public void setInput(Object object)
+ {
+ if (object instanceof XSDConcreteComponent)
+ {
+ XSDConcreteComponent xsdComp = (XSDConcreteComponent) object;
+ if (xsdComp instanceof XSDSchema)
+ {
+ setBackButtonEnabled(false);
+ }
+ else
+ {
+ setBackButtonEnabled(true);
+ }
+ componentViewer.setInput(xsdComp);
+ componentViewer.setSelection(xsdComp);
+ }
+ }
+
+ protected boolean isDeleted(XSDConcreteComponent component)
+ {
+ boolean result = false;
+ if (component != null && component.getElement() != null)
+ {
+ result = component.getElement().getParentNode() == null;
+ }
+ return result;
+ }
+
+ public void setSelectionManager(XSDSelectionManager newSelectionManager)
+ {
+ // disconnect from old one
+ if (xsdSelectionManager != null)
+ {
+ xsdSelectionManager.removeSelectionChangedListener(this);
+ internalSelectionProvider.removeSelectionChangedListener(xsdSelectionManager);
+ }
+ xsdSelectionManager = newSelectionManager;
+ // connect to new one
+ if (xsdSelectionManager != null)
+ {
+ xsdSelectionManager.addSelectionChangedListener(this);
+ internalSelectionProvider.addSelectionChangedListener(xsdSelectionManager);
+ }
+ }
+
+ // this method is called by the SelectionManager to notify the graph view
+ // that the editor selection has changed
+ //
+ public void selectionChanged(SelectionChangedEvent event)
+ {
+ // here we check the selection source to ensure that this selection came
+ // from a different view (not from the graph view)
+ if (event.getSource() != getComponentViewer())
+ {
+ handleSelection(event.getSelection(), true);
+ }
+ }
+
+ protected XSDConcreteComponent getTopLevelComponent(XSDConcreteComponent component)
+ {
+ XSDConcreteComponent prev = component;
+ XSDConcreteComponent container = component;
+ while ( container != null && !(container instanceof XSDSchema))
+ {
+ prev = container;
+ container = container.getContainer();
+ }
+ return container != null ? prev : null;
+ }
+
+ // TODO.. we need to clean this method up and add comments to clarify what's going on
+ //
+ protected void handleSelection(ISelection selection, boolean isSelectionRequired)
+ {
+ StructuredSelection s = (StructuredSelection)selection;
+ Object obj = s.getFirstElement();
+ if (obj instanceof XSDConcreteComponent)
+ {
+ XSDConcreteComponent selectedComponent = (XSDConcreteComponent)obj;
+ Object currentInput = getComponentViewer().getInput();
+
+ // in this case we're looking at a top level view
+ // so if the selection is a 'non-top-level' component we need to do a set input
+ XSDSchema topLevelSchema = null;
+ if (currentInput instanceof XSDSchema)
+ {
+ if (selectedComponent instanceof XSDSchema ||
+ selectedComponent.getContainer() instanceof XSDSchema)
+ {
+ topLevelSchema = (XSDSchema)currentInput;
+ }
+ }
+ else if (selectedComponent instanceof XSDSchemaDirective || selectedComponent instanceof XSDSimpleTypeDefinition || selectedComponent instanceof XSDNotationDeclaration)
+ {
+ topLevelSchema = selectedComponent.getSchema();
+ }
+
+ if (topLevelSchema != null)
+ {
+ setInput(topLevelSchema);
+ // TODO... this is not 'quite' right
+ // it should be possible to view in
+ }
+ else
+ {
+ EditPart editPart = getComponentViewer().getEditPart(getComponentViewer().getRootEditPart(), obj);
+ if (editPart == null)
+ {
+ XSDConcreteComponent topLevelComponent = getTopLevelComponent(selectedComponent);
+ if (topLevelComponent != null)
+ {
+ setInput(topLevelComponent);
+ }
+ }
+ }
+
+ // now we handle the selection
+ //
+ if (isSelectionRequired)
+ {
+ EditPart editPart = getComponentViewer().getRootEditPart();
+ EditPart newSelectedEditPart = getComponentViewer().getEditPart(editPart, obj);
+ if (newSelectedEditPart != null)
+ {
+ if (newSelectedEditPart instanceof TopLevelComponentEditPart)
+ {
+ TopLevelComponentEditPart topLevel = (TopLevelComponentEditPart) newSelectedEditPart;
+ CategoryEditPart categoryEP = (CategoryEditPart) topLevel.getParent();
+ categoryEP.scrollTo(topLevel);
+ getComponentViewer().reveal(newSelectedEditPart);
+ }
+ getComponentViewer().setSelection(new StructuredSelection(newSelectedEditPart));
+ }
+ }
+ }
+ }
+
+ protected Element getElementNode(Node node)
+ {
+ while (!(node instanceof Element))
+ {
+ if (node instanceof Attr)
+ {
+ node = ((Attr) node).getOwnerElement();
+ }
+ else if (node instanceof Text)
+ {
+ Node sibling = node.getNextSibling();
+ if (sibling == null)
+ {
+ break;
+ }
+ node = sibling;
+ }
+ else
+ {
+ Node parent = node.getParentNode();
+ if (parent == null)
+ {
+ break;
+ }
+ node = node.getParentNode();
+ }
+ }
+ return node instanceof Element ? (Element) node : null;
+ }
+
+
+
+ // This class listens to the graph view and converts edit part selection
+ // events
+ // into XSD component selection events that can be 'fired' to the
+ // selectionManager
+ //
+ class InternalSelectionProvider implements ISelectionProvider, ISelectionChangedListener
+ {
+ protected List listenerList = new ArrayList();
+ protected ISelection selection = new StructuredSelection();
+
+ public void addSelectionChangedListener(ISelectionChangedListener listener)
+ {
+ listenerList.add(listener);
+ }
+
+ public void removeSelectionChangedListener(ISelectionChangedListener listener)
+ {
+ listenerList.remove(listener);
+ }
+
+ public ISelection getSelection()
+ {
+ return selection;
+ }
+
+ protected void notifyListeners(SelectionChangedEvent event)
+ {
+ for (Iterator i = listenerList.iterator(); i.hasNext();)
+ {
+ ISelectionChangedListener listener = (ISelectionChangedListener) i.next();
+ listener.selectionChanged(event);
+ }
+ }
+
+ public StructuredSelection convertSelectionFromEditPartToModel(ISelection editPartSelection)
+ {
+ List selectedModelObjectList = new ArrayList();
+ if (editPartSelection instanceof IStructuredSelection)
+ {
+ for (Iterator i = ((IStructuredSelection) editPartSelection).iterator(); i.hasNext();)
+ {
+ Object obj = i.next();
+ Object model = null;
+ if (obj instanceof EditPart)
+ {
+ EditPart editPart = (EditPart) obj;
+ model = editPart.getModel();
+ // Convert category to XSDSchema
+ // if (editPart instanceof CategoryEditPart)
+ // {
+ // model = ((Category)((CategoryEditPart)editPart).getModel()).getXSDSchema();
+ // }
+ }
+ else if (obj instanceof XSDConcreteComponent)
+ {
+ //cs .. not sure why would we'd ever hit this case?
+ model = obj;
+ }
+ if (model != null)//&& model instanceof XSDConcreteComponent)
+ {
+ selectedModelObjectList.add(model);
+ }
+ }
+ }
+ return new StructuredSelection(selectedModelObjectList);
+ }
+
+ public void setSelection(ISelection selection)
+ {
+ this.selection = selection;
+ }
+
+ // This method gets called when an edit part in the graph view is selected
+ //
+ public void selectionChanged(SelectionChangedEvent event)
+ {
+ ISelection newSelection = convertSelectionFromEditPartToModel(event.getSelection());
+ this.selection = newSelection;
+ SelectionChangedEvent newEvent = new SelectionChangedEvent(getComponentViewer(), newSelection);
+ notifyListeners(newEvent);
+ }
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphicalViewerKeyHandler.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphicalViewerKeyHandler.java
new file mode 100644
index 0000000000..b6c80263ec
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphicalViewerKeyHandler.java
@@ -0,0 +1,352 @@
+/*******************************************************************************
+ * 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.graph;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.ConnectionEditPart;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.gef.KeyHandler;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.ExpandableGraphNodeEditPart;
+
+
+public class XSDGraphicalViewerKeyHandler extends KeyHandler
+{
+ public XSDGraphicalViewerKeyHandler(GraphicalViewer viewer)
+ {
+ this.viewer = viewer;
+ }
+
+ private WeakReference cachedNode;
+ int counter;
+ private GraphicalViewer viewer;
+
+ private boolean acceptConnection(KeyEvent event)
+ {
+ return event.character == '/'
+ || event.character == '?'
+ || event.character == '\\'
+ || event.character == '|';
+ }
+ private boolean acceptIntoContainer(KeyEvent event)
+ {
+ return (((event.stateMask & SWT.ALT) != 0)
+ && (event.keyCode == SWT.ARROW_RIGHT)) || (event.keyCode == SWT.ARROW_RIGHT);
+// return (event.keyCode == SWT.ARROW_RIGHT);
+ }
+ private boolean acceptLeaveConnection(KeyEvent event)
+ {
+ int key = event.keyCode;
+ if (getFocus() instanceof ConnectionEditPart)
+ if ((key == SWT.ARROW_UP)
+ || (key == SWT.ARROW_RIGHT)
+ || (key == SWT.ARROW_DOWN)
+ || (key == SWT.ARROW_LEFT))
+ return true;
+ return false;
+ }
+ private boolean acceptLeaveContents(KeyEvent event)
+ {
+ int key = event.keyCode;
+ return getFocus() == getViewer().getContents()
+ && ((key == SWT.ARROW_UP)
+ || (key == SWT.ARROW_RIGHT)
+ || (key == SWT.ARROW_DOWN)
+ || (key == SWT.ARROW_LEFT));
+ }
+ private boolean acceptOutOf(KeyEvent event)
+ {
+ return (((event.stateMask & SWT.ALT) != 0) && (event.keyCode == SWT.ARROW_LEFT)) || (event.keyCode == SWT.ARROW_LEFT);
+// return (event.keyCode == SWT.ARROW_LEFT);
+ }
+ private ConnectionEditPart findConnection(
+ GraphicalEditPart node,
+ ConnectionEditPart current,
+ boolean forward)
+ {
+ List connections = new ArrayList(node.getSourceConnections());
+ connections.addAll(node.getTargetConnections());
+ if (connections.isEmpty())
+ return null;
+ if (forward)
+ counter++;
+ else
+ counter--;
+ while (counter < 0)
+ counter += connections.size();
+ counter %= connections.size();
+ return (ConnectionEditPart) connections.get(counter % connections.size());
+ }
+ /*
+ * pStart is a point in absolute coordinates.
+ */
+ private GraphicalEditPart findSibling(
+ List siblings,
+ Point pStart,
+ int direction,
+ EditPart exclude)
+ {
+ GraphicalEditPart epCurrent;
+ GraphicalEditPart epFinal = null;
+ IFigure figure;
+ Point pCurrent;
+ int distance = Integer.MAX_VALUE;
+ Iterator iter = siblings.iterator();
+ while (iter.hasNext())
+ {
+ epCurrent = (GraphicalEditPart) iter.next();
+ if (epCurrent == exclude)
+ continue;
+ figure = epCurrent.getFigure();
+ pCurrent = getInterestingPoint(figure);
+ figure.translateToAbsolute(pCurrent);
+ if (pStart.getPosition(pCurrent) != direction)
+ continue;
+ int d = pCurrent.getDistanceOrthogonal(pStart);
+ if (d < distance)
+ {
+ distance = d;
+ epFinal = epCurrent;
+ }
+ }
+ return epFinal;
+ }
+ Point getInterestingPoint(IFigure figure)
+ {
+// return figure.getBounds().getCenter();
+ return figure.getBounds().getTopLeft();
+ }
+ /**
+ * Returns the cached node. It is possible that the node is not longer in the viewer but has
+ * not been garbage collected yet.
+ */
+ private GraphicalEditPart getCachedNode()
+ {
+ if (cachedNode == null)
+ return null;
+ if (cachedNode.isEnqueued())
+ return null;
+ return (GraphicalEditPart) cachedNode.get();
+ }
+ GraphicalEditPart getFocus()
+ {
+ return (GraphicalEditPart) getViewer().getFocusEditPart();
+ }
+ List getNavigationSiblings()
+ {
+ return getFocus().getParent().getChildren();
+ }
+ protected GraphicalViewer getViewer()
+ {
+ return viewer;
+ }
+ public boolean keyPressed(KeyEvent event)
+ {
+ if (event.character == ' ')
+ {
+ processSelect(event);
+ return true;
+ }
+ else if (acceptIntoContainer(event))
+ {
+ navigateIntoContainer(event);
+ return true;
+ }
+ else if (acceptOutOf(event))
+ {
+ navigateOut(event);
+ return true;
+ }
+ else if (acceptConnection(event))
+ {
+ navigateConnections(event);
+ return true;
+ }
+ else if (acceptLeaveConnection(event))
+ {
+ navigateOutOfConnection(event);
+ return true;
+ }
+ else if (acceptLeaveContents(event))
+ {
+ navigateIntoContainer(event);
+ return true;
+ }
+ switch (event.keyCode)
+ {
+ case SWT.ARROW_LEFT :
+ return navigateNextSibling(event, PositionConstants.WEST);
+ case SWT.ARROW_RIGHT :
+ return navigateNextSibling(event, PositionConstants.EAST);
+ case SWT.ARROW_UP :
+ return navigateNextSibling(event, PositionConstants.NORTH);
+ case SWT.ARROW_DOWN :
+ return navigateNextSibling(event, PositionConstants.SOUTH);
+ case SWT.HOME :
+ return navigateJumpSibling(event, PositionConstants.WEST);
+ case SWT.END :
+ return navigateJumpSibling(event, PositionConstants.EAST);
+ case SWT.PAGE_DOWN :
+ return navigateJumpSibling(event, PositionConstants.SOUTH);
+ case SWT.PAGE_UP :
+ return navigateJumpSibling(event, PositionConstants.NORTH);
+ }
+ return super.keyPressed(event);
+ }
+ private void navigateConnections(KeyEvent event)
+ {
+ GraphicalEditPart focus = getFocus();
+ ConnectionEditPart current = null;
+ GraphicalEditPart node = getCachedNode();
+ if (focus instanceof ConnectionEditPart)
+ {
+ current = (ConnectionEditPart) focus;
+ if (node == null
+ || (node != current.getSource() && node != current.getTarget()))
+ {
+ node = (GraphicalEditPart) current.getSource();
+ counter = 0;
+ }
+ }
+ else
+ {
+ node = focus;
+ }
+ setCachedNode(node);
+ boolean forward = event.character == '/' || event.character == '?';
+ ConnectionEditPart next = findConnection(node, current, forward);
+ navigateTo(next, event);
+ }
+ private void navigateIntoContainer(KeyEvent event)
+ {
+ GraphicalEditPart focus = getFocus();
+ List childList = focus.getChildren();
+
+ if (focus instanceof ExpandableGraphNodeEditPart)
+ {
+ if (!((ExpandableGraphNodeEditPart)focus).isExpanded())
+ {
+ ((ExpandableGraphNodeEditPart)focus).doPerformExpandOrCollapse();
+ }
+ }
+
+ Point tl = focus.getContentPane().getBounds().getTopLeft();
+ int minimum = Integer.MAX_VALUE;
+ int current;
+ GraphicalEditPart closestPart = null;
+ for (int i = 0; i < childList.size(); i++)
+ {
+ GraphicalEditPart ged = (GraphicalEditPart) childList.get(i);
+ Rectangle childBounds = ged.getFigure().getBounds();
+ current = (childBounds.x - tl.x) + (childBounds.y - tl.y);
+ if (current < minimum)
+ {
+ minimum = current;
+ closestPart = ged;
+ }
+ }
+ if (closestPart != null)
+ navigateTo(closestPart, event);
+ }
+ private boolean navigateJumpSibling(KeyEvent event, int direction)
+ {
+ return false;
+ }
+ private boolean navigateNextSibling(KeyEvent event, int direction)
+ {
+ GraphicalEditPart epStart = getFocus();
+ IFigure figure = epStart.getFigure();
+ Point pStart = getInterestingPoint(figure);
+ figure.translateToAbsolute(pStart);
+ EditPart next =
+ findSibling(getNavigationSiblings(), pStart, direction, epStart);
+ if (next == null)
+ return false;
+ navigateTo(next, event);
+ return true;
+ }
+ private void navigateOut(KeyEvent event)
+ {
+ if (getFocus() == null
+ || getFocus() == getViewer().getContents()
+ || getFocus().getParent() == getViewer().getContents())
+ return;
+
+ EditPart parent = getFocus().getParent();
+ if (((event.stateMask & SWT.ALT) != 0) && (event.keyCode == SWT.ARROW_LEFT))
+ {
+ if ((parent != null) && (parent instanceof ExpandableGraphNodeEditPart))
+ {
+ if (((ExpandableGraphNodeEditPart)parent).isExpanded())
+ {
+ ((ExpandableGraphNodeEditPart)parent).doPerformExpandOrCollapse();
+ }
+ }
+ }
+ navigateTo(parent, event);
+// navigateTo(getFocus().getParent(), event);
+ }
+ private void navigateOutOfConnection(KeyEvent event)
+ {
+ GraphicalEditPart cached = getCachedNode();
+ ConnectionEditPart conn = (ConnectionEditPart) getFocus();
+ if (cached != null
+ && (cached == conn.getSource() || cached == conn.getTarget()))
+ navigateTo(cached, event);
+ else
+ navigateTo(conn.getSource(), event);
+ }
+ void navigateTo(EditPart part, KeyEvent event)
+ {
+ if (part == null)
+ return;
+ if ((event.stateMask & SWT.SHIFT) != 0)
+ {
+ getViewer().appendSelection(part);
+ getViewer().setFocus(part);
+ }
+ else if ((event.stateMask & SWT.CONTROL) != 0)
+ getViewer().setFocus(part);
+ else
+ getViewer().select(part);
+ }
+ private void processSelect(KeyEvent event)
+ {
+ EditPart part = getViewer().getFocusEditPart();
+ if ((event.stateMask & SWT.CONTROL) != 0
+ && part.getSelected() != EditPart.SELECTED_NONE)
+ {
+ getViewer().deselect(part);
+ }
+ else
+ {
+ getViewer().appendSelection(part);
+ }
+ getViewer().setFocus(part);
+ }
+ private void setCachedNode(GraphicalEditPart node)
+ {
+ if (node == null)
+ cachedNode = null;
+ else
+ cachedNode = new WeakReference(node);
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDInheritanceViewer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDInheritanceViewer.java
new file mode 100644
index 0000000000..71a82051fa
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDInheritanceViewer.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * 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.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.wst.xsd.ui.internal.XSDEditor;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.SubstitutionGroupViewerRootEditPart;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDSchema;
+
+
+public class XSDInheritanceViewer extends BaseGraphicalViewer
+{
+ protected SubstitutionGroupViewerRootEditPart inheritanceViewerRootEditPart;
+ public XSDInheritanceViewer(XSDEditor editor, ISelectionProvider menuSelectionProvider)
+ {
+ super(editor, menuSelectionProvider);
+ }
+
+ public void setInput(XSDConcreteComponent component)
+ {
+ if (isInputEnabled)
+ {
+ input = null;
+
+ if (component instanceof XSDSchema ||
+ component instanceof XSDComplexTypeDefinition)
+ {
+ input = component;
+ }
+
+ inheritanceViewerRootEditPart.setInput(input);
+ }
+ }
+
+ public void setSelection(XSDConcreteComponent component)
+ {
+ if (isSelectionEnabled)
+ {
+ //System.out.println("XSDComponentViewer.setSelection(" + component + ")");
+ List editPartList = new ArrayList();
+ StructuredSelection selection = new StructuredSelection();
+ if (component instanceof XSDElementDeclaration ||
+ component instanceof XSDSchema ||
+ component instanceof XSDModelGroup ||
+ component instanceof XSDModelGroupDefinition ||
+ component instanceof XSDComplexTypeDefinition)
+ {
+ if (component != null)
+ {
+ EditPart editPart = getEditPart(inheritanceViewerRootEditPart, component);
+ if (editPart != null)
+ {
+ // TODO ... take a look at this to figure our why a newly added component
+ // seems to have the wrong bounds at this point... is this a layout issue?
+ // As a temp hack I'm ignoring the selection of component with bounds (x, y) == (0, 0)
+ // Perhaps a delayed selection is required?
+ Rectangle bounds = ((GraphicalEditPart)editPart).getFigure().getBounds();
+ if (bounds.x > 0 || bounds.y > 0)
+ {
+ editPartList.add(editPart);
+ }
+ }
+ }
+ }
+ setSelection(new StructuredSelection(editPartList));
+ }
+ }
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#hookControl()
+ */
+ protected void hookControl()
+ {
+ super.hookControl();
+ inheritanceViewerRootEditPart = new SubstitutionGroupViewerRootEditPart();
+ setContents(inheritanceViewerRootEditPart);
+ }
+
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDSubstitutionGroupChildUtility.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDSubstitutionGroupChildUtility.java
new file mode 100644
index 0000000000..9fa84bd867
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDSubstitutionGroupChildUtility.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * 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.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.xsd.XSDElementDeclaration;
+
+/**
+ * @author ernest
+ *
+ * To change this generated comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class XSDSubstitutionGroupChildUtility
+{
+
+ /**
+ * @param declaration
+ * @return List
+ */
+ public static List getModelChildren(XSDElementDeclaration declaration)
+ {
+ ArrayList children = new ArrayList();
+ List substitutionGroup = declaration.getSubstitutionGroup();
+ for (int i = 0, size = substitutionGroup.size(); i < size; i++)
+ {
+ XSDElementDeclaration element = (XSDElementDeclaration) substitutionGroup.get(i);
+ if (declaration.equals(element.getSubstitutionGroupAffiliation()))
+ {
+ children.add(element);
+ }
+ }
+ return children;
+
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDSubstitutionGroupsViewer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDSubstitutionGroupsViewer.java
new file mode 100644
index 0000000000..5598fdfb56
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDSubstitutionGroupsViewer.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * 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.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.wst.xsd.ui.internal.XSDEditor;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.SubstitutionGroupViewerRootEditPart;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDSchema;
+
+
+public class XSDSubstitutionGroupsViewer extends BaseGraphicalViewer
+{
+ protected SubstitutionGroupViewerRootEditPart subGroupViewerRootEditPart;
+ public XSDSubstitutionGroupsViewer(XSDEditor editor, ISelectionProvider menuSelectionProvider)
+ {
+ super(editor, menuSelectionProvider);
+ }
+
+ public void setInput(XSDConcreteComponent component)
+ {
+ if (isInputEnabled)
+ {
+ input = null;
+
+ if (component instanceof XSDElementDeclaration ||
+ component instanceof XSDSchema)
+ {
+ input = component;
+ }
+
+ subGroupViewerRootEditPart.setInput(input);
+ }
+ }
+
+ public void setSelection(XSDConcreteComponent component)
+ {
+ if (isSelectionEnabled)
+ {
+ //System.out.println("XSDComponentViewer.setSelection(" + component + ")");
+ List editPartList = new ArrayList();
+ StructuredSelection selection = new StructuredSelection();
+ if (component instanceof XSDElementDeclaration ||
+ component instanceof XSDSchema ||
+ component instanceof XSDModelGroup ||
+ component instanceof XSDModelGroupDefinition ||
+ component instanceof XSDComplexTypeDefinition)
+ {
+ if (component != null)
+ {
+ EditPart editPart = getEditPart(subGroupViewerRootEditPart, component);
+ if (editPart != null)
+ {
+ // TODO ... take a look at this to figure our why a newly added component
+ // seems to have the wrong bounds at this point... is this a layout issue?
+ // As a temp hack I'm ignoring the selection of component with bounds (x, y) == (0, 0)
+ // Perhaps a delayed selection is required?
+ Rectangle bounds = ((GraphicalEditPart)editPart).getFigure().getBounds();
+ if (bounds.x > 0 || bounds.y > 0)
+ {
+ editPartList.add(editPart);
+ }
+ }
+ }
+ }
+ setSelection(new StructuredSelection(editPartList));
+ }
+ }
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#hookControl()
+ */
+ protected void hookControl()
+ {
+ super.hookControl();
+ subGroupViewerRootEditPart = new SubstitutionGroupViewerRootEditPart();
+ setContents(subGroupViewerRootEditPart);
+ }
+
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/BaseEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/BaseEditPart.java
new file mode 100644
index 0000000000..f98da1abb1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/BaseEditPart.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.wst.xsd.ui.internal.graph.GraphicsConstants;
+import org.eclipse.wst.xsd.ui.internal.graph.model.ModelAdapterListener;
+import org.eclipse.wst.xsd.ui.internal.graph.model.XSDModelAdapterFactory;
+
+
+public abstract class BaseEditPart extends AbstractGraphicalEditPart implements ModelAdapterListener, GraphicsConstants, IFeedbackHandler
+{
+ protected boolean isSelected = false;
+ /**
+ * Activates the <code>EditPart</code> by setting the
+ * appropriate flags, and activating its children.
+ * activation signals to the EditPart that is should start observing
+ * it's model, and that is should support editing at this time.
+ * An EditPart will have a parent prior to activiation.
+ * @see #deactivate()
+ */
+ public void activate()
+ {
+ super.activate();
+ XSDModelAdapterFactory.addModelAdapterListener(getModel(), this);
+ }
+ /**
+ * Apart from the deactivation done in super, the source
+ * and target connections are deactivated, and the visual
+ * part of the this is removed.
+ *
+ * @see #activate()
+ */
+ public void deactivate()
+ {
+ XSDModelAdapterFactory.removeModelAdapterListener(getModel(), this);
+ super.deactivate();
+ }
+
+ protected void createEditPolicies()
+ {
+ }
+
+ protected EditPart createChild(Object model)
+ {
+ return XSDEditPartFactory.getInstance().createEditPart(this, model);
+ }
+
+ public void propertyChanged(Object object, String property)
+ {
+ refresh();
+ }
+
+ //public BaseGraphicalViewer getBaseGraphicalViewer()
+ //{
+ // return (BaseGraphicalViewer)getViewer();
+ //}
+
+ public IFigure getSelectionFigure()
+ {
+ return getFigure();
+ }
+
+
+ public void addFeedback()
+ {
+ isSelected = true;
+ refreshVisuals();
+ }
+
+ public void removeFeedback()
+ {
+ isSelected = false;
+ refreshVisuals();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/CategoryEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/CategoryEditPart.java
new file mode 100644
index 0000000000..ae8540c24e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/CategoryEditPart.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.ScrollPane;
+import org.eclipse.draw2d.Viewport;
+import org.eclipse.draw2d.ViewportLayout;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.wst.xsd.ui.internal.graph.GraphicsConstants;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.FillLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.wst.xsd.ui.internal.graph.model.Category;
+
+
+public class CategoryEditPart extends BaseEditPart
+{
+ protected ScrollPane scrollpane;
+ protected Label label;
+
+
+ public int getType()
+ {
+ return ((Category)getModel()).getGroupType();
+ }
+
+ protected IFigure createFigure()
+ {
+ ContainerFigure outerPane = new ContainerFigure();
+ outerPane.setBorder(new RoundedLineBorder(1, 6));
+ outerPane.setForegroundColor(categoryBorderColor);
+
+ ContainerFigure r = new ContainerFigure();
+ r.setOutline(false);
+ r.setMinimumSize(new Dimension(0, 0));
+ r.setFill(true);
+ r.setBackgroundColor(GraphicsConstants.elementBackgroundColor);
+ outerPane.add(r);
+
+ int minHeight = 250;
+ switch (getType())
+ {
+ case Category.DIRECTIVES :
+ case Category.NOTATIONS :
+ {
+ minHeight = 50;
+ break;
+ }
+ case Category.ATTRIBUTES :
+ case Category.GROUPS :
+ {
+ minHeight = 100;
+ break;
+ }
+ }
+
+ final int theMinHeight = minHeight;
+ FillLayout outerLayout = new FillLayout()
+ {
+ protected Dimension calculatePreferredSize(IFigure parent, int width, int height)
+ {
+ Dimension d = super.calculatePreferredSize(parent, width, height);
+ d.union(new Dimension(100, theMinHeight));
+ return d;
+ }
+ };
+ //outerLayout.setHorizontal(false);
+ outerPane.setLayoutManager(outerLayout);
+
+
+ label = new Label();
+ label.setForegroundColor(ColorConstants.black);
+ label.setBorder(new MarginBorder(2, 4, 2, 4));
+ r.add(label); //Holder);
+
+ RectangleFigure line = new RectangleFigure();
+ line.setPreferredSize(20, 1);
+ outerPane.add(line);
+
+
+ scrollpane = new ScrollPane();
+ scrollpane.setForegroundColor(ColorConstants.black);
+ scrollpane.setVerticalScrollBarVisibility(ScrollPane.AUTOMATIC); //ScrollPane.ALWAYS);
+ outerPane.add(scrollpane);
+
+ ContainerFigure pane = new ContainerFigure();
+ pane.setBorder(new MarginBorder(5, 8, 5, 8));
+ ContainerLayout layout = new ContainerLayout();
+ layout.setHorizontal(false);
+ layout.setSpacing(0);
+ pane.setLayoutManager(layout);
+
+ Viewport viewport = new Viewport();
+ viewport.setContentsTracksHeight(true);
+ ViewportLayout viewportLayout = new ViewportLayout()
+ {
+ protected Dimension calculatePreferredSize(IFigure parent, int width, int height)
+ {
+ Dimension d = super.calculatePreferredSize(parent, width, height);
+ d.height = Math.min(d.height, theMinHeight - 25); //getViewer().getControl().getBounds().height);
+ return d;
+ }
+ };
+ viewport.setLayoutManager(viewportLayout);
+
+ scrollpane.setViewport(viewport);
+ scrollpane.setContents(pane);
+
+ return outerPane;
+ }
+
+ protected List getModelChildren()
+ {
+ return ((Category)getModel()).getChildren();
+ }
+
+ public void refreshVisuals()
+ {
+ Category category = (Category)getModel();
+ // temp hack --- added empty space to make the min width of groups bigger
+ label.setText(" " + category.getName() + " ");
+ }
+
+ public IFigure getContentPane()
+ {
+ return scrollpane.getContents();
+ }
+
+ public void scrollTo(AbstractGraphicalEditPart topLevel)
+ {
+ Rectangle topLevelBounds = topLevel.getFigure().getBounds();
+ Rectangle categoryBounds = getFigure().getBounds();
+ int scrollValue = scrollpane.getVerticalScrollBar().getValue();
+ int location = topLevelBounds.y + scrollValue - categoryBounds.y;
+ scrollpane.scrollVerticalTo(location - categoryBounds.height/2);
+ }
+
+ protected EditPart createChild(Object model)
+ {
+ EditPart editPart = new TopLevelComponentEditPart();
+ editPart.setModel(model);
+ editPart.setParent(this);
+ return editPart;
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComplexTypeDefinitionEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComplexTypeDefinitionEditPart.java
new file mode 100644
index 0000000000..b0c1825069
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComplexTypeDefinitionEditPart.java
@@ -0,0 +1,210 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.gef.requests.LocationRequest;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDChildUtility;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.ComponentNameDirectEditManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SimpleDirectEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.CenteredIconFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.FillLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+
+
+
+public class ComplexTypeDefinitionEditPart extends GraphNodeEditPart
+{
+ protected ContainerFigure contentFigure;
+ protected Label label;
+ protected SimpleDirectEditPolicy simpleDirectEditPolicy = new SimpleDirectEditPolicy();
+ protected CenteredIconFigure centeredIconFigure;
+ protected RectangleFigure preceedingSpace;
+ protected ContainerFigure contentPane;
+
+ public XSDComplexTypeDefinition getXSDComplexTypeDefinition()
+ {
+ return (XSDComplexTypeDefinition)getModel();
+ }
+
+ protected boolean isConnectedEditPart()
+ {
+ return false;
+ }
+
+ protected GraphNodeFigure createGraphNodeFigure()
+ {
+ XSDComplexTypeDefinition ctd = (XSDComplexTypeDefinition)getModel();
+ GraphNodeFigure figure = new GraphNodeFigure();
+
+ figure.getOutlinedArea().setBorder(new RoundedLineBorder(1, 6));
+ figure.getOutlinedArea().setFill(true);
+ figure.getOutlinedArea().setLayoutManager(new FillLayout(true));
+
+ figure.getInnerContentArea().getContainerLayout().setHorizontal(true);
+
+ preceedingSpace = new RectangleFigure();
+ preceedingSpace.setVisible(false);
+ figure.getInnerContentArea().add(preceedingSpace, 0);
+
+ contentPane = new ContainerFigure();
+ contentPane.getContainerLayout().setHorizontal(false);
+ contentPane.getContainerLayout().setSpacing(5);
+ contentPane.setBorder(new MarginBorder(5, 5, 5, 5));
+ figure.getInnerContentArea().add(contentPane);
+
+ label = new Label();
+ label.setBorder(new MarginBorder(0, 5, 5, 5));
+ figure.getIconArea().add(label);
+ label.setFont(mediumBoldFont);
+
+ figure.getInnerContentArea().getContainerLayout().setSpacing(5);
+ figure.getInnerContentArea().setBorder(new MarginBorder(5, 5, 5, 5));
+
+ return figure;
+ }
+
+ protected EditPart createChild(Object model)
+ {
+ EditPart editPart = null;
+ if (model == getModel())
+ {
+ editPart = new ComplexTypeInheritedContentEditPart();
+ editPart.setModel(model);
+ editPart.setParent(this);
+ }
+ else
+ {
+ editPart = super.createChild(model);
+ }
+ return editPart;
+ }
+
+ protected List getModelChildren()
+ {
+ List list = new ArrayList();
+
+ XSDComplexTypeDefinition ct = (XSDComplexTypeDefinition)getModel();
+
+ if (ct.getDerivationMethod().getName().equals("extension"))
+ {
+ list.add(getModel());
+ }
+
+ list.addAll(XSDChildUtility.getModelChildren(getModel()));
+ return list;
+ }
+
+ public IFigure getContentPane()
+ {
+ return contentPane;
+ }
+
+ protected void refreshVisuals()
+ {
+ XSDComplexTypeDefinition ctd = (XSDComplexTypeDefinition)getModel();
+
+ String name = ctd.getName();
+ if (name == null)
+ {
+ try
+ {
+ if (label != null)
+ {
+ graphNodeFigure.getIconArea().remove(label);
+ }
+ label = null;
+ }
+ catch (Exception e)
+ {
+ }
+ }
+ else
+ {
+ if (label == null)
+ {
+ label = new Label();
+ label.setBorder(new MarginBorder(0, 5, 5, 5));
+ ((GraphNodeFigure)getFigure()).getIconArea().add(label);
+ label.setFont(mediumBoldFont);
+ }
+ graphNodeFigure.getIconArea().add(label);
+ label.setText(name);
+ }
+
+ // provides some room if we need to draw lines for the inherited
+ boolean includesInheritedContent = getModelChildren().contains(getModel());
+ preceedingSpace.setPreferredSize(includesInheritedContent ? new Dimension(10, 1) : new Dimension(0, 0));
+
+ if (XSDGraphUtil.isEditable(getModel()))
+ {
+ graphNodeFigure.setForegroundColor(isSelected ? ColorConstants.black : elementBorderColor);
+ if (label != null)
+ label.setForegroundColor(elementBorderColor);
+ }
+ else
+ {
+ graphNodeFigure.setForegroundColor(isSelected ? ColorConstants.black : readOnlyBorderColor);
+ if (label != null)
+ label.setForegroundColor(readOnlyBorderColor);
+ }
+ }
+
+ protected void performDirectEdit()
+ {
+ ComponentNameDirectEditManager manager = new ComponentNameDirectEditManager(this, label, (XSDComplexTypeDefinition)getModel());
+ simpleDirectEditPolicy.setDelegate(manager);
+ manager.show();
+ }
+
+
+ protected void createEditPolicies()
+ {
+ super.createEditPolicies();
+ installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, simpleDirectEditPolicy);
+ }
+
+
+ public void performRequest(Request request)
+ {
+ if (request.getType() == RequestConstants.REQ_DIRECT_EDIT ||
+ request.getType() == RequestConstants.REQ_OPEN)
+ {
+ if (XSDGraphUtil.isEditable(getModel()))
+ {
+ LocationRequest locationRequest = (LocationRequest)request;
+ Point p = locationRequest.getLocation();
+
+ if (label != null && hitTest(label, p))
+ {
+ performDirectEdit();
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComplexTypeInheritedContentEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComplexTypeInheritedContentEditPart.java
new file mode 100644
index 0000000000..afeebc1bc2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComplexTypeInheritedContentEditPart.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDChildUtility;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.ComponentNameDirectEditManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SimpleDirectEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+
+
+// This is a dashed box that displays the inherited content of a complex type
+//
+public class ComplexTypeInheritedContentEditPart extends BaseEditPart
+{
+ protected Label label;
+ protected SimpleDirectEditPolicy simpleDirectEditPolicy = new SimpleDirectEditPolicy();
+ protected boolean isParentExpanded;
+
+ public ComplexTypeInheritedContentEditPart()
+ {
+ super();
+ }
+
+ public XSDComplexTypeDefinition getXSDComplexTypeDefinition()
+ {
+ return (XSDComplexTypeDefinition)getModel();
+ }
+
+ protected IFigure createFigure()
+ {
+ ContainerFigure figure = new ContainerFigure();
+ figure.getContainerLayout().setHorizontal(false);
+ figure.getContainerLayout().setBorder(5);
+ figure.getContainerLayout().setSpacing(5);
+ figure.setBorder(new RoundedLineBorder(ColorConstants.gray, 1, 6, Graphics.LINE_DASH));
+ return figure;
+ }
+
+ protected List getModelChildren()
+ {
+ XSDComplexTypeDefinition ct = (XSDComplexTypeDefinition)getModel();
+
+ List list = new ArrayList();
+
+ if (ct.getDerivationMethod().getName().equals("extension") && !isParentExpanded)
+ {
+ XSDTypeDefinition type = ct.getBaseTypeDefinition();
+ Iterator iter = XSDChildUtility.getModelChildren(type).iterator();
+ boolean cont = true;
+ while (cont)
+ {
+ while (iter.hasNext())
+ {
+ list.add(0, iter.next());
+ }
+
+ if (type instanceof XSDComplexTypeDefinition)
+ {
+ XSDComplexTypeDefinition ctd = (XSDComplexTypeDefinition)type;
+ type = ctd.getBaseTypeDefinition();
+
+ // defect 264957 - workbench hangs when modifying complex content
+ // Since we don't filter out the current complexType from
+ // the combobox, we can potentially have an endless loop
+ if (ctd == type)
+ {
+ cont = false;
+ break;
+ }
+
+ if (ctd.getDerivationMethod().getName().equals("extension"))
+ {
+ iter = XSDChildUtility.getModelChildren(type).iterator();
+ }
+ else
+ {
+ cont = false;
+ }
+ }
+ else
+ {
+ cont = false;
+ }
+ }
+ }
+ return list;
+ }
+
+ protected void refreshVisuals()
+ {
+ XSDComplexTypeDefinition ctd = (XSDComplexTypeDefinition)getModel();
+ List children = getModelChildren();
+ figure.setVisible(children.size() > 0);
+ // todo set preferredSize to 0 ?
+ }
+
+ protected void performDirectEdit()
+ {
+ ComponentNameDirectEditManager manager = new ComponentNameDirectEditManager(this, label, (XSDComplexTypeDefinition)getModel());
+ simpleDirectEditPolicy.setDelegate(manager);
+ manager.show();
+ }
+
+
+ protected void createEditPolicies()
+ {
+ super.createEditPolicies();
+ installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, simpleDirectEditPolicy);
+ }
+
+
+ public void performRequest(Request request)
+ {
+ if (request.getType() == RequestConstants.REQ_DIRECT_EDIT)
+ {
+ if (XSDGraphUtil.isEditable(getModel()))
+ {
+ performDirectEdit();
+ }
+ }
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComponentViewerRootEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComponentViewerRootEditPart.java
new file mode 100644
index 0000000000..fa8d191fd4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComponentViewerRootEditPart.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Panel;
+import org.eclipse.gef.EditPart;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerLayout;
+
+
+
+public class ComponentViewerRootEditPart extends BaseEditPart
+{
+ protected final static String MESSAGE_PLACE_HOLDER = "MESSAGE_PLACE_HOLDER";
+ protected Object input;
+
+ public void setInput(Object input)
+ {
+ this.input = input;
+ refreshChildren();
+ }
+
+ protected IFigure createFigure()
+ {
+ Panel panel = new Panel();
+ ContainerLayout layout = new ContainerLayout();
+ layout.setBorder(60);
+ panel.setLayoutManager(layout);
+ return panel;
+ }
+
+
+ protected List getModelChildren()
+ {
+ List list = new ArrayList();
+ if (input != null)
+ {
+ list.add(input);
+ }
+ else
+ {
+ list.add(MESSAGE_PLACE_HOLDER);
+ }
+ return list;
+ }
+
+ protected EditPart createChild(Object model)
+ {
+ EditPart editPart = null;
+ if (model == MESSAGE_PLACE_HOLDER)
+ {
+ editPart = new MessageEditPart();
+ editPart.setModel(model);
+ }
+ else
+ {
+ editPart = super.createChild(model);
+ }
+ return editPart;
+ }
+
+ protected void createEditPolicies()
+ {
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ElementDeclarationEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ElementDeclarationEditPart.java
new file mode 100644
index 0000000000..b52d893670
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ElementDeclarationEditPart.java
@@ -0,0 +1,379 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.LineBorder;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.gef.requests.LocationRequest;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.gef.util.figures.SpacingFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDChildUtility;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDSubstitutionGroupChildUtility;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDSubstitutionGroupsViewer;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.ComboBoxCellEditorManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.ComponentNameDirectEditManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SimpleDirectEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.TypeReferenceDirectEditManager;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ExpandableGraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.FillLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.model.XSDModelAdapterFactory;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+
+
+
+public class ElementDeclarationEditPart extends ExpandableGraphNodeEditPart
+{
+ public Label label;
+ protected Label contentIconLabel;
+ protected Label typeValueLabel;
+ protected SimpleDirectEditPolicy simpleDirectEditPolicy = new SimpleDirectEditPolicy();
+ protected boolean isContentIconLabelSelected = false;
+
+ protected final static String ELEMENT_TYPE_PLACE_HOLDER = "ELEMENT_TYPE_PLACE_HOLDER";
+
+ public XSDParticle getXSDParticle()
+ {
+ Object o = getXSDElementDeclaration().getContainer();
+ return (o instanceof XSDParticle) ? (XSDParticle)o : null;
+ }
+
+ public XSDElementDeclaration getXSDElementDeclaration()
+ {
+ return (XSDElementDeclaration)getModel();
+ }
+
+ protected boolean isDefaultExpanded()
+ {
+ // hack to expand up to its content. The previous test didn't appear to work
+ int depth = 0;
+ for (EditPart part = this; part != null; part = part.getParent())
+ {
+ depth++;
+ }
+ return depth <= 3;
+ }
+
+ protected GraphNodeFigure createGraphNodeFigure()
+ {
+ ExpandableGraphNodeFigure figure = new ExpandableGraphNodeFigure();
+
+ figure.getOutlinedArea().setFill(true);
+ figure.getOutlinedArea().setLayoutManager(new FillLayout());
+
+ label = new Label();
+ figure.getIconArea().add(label);
+ label.setFont(mediumBoldFont);
+
+ SpacingFigure spacingFigure = new SpacingFigure();
+ figure.getIconArea().add(spacingFigure);
+
+ contentIconLabel = new Label();
+ //contentIcon.setBorder(new MarginBorder(2, 2, 2, 10));
+ figure.getIconArea().add(contentIconLabel);
+
+ // A sneaky null check.... getViewer() does a getRoot(), but getRoot() might be null
+ // same with getParent()
+ if (getParent() != null && getRoot() != null && getViewer() instanceof XSDSubstitutionGroupsViewer)
+ {
+ figure.getOuterContentArea().getContainerLayout().setSpacing(5);
+ }
+ else
+ {
+ RectangleFigure line = new RectangleFigure();
+ line.setPreferredSize(20, 1);
+ figure.getOutlinedArea().add(line, 1);
+
+ figure.getInnerContentArea().setLayoutManager(new FillLayout(2));
+ figure.getInnerContentArea().setBorder(new MarginBorder(2,2,2,1));
+
+ ContainerFigure labelGroup = new ContainerFigure();
+ Label typeLabel = new Label("type");
+ labelGroup.add(typeLabel);
+ labelGroup.setBorder(new MarginBorder(0, 4, 0, 4));
+
+ Label equalsLabel = new Label(" = ");
+ labelGroup.add(equalsLabel);
+
+ typeValueLabel = new Label();
+ labelGroup.add(typeValueLabel);
+ figure.getOutlinedArea().add(labelGroup, 2);
+ }
+ return figure;
+ }
+
+ protected ExpandableGraphNodeFigure getExpandableGraphNodeFigure()
+ {
+ return (ExpandableGraphNodeFigure)graphNodeFigure;
+ }
+
+ protected List getModelChildren()
+ {
+ return getExpandableGraphNodeFigure().isExpanded() ? getModelChildrenHelper() : Collections.EMPTY_LIST;
+ }
+
+ protected List getModelChildrenHelper()
+ {
+ if (getViewer() instanceof XSDSubstitutionGroupsViewer)
+ {
+ return XSDSubstitutionGroupChildUtility.getModelChildren(getXSDElementDeclaration().getResolvedElementDeclaration());
+ }
+ else
+ {
+ return XSDChildUtility.getModelChildren(getXSDElementDeclaration().getResolvedElementDeclaration());
+ }
+ }
+
+ protected void refreshContentIcon()
+ {
+ String iconName = null;
+ XSDTypeDefinition td = getXSDElementDeclaration().getResolvedElementDeclaration().getTypeDefinition();
+ if (td instanceof XSDSimpleTypeDefinition)
+ {
+ // TODO... we should probably show the overlay form of this icon in the case that its a
+ // restriction, list or union
+ iconName = "icons/XSDSimpleType.gif";
+ }
+ else if (td instanceof XSDComplexTypeDefinition)
+ {
+ XSDComplexTypeDefinition complexTypeDefinition = (XSDComplexTypeDefinition)td;
+ if (complexTypeDefinition.getAttributeUses().size() > 0)
+ {
+ iconName = "icons/XSDAttribute.gif";
+ }
+ }
+ Image image = iconName != null ? XSDEditorPlugin.getXSDImage(iconName) : null;
+ contentIconLabel.setIcon(image);
+ }
+
+ protected void refreshVisuals()
+ {
+ String text = getXSDElementDeclaration().isElementDeclarationReference() ?
+ getXSDElementDeclaration().getResolvedElementDeclaration().getQName(getXSDElementDeclaration().getSchema()) :
+ getXSDElementDeclaration().getName();
+
+ label.setText(text);
+
+
+ ContainerFigure rectangle = graphNodeFigure.getOutlinedArea();
+ if (XSDGraphUtil.isEditable(getXSDElementDeclaration()))
+ {
+ rectangle.setBorder(new LineBorder(isSelected ? ColorConstants.black : elementBorderColor, 2));
+ rectangle.setBackgroundColor(elementBackgroundColor);
+ rectangle.setForegroundColor(elementBorderColor);
+ graphNodeFigure.getInnerContentArea().setForegroundColor(ColorConstants.black);
+ if (XSDGraphUtil.isEditable(getXSDElementDeclaration().getResolvedElementDeclaration()))
+ {
+ // give label 'editable' colour
+ graphNodeFigure.getInnerContentArea().setForegroundColor(elementLabelColor);
+ }
+ else
+ {
+ // give label 'read only' colour
+ graphNodeFigure.getInnerContentArea().setForegroundColor(elementBorderColor);
+ }
+ label.setBackgroundColor(elementBackgroundColor);
+ label.setForegroundColor(elementLabelColor);
+ }
+ else
+ {
+ rectangle.setBorder(new LineBorder(isSelected ? ColorConstants.black : readOnlyBorderColor, 2));
+ rectangle.setBackgroundColor(readOnlyBackgroundColor);
+ rectangle.setForegroundColor(readOnlyBorderColor);
+ graphNodeFigure.getInnerContentArea().setForegroundColor(readOnlyBorderColor);
+ label.setBackgroundColor(readOnlyBackgroundColor);
+ }
+
+ if (getXSDElementDeclaration().isElementDeclarationReference())
+ {
+ label.setIcon(XSDEditorPlugin.getXSDImage("icons/GraphViewElementRef.gif"));
+ label.setBorder(new MarginBorder(0, 0, 0, 4));
+ }
+ else
+ {
+ label.setIcon(null);
+ label.setBorder(new MarginBorder(0, 6, 0, 4));
+ }
+
+ if (getXSDParticle() != null)
+ {
+ refreshOccurenceLabel(getXSDParticle().getMinOccurs(), getXSDParticle().getMaxOccurs());
+ }
+
+
+ if (typeValueLabel != null)
+ {
+ XSDElementDeclaration ed = getXSDElementDeclaration();
+ if (ed.getElement() != null)
+ {
+ String type = ed.getElement().getAttribute("type");
+ if (type == null)
+ {
+ type = "";
+ }
+ if (!getXSDElementDeclaration().isElementDeclarationReference())
+ {
+ typeValueLabel.setText(type.equals("") ? "<anonymous>" : type);
+ }
+ else // if it is a ref, we show the resolved type
+ {
+ String resolvedType = "";
+ if (ed.getResolvedElementDeclaration() != null)
+ {
+ if (ed.getResolvedElementDeclaration().getTypeDefinition() != null)
+ {
+ resolvedType = ed.getResolvedElementDeclaration().getTypeDefinition().getQName(ed.getSchema());
+
+ // if null, it has an anonymous type that has no resolved type
+ if (resolvedType == null)
+ {
+ resolvedType = "<anonymous>";
+ }
+ }
+ }
+ typeValueLabel.setText(resolvedType);
+ }
+ }
+ }
+ refreshContentIcon();
+ }
+
+
+ public void performRequest(Request request)
+ {
+ if (request.getType() == RequestConstants.REQ_DIRECT_EDIT ||
+ request.getType() == RequestConstants.REQ_OPEN)
+ {
+ if (XSDGraphUtil.isEditable(getXSDElementDeclaration()))
+ {
+ if (request instanceof LocationRequest)
+ {
+ LocationRequest locationRequest = (LocationRequest)request;
+ Point p = locationRequest.getLocation();
+ isContentIconLabelSelected = false;
+
+ if (hitTest(label, p))
+ {
+ performDirectEditForLabel();
+ }
+ else if (hitTest(typeValueLabel, p))
+ {
+ performDirectEditForTypeValueLabel();
+ }
+ }
+ }
+ }
+ }
+
+ private void performDirectEditForTypeValueLabel()
+ {
+ if (!getXSDElementDeclaration().isElementDeclarationReference())
+ {
+ TypeReferenceDirectEditManager manager = new TypeReferenceDirectEditManager(this, getXSDElementDeclaration(), typeValueLabel);
+ simpleDirectEditPolicy.setDelegate(manager);
+ manager.show();
+ }
+ // just ignore type edit for element ref's
+ }
+
+
+ private void performDirectEditForLabel()
+ {
+ if (getXSDElementDeclaration().isElementDeclarationReference())
+ {
+ ComboBoxCellEditorManager manager = new ComboBoxCellEditorManager(this, label)
+ {
+ protected List computeComboContent()
+ {
+ XSDSchema schema = getXSDElementDeclaration().getSchema();
+ List globalElementNameList = new ArrayList();
+ if (schema != null)
+ {
+ TypesHelper typesHelper = new TypesHelper(schema);
+ globalElementNameList = typesHelper.getGlobalElements();
+ }
+ return globalElementNameList;
+ }
+
+ public void performModify(String value)
+ {
+ getXSDElementDeclaration().getElement().setAttribute("ref", value);
+ }
+ };
+ simpleDirectEditPolicy.setDelegate(manager);
+ manager.show();
+ }
+ else
+ {
+ ComponentNameDirectEditManager manager = new ComponentNameDirectEditManager(this, label, getXSDElementDeclaration());
+ simpleDirectEditPolicy.setDelegate(manager);
+ manager.show();
+ }
+ }
+
+
+ protected void createEditPolicies()
+ {
+ super.createEditPolicies();
+ installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, simpleDirectEditPolicy);
+ }
+
+
+ public void activate()
+ {
+ super.activate();
+ if (getXSDParticle() != null)
+ {
+ XSDModelAdapterFactory.addModelAdapterListener(getXSDParticle(), this);
+ }
+ }
+ /**
+ * Apart from the deactivation done in super, the source
+ * and target connections are deactivated, and the visual
+ * part of the this is removed.
+ *
+ * @see #activate()
+ */
+ public void deactivate()
+ {
+ if (getXSDParticle() != null)
+ {
+ XSDModelAdapterFactory.removeModelAdapterListener(getXSDParticle(), this);
+ }
+ super.deactivate();
+ }
+
+ public boolean isContentIconLabelSelected()
+ {
+ return isContentIconLabelSelected;
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ExpandableGraphNodeEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ExpandableGraphNodeEditPart.java
new file mode 100644
index 0000000000..1ad4057fed
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ExpandableGraphNodeEditPart.java
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.ActionEvent;
+import org.eclipse.draw2d.ActionListener;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.LayoutManager;
+import org.eclipse.draw2d.MouseEvent;
+import org.eclipse.draw2d.MouseListener;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ExpandableGraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+
+
+
+public abstract class ExpandableGraphNodeEditPart extends RepeatableGraphNodeEditPart implements MouseListener, ActionListener
+{
+ protected boolean needToPerformDefaultExpansion = true;
+
+ protected GraphNodeFigure createGraphNodeFigure()
+ {
+ return new ExpandableGraphNodeFigure();
+ }
+
+ protected void addGraphNodeFigureListeners()
+ {
+ getExpandableGraphNodeFigure().getInteractor().addMouseListener(this);
+ }
+
+ protected ExpandableGraphNodeFigure getExpandableGraphNodeFigure()
+ {
+ return (ExpandableGraphNodeFigure)graphNodeFigure;
+ }
+
+ public IFigure getContentPane()
+ {
+ return getExpandableGraphNodeFigure().getOuterContentArea();
+ }
+
+ protected boolean isDefaultExpanded()
+ {
+ return false;
+ }
+
+ protected boolean hasChildren()
+ {
+ return getModelChildrenHelper().size() > 0;
+ }
+
+ protected abstract List getModelChildrenHelper();
+
+
+ protected List getModelChildren()
+ {
+ return getExpandableGraphNodeFigure().isExpanded() ? getModelChildrenHelper() : Collections.EMPTY_LIST;
+ }
+
+ protected void refreshChildren()
+ {
+ if (needToPerformDefaultExpansion && isDefaultExpanded())
+ {
+ needToPerformDefaultExpansion = false;
+ performExpandOrCollapseHelper();
+
+ super.refreshChildren();
+
+ EditPart root = getRoot();
+ if (root instanceof AbstractGraphicalEditPart)
+ {
+ getContentPane().setVisible(true);
+
+ IFigure rootFigure = ((AbstractGraphicalEditPart)root).getFigure();
+ invalidateAll(rootFigure);
+ rootFigure.validate();
+ rootFigure.repaint();
+ }
+ getExpandableGraphNodeFigure().getInteractor().repaint();
+ }
+ else
+ {
+ super.refreshChildren();
+ }
+ getExpandableGraphNodeFigure().getInteractor().setVisible(hasChildren());
+ }
+
+
+ protected void performExpandOrCollapseHelper()
+ {
+ boolean isButtonExpanded = !getExpandableGraphNodeFigure().isExpanded();
+ getExpandableGraphNodeFigure().setExpanded(isButtonExpanded);
+ }
+
+ public void doPerformExpandOrCollapse()
+ {
+ performExpandOrCollapse();
+ }
+
+ public boolean isExpanded()
+ {
+ return getExpandableGraphNodeFigure().isExpanded();
+ }
+
+ protected void performExpandOrCollapse()
+ {
+ performExpandOrCollapseHelper();
+
+ boolean isButtonExpanded = getExpandableGraphNodeFigure().isExpanded();
+
+ refreshChildren();
+
+ EditPart root = getRoot();
+ if (root instanceof AbstractGraphicalEditPart)
+ {
+ getContentPane().setVisible(isButtonExpanded);
+
+ IFigure rootFigure = ((AbstractGraphicalEditPart)root).getFigure();
+ invalidateAll(rootFigure);
+ rootFigure.validate();
+ rootFigure.repaint();
+ }
+ getExpandableGraphNodeFigure().getInteractor().repaint();
+ }
+
+
+ protected void refreshOccurenceLabel(int min, int max)
+ {
+ super.refreshOccurenceLabel(min, max);
+
+ // TODO: revisit the 'hack' to understand why we need to do this
+ // in order to get the view to layout propetly
+ //
+ IFigure thisFigure = getFigure();
+ invalidateAll(thisFigure);
+ thisFigure.validate();
+ thisFigure.repaint();
+ }
+
+ protected void invalidateAll(IFigure figure)
+ {
+ figure.invalidate();
+ LayoutManager manager = figure.getLayoutManager();
+ if (manager != null)
+ {
+ manager.invalidate();
+ }
+ for (Iterator i = figure.getChildren().iterator(); i.hasNext(); )
+ {
+ IFigure child = (IFigure)i.next();
+ invalidateAll(child);
+ }
+ }
+
+
+ // implements MouseListener
+ //
+ public void mouseDoubleClicked(MouseEvent me)
+ {
+ }
+
+ public void mousePressed(MouseEvent me)
+ {
+ me.consume();
+ needToPerformDefaultExpansion = false;
+ performExpandOrCollapse();
+ }
+
+ public void mouseReleased(MouseEvent me)
+ {
+ }
+
+ public void actionPerformed(ActionEvent event)
+ {
+ performExpandOrCollapse();
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/GraphNodeEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/GraphNodeEditPart.java
new file mode 100644
index 0000000000..ce6ad0a9cb
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/GraphNodeEditPart.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.DragTracker;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.requests.LocationRequest;
+import org.eclipse.wst.xsd.ui.internal.gef.util.figures.ConnectedEditPartFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.GraphNodeDragTracker;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SelectionHandlesEditPolicyImpl;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+
+
+
+public abstract class GraphNodeEditPart extends BaseEditPart
+{
+ protected GraphNodeFigure graphNodeFigure;
+ protected SelectionHandlesEditPolicyImpl selectionHandlesEditPolicy;
+
+ protected boolean isConnectedEditPart()
+ {
+ return true;
+ }
+
+ protected IFigure createFigure()
+ {
+ IFigure result = graphNodeFigure = createGraphNodeFigure();
+ addGraphNodeFigureListeners();
+
+ if (isConnectedEditPart())
+ {
+ ConnectedEditPartFigure connectedEditPartFigure = createConnectedEditPartFigure();
+ connectedEditPartFigure.add(graphNodeFigure);
+ result = connectedEditPartFigure;
+ }
+ return result;
+ }
+
+ protected ConnectedEditPartFigure createConnectedEditPartFigure()
+ {
+ ConnectedEditPartFigure connectedEditPartFigure = new ConnectedEditPartFigure(this)
+ {
+ public IFigure getSelectionFigure()
+ {
+ return graphNodeFigure.getOutlinedArea();
+ }
+
+ public IFigure getConnectionFigure()
+ {
+ return graphNodeFigure.getConnectionFigure();
+ }
+ };
+ return connectedEditPartFigure;
+ }
+
+ protected abstract GraphNodeFigure createGraphNodeFigure();
+
+ protected void addGraphNodeFigureListeners()
+ {
+ }
+
+ public IFigure getSelectionFigure()
+ {
+ return graphNodeFigure.getOutlinedArea();
+ }
+
+ public Rectangle getConnectionRectangle()
+ {
+ return graphNodeFigure.getConnectionRectangle();
+ }
+
+ protected void createEditPolicies()
+ {
+ //installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new NonResizableEditPolicy());
+ selectionHandlesEditPolicy = new SelectionHandlesEditPolicyImpl();
+ installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, selectionHandlesEditPolicy);
+ }
+
+ public DragTracker getDragTracker(Request request)
+ {
+ return new GraphNodeDragTracker((EditPart)this);
+ }
+
+ protected EditPart getApplicableEditPart(EditPart editPart, Point p)
+ {
+ while (true)
+ {
+ EditPart parent = null;
+ if (editPart instanceof GraphNodeEditPart)
+ {
+ IFigure f = ((GraphNodeEditPart)editPart).getSelectionFigure();
+ if (!hitTest(f, p))
+ {
+ parent = editPart.getParent();
+ }
+ }
+
+ if (parent != null)
+ {
+ editPart = parent;
+ }
+ else
+ {
+ break;
+ }
+ }
+ return editPart;
+ }
+
+ public EditPart getTargetEditPart(Request request)
+ {
+ EditPart editPart = null;
+ if (request.getType() == REQ_SELECTION)
+ {
+ if (request instanceof LocationRequest)
+ {
+ LocationRequest locationRequest = (LocationRequest)request;
+ Point p = locationRequest.getLocation();
+ editPart = getApplicableEditPart(this, p);
+ }
+ }
+ return (editPart != null) ? editPart : super.getTargetEditPart(request);
+ }
+
+ public boolean hitTest(IFigure target, Point location)
+ {
+ Rectangle b = target.getBounds().getCopy();
+ target.translateToAbsolute(b);
+ return b.contains(location);
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/IFeedbackHandler.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/IFeedbackHandler.java
new file mode 100644
index 0000000000..24a05377c7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/IFeedbackHandler.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+public interface IFeedbackHandler
+{
+ public void addFeedback();
+ public void removeFeedback();
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/MessageEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/MessageEditPart.java
new file mode 100644
index 0000000000..bbb7f92dd2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/MessageEditPart.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+
+
+
+public class MessageEditPart extends BaseEditPart
+{
+ public MessageEditPart()
+ {
+ }
+
+ protected IFigure createFigure()
+ {
+ Label label = new Label(XSDEditorPlugin.getXSDString("_UI_GRAPH_VIEW_NOT_AVAILABLE"));
+ return label;
+ }
+
+ protected List getModelChildren()
+ {
+ return Collections.EMPTY_LIST;
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ModelGroupDefinitionEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ModelGroupDefinitionEditPart.java
new file mode 100644
index 0000000000..8ccdfec543
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ModelGroupDefinitionEditPart.java
@@ -0,0 +1,196 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDChildUtility;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.ComboBoxCellEditorManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.ComponentNameDirectEditManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SimpleDirectEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RepeatableGraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDSchema;
+
+
+public class ModelGroupDefinitionEditPart extends RepeatableGraphNodeEditPart
+{
+ protected Label label;
+ protected SimpleDirectEditPolicy simpleDirectEditPolicy = new SimpleDirectEditPolicy();
+
+ public XSDModelGroupDefinition getXSDModelGroupDefinition()
+ {
+ return (XSDModelGroupDefinition)getModel();
+ }
+
+ protected boolean isConnectedEditPart()
+ {
+ return false;
+ }
+
+ public XSDParticle getXSDParticle()
+ {
+ Object o = getXSDModelGroupDefinition().getContainer();
+ return (o instanceof XSDParticle) ? (XSDParticle)o : null;
+ }
+
+ protected GraphNodeFigure createGraphNodeFigure()
+ {
+ RepeatableGraphNodeFigure figure = new RepeatableGraphNodeFigure();
+ figure.getOutlinedArea().setBorder(new RoundedLineBorder(1, 6));
+ figure.getInnerContentArea().setBorder(new MarginBorder(10, 0, 10, 0));
+
+ label = new Label();
+ label.setFont(mediumBoldFont);
+ figure.getIconArea().add(label);
+
+
+ return figure;
+ }
+
+ public IFigure getContentPane()
+ {
+ return graphNodeFigure.getInnerContentArea();
+ }
+
+ protected List getModelChildren()
+ {
+ return XSDChildUtility.getModelChildren(getModel());
+ }
+
+ protected void createEditPolicies()
+ {
+ super.createEditPolicies();
+ installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, simpleDirectEditPolicy);
+ }
+
+ protected void refreshVisuals()
+ {
+ super.refreshVisuals();
+
+ if (getXSDModelGroupDefinition().isModelGroupDefinitionReference())
+ {
+ label.setText(getXSDModelGroupDefinition().getResolvedModelGroupDefinition().getQName());
+ label.setIcon(XSDEditorPlugin.getXSDImage("icons/GraphViewElementRef.gif"));
+ label.setBorder(new MarginBorder(0, 0, 0, 4));
+
+ // todo update occurence label
+ //
+ }
+ else
+ {
+ label.setText(getXSDModelGroupDefinition().getName());
+ label.setIcon(null);
+ label.setBorder(new MarginBorder(0, 6, 0, 4));
+ }
+
+ if (XSDGraphUtil.isEditable(getModel()))
+ {
+ graphNodeFigure.getOutlinedArea().setForegroundColor(isSelected ? ColorConstants.black : elementBorderColor);
+ label.setForegroundColor(elementLabelColor);
+ }
+ else
+ {
+ graphNodeFigure.getOutlinedArea().setForegroundColor(readOnlyBackgroundColor);
+ label.setForegroundColor(readOnlyBackgroundColor);
+ }
+
+ refreshOccurenceLabel(getXSDParticle());
+ }
+
+
+ protected void performDirectEdit()
+ {
+ if (getXSDModelGroupDefinition().isModelGroupDefinitionReference())
+ {
+ ComboBoxCellEditorManager manager = new ComboBoxCellEditorManager(this, label)
+ {
+ protected List computeComboContent()
+ {
+ XSDSchema schema = getXSDModelGroupDefinition().getSchema();
+ List nameList = new ArrayList();
+ if (schema != null)
+ {
+ TypesHelper typesHelper = new TypesHelper(schema);
+ nameList = typesHelper.getModelGroups();
+ }
+ return nameList;
+ }
+
+ public void performModify(String value)
+ {
+ Display.getCurrent().asyncExec(new DelayedModelGroupRenameAction(getXSDModelGroupDefinition(), value));
+ }
+ };
+ simpleDirectEditPolicy.setDelegate(manager);
+ manager.show();
+ }
+ else
+ {
+ ComponentNameDirectEditManager manager = new ComponentNameDirectEditManager(this, label, getXSDModelGroupDefinition());
+ simpleDirectEditPolicy.setDelegate(manager);
+ manager.show();
+ }
+ }
+
+
+ protected class DelayedModelGroupRenameAction implements Runnable
+ {
+ XSDModelGroupDefinition modelGroupDefinition;
+ String value;
+
+ DelayedModelGroupRenameAction(XSDModelGroupDefinition modelGroupDefinition, String value)
+ {
+ this.modelGroupDefinition = modelGroupDefinition;
+ this.value = value;
+ }
+
+ public void run()
+ {
+ modelGroupDefinition.getElement().setAttribute("ref", value);
+ }
+ }
+
+
+ public void performRequest(Request request)
+ {
+ if (request.getType() == RequestConstants.REQ_DIRECT_EDIT)
+ {
+ if (XSDGraphUtil.isEditable(getModel()))
+ {
+ performDirectEdit();
+ }
+ }
+ }
+
+ // TODO... I added this as a quick fix to makesure the title gets redrawn when the groupRef is changed
+ // we should probably fix the ModelListenerUtil to fire both call both 'change' methods for the ref property
+ //public void modelChildrenChanged()
+ //{
+ // super.modelChildrenChanged();
+ // refreshVisuals();
+ //}
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ModelGroupEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ModelGroupEditPart.java
new file mode 100644
index 0000000000..b793ebab46
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ModelGroupEditPart.java
@@ -0,0 +1,187 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDChildUtility;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.DragAndDropEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.CenteredIconFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ExpandableGraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.wst.xsd.ui.internal.graph.model.XSDModelAdapterFactory;
+import org.eclipse.xsd.XSDCompositor;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDParticle;
+
+
+
+public class ModelGroupEditPart extends ExpandableGraphNodeEditPart
+{
+ protected CenteredIconFigure centeredIconFigure;
+
+ protected static Color editableBackgroundColor = null;
+ protected static Color editableForegroundColor = null;
+ protected static Color nonEditableForegroundColor = null;
+
+ public XSDParticle getXSDParticle()
+ {
+ Object o = getXSDModelGroup().getContainer();
+ return (o instanceof XSDParticle) ? (XSDParticle)o : null;
+ }
+
+ public XSDModelGroup getXSDModelGroup()
+ {
+ return (XSDModelGroup)getModel();
+ }
+
+ protected GraphNodeFigure createGraphNodeFigure()
+ {
+ ExpandableGraphNodeFigure figure = new ExpandableGraphNodeFigure();
+
+ centeredIconFigure = new CenteredIconFigure();
+ centeredIconFigure.setPreferredSize(new Dimension(32, 20));
+ //centeredIconFigure.setBackgroundColor(new Color(Display.getCurrent(), 255, 0, 0));
+ figure.getIconArea().add(centeredIconFigure);
+ //figure.getIconArea().setLayout(new CenterLayout());
+
+ ContainerFigure outlinedArea = figure.getOutlinedArea();
+ outlinedArea.setBorder(new RoundedLineBorder(1, 10));
+ //outlinedArea.setPreferredSize(new Dimension(32, 20));
+
+ // set layout so that children are aligned vertically with some spacing
+ //
+ figure.getOuterContentArea().getContainerLayout().setHorizontal(false);
+ figure.getOuterContentArea().getContainerLayout().setSpacing(10);
+
+ return figure;
+ }
+
+ protected List getModelChildrenHelper()
+ {
+ return XSDChildUtility.getModelChildren(getXSDModelGroup());
+ }
+
+ protected void refreshVisuals()
+ {
+ String iconName = "icons/XSDSequence.gif";
+ switch (getXSDModelGroup().getCompositor().getValue())
+ {
+ case XSDCompositor.ALL : { iconName = "icons/XSDAll.gif"; break; }
+ case XSDCompositor.CHOICE : { iconName = "icons/XSDChoice.gif"; break; }
+ case XSDCompositor.SEQUENCE : { iconName = "icons/XSDSequence.gif"; break; }
+ }
+ centeredIconFigure.image = XSDEditorPlugin.getXSDImage(iconName);
+ centeredIconFigure.repaint();
+
+
+ ContainerFigure outlinedArea = graphNodeFigure.getOutlinedArea() ;
+ if (XSDGraphUtil.isEditable(getXSDModelGroup()))
+ {
+ if (editableForegroundColor == null)
+ editableForegroundColor = new Color(Display.getCurrent(), 120, 152, 184);
+
+ if (editableBackgroundColor == null)
+ editableBackgroundColor = new Color(Display.getCurrent(), 232, 240, 248);
+
+ outlinedArea.setForegroundColor(isSelected ? ColorConstants.black : editableForegroundColor);
+ outlinedArea.setBackgroundColor(editableBackgroundColor);
+ }
+ else
+ {
+ if (nonEditableForegroundColor == null)
+ nonEditableForegroundColor = new Color(Display.getCurrent(), 164, 164, 164);
+
+ outlinedArea.setForegroundColor(isSelected ? ColorConstants.black : nonEditableForegroundColor);
+ outlinedArea.setBackgroundColor(ColorConstants.white);
+ }
+
+ refreshOccurenceLabel(getXSDParticle());
+ }
+
+ protected boolean isChildLayoutHorizontal()
+ {
+ return false;
+ }
+
+ protected boolean isDefaultExpanded()
+ {
+ return isPossibleCycle() ? false : true;
+ }
+
+ // This test ensures that we don't end up with an infinite default expansion (e.g. when a group contains a cyclic group ref)
+ // TODO... we probably need some more extensible 'OO' way of computing this information
+ protected boolean isPossibleCycle()
+ {
+ boolean result = false;
+ if (getParent() instanceof ModelGroupDefinitionEditPart)
+ {
+ ModelGroupDefinitionEditPart group = (ModelGroupDefinitionEditPart)getParent();
+ for (EditPart parent = group.getParent(); parent != null; parent = parent.getParent())
+ {
+ if (parent.getModel() instanceof ElementDeclarationEditPart)
+ {
+ break;
+ }
+ else
+ {
+ if (parent.getModel() == group.getModel())
+ {
+ result = true;
+ break;
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ protected void createEditPolicies()
+ {
+ super.createEditPolicies();
+ installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new DragAndDropEditPolicy(getViewer(), selectionHandlesEditPolicy));
+ }
+
+ public void activate()
+ {
+ super.activate();
+ if (getXSDParticle() != null)
+ {
+ XSDModelAdapterFactory.addModelAdapterListener(getXSDParticle(), this);
+ }
+ }
+ /**
+ * Apart from the deactivation done in super, the source
+ * and target connections are deactivated, and the visual
+ * part of the this is removed.
+ *
+ * @see #activate()
+ */
+ public void deactivate()
+ {
+ if (getXSDParticle() != null)
+ {
+ XSDModelAdapterFactory.removeModelAdapterListener(getXSDParticle(), this);
+ }
+ super.deactivate();
+ }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RepeatableGraphNodeEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RepeatableGraphNodeEditPart.java
new file mode 100644
index 0000000000..6fdf7d61ca
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RepeatableGraphNodeEditPart.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.DragAndDropEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RepeatableGraphNodeFigure;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDSchema;
+
+
+
+public class RepeatableGraphNodeEditPart extends GraphNodeEditPart
+{
+ protected RepeatableGraphNodeFigure getRepeatableGraphNodeFigure()
+ {
+ return (RepeatableGraphNodeFigure)graphNodeFigure;
+ }
+
+ protected GraphNodeFigure createGraphNodeFigure()
+ {
+ return new RepeatableGraphNodeFigure();
+ }
+
+ protected void refreshOccurenceLabel(XSDParticle particle)
+ {
+ if (particle != null)
+ {
+ refreshOccurenceLabel(particle.getMinOccurs(), particle.getMaxOccurs());
+ }
+ }
+
+ protected void refreshOccurenceLabel(int min, int max)
+ {
+ if (min == 1 && max == 1)
+ {
+ getRepeatableGraphNodeFigure().getOccurenceLabel().setText("");
+ }
+ else
+ {
+ String maxString = max == -1 ? "*" : "" + max;
+ getRepeatableGraphNodeFigure().getOccurenceLabel().setText(min + ".." + maxString);
+ }
+ getRepeatableGraphNodeFigure().getOccurenceLabel().repaint();
+ }
+
+ protected void createEditPolicies()
+ {
+ super.createEditPolicies();
+
+ if (getModel() instanceof XSDElementDeclaration) {
+ Object parent = ((XSDElementDeclaration) getModel()).eContainer();
+
+ if (!(parent instanceof XSDSchema)) {
+ installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new DragAndDropEditPolicy(getViewer(), selectionHandlesEditPolicy));
+ }
+ }
+ else {
+ installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new DragAndDropEditPolicy(getViewer(), selectionHandlesEditPolicy));
+ }
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RootComplexTypeDefinitionEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RootComplexTypeDefinitionEditPart.java
new file mode 100644
index 0000000000..853a2dfa19
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RootComplexTypeDefinitionEditPart.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import java.util.List;
+
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDChildUtility;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDInheritanceViewer;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.ComponentNameDirectEditManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SelectionHandlesEditPolicyImpl;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SimpleDirectEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ExpandableGraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.FillLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+
+
+
+public class RootComplexTypeDefinitionEditPart extends ExpandableGraphNodeEditPart
+{
+ public Label label;
+ protected SimpleDirectEditPolicy simpleDirectEditPolicy = new SimpleDirectEditPolicy();
+
+
+ protected GraphNodeFigure createGraphNodeFigure()
+ {
+ ExpandableGraphNodeFigure figure = new ExpandableGraphNodeFigure();
+ figure.getOutlinedArea().setBorder(new RoundedLineBorder(1, 6));
+ figure.getOutlinedArea().setLayoutManager(new FillLayout());
+ figure.getOutlinedArea().setFill(true);
+
+ if (getViewer() instanceof XSDInheritanceViewer)
+ {
+ figure.getOuterContentArea().getContainerLayout().setSpacing(10);
+ }
+
+ label = new Label();
+ label.setFont(mediumBoldFont);
+ label.setBorder(new MarginBorder(5, 8, 5, 8));
+ figure.getIconArea().add(label);
+
+ return figure;
+ }
+
+
+ protected void refreshVisuals()
+ {
+ super.refreshVisuals();
+
+ XSDComplexTypeDefinition ctd = (XSDComplexTypeDefinition)getModel();
+ label.setText(ctd.getName() != null ? ctd.getName(): "");
+
+ if (XSDGraphUtil.isEditable(ctd))
+ {
+ figure.setForegroundColor(elementBorderColor);
+ label.setForegroundColor(elementBorderColor);
+ }
+ else
+ {
+ figure.setForegroundColor(readOnlyBorderColor);
+ label.setForegroundColor(readOnlyBorderColor);
+ }
+ }
+
+
+ protected List getModelChildrenHelper()
+ {
+ XSDComplexTypeDefinition ct = (XSDComplexTypeDefinition)getModel();
+ if (getViewer() instanceof XSDInheritanceViewer)
+ {
+ return XSDChildUtility.getImmediateDerivedTypes(ct);
+ }
+ else
+ {
+ return XSDChildUtility.getModelChildren(getModel());
+ }
+ }
+
+
+ protected void createEditPolicies()
+ {
+ SelectionHandlesEditPolicyImpl policy = new SelectionHandlesEditPolicyImpl();
+ installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, policy);
+ installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, simpleDirectEditPolicy);
+ }
+
+
+ protected void performDirectEdit()
+ {
+ ComponentNameDirectEditManager manager = new ComponentNameDirectEditManager(this, label, (XSDComplexTypeDefinition)getModel());
+ simpleDirectEditPolicy.setDelegate(manager);
+ manager.show();
+ }
+
+
+ public void performRequest(Request request)
+ {
+ if (request.getType() == RequestConstants.REQ_DIRECT_EDIT)
+ {
+ if (XSDGraphUtil.isEditable(getModel()))
+ {
+ performDirectEdit();
+ }
+ }
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RootModelGroupDefinitionEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RootModelGroupDefinitionEditPart.java
new file mode 100644
index 0000000000..35f4486708
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RootModelGroupDefinitionEditPart.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import java.util.List;
+
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDChildUtility;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.ComponentNameDirectEditManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SelectionHandlesEditPolicyImpl;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SimpleDirectEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ExpandableGraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.FillLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+
+
+public class RootModelGroupDefinitionEditPart extends ExpandableGraphNodeEditPart
+{
+ public Label label;
+ protected SimpleDirectEditPolicy simpleDirectEditPolicy = new SimpleDirectEditPolicy();
+
+
+ protected GraphNodeFigure createGraphNodeFigure()
+ {
+ ExpandableGraphNodeFigure figure = new ExpandableGraphNodeFigure();
+ figure.getOutlinedArea().setBorder(new RoundedLineBorder(1, 6));
+ figure.getOutlinedArea().setLayoutManager(new FillLayout());
+ figure.getOutlinedArea().setFill(true);
+
+ label = new Label();
+ label.setFont(mediumBoldFont);
+ label.setBorder(new MarginBorder(5, 8, 5, 8));
+ figure.getIconArea().add(label);
+
+ return figure;
+ }
+
+ protected void refreshVisuals()
+ {
+ super.refreshVisuals();
+
+ XSDModelGroupDefinition mgd = (XSDModelGroupDefinition)getModel();
+ String name = mgd.getResolvedModelGroupDefinition().getName();
+ label.setText(name);
+
+ if (XSDGraphUtil.isEditable(getModel()))
+ {
+ figure.setForegroundColor(elementBorderColor);
+ label.setForegroundColor(elementBorderColor);
+ }
+ else
+ {
+ figure.setForegroundColor(readOnlyBorderColor);
+ label.setForegroundColor(readOnlyBorderColor);
+ }
+ }
+
+ protected List getModelChildrenHelper()
+ {
+ return XSDChildUtility.getModelChildren(getModel());
+ }
+
+
+ protected void createEditPolicies()
+ {
+ SelectionHandlesEditPolicyImpl policy = new SelectionHandlesEditPolicyImpl();
+ installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, policy);
+ installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, simpleDirectEditPolicy);
+ }
+
+
+ protected void performDirectEdit()
+ {
+ ComponentNameDirectEditManager manager = new ComponentNameDirectEditManager(this, label, ((XSDModelGroupDefinition)getModel()).getResolvedModelGroupDefinition());
+ simpleDirectEditPolicy.setDelegate(manager);
+ manager.show();
+ }
+
+
+ public void performRequest(Request request)
+ {
+ if (request.getType() == RequestConstants.REQ_DIRECT_EDIT)
+ {
+ if (XSDGraphUtil.isEditable(getModel()))
+ {
+ performDirectEdit();
+ }
+ }
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SchemaDirectiveEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SchemaDirectiveEditPart.java
new file mode 100644
index 0000000000..c0697d5fc5
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SchemaDirectiveEditPart.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.CenteredIconFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.FillLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.xsd.XSDSchemaDirective;
+
+
+public class SchemaDirectiveEditPart extends BaseEditPart
+{
+ protected CenteredIconFigure centeredIconFigure;
+ protected Label label;
+ /**
+ * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
+ */
+ protected IFigure createFigure()
+ {
+
+ ContainerFigure figure = new ContainerFigure();
+
+ figure.setLayoutManager(new FillLayout());
+ figure.setBorder(new RoundedLineBorder(1, 8));
+
+ ContainerFigure fig = new ContainerFigure();
+ fig.setLayoutManager(new FillLayout());
+ fig.setBorder(new MarginBorder(10, 0, 10, 0));
+ figure.add(fig);
+
+
+ label = new Label();
+ label.setBorder(new MarginBorder(4, 2, 2, 10));
+ fig.add(label);
+
+ return figure;
+ }
+
+ public void refreshVisuals()
+ {
+ XSDSchemaDirective directive = (XSDSchemaDirective)getModel();
+ String schemaLocation = directive.getSchemaLocation();
+ if (schemaLocation == null) schemaLocation = "(" + XSDEditorPlugin.getXSDString("_UI_LABEL_NO_LOCATION_SPECIFIED") + ")";
+ if (schemaLocation.equals("")) schemaLocation = "(" + XSDEditorPlugin.getXSDString("_UI_LABEL_NO_LOCATION_SPECIFIED") + ")";
+ label.setText(" " + directive.getElement().getLocalName() + " " + schemaLocation);
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SchemaEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SchemaEditPart.java
new file mode 100644
index 0000000000..b23821c3a7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SchemaEditPart.java
@@ -0,0 +1,207 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.gef.EditPart;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.graph.GraphicsConstants;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.FillLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.wst.xsd.ui.internal.graph.model.Category;
+import org.eclipse.wst.xsd.ui.internal.graph.model.XSDModelAdapterFactory;
+import org.eclipse.xsd.XSDSchema;
+
+public class SchemaEditPart extends BaseEditPart
+{
+ protected ContainerFigure containerFigure;
+ protected Label label;
+
+ //protected ContainerFigure childExpansionContainer;
+ public IFigure getContentPane()
+ {
+ return containerFigure;
+ }
+
+ protected IFigure createFigure()
+ {
+ ContainerFigure outer = new ContainerFigure();
+ outer.setBorder(new RoundedLineBorder(1, 6));
+ outer.setForegroundColor(categoryBorderColor);
+ FillLayout fillLayout = new FillLayout(4);
+ outer.setLayoutManager(fillLayout);
+ //outer.getContainerLayout().setHorizontal(false);
+
+ ContainerFigure r = new ContainerFigure();
+ r.setOutline(false);
+ r.setMinimumSize(new Dimension(0, 0));
+ r.setFill(true);
+ r.setBackgroundColor(GraphicsConstants.elementBackgroundColor);
+ outer.add(r);
+
+ final int theMinHeight = 200;
+ FillLayout outerLayout = new FillLayout()
+ {
+ protected Dimension calculatePreferredSize(IFigure parent, int width, int height)
+ {
+ Dimension d = super.calculatePreferredSize(parent, width, height);
+ d.union(new Dimension(100, theMinHeight));
+ return d;
+ }
+ };
+ outerLayout.setHorizontal(false);
+ outer.setLayoutManager(outerLayout);
+
+ label = new Label();
+ label.setForegroundColor(ColorConstants.black);
+ label.setBorder(new MarginBorder(2, 4, 2, 4));
+ r.add(label);
+
+ RectangleFigure line = new RectangleFigure();
+ line.setPreferredSize(20, 1);
+ outer.add(line);
+
+ containerFigure = new ContainerFigure();
+ //containerFigure.setBackgroundColor(ColorConstants.red);
+ containerFigure.setBorder(new MarginBorder(4, 4, 4, 4));
+ fillLayout = new FillLayout(4);
+ containerFigure.setLayoutManager(fillLayout);
+ //containerFigure.setLayoutManager(new FillLayout(false));
+ /*
+ * FlowLayout layout1 = new FlowLayout(false); layout1.setMajorSpacing(0);
+ * layout1.setMinorSpacing(0); layout1.setStretchMinorAxis(true);
+ * containerFigure.setLayoutManager(layout1);
+ */
+ outer.add(containerFigure);
+ //childExpansionContainer = new ContainerFigure();
+ //childExpansionContainer.getContainerLayout().setHorizontal(false);
+ //childExpansionContainer.setOutlined(true);
+ return outer;
+ }
+
+ protected List getModelChildren()
+ {
+ XSDSchema schema = (XSDSchema) getModel();
+ List list = new ArrayList();
+ list.add(CategoryRowEditPart.DIRECTIVES_AND_NOTATIONS);
+ list.add(CategoryRowEditPart.ELEMENTS_AND_TYPES);
+ list.add(CategoryRowEditPart.MODEL_GROUPS_AND_ATTRIBUTES);
+ return list;
+ }
+
+ protected EditPart createChild(Object model)
+ {
+ CategoryRowEditPart result = new CategoryRowEditPart();
+ result.setModel(model);
+ result.setParent(this);
+ result.setSchema((XSDSchema)getModel());
+ return result;
+ }
+
+
+ protected void refreshVisuals()
+ {
+ super.refreshVisuals();
+ String targetNamespaceValue = ((XSDSchema)getModel()).getTargetNamespace();
+ if (targetNamespaceValue == null || targetNamespaceValue.length() == 0)
+ {
+ targetNamespaceValue = XSDEditorPlugin.getXSDString("_UI_GRAPH_XSDSCHEMA_NO_NAMESPACE");
+ }
+ label.setText(XSDEditorPlugin.getXSDString("_UI_GRAPH_XSDSCHEMA") + " : " + targetNamespaceValue);
+ }
+}
+
+class CategoryRowEditPart extends BaseEditPart
+{
+ public static final int[] ELEMENTS_AND_TYPES = {Category.ELEMENTS, Category.TYPES };
+ public static final int[] DIRECTIVES_AND_NOTATIONS = {Category.DIRECTIVES, Category.NOTATIONS };
+ public static final int[] MODEL_GROUPS_AND_ATTRIBUTES = {Category.GROUPS, Category.ATTRIBUTES};//, Category.COMPLEX_TYPES };
+
+ protected XSDSchema schema;
+ protected Figure contentPane;
+
+ protected IFigure createFigure()
+ {
+ ContainerFigure containerFigure = new ContainerFigure();
+ //containerFigure.setBackgroundColor(ColorConstants.red);
+ containerFigure.setFill(true);
+ containerFigure.setBorder(new MarginBorder(4, 4, 4, 4));
+ org.eclipse.wst.xsd.ui.internal.gef.util.figures.FillLayout fillLayout = new org.eclipse.wst.xsd.ui.internal.gef.util.figures.FillLayout(4);
+ fillLayout.setHorizontal(true);
+ containerFigure.setLayoutManager(fillLayout);
+ //containerFigure.setLayoutManager(new FillLayout(4));
+ return containerFigure;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getContentPane()
+ */
+ public IFigure getContentPane()
+ {
+ return super.getContentPane();
+ }
+
+ public XSDSchema getSchema()
+ {
+ return schema;
+ }
+
+ public void setSchema(XSDSchema schema)
+ {
+ this.schema = schema;
+ }
+
+
+ protected List getModelChildren()
+ {
+ List categoryList = (List) XSDModelAdapterFactory.getAdapter(schema).getProperty(schema, "groups");
+ return filterCategoryList(categoryList);
+ }
+
+ protected List filterCategoryList(List list)
+ {
+ List result = new ArrayList();
+ int[] categoryTypes = (int[])getModel();
+ for (Iterator i = list.iterator(); i.hasNext(); )
+ {
+ Category category = (Category)i.next();
+ if (isMatching(categoryTypes, category))
+ {
+ result.add(category);
+ }
+ }
+ return result;
+ }
+
+ private boolean isMatching(int[] categoryTypes, Category category)
+ {
+ boolean result = false;
+ for (int i = 0; i < categoryTypes.length; i++)
+ {
+ if (categoryTypes[i] == category.getGroupType())
+ {
+ result = true;
+ break;
+ }
+ }
+ return result;
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SubstitutionGroupViewerRootEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SubstitutionGroupViewerRootEditPart.java
new file mode 100644
index 0000000000..3899e8e6f3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SubstitutionGroupViewerRootEditPart.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Panel;
+import org.eclipse.gef.EditPart;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerLayout;
+
+
+
+public class SubstitutionGroupViewerRootEditPart extends BaseEditPart
+{
+ protected final static String MESSAGE_PLACE_HOLDER = "MESSAGE_PLACE_HOLDER";
+ protected Object input;
+
+ public void setInput(Object input)
+ {
+ this.input = input;
+ refreshChildren();
+ }
+
+ protected IFigure createFigure()
+ {
+ Panel panel = new Panel();
+ ContainerLayout layout = new ContainerLayout();
+ layout.setBorder(60);
+ panel.setLayoutManager(layout);
+ return panel;
+ }
+
+
+ protected List getModelChildren()
+ {
+ List list = new ArrayList();
+ if (input != null)
+ {
+ list.add(input);
+ }
+ else
+ {
+ list.add(MESSAGE_PLACE_HOLDER);
+ }
+ return list;
+ }
+
+ protected EditPart createChild(Object model)
+ {
+ EditPart editPart = null;
+ if (model == MESSAGE_PLACE_HOLDER)
+ {
+ editPart = new MessageEditPart();
+ editPart.setModel(model);
+ }
+ else
+ {
+ editPart = super.createChild(model);
+ }
+ return editPart;
+ }
+
+ protected void createEditPolicies()
+ {
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/TopLevelComponentEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/TopLevelComponentEditPart.java
new file mode 100644
index 0000000000..f34fb330c9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/TopLevelComponentEditPart.java
@@ -0,0 +1,273 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+import java.lang.reflect.Field;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.gef.editpolicies.SelectionEditPolicy;
+import org.eclipse.gef.requests.LocationRequest;
+import org.eclipse.gef.ui.parts.AbstractEditPartViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.wst.xsd.ui.internal.gef.util.editparts.AbstractComponentViewerRootEditPart;
+import org.eclipse.wst.xsd.ui.internal.gef.util.figures.FillLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.GraphicsConstants;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDComponentViewer;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SelectionHandlesEditPolicyImpl;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.model.ModelAdapter;
+import org.eclipse.wst.xsd.ui.internal.graph.model.XSDModelAdapterFactory;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDNamedComponent;
+
+
+public class TopLevelComponentEditPart extends BaseEditPart implements IFeedbackHandler
+{
+ protected Label label;
+ //protected Label arrowLabel;
+ protected ContainerFigure labelHolder = new ContainerFigure();
+ protected SelectionHandlesEditPolicyImpl selectionHandlesEditPolicy;
+ protected boolean isReadOnly;
+ protected boolean isSelected;
+
+ protected IFigure createFigure()
+ {
+ ContainerFigure typeGroup = new ContainerFigure();
+ typeGroup.getContainerLayout().setHorizontal(true);
+
+ //arrowLabel = new Label();
+ //arrowLabel.setIcon(XSDEditorPlugin.getPlugin().getImage("icons/forward.gif"));
+ //typeGroup.add(arrowLabel);
+
+ labelHolder = new ContainerFigure();
+ FillLayout fillLayout = new FillLayout();
+ labelHolder.setLayoutManager(fillLayout);
+ labelHolder.setFill(true);
+ typeGroup.add(labelHolder);
+
+ label = new Label();
+ label.setBorder(new MarginBorder(0, 2, 2, 1));
+ label.setForegroundColor(ColorConstants.black);
+ labelHolder.add(label);
+
+ try
+ {
+ // evil hack to provide underlines
+ Object model = getModel();
+
+ boolean isLinux = java.io.File.separator.equals("/");
+ if (model instanceof XSDComplexTypeDefinition ||
+ model instanceof XSDElementDeclaration ||
+ model instanceof XSDModelGroupDefinition)
+ {
+ if (!isLinux)
+ {
+ FontData oldData = GraphicsConstants.medium.getFontData()[0];
+ FontData fontData = new FontData(oldData.getName(), oldData.getHeight(), SWT.NONE);
+
+ // TODO... clean this awful code up... we seem to be leaking here too
+ // we can't call this directly since the methods are OS dependant
+ // fontData.data.lfUnderline = 1
+ // so instead we use reflection
+ Object data = fontData.getClass().getField("data").get(fontData);
+ System.out.println("data" + data.getClass());
+ data.getClass().getField("lfUnderline").setByte(data, (byte)1);
+ Font font = new Font(Display.getCurrent(), fontData);
+ label.setFont(font);
+
+ }
+ }
+ }
+ catch (Exception e)
+ {
+
+ }
+ //FontData data = label.getFont().getFontData()[0];
+ //data.data.lfUnderline = 1;
+
+ //RectangleFigure line = new RectangleFigure();
+ //line.setPreferredSize(2, 1);
+ //labelHolder.add(line, 1);
+
+ //label.getFont().getFontData()[0].setStyle()
+
+ return typeGroup;
+ }
+
+ public void refreshVisuals()
+ {
+ ModelAdapter adapter = XSDModelAdapterFactory.getAdapter(getModel());
+ if (adapter != null)
+ {
+ // isReadOnly = Boolean.TRUE.equals(adapter.getProperty(getModel(), "isReadOnly"));
+ isReadOnly = !XSDGraphUtil.isEditable(getModel());
+ label.setForegroundColor(computeLabelColor());
+ label.setText((String)adapter.getProperty(getModel(), ModelAdapter.LABEL_PROPERTY));
+ Image image = (Image)adapter.getProperty(getModel(), ModelAdapter.IMAGE_PROPERTY);
+ if (image != null) label.setIcon(image);
+ //arrowLabel.setVisible(Boolean.TRUE.equals(adapter.getProperty(getModel(), "drillDown")));
+ }
+ else
+ {
+ label.setText("unknown object" + getModel().getClass().getName());
+ //arrowLabel.setVisible(false);
+ }
+ }
+
+
+ public XSDNamedComponent getXSDNamedComponent()
+ {
+ return (XSDNamedComponent) getModel();
+ }
+
+ public List getModelChildren()
+ {
+ return Collections.EMPTY_LIST;
+ }
+
+ protected void createEditPolicies()
+ {
+ //installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new NonResizableEditPolicy());
+ //selectionHandlesEditPolicy = new SelectionHandlesEditPolicyImpl();
+ //installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, selectionHandlesEditPolicy);
+
+ SelectionHandlesEditPolicyImpl policy = new SelectionHandlesEditPolicyImpl();
+ installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, policy);
+
+ SelectionEditPolicy feedBackSelectionEditPolicy = new SelectionEditPolicy()
+ {
+ protected void hideSelection()
+ {
+ EditPart editPart = getHost();
+ if (editPart instanceof IFeedbackHandler)
+ {
+ ((IFeedbackHandler)editPart).removeFeedback();
+ }
+ }
+
+ protected void showSelection()
+ {
+ EditPart editPart = getHost();
+ if (editPart instanceof IFeedbackHandler)
+ {
+ ((IFeedbackHandler)editPart).addFeedback();
+ }
+ }
+ };
+ installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, feedBackSelectionEditPolicy);
+ }
+
+ public Color computeLabelColor()
+ {
+ Color color = ColorConstants.black;
+ if (isSelected)
+ {
+ color = ColorConstants.white;
+ }
+ else if (isReadOnly)
+ {
+ color = ColorConstants.gray;
+ }
+ return color;
+ }
+
+
+ public void addFeedback()
+ {
+ isSelected = true;
+
+ labelHolder.setBackgroundColor(ColorConstants.black);
+ label.setForegroundColor(computeLabelColor());
+ labelHolder.setFill(true);
+ }
+
+ public void removeFeedback()
+ {
+ isSelected = false;
+ labelHolder.setBackgroundColor(null);
+ label.setForegroundColor(computeLabelColor());
+ labelHolder.setFill(false);
+ }
+
+ public void performRequest(Request request)
+ {
+ if (request.getType() == RequestConstants.REQ_DIRECT_EDIT ||
+ request.getType() == RequestConstants.REQ_OPEN)
+ {
+
+ Object model = getModel();
+ if (model instanceof XSDComplexTypeDefinition ||
+ model instanceof XSDElementDeclaration ||
+ model instanceof XSDModelGroupDefinition)
+ {
+ if (request instanceof LocationRequest)
+ {
+ LocationRequest locationRequest = (LocationRequest)request;
+ Point p = locationRequest.getLocation();
+
+ if (hitTest(labelHolder, p))
+ {
+ performDrillDownAction();
+ }
+ }
+ }
+ }
+ }
+
+ public boolean hitTest(IFigure target, Point location)
+ {
+ Rectangle b = target.getBounds().getCopy();
+ target.translateToAbsolute(b);
+ return b.contains(location);
+ }
+
+ protected void performDrillDownAction()
+ {
+ Runnable runnable = new Runnable()
+ {
+ public void run()
+ {
+ //((XSDComponentViewer)getViewer()).setInput((XSDConcreteComponent)getModel());
+
+ EditPart editPart = ((AbstractEditPartViewer)getViewer()).getRootEditPart().getContents();
+ if (editPart instanceof AbstractComponentViewerRootEditPart)
+ {
+ AbstractComponentViewerRootEditPart rootEditPart = (AbstractComponentViewerRootEditPart)editPart;
+ rootEditPart.setInput((XSDConcreteComponent)getModel());
+ }
+ else if (editPart instanceof BaseEditPart)
+ {
+ ((XSDComponentViewer)getViewer()).setInput((XSDConcreteComponent)getModel());
+ }
+ }
+ };
+ Display.getCurrent().asyncExec(runnable);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/TypeEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/TypeEditPart.java
new file mode 100644
index 0000000000..37a83e11ba
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/TypeEditPart.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SelectionHandlesEditPolicyImpl;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SimpleDirectEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.xsd.XSDTypeDefinition;
+
+
+public class TypeEditPart extends BaseEditPart
+{
+ protected SimpleDirectEditPolicy simpleDirectEditPolicy = new SimpleDirectEditPolicy();
+
+ protected IFigure createFigure()
+ {
+ ContainerFigure typeGroup = new ContainerFigure();
+// typeGroup.setBorder(new SimpleRaisedBorder(1));
+// typeGroup.setBorder(new LineBorder(1));
+// typeGroup.setBorder(new RoundedLineBorder(1,5));
+
+ Label typeLabel = new Label("type");
+ typeLabel.setBorder(new MarginBorder(0,2,2,1));
+ typeGroup.add(typeLabel);
+
+ return typeGroup;
+ }
+
+ protected void refreshVisuals()
+ {
+ super.refreshVisuals();
+ }
+
+ public XSDTypeDefinition getXSDTypeDefinition()
+ {
+ return (XSDTypeDefinition)getModel();
+ }
+
+
+ public List getModelChildren()
+ {
+ return Collections.EMPTY_LIST;
+ }
+
+ protected void createEditPolicies()
+ {
+ SelectionHandlesEditPolicyImpl policy = new SelectionHandlesEditPolicyImpl();
+ installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, policy);
+ }
+
+
+ public void performRequest(Request request)
+ {
+ super.performRequest(request);
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/WildcardEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/WildcardEditPart.java
new file mode 100644
index 0000000000..53a86a19d0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/WildcardEditPart.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.LineBorder;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RepeatableGraphNodeFigure;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDWildcard;
+
+
+public class WildcardEditPart extends RepeatableGraphNodeEditPart
+{
+ protected Label label;
+
+
+ public XSDParticle getXSDParticle()
+ {
+ Object o = getXSDWildcard().getContainer();
+ return (o instanceof XSDParticle) ? (XSDParticle)o : null;
+ }
+
+
+ public XSDWildcard getXSDWildcard()
+ {
+ return (XSDWildcard)getModel();
+ }
+
+
+ protected GraphNodeFigure createGraphNodeFigure()
+ {
+ RepeatableGraphNodeFigure figure = new RepeatableGraphNodeFigure();
+ figure.setConnected(true);
+ figure.getOutlinedArea().setFill(true);
+
+ label = new Label();
+ label.setText(XSDEditorPlugin.getXSDString("_UI_ANY_ELEMENT"));
+ label.setBorder(new MarginBorder(0, 6, 0, 4));
+ label.setFont(mediumBoldFont);
+
+ figure.getIconArea().add(label);
+
+ return figure;
+ }
+
+
+ protected void refreshVisuals()
+ {
+ ContainerFigure rectangle = graphNodeFigure.getOutlinedArea();
+ if (XSDGraphUtil.isEditable(getModel()))
+ {
+ rectangle.setBorder(new LineBorder(2));
+ rectangle.setBackgroundColor(elementBackgroundColor);
+ rectangle.setForegroundColor(isSelected ? ColorConstants.black : elementBorderColor);
+
+ label.setBackgroundColor(elementBackgroundColor);
+ label.setForegroundColor(elementLabelColor);
+ }
+ else
+ {
+ rectangle.setBorder(new LineBorder(readOnlyBorderColor, 2));
+ rectangle.setBackgroundColor(readOnlyBackgroundColor);
+ rectangle.setForegroundColor(isSelected ? ColorConstants.black : readOnlyBorderColor);
+
+ label.setBackgroundColor(readOnlyBackgroundColor);
+ label.setForegroundColor(readOnlyBorderColor);
+ }
+
+ refreshOccurenceLabel(getXSDParticle());
+ }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/XSDEditPartFactory.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/XSDEditPartFactory.java
new file mode 100644
index 0000000000..f6c5de3d11
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/XSDEditPartFactory.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * 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.graph.editparts;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartFactory;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDInheritanceViewer;
+import org.eclipse.wst.xsd.ui.internal.graph.model.Category;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDWildcard;
+
+
+
+public class XSDEditPartFactory implements EditPartFactory
+{
+ protected static XSDEditPartFactory instance;
+
+ public static XSDEditPartFactory getInstance()
+ {
+ if (instance == null)
+ {
+ instance = new XSDEditPartFactory();
+ }
+ return instance;
+ }
+
+ public EditPart createEditPart(EditPart parent, Object model)
+ {
+ EditPart editPart = null;
+
+ if (model instanceof Category)
+ {
+ editPart = new CategoryEditPart();
+ }
+ else if (model instanceof XSDElementDeclaration)
+ {
+ editPart = new ElementDeclarationEditPart();
+ }
+ else if (model instanceof XSDComplexTypeDefinition)
+ {
+ if (parent.getViewer() instanceof XSDInheritanceViewer)
+ {
+ editPart = new RootComplexTypeDefinitionEditPart();
+ }
+ else
+ {
+ if (parent instanceof CategoryEditPart)
+ editPart = new RootComplexTypeDefinitionEditPart();
+ else
+ editPart = new ComplexTypeDefinitionEditPart();
+ }
+ }
+ else if (model instanceof XSDModelGroup)
+ {
+ editPart = new ModelGroupEditPart();
+ }
+ else if (model instanceof XSDModelGroupDefinition)
+ {
+ if (parent instanceof CategoryEditPart)
+ editPart = new RootModelGroupDefinitionEditPart();
+ else
+ editPart = new ModelGroupDefinitionEditPart();
+ }
+ else if (model instanceof XSDSchema)