public virtual void MergeMenu (Menu menuSrc)
{
if (menuSrc == this)
throw new ArgumentException ("The menu cannot be merged with itself");
if (menuSrc == null)
return;
for (int i = 0; i < menuSrc.MenuItems.Count; i++) {
MenuItem sourceitem = menuSrc.MenuItems[i];
switch (sourceitem.MergeType) {
case MenuMerge.Remove: // Item not included
break;
case MenuMerge.Add:
{
int pos = FindMergePosition (sourceitem.MergeOrder);
MenuItems.Add (pos, sourceitem.CloneMenu ());
break;
}
case MenuMerge.Replace:
case MenuMerge.MergeItems:
{
for (int pos = FindMergePosition (sourceitem.MergeOrder-1); pos <= MenuItems.Count; pos++) {
if ((pos >= MenuItems.Count) || (MenuItems[pos].MergeOrder != sourceitem.MergeOrder)) {
MenuItems.Add (pos, sourceitem.CloneMenu ());
break;
}
MenuItem mergeitem = MenuItems[pos];
if (mergeitem.MergeType != MenuMerge.Add) {
if ((sourceitem.MergeType == MenuMerge.MergeItems) && (mergeitem.MergeType == MenuMerge.MergeItems)) {
mergeitem.MergeMenu (sourceitem);
} else {
MenuItems.Remove (sourceitem);
MenuItems.Add (pos, sourceitem.CloneMenu ());
}
break;
}
}
break;
}
default:
break;
}
}
}