[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