/// <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}."); } }; } } } } }