public void ApplyTemplate(TunableMenuTemplate template)
        {
            if (null == template)
            {
                throw new ArgumentNullException(nameof(template));
            }

            Reset();

            var toolStripItems = new List <ToolStripItem>();

            foreach (var itemTemplate in template.Items)
            {
                if (null == itemTemplate.Text)
                {
                    throw new BadTemplateException("null == itemTemplate.Text");
                }

                if ("-".Equals(itemTemplate.Text, StringComparison.OrdinalIgnoreCase))
                {
                    toolStripItems.Add(new ToolStripSeparator());
                    continue;
                }

                var image = itemTemplate.BuildIconHolder()?.TryBuildImage();

                var toolStripLabel = new ToolStripMenuItem(itemTemplate.Text, image, OnMenuItemClick);

                toolStripItems.Add(toolStripLabel);

                if (null == itemTemplate.Command)
                {
                    continue;
                }

                toolStripLabel.Tag = itemTemplate.Command;
            }

            SuspendLayout();
            Items.AddRange(toolStripItems.ToArray());
            ResumeLayout();
        }
        public static TunableMenuTemplate BuildCommandMenu(ExtensionManager extensionManager, string tagName, string templateBaseDirectory)
        {
            if (null == extensionManager)
            {
                throw new ArgumentNullException(nameof(extensionManager));
            }

            if (null == tagName)
            {
                throw new ArgumentNullException(nameof(tagName));
            }

            if (null == templateBaseDirectory)
            {
                throw new ArgumentNullException(nameof(templateBaseDirectory));
            }

            var extensionInfoList = extensionManager.SelectExtensionInfoListByTag(tagName);
            var itemTemplates     = new List <MenuItemTemplate>();

            decimal?currentGroupOrder = null;

            foreach (var extensionInfo in extensionInfoList)
            {
                if (null == currentGroupOrder)
                {
                    currentGroupOrder = extensionInfo.GroupOrder;
                }

                if (currentGroupOrder != extensionInfo.GroupOrder)
                {
                    itemTemplates.Add(new MenuItemTemplate("-"));
                    currentGroupOrder = extensionInfo.GroupOrder;
                }

                string iconPath = null;

                if (null != extensionInfo.IconPath)
                {
                    var iconAbsolutePath = Path.Combine(extensionInfo.BaseDirectory, extensionInfo.IconPath);
                    iconPath = FileUtility.MakeRelativePath(iconAbsolutePath, templateBaseDirectory);
                }

                var menuItemTemplate = new MenuItemTemplate(extensionInfo.Name)
                {
                    Command  = extensionInfo.Id,
                    IconPath = iconPath
                };

                itemTemplates.Add(menuItemTemplate);
            }

            TunableMenuTemplate tunableMenuTemplate;

            if (0 == itemTemplates.Count)
            {
                tunableMenuTemplate = null;
            }
            else
            {
                tunableMenuTemplate = new TunableMenuTemplate();

                tunableMenuTemplate.Items.Clear();
                tunableMenuTemplate.Items.AddRange(itemTemplates);
            }

            return(tunableMenuTemplate);
        }