Example #1
0
        /// <summary>
        /// Adds sub-items for the specified menu item and category
        /// </summary>
        /// <param name="menuItem">Parent menu item</param>
        /// <param name="category">Category we are interested in</param>
        /// <param name="actions">Actions to consider</param>
        /// <param name="indentLevel">Current hierarchical indentation level</param>
        private void PopulateSubCategories(MenuItem menuItem, ViewActionCategory category, IEnumerable <IViewAction> actions, int indentLevel = 0)
        {
            var populatedCategories = new List <string>();

            if (actions == null)
            {
                return;
            }
            var viewActions     = actions as IViewAction[] ?? actions.ToArray();
            var matchingActions = ViewActionPolicy != null?ViewActionPolicy.GetAllActionsForCategory(viewActions, category, indentLevel, orderByGroupTitle : false, viewModel : this) : ViewActionHelper.GetAllActionsForCategory(viewActions, category, indentLevel, orderByGroupTitle: false);

            var addedMenuItems = 0;

            foreach (var matchingAction in matchingActions)
            {
                if (addedMenuItems > 0 && matchingAction.BeginGroup)
                {
                    menuItem.Items.Add(new Separator());
                }

                if (matchingAction.Categories != null && matchingAction.Categories.Count > indentLevel + 1 && !populatedCategories.Contains(matchingAction.Categories[indentLevel].Id)) // This is further down in a sub-category even
                {
                    populatedCategories.Add(matchingAction.Categories[indentLevel].Id);
                    var newMenuItem = new ViewActionMenuItem {
                        Header = matchingAction.Categories[indentLevel + 1].Caption
                    };
                    var icon = new ThemeIcon {
                        UseFallbackIcon = false
                    };
                    icon.SetBinding(ThemeIcon.IconResourceKeyProperty, new Binding("BrushResourceKey"));
                    newMenuItem.Icon = icon;
                    CreateMenuItemBinding(matchingAction, newMenuItem);
                    PopulateSubCategories(newMenuItem, matchingAction.Categories[indentLevel + 1], viewActions, indentLevel + 1);
                    menuItem.Items.Add(newMenuItem);
                    addedMenuItems++;
                }
                else
                {
                    var newMenuItem1 = new ViewActionMenuItem {
                        Header = GetMenuTitle(matchingAction), Command = matchingAction, DataContext = matchingAction
                    };
                    HandleMenuShortcutKey(newMenuItem1, matchingAction);
                    if (matchingAction.ViewActionType == ViewActionTypes.Toggle)
                    {
                        newMenuItem1.IsCheckable = true;
                        newMenuItem1.SetBinding(MenuItem.IsCheckedProperty, new Binding("IsChecked")
                        {
                            Source = matchingAction, Mode = BindingMode.OneWay
                        });
                    }
                    var realMatchingAction = matchingAction as ViewAction;
                    if (realMatchingAction != null && !string.IsNullOrEmpty(realMatchingAction.ToolTipText))
                    {
                        newMenuItem1.ToolTip = realMatchingAction.ToolTipText;
                    }
                    var icon = new ThemeIcon {
                        FallbackIconResourceKey = string.Empty
                    };
                    icon.SetBinding(ThemeIcon.IconResourceKeyProperty, new Binding("BrushResourceKey"));
                    newMenuItem1.Icon = icon;
                    CreateMenuItemBinding(matchingAction, newMenuItem1);
                    menuItem.Items.Add(newMenuItem1);
                    addedMenuItems++;
                }
            }
        }
Example #2
0
 /// <summary>
 /// Gets all actions for the specified category.
 /// </summary>
 /// <param name="actions">The actions.</param>
 /// <param name="category">The category.</param>
 /// <param name="indentLevel">The indent level.</param>
 /// <param name="emptyCategory">The empty category.</param>
 /// <param name="orderByGroupTitle">if set to <c>true</c> [order by group title].</param>
 /// <param name="viewModel">Optional view model object</param>
 /// <returns>IEnumerable&lt;IViewAction&gt;.</returns>
 public virtual IEnumerable <IViewAction> GetAllActionsForCategory(IEnumerable <IViewAction> actions, ViewActionCategory category, int indentLevel = 0, string emptyCategory = "File", bool orderByGroupTitle = true, object viewModel = null) => ViewActionHelper.GetAllActionsForCategory(actions, category, indentLevel, emptyCategory, orderByGroupTitle);
        /// <summary>
        /// Populates the current items control with items based on the actions collection
        /// </summary>
        /// <param name="actions">List of actions</param>
        protected virtual void PopulateItems(IHaveActions actions)
        {
            RemoveAllMenuKeyBindings();
            Items.Clear();
            if (actions == null || actions.Actions == null)
            {
                return;
            }

            var actionList     = actions.Actions.ToList();
            var rootCategories = ViewActionPolicy != null?ViewActionPolicy.GetTopLevelActionCategories(actionList, EmptyGlobalCategoryTitle) : ViewActionHelper.GetTopLevelActionCategories(actionList, EmptyGlobalCategoryTitle);

            var viewActionCategories = rootCategories as ViewActionCategory[] ?? rootCategories.ToArray();

            foreach (var category in viewActionCategories)
            {
                var matchingActions = ViewActionPolicy != null?ViewActionPolicy.GetAllActionsForCategory(actionList, category, orderByGroupTitle : OrderByGroupTitle) : ViewActionHelper.GetAllActionsForCategory(actionList, category, orderByGroupTitle: OrderByGroupTitle);

                foreach (var action in matchingActions)
                {
                    var wrapper = new DependencyViewActionWrapper(action);
                    if (action.Categories.Count > 0)
                    {
                        MetroTiles.SetGroupName(wrapper, action.Categories[0].Id);
                        MetroTiles.SetGroupTitle(wrapper, action.Categories[0].Caption);
                    }
                    else
                    {
                        MetroTiles.SetGroupName(wrapper, string.Empty);
                        MetroTiles.SetGroupTitle(wrapper, string.Empty);
                    }
                    if (action.Availability != ViewActionAvailabilities.Unavailable)
                    {
                        MetroTiles.SetTileVisibility(wrapper, action.Visibility);
                    }
                    else
                    {
                        MetroTiles.SetTileVisibility(wrapper, Visibility.Collapsed);
                    }
                    Items.Add(wrapper);
                    if (action.ShortcutKey == Key.None)
                    {
                        continue;
                    }
                    MenuKeyBindings.Add(new ViewActionMenuKeyBinding(action));
                }
            }

            CreateAllMenuKeyBindings();
        }