Browse Source

2007-01-15 Everaldo Canuto <[email protected]>

	* Menu.cs: implement MergeItems and Replace for MenuMerge method.
	Fixes #80006.


svn path=/trunk/mcs/; revision=71102
Everaldo Canuto 19 years ago
parent
commit
3da35cff9f

+ 5 - 0
mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog

@@ -1,3 +1,8 @@
+2007-01-15  Everaldo Canuto  <[email protected]>
+
+	* Menu.cs: implement MergeItems and Replace for MenuMerge method.
+	Fixes #80006.
+
 2007-01-15 Carlos Alberto Cortez <[email protected]>
 
 	* ListViewItem.cs:

+ 26 - 7
mcs/class/Managed.Windows.Forms/System.Windows.Forms/Menu.cs

@@ -263,24 +263,43 @@ namespace System.Windows.Forms
 			if (menuSrc == this)
 				throw new ArgumentException ("The menu cannot be merged with itself");
 			
-			for (int i = 0; i < menuSrc.MenuItems.Count; i++){
-								
-				switch (menuSrc.MenuItems[i].MergeType) {
+			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 (menuSrc.MenuItems[i].MergeOrder);						
-						MenuItems.Add (pos, menuSrc.MenuItems[i].CloneMenu ());
+						int pos = FindMergePosition (sourceitem.MergeOrder);						
+						MenuItems.Add (pos, sourceitem.CloneMenu ());
 						break;					
 					}
 					
 					case MenuMerge.Replace:
 					case MenuMerge.MergeItems:
 					{
-						int pos = FindMergePosition (menuSrc.MenuItems[i].MergeOrder - 1);						
-						MenuItems.Insert (pos, menuSrc.MenuItems[i].CloneMenu ());
+						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;
 					}