/// <summary>
        /// Create a contextual menu from an Xml
        /// </summary>
        public static IEnumerable <IContextualMenu> CreateInstances(string xmlValue)
        {
            List <IContextualMenu>       ret         = null;
            XmlContextualMenuDefinitions definitions = null;

            try
            {
                definitions = XmlContextualMenuDefinitions.CreateInstance(xmlValue);
                if (definitions != null && definitions.ContextualMenus != null)
                {
                    ret = new List <IContextualMenu>();

                    foreach (XmlContextualMenuDefinition definition in definitions.ContextualMenus)
                    {
                        definition.Name = definition.Name.EmptyIfNull().Trim();
                        if (string.IsNullOrEmpty(definition.Name))
                        {
                            throw new EtkException("Contextual menu must have a name");
                        }

                        if (definition.Items != null && definition.Items.Count > 0)
                        {
                            List <IContextualPart> items = new List <IContextualPart>();
                            foreach (XmlContextualMenuPart xmlPart in definition.Items)
                            {
                                if (xmlPart is XmlContextualMenuItemDefinition)
                                {
                                    XmlContextualMenuItemDefinition xmlItem = xmlPart as XmlContextualMenuItemDefinition;
                                    MethodInfo          methodInfo          = ConstextualMethodRetriever.RetrieveContextualMethodInfo(xmlItem.Action);
                                    IContextualMenuItem menuItem            = new ContextualMenuItem(xmlItem.Caption, xmlItem.BeginGroup, methodInfo, xmlItem.FaceId);

                                    items.Add(menuItem);
                                }
                                //if (xmlPart is XmlContextualMenuDefinition)
                                //    items.Add((IContextualPart)menuItem);
                            }
                            if (items.Count > 0)
                            {
                                ret.Add(new ContextualMenu(definition.Name, definition.Caption, definition.BeginGroup, items));
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string message = xmlValue.Length > 350 ? xmlValue.Substring(0, 350) + "..." : xmlValue;
                throw new EtkException($"Cannot create Event Callbacks from xml '{message}':{ex.Message}");
            }
            return(ret);
        }
        /// <summary> Create a menu and its submenus and manage their actions</summary>
        /// <param name="parentControls">Control where the menu must be inserted</param>
        /// <param name="contextualMenu">Menu to insert</param>
        private void CreateMenus(CommandBarControls parentControls, IContextualMenu contextualMenu)
        {
            if (contextualMenu != null && contextualMenu.Items != null)
            {
                foreach (IContextualPart part in contextualMenu.Items)
                {
                    if (part is IContextualMenu)
                    {
                        IContextualMenu contextualSubMenu = part as IContextualMenu;
                        CommandBarPopup subMenu           = (CommandBarPopup)parentControls.Add(MsoControlType.msoControlPopup, Type.Missing, Type.Missing, Type.Missing, true);
                        subMenu.Caption    = contextualSubMenu.Caption;
                        subMenu.BeginGroup = contextualSubMenu.BeginGroup;
                        CreateMenus(subMenu.Controls, contextualSubMenu);
                    }
                    else
                    {
                        ContextualMenuItem contextualMenuItem = part as ContextualMenuItem;
                        if (contextualMenuItem != null)
                        {
                            MsoControlType   menuItem         = MsoControlType.msoControlButton;
                            CommandBarButton commandBarButton = (CommandBarButton)parentControls.Add(menuItem, Type.Missing, Type.Missing, Type.Missing, true);
                            commandBarButton.Style      = MsoButtonStyle.msoButtonIconAndCaption;
                            commandBarButton.Caption    = contextualMenuItem.Caption;
                            commandBarButton.BeginGroup = contextualMenuItem.BeginGroup;
                            if (contextualMenuItem.FaceId != 0)
                            {
                                commandBarButton.FaceId = contextualMenuItem.FaceId;
                            }

                            commandBarButton.Click += (CommandBarButton ctrl, ref bool cancel1) =>
                            {
                                try
                                {
                                    if (contextualMenuItem.Action != null)
                                    {
                                        contextualMenuItem.Action();
                                    }
                                }
                                catch (Exception ex)
                                {
                                    string methodName = contextualMenuItem.MethodInfo == null ? string.Empty : contextualMenuItem.MethodInfo.Name;
                                    throw new EtkException($"Contextual menu: '{methodName}' invocation failed: {ex.Message}.");
                                }
                            };
                        }
                    }
                }
            }
        }