[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