/// <summary> /// A method to add the menu values to a tool strip menu /// </summary> /// <param name="manager">The manager</param> /// <param name="createItem">A method to create top level items</param> /// <param name="extMenu">The extension menu strip</param> /// <param name="clickHandler">The click handler to associate with the items</param> private static void AddToMenu <T, U>(GenericExtensionManager <T, U> manager, Func <string, ToolStripMenuItem> createItem, ToolStripMenuItem extMenu, EventHandler clickHandler) where T : MenuExtensionAttribute { Dictionary <string, ToolStripMenuItem> categories = new Dictionary <string, ToolStripMenuItem>(); PopulateDictionary(categories, "", extMenu); foreach (var ext in manager.GetExtensions()) { ToolStripMenuItem subItem = extMenu; ToolStripMenuItem item = new ToolStripMenuItem(ext.ExtensionAttribute.Name); item.Click += clickHandler; item.Tag = ext.ExtensionType; if (ext.ExtensionAttribute.ShortcutKeys != Keys.None) { item.ShortcutKeys = ext.ExtensionAttribute.ShortcutKeys; item.ShowShortcutKeys = true; } if (!String.IsNullOrWhiteSpace(ext.Category)) { string catName = ext.Category.ToLowerInvariant(); if (!categories.ContainsKey(catName)) { string[] origNames = ext.Category.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); string[] lowerNames = catName.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); if (categories.ContainsKey(lowerNames[0])) { subItem = categories[lowerNames[0]]; } else { subItem = createItem(origNames[0]); categories[lowerNames[0]] = subItem; } StringBuilder currName = new StringBuilder(lowerNames[0]); for (int i = 1; i < origNames.Length; ++i) { currName.AppendFormat("/{0}", lowerNames[i]); string newName = currName.ToString(); if (categories.ContainsKey(newName)) { subItem = categories[newName]; } else { subItem = (ToolStripMenuItem)subItem.DropDownItems.Add(origNames[i]); categories[newName] = subItem; } } categories[catName] = subItem; } else { subItem = categories[catName]; } } subItem.DropDownItems.Add(item); } }
/// <summary> /// A method to add the menu values to a tool strip menu /// </summary> /// <param name="manager">The manager</param> /// <param name="rootMenu">The root menu strip</param> /// <param name="clickHandler">The click handler to associate with the items</param> public static void AddToMenu <T, U>(this GenericExtensionManager <T, U> manager, MenuStrip rootMenu, ToolStripMenuItem extensionMenuItem, EventHandler clickHandler) where T : MenuExtensionAttribute { AddToMenu(manager, s => (ToolStripMenuItem)rootMenu.Items.Add(s), extensionMenuItem, clickHandler); }