public override SubNavigationMenuModel GetMenu()
        {
            if (IsHomePage(CurrentPage) || IsShowInHomeNavigation(CurrentPage))
            {
                return(null);
            }

            var contentUnderHeading = CurrentPage.AncestorsOrSelf().SingleOrDefault(pc => pc.Parent != null && pc.Parent.IsHeading());

            var subMenuStartPage = contentUnderHeading ?? CurrentPage.AncestorsOrSelf().SingleOrDefault(pc => pc.Parent != null && IsHomePage(pc.Parent));

            if (subMenuStartPage == null)
            {
                return(null);
            }

            var model = new SubNavigationMenuModel
            {
                Rows   = GetSubNavigationMenuRows(subMenuStartPage, _groupHelper.IsGroupPage(subMenuStartPage)),
                Parent = IsHomePage(CurrentPage.Parent) || IsContentUnavailable(CurrentPage.Parent)
                    ? null
                    : MapToMenuItemModel(CurrentPage.Parent),
                Title           = GetNavigationName(subMenuStartPage),
                IsTitleHidden   = IsTitleHidden(subMenuStartPage),
                ShowBreadcrumbs = IsShowBreadcrumbs(CurrentPage)
            };


            return(model);
        }
        protected virtual IEnumerable <SubNavigationMenuRowModel> GetSubNavigationMenuRows(IPublishedContent subMenuStartPage, bool isGroupSubNavigation)
        {
            if (!subMenuStartPage.IsContentPage() && !_groupHelper.IsGroupPage(subMenuStartPage))
            {
                return(Enumerable.Empty <SubNavigationMenuRowModel>());
            }

            var activeItems = CurrentPage.AncestorsOrSelf().Where(pc => !pc.IsHeading() && !IsHomePage(pc)).ToList();

            var menuRows = activeItems
                           .Select(selectedItem =>
            {
                var availableContent = GetAvailableContent(selectedItem.Children);
                if (isGroupSubNavigation)
                {
                    return(ValidateGroupSubNavigationItems(availableContent).Select(MapToSubNavigationMenuItemModel));
                }
                return(availableContent.Select(MapToSubNavigationMenuItemModel));
            })
                           .Select(menuItems => new SubNavigationMenuRowModel
            {
                Items = menuItems.ToList()
            })
                           .ToList();

            menuRows.Reverse();

            var topLevelMenuRow = menuRows.First();

            topLevelMenuRow.Items.Insert(0, MapToSubNavigationMenuItemModel(subMenuStartPage));

            return(menuRows);
        }
        protected virtual IEnumerable <MenuItemModel> BuildLeftMenuTree(IPublishedContent parent, IList <int> excludeContentIds)
        {
            if (!parent.Children.Any())
            {
                yield break;
            }

            var children       = GetAvailableContent(parent.Children).Where(pContent => !excludeContentIds.Contains(pContent.Id));
            var activeMenuItem = CurrentPage.AncestorsOrSelf().FirstOrDefault(pc => !IsHideFromNavigation(pc));

            foreach (var child in children)
            {
                var isHeading = child.IsHeading();

                var newMenuItem = new MenuItemModel
                {
                    Id        = child.Id,
                    Name      = GetNavigationName(child),
                    Url       = isHeading ? string.Empty : child.Url,
                    IsActive  = child == activeMenuItem,
                    IsHeading = isHeading,
                    Children  = BuildLeftMenuTree(child, excludeContentIds).ToList()
                };

                yield return(newMenuItem);
            }
        }