Beispiel #1
0
        /// <summary>
        /// Manage the views contextual menus (those that are defined in the templates)
        /// </summary>
        private IEnumerable <IContextualMenu> ManageViewsContextualMenu(ExcelInterop.Worksheet sheet, ExcelInterop.Range range)
        {
            List <IContextualMenu> menus = new List <IContextualMenu>();

            if (sheet != null && range != null)
            {
                ExcelInterop.Range targetRange = range.Cells[1, 1];

                lock (syncRoot)
                {
                    List <ExcelTemplateView> views;
                    if (viewsBySheet.TryGetValue(sheet, out views))
                    {
                        if (views != null)
                        {
                            foreach (ExcelTemplateView view in views.Where(v => v.IsRendered).Select(v => v))
                            {
                                ExcelInterop.Range intersect = ExcelApplication.Application.Intersect(view.RenderedRange, targetRange);
                                if (intersect != null)
                                {
                                    IBindingContextItem currentContextItem = view.GetConcernedContextItem(targetRange);
                                    if (currentContextItem != null)
                                    {
                                        // User contextual menu
                                        IBindingContextElement catchingContextElement = currentContextItem.ParentElement;
                                        do
                                        {
                                            ExcelTemplateDefinitionPart currentTemplateDefinition = catchingContextElement.ParentPart.TemplateDefinitionPart as ExcelTemplateDefinitionPart;
                                            if ((currentTemplateDefinition.Parent as ExcelTemplateDefinition).ContextualMenu != null)
                                            {
                                                ContextualMenu contextualMenu = (currentTemplateDefinition.Parent as ExcelTemplateDefinition).ContextualMenu as ContextualMenu;
                                                contextualMenu.SetAction(targetRange, catchingContextElement, currentContextItem.ParentElement);
                                                menus.Insert(0, contextualMenu);
                                            }
                                            catchingContextElement = catchingContextElement.ParentPart.ParentContext == null ? null : catchingContextElement.ParentPart.ParentContext.Parent;
                                        }while (catchingContextElement != null);

                                        // Etk sort, search and filter
                                        IContextualMenu searchSortAndFilterMenu = sortSearchAndFilterMenuManager.GetMenus(view, targetRange, currentContextItem);
                                        if (searchSortAndFilterMenu != null)
                                        {
                                            menus.Insert(0, searchSortAndFilterMenu);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                //ExcelApplication.ReleaseComObject(targetRange);
                targetRange = null;
            }
            return(menus);
        }
Beispiel #2
0
        public SortSearchAndFilterMenuManager()
        {
            // Create the contextual menu instances.
            Assembly assembly = Assembly.GetExecutingAssembly();

            using (TextReader textReader = new StreamReader(assembly.GetManifestResourceStream("Etk.Excel.Resources.ViewSortSearchAndFilterContextualMenu.xml")))
            {
                string menuXml = textReader.ReadToEnd();
                sortSearchAndFilersMenu = ContextualMenuFactory.CreateInstance(menuXml);
            }
        }
        public IContextualMenu GetContextualMenu(string name)
        {
            IContextualMenu ret = null;

            if (!String.IsNullOrEmpty(name))
            {
                lock ((contextualMenuByIdent as ICollection).SyncRoot)
                {
                    contextualMenuByIdent.TryGetValue(name, out ret);
                }
            }
            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}.");
                                }
                            };
                        }
                    }
                }
            }
        }
        public static IContextualMenu CreateInstance(string xmlValue)
        {
            IContextualMenu             ret        = null;
            XmlContextualMenuDefinition definition = null;

            try
            {
                definition = XmlContextualMenuDefinition.CreateInstance(xmlValue);
                if (definition != null)
                {
                    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((IContextualPart)menuItem);
                            }
                            if (xmlPart is XmlContextualMenuDefinition)
                            {
                                //items.Add((IContextualPart)menuItem);
                            }
                        }
                        if (items.Count > 0)
                        {
                            ret = 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);
        }
Beispiel #6
0
        public TemplateContextualMenuManager(ContextualMenuManager contextualMenuManager)
        {
            this.contextualMenuManager = contextualMenuManager;

            // Create the contextual menu instances.
            Assembly assembly = Assembly.GetExecutingAssembly();

            using (TextReader textReader = new StreamReader(assembly.GetManifestResourceStream("Etk.Excel.Resources.TemplateManagerUpdateDeleteContextualMenu.xml")))
            {
                string menuXml = textReader.ReadToEnd();
                manageTemplateMenu = null;//ùùmanageTemplateMenu = ContextualMenuFactory.CreateInstance(menuXml);
            }

            // Declare the contextual menus activators.
            contextualMenuManager.OnContextualMenusRequested += ManageTemplateManagerContextualMenu;
        }
Beispiel #7
0
 public RequestsManager([Import] IContextualMenuManager contextualMenuManager)
 {
     try
     {
         // Create the contextual menu instances.
         Assembly assembly = Assembly.GetExecutingAssembly();
         using (TextReader textReader = new StreamReader(assembly.GetManifestResourceStream("Etk.Excel.Resources.RequestsManagerContextualMenu.xml")))
         {
             string menuXml = textReader.ReadToEnd();
             RequestManagementMenu = ContextualMenuFactory.CreateInstance(menuXml);
         }
         // Declare the contextual menus activators.
         contextualMenuManager.OnContextualMenusRequested += ManageRequestsContexualMenu;
     }
     catch (Exception ex)
     {
         throw new EtkException($"UDF manager initialization failed:{ex.Message}", ex);
     }
 }
 public IContextualMenu RegisterMenuDefinitionFromXml(string xml)
 {
     try
     {
         IContextualMenu menu = ContextualMenuFactory.CreateInstance(xml);
         lock ((contextualMenuByIdent as ICollection).SyncRoot)
         {
             if (menu != null)
             {
                 if (contextualMenuByIdent.ContainsKey(menu.Name))
                 {
                     log.LogFormat(LogType.Warn, "Menu {0} already registered.", menu.Name ?? string.Empty);
                 }
                 contextualMenuByIdent[menu.Name] = menu;
             }
         }
         return(menu);
     }
     catch (Exception ex)
     {
         string message = xml.Length > 350 ? xml.Substring(0, 350) + "..." : xml;
         throw new EtkException($"Cannot create contextual menu from xml '{message}':{ex.Message}");
     }
 }
Beispiel #9
0
 public static IEnumerable <MenuItemToken> MenuItemsFor <T>(this IContextualMenu <T> menu, T target,
                                                            StringToken name)
 {
     return(menu.MenuItemsFor(target, name.Key));
 }