Пример #1
0
        /// <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);
            }
        }
Пример #2
0
 /// <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);
 }