示例#1
0
 bool ShowContextMenu(TextViewContext context, out ContextMenu menu)
 {
     menu = new ContextMenu();
     foreach (var category in entries.OrderBy(c => c.Metadata.Order).GroupBy(c => c.Metadata.Category))
     {
         bool needSeparatorForCategory = menu.Items.Count > 0;
         foreach (var entryPair in category)
         {
             IContextMenuEntry entry = entryPair.Value;
             if (entry.IsVisible(context))
             {
                 if (needSeparatorForCategory)
                 {
                     menu.Items.Add(new Separator());
                     needSeparatorForCategory = false;
                 }
                 MenuItem menuItem = new MenuItem();
                 menuItem.Header           = MainWindow.GetResourceString(entryPair.Metadata.Header);
                 menuItem.InputGestureText = entryPair.Metadata.InputGestureText;
                 if (!string.IsNullOrEmpty(entryPair.Metadata.Icon))
                 {
                     object image = Images.Load(entryPair.Value, entryPair.Metadata.Icon);
                     if (!(image is Viewbox))
                     {
                         image = new Image {
                             Width  = 16,
                             Height = 16,
                             Source = (ImageSource)image
                         };
                     }
                     menuItem.Icon = image;
                 }
                 if (entryPair.Value.IsEnabled(context))
                 {
                     menuItem.Click += delegate { entry.Execute(context); };
                 }
                 else
                 {
                     menuItem.IsEnabled = false;
                 }
                 menu.Items.Add(menuItem);
             }
         }
     }
     return(menu.Items.Count > 0);
 }
        bool ShowContextMenu(TextViewContext context, out IEnumerable <IControl> menuItems)
        {
            List <IControl> items = new List <IControl>();

            foreach (var category in entries.OrderBy(c => c.Metadata.Order).GroupBy(c => c.Metadata.Category))
            {
                bool needSeparatorForCategory = items.Count > 0;
                foreach (var entryPair in category)
                {
                    IContextMenuEntry entry = entryPair.Value;
                    if (entry.IsVisible(context))
                    {
                        if (needSeparatorForCategory)
                        {
                            items.Add(new Separator());
                            needSeparatorForCategory = false;
                        }
                        MenuItem menuItem = new MenuItem();
                        menuItem.Header = MainWindow.GetResourceString(entryPair.Metadata.Header);
                        if (!string.IsNullOrEmpty(entryPair.Metadata.Icon))
                        {
                            menuItem.Icon = new Image {
                                Width  = 16,
                                Height = 16,
                                Source = Images.LoadImage(entry, entryPair.Metadata.Icon)
                            };
                        }
                        if (entryPair.Value.IsEnabled(context))
                        {
                            menuItem.Click += delegate { entry.Execute(context); };
                        }
                        else
                        {
                            menuItem.IsEnabled = false;
                        }
                        items.Add(menuItem);
                    }
                }
            }
            menuItems = items;
            return(items.Count > 0);
        }
示例#3
0
        bool ShowContextMenu(TextViewContext context, out ContextMenu menu)
        {
            menu = new ContextMenu();
            var menuGroups = new Dictionary <string, Lazy <IContextMenuEntry, IContextMenuEntryMetadata>[]>();

            Lazy <IContextMenuEntry, IContextMenuEntryMetadata>[] topLevelGroup = null;
            foreach (var group in entries.OrderBy(c => c.Metadata.Order).GroupBy(c => c.Metadata.ParentMenuID))
            {
                if (group.Key == null)
                {
                    topLevelGroup = group.ToArray();
                }
                else
                {
                    menuGroups.Add(group.Key, group.ToArray());
                }
            }
            BuildMenu(topLevelGroup ?? Array.Empty <Lazy <IContextMenuEntry, IContextMenuEntryMetadata> >(), menu.Items);
            return(menu.Items.Count > 0);

            void BuildMenu(Lazy <IContextMenuEntry, IContextMenuEntryMetadata>[] menuGroup, ItemCollection parent)
            {
                foreach (var category in menuGroup.GroupBy(c => c.Metadata.Category))
                {
                    bool needSeparatorForCategory = parent.Count > 0;
                    foreach (var entryPair in category)
                    {
                        IContextMenuEntry entry = entryPair.Value;
                        if (entry.IsVisible(context))
                        {
                            if (needSeparatorForCategory)
                            {
                                parent.Add(new Separator());
                                needSeparatorForCategory = false;
                            }
                            MenuItem menuItem = new MenuItem();
                            menuItem.Header           = MainWindow.GetResourceString(entryPair.Metadata.Header);
                            menuItem.InputGestureText = entryPair.Metadata.InputGestureText;
                            if (!string.IsNullOrEmpty(entryPair.Metadata.Icon))
                            {
                                menuItem.Icon = new Image {
                                    Width  = 16,
                                    Height = 16,
                                    Source = Images.Load(entryPair.Value, entryPair.Metadata.Icon)
                                };
                            }
                            if (entryPair.Value.IsEnabled(context))
                            {
                                menuItem.Click += delegate { entry.Execute(context); };
                            }
                            else
                            {
                                menuItem.IsEnabled = false;
                            }
                            parent.Add(menuItem);

                            if (entryPair.Metadata.MenuID != null && menuGroups.TryGetValue(entryPair.Metadata.MenuID, out var group))
                            {
                                BuildMenu(group, menuItem.Items);
                            }
                        }
                    }
                }
            }
        }