private static void MergeRecursive(ToolStripItem source, ToolStripItemCollection destinationItems, Stack<MergeHistoryItem> history) { MergeHistoryItem item; ToolStripItem item2; switch (source.MergeAction) { case MergeAction.Append: { item = new MergeHistoryItem(MergeAction.Remove) { PreviousIndexCollection = source.Owner.Items, PreviousIndex = item.PreviousIndexCollection.IndexOf(source), TargetItem = source }; int num8 = destinationItems.Add(source); item.Index = num8; item.IndexCollection = destinationItems; history.Push(item); return; } case MergeAction.Insert: if (source.MergeIndex > -1) { item = new MergeHistoryItem(MergeAction.Remove) { PreviousIndexCollection = source.Owner.Items, PreviousIndex = item.PreviousIndexCollection.IndexOf(source), TargetItem = source }; int num7 = Math.Min(destinationItems.Count, source.MergeIndex); destinationItems.Insert(num7, source); item.IndexCollection = destinationItems; item.Index = num7; history.Push(item); } return; case MergeAction.Replace: case MergeAction.Remove: case MergeAction.MatchOnly: item2 = FindMatch(source, destinationItems); if (item2 != null) { switch (source.MergeAction) { case MergeAction.MatchOnly: { ToolStripDropDownItem item3 = item2 as ToolStripDropDownItem; ToolStripDropDownItem item4 = source as ToolStripDropDownItem; if (((item3 == null) || (item4 == null)) || (item4.DropDownItems.Count == 0)) { return; } int count = item4.DropDownItems.Count; if (count <= 0) { return; } int num2 = count; item4.DropDown.SuspendLayout(); try { int num3 = 0; int num4 = 0; while (num3 < count) { MergeRecursive(item4.DropDownItems[num4], item3.DropDownItems, history); int num5 = num2 - item4.DropDownItems.Count; num4 = (num5 > 0) ? num4 : (num4 + 1); num2 = item4.DropDownItems.Count; num3++; } return; } finally { item4.DropDown.ResumeLayout(); } goto Label_0108; } } } return; default: return; } Label_0108: item = new MergeHistoryItem(MergeAction.Insert); item.TargetItem = item2; int index = destinationItems.IndexOf(item2); destinationItems.RemoveAt(index); item.Index = index; item.IndexCollection = destinationItems; item.TargetItem = item2; history.Push(item); if (source.MergeAction == MergeAction.Replace) { item = new MergeHistoryItem(MergeAction.Remove) { PreviousIndexCollection = source.Owner.Items, PreviousIndex = item.PreviousIndexCollection.IndexOf(source), TargetItem = source }; destinationItems.Insert(index, source); item.Index = index; item.IndexCollection = destinationItems; history.Push(item); } }
private static void MergeRecursive(ToolStripItem source, ToolStripItemCollection destinationItems, Stack<MergeHistoryItem> history) { Debug.Indent(); MergeHistoryItem maction; switch (source.MergeAction) { case MergeAction.MatchOnly: case MergeAction.Replace: case MergeAction.Remove: ToolStripItem item = FindMatch(source, destinationItems); if (item != null) { switch (source.MergeAction) { case MergeAction.MatchOnly: //Debug.WriteLine("matchonly"); ToolStripDropDownItem tsddownDest = item as ToolStripDropDownItem; ToolStripDropDownItem tsddownSrc = source as ToolStripDropDownItem; if (tsddownDest != null && tsddownSrc != null && tsddownSrc.DropDownItems.Count != 0) { int originalCount = tsddownSrc.DropDownItems.Count; if (originalCount > 0) { int lastCount = originalCount; tsddownSrc.DropDown.SuspendLayout(); try { // the act of walking through this collection removes items from // the dropdown. for (int i = 0, itemToLookAt = 0; i < originalCount; i++) { MergeRecursive(tsddownSrc.DropDownItems[itemToLookAt], tsddownDest.DropDownItems, history); int numberOfItemsMerged = lastCount - tsddownSrc.DropDownItems.Count; itemToLookAt = (numberOfItemsMerged > 0) ? itemToLookAt : itemToLookAt + 1; lastCount = tsddownSrc.DropDownItems.Count; } } finally { tsddownSrc.DropDown.ResumeLayout(); } } } break; case MergeAction.Replace: case MergeAction.Remove: //Debug.WriteLine("remove"); maction = new MergeHistoryItem(MergeAction.Insert); maction.TargetItem = item; int indexOfDestinationItem = destinationItems.IndexOf(item); destinationItems.RemoveAt(indexOfDestinationItem); maction.Index = indexOfDestinationItem; maction.IndexCollection = destinationItems; maction.TargetItem = item; history.Push(maction); //Debug.WriteLine(maction.ToString()); if (source.MergeAction == MergeAction.Replace) { //Debug.WriteLine("replace"); //ToolStripItem clonedItem = source.Clone(); maction = new MergeHistoryItem(MergeAction.Remove); maction.PreviousIndexCollection = source.Owner.Items; maction.PreviousIndex = maction.PreviousIndexCollection.IndexOf(source); maction.TargetItem = source; destinationItems.Insert(indexOfDestinationItem, source); maction.Index = indexOfDestinationItem; maction.IndexCollection = destinationItems; history.Push(maction); //Debug.WriteLine(maction.ToString()); } break; } } break; case MergeAction.Insert: if (source.MergeIndex > -1) { maction = new MergeHistoryItem(MergeAction.Remove); maction.PreviousIndexCollection = source.Owner.Items; maction.PreviousIndex = maction.PreviousIndexCollection.IndexOf(source); maction.TargetItem = source; int insertIndex = Math.Min(destinationItems.Count, source.MergeIndex); destinationItems.Insert(insertIndex, source); maction.IndexCollection = destinationItems; maction.Index = insertIndex; history.Push(maction); //Debug.WriteLine(maction.ToString()); } break; case MergeAction.Append: maction = new MergeHistoryItem(MergeAction.Remove); maction.PreviousIndexCollection = source.Owner.Items; maction.PreviousIndex = maction.PreviousIndexCollection.IndexOf(source); maction.TargetItem = source; int index = destinationItems.Add(source); maction.Index = index; maction.IndexCollection = destinationItems; history.Push(maction); //Debug.WriteLine(maction.ToString()); break; } Debug.Unindent(); }