[157897] Model Group Ref properties should have minOccurs and maxOccurs
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/adapters/XSDModelGroupDefinitionAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/adapters/XSDModelGroupDefinitionAdapter.java index 672303d..89f72b9 100644 --- a/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/adapters/XSDModelGroupDefinitionAdapter.java +++ b/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/adapters/XSDModelGroupDefinitionAdapter.java
@@ -19,6 +19,7 @@ import org.eclipse.gef.commands.Command; import org.eclipse.swt.graphics.Image; import org.eclipse.wst.xsd.ui.internal.adt.actions.BaseSelectionAction; +import org.eclipse.wst.xsd.ui.internal.adt.actions.ShowPropertiesViewAction; import org.eclipse.wst.xsd.ui.internal.adt.design.editparts.model.IActionProvider; import org.eclipse.wst.xsd.ui.internal.adt.design.editparts.model.IGraphElement; import org.eclipse.wst.xsd.ui.internal.adt.facade.IADTObject; @@ -29,13 +30,14 @@ import org.eclipse.wst.xsd.ui.internal.common.actions.AddXSDElementAction; import org.eclipse.wst.xsd.ui.internal.common.actions.AddXSDModelGroupAction; import org.eclipse.wst.xsd.ui.internal.common.actions.DeleteXSDConcreteComponentAction; +import org.eclipse.wst.xsd.ui.internal.common.actions.SetMultiplicityAction; import org.eclipse.wst.xsd.ui.internal.common.commands.DeleteCommand; import org.eclipse.wst.xsd.ui.internal.editor.Messages; import org.eclipse.wst.xsd.ui.internal.editor.XSDEditorPlugin; import org.eclipse.xsd.XSDModelGroup; import org.eclipse.xsd.XSDModelGroupDefinition; -public class XSDModelGroupDefinitionAdapter extends XSDBaseAdapter implements IStructure, IActionProvider, IGraphElement, IADTObjectListener +public class XSDModelGroupDefinitionAdapter extends XSDParticleAdapter implements IStructure, IActionProvider, IGraphElement, IADTObjectListener { public static final Image MODEL_GROUP_ICON = XSDEditorPlugin.getPlugin().getIcon("obj16/XSDGroup.gif"); //$NON-NLS-1$ public static final Image MODEL_GROUP_DISABLED_ICON = XSDEditorPlugin.getPlugin().getIcon("obj16/XSDGroupdis.gif"); //$NON-NLS-1$ @@ -116,6 +118,21 @@ } list.add(DeleteXSDConcreteComponentAction.DELETE_XSD_COMPONENT_ID); + + if (getXSDModelGroupDefinition().isModelGroupDefinitionReference()) + { + list.add(BaseSelectionAction.SEPARATOR_ID); + list.add(BaseSelectionAction.SUBMENU_START_ID + Messages._UI_ACTION_SET_MULTIPLICITY); + list.add(SetMultiplicityAction.REQUIRED_ID); + list.add(SetMultiplicityAction.ZERO_OR_ONE_ID); + list.add(SetMultiplicityAction.ZERO_OR_MORE_ID); + list.add(SetMultiplicityAction.ONE_OR_MORE_ID); + list.add(BaseSelectionAction.SUBMENU_END_ID); + } + + list.add(BaseSelectionAction.SEPARATOR_ID); + list.add(ShowPropertiesViewAction.ID); + return (String [])list.toArray(new String[0]); } @@ -197,4 +214,15 @@ clearFields(); notifyListeners(this, null); } + + public int getMaxOccurs() + { + return getMaxOccurs(getXSDModelGroupDefinition()); + } + + public int getMinOccurs() + { + return getMinOccurs(getXSDModelGroupDefinition()); + } + }
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/design/editparts/ModelGroupDefinitionReferenceEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/design/editparts/ModelGroupDefinitionReferenceEditPart.java index 0f63976..248e6e6 100644 --- a/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/design/editparts/ModelGroupDefinitionReferenceEditPart.java +++ b/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/design/editparts/ModelGroupDefinitionReferenceEditPart.java
@@ -42,6 +42,52 @@ super.refreshVisuals(); XSDModelGroupDefinitionAdapter adapter = (XSDModelGroupDefinitionAdapter)getModel(); figure.getIconFigure().image = adapter.getImage(); + + GenericGroupFigure groupFigure = (GenericGroupFigure)getFigure(); + String nodeName = ""; + + // TODO: commmon this up with ModelGroupEditPart, XSDParticleAdapter's code + + // -2 means the user didn't specify (so the default is 1) + int minOccurs = adapter.getMinOccurs(); + int maxOccurs = adapter.getMaxOccurs(); + String occurenceDescription = ""; //$NON-NLS-1$ + + if (minOccurs == -3 && maxOccurs == -3) + { + occurenceDescription = nodeName; + groupFigure.setText(null); + } + else if (minOccurs == 0 && (maxOccurs == -2 || maxOccurs == 1)) + { + occurenceDescription = nodeName + " [0..1]"; //$NON-NLS-1$ + groupFigure.setText("0..1"); + } + else if ((minOccurs == 1 && maxOccurs == 1) || + (minOccurs == -2 && maxOccurs == 1) || + (minOccurs == 1 && maxOccurs == -2)) + { + occurenceDescription = nodeName + " [1..1]"; //$NON-NLS-1$ + groupFigure.setText("1..1"); + } + else if (minOccurs == -2 && maxOccurs == -2) + { + occurenceDescription = nodeName; + groupFigure.setText(null); + } + else + { + if (maxOccurs == -2) maxOccurs = 1; + String maxSymbol = maxOccurs == -1 ? "*" : "" + maxOccurs; //$NON-NLS-1$ //$NON-NLS-2$ + + String minSymbol = minOccurs == -2 ? "1" : "" + minOccurs; //$NON-NLS-1$ //$NON-NLS-2$ + occurenceDescription = nodeName + " [" + minSymbol + ".." + maxSymbol + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + groupFigure.setText(minSymbol + ".." + maxSymbol); + } + + groupFigure.getIconFigure().setToolTipText(occurenceDescription); + groupFigure.getIconFigure().repaint(); + } protected List getModelChildren() @@ -68,6 +114,4 @@ connectionFigure.setHighlight(false); return connectionFigure; } - - }
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/XSDModelGroupDefinitionSection.java b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/XSDModelGroupDefinitionSection.java index e1696f4..4e2a055 100644 --- a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/XSDModelGroupDefinitionSection.java +++ b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/XSDModelGroupDefinitionSection.java
@@ -37,7 +37,7 @@ import org.eclipse.xsd.util.XSDConstants; import org.w3c.dom.Element; -public class XSDModelGroupDefinitionSection extends RefactoringSection +public class XSDModelGroupDefinitionSection extends MultiplicitySection { protected Text nameText; protected CCombo componentNameCombo; @@ -74,6 +74,7 @@ data = new GridData(); data.grabExcessHorizontalSpace = true; data.horizontalAlignment = GridData.FILL; + data.horizontalSpan = 2; componentNameCombo = getWidgetFactory().createCCombo(composite, SWT.FLAT); componentNameCombo.addSelectionListener(this); @@ -81,7 +82,50 @@ PlatformUI.getWorkbench().getHelpSystem().setHelp(componentNameCombo, XSDEditorCSHelpIds.GENERAL_TAB__MODELGROUP_REFS__REF); + + // ------------------------------------------------------------------ + // min property + // ------------------------------------------------------------------ + getWidgetFactory().createCLabel(composite, + org.eclipse.wst.xsd.ui.internal.editor.Messages.UI_LABEL_MINOCCURS); + + data = new GridData(); + data.grabExcessHorizontalSpace = true; + data.horizontalAlignment = GridData.FILL; + data.horizontalSpan = 2; + minCombo = getWidgetFactory().createCCombo(composite, SWT.FLAT); + minCombo.setLayoutData(data); + minCombo.add("0"); //$NON-NLS-1$ + minCombo.add("1"); //$NON-NLS-1$ + applyAllListeners(minCombo); + minCombo.addSelectionListener(this); + + PlatformUI.getWorkbench().getHelpSystem().setHelp(minCombo, + XSDEditorCSHelpIds.GENERAL_TAB__MODELGROUP__MIN_OCCURENCE); + + // ------------------------------------------------------------------ + // max property + // ------------------------------------------------------------------ + getWidgetFactory().createCLabel(composite, + org.eclipse.wst.xsd.ui.internal.editor.Messages.UI_LABEL_MAXOCCURS); + + data = new GridData(); + data.grabExcessHorizontalSpace = true; + data.horizontalAlignment = GridData.FILL; + data.horizontalSpan = 2; + + maxCombo = getWidgetFactory().createCCombo(composite, SWT.FLAT); + maxCombo.setLayoutData(data); + maxCombo.add("0"); //$NON-NLS-1$ + maxCombo.add("1"); //$NON-NLS-1$ + maxCombo.add("unbounded"); //$NON-NLS-1$ + applyAllListeners(maxCombo); + maxCombo.addSelectionListener(this); + + PlatformUI.getWorkbench().getHelpSystem().setHelp(maxCombo, + XSDEditorCSHelpIds.GENERAL_TAB__MODELGROUP__MAX_OCCURENCE); + } else { @@ -142,6 +186,12 @@ attrValue = ""; //$NON-NLS-1$ } componentNameCombo.setText(attrValue); + + // refresh min max + if (minCombo != null && maxCombo != null) + { + refreshMinMax(); + } } } else