////////////////////////////////////////////////// // Public static methods ////////////////////////////////////////////////// #region Public static methods /// <summary> /// Clones the specified source tool strip menu item. /// </summary> /// <param name="sourceToolStripMenuItem">The source tool strip menu item.</param> /// <returns>A cloned version of the toolstrip menu item</returns> public static ToolStripMenuItem Clone(this ToolStripMenuItem sourceToolStripMenuItem) { ToolStripMenuItem menuItem = new ToolStripMenuItem(); var propInfoList = from p in typeof(ToolStripMenuItem).GetProperties() let attributes = p.GetCustomAttributes(true) let notBrowseable = (from a in attributes where a.GetType() == typeof(BrowsableAttribute) select !(a as BrowsableAttribute).Browsable).FirstOrDefault() where !notBrowseable && p.CanRead && p.CanWrite && p.Name != "DropDown" orderby p.Name select p; // Copy over using reflections foreach (var propertyInfo in propInfoList) { object propertyInfoValue = propertyInfo.GetValue(sourceToolStripMenuItem, null); propertyInfo.SetValue(menuItem, propertyInfoValue, null); } // Create a new menu name menuItem.Name = sourceToolStripMenuItem.Name + "-" + m_menuNameCounter++; // Process any other properties if (sourceToolStripMenuItem.ImageIndex != -1) { menuItem.ImageIndex = sourceToolStripMenuItem.ImageIndex; } if (!string.IsNullOrEmpty(sourceToolStripMenuItem.ImageKey)) { menuItem.ImageKey = sourceToolStripMenuItem.ImageKey; } // We need to make this visible menuItem.Visible = true; // Recursively clone the drop down list foreach (var item in sourceToolStripMenuItem.DropDownItems) { ToolStripItem newItem; if (item is ToolStripMenuItem) { newItem = ((ToolStripMenuItem)item).Clone(); } else if (item is ToolStripSeparator) { newItem = new ToolStripSeparator(); } else { throw new NotImplementedException("Menu item is not a ToolStripMenuItem or a ToolStripSeparatorr"); } menuItem.DropDownItems.Add(newItem); } // The handler list starts empty because we created its parent via a new // So this is equivalen to a copy. menuItem.AddHandlers(sourceToolStripMenuItem); return(menuItem); }