예제 #1
0
        public static IDictionary <int, List <ITabStopElement> > GetTabIndexesOnParentPage(this ITabStopElement element, out int countChildrenWithTabStopWithoutThis)
        {
            var empty = new Dictionary <int, List <ITabStopElement> >();

            countChildrenWithTabStopWithoutThis = 0;

            Element parentPage = (element as Element)?.Parent;

            while (parentPage != null && !(parentPage is Page))
            {
                parentPage = parentPage.Parent;
            }

            var descendantsOnPage = parentPage?.VisibleDescendants();

            if (parentPage is IShellController shell)
            {
                descendantsOnPage = shell.GetItems();
            }

            if (descendantsOnPage == null)
            {
                return(empty);
            }

            var childrenWithTabStop = new List <ITabStopElement>();

            foreach (var descendant in descendantsOnPage)
            {
                if (descendant is ITabStopElement visualElement && IsTabStop(descendant))
                {
                    childrenWithTabStop.Add(visualElement);
                }
            }

            countChildrenWithTabStopWithoutThis = childrenWithTabStop.Count - 1;
            return(childrenWithTabStop.GroupToDictionary(c => c.TabIndex));
        }
예제 #2
0
        public static ITabStopElement FindNextElement(this ITabStopElement element, bool forwardDirection, IDictionary <int, List <ITabStopElement> > tabIndexes, ref int tabIndex)
        {
            if (!tabIndexes.TryGetValue(tabIndex, out var tabGroup))
            {
                return(null);
            }

            if (!forwardDirection)
            {
                // search prev element in same TabIndex group
                var prevSubIndex = tabGroup.IndexOf(element) - 1;
                if (prevSubIndex >= 0 && prevSubIndex < tabGroup.Count)
                {
                    return(tabGroup[prevSubIndex]);
                }
                else                 // search prev element in prev TabIndex group
                {
                    var smallerMax    = int.MinValue;
                    var tabIndexesMax = int.MinValue;
                    foreach (var index in tabIndexes.Keys)
                    {
                        if (index < tabIndex && smallerMax < index)
                        {
                            smallerMax = index;
                        }
                        if (tabIndexesMax < index)
                        {
                            tabIndexesMax = index;
                        }
                    }
                    tabIndex = smallerMax != int.MinValue ? smallerMax : tabIndexesMax;
                    return(tabIndexes[tabIndex][0]);
                }
            }
            else             // Forward
            {
                // search next element in same TabIndex group
                var nextSubIndex = tabGroup.IndexOf(element) + 1;
                if (nextSubIndex > 0 && nextSubIndex < tabGroup.Count)
                {
                    return(tabGroup[nextSubIndex]);
                }
                else                 // search next element in next TabIndex group
                {
                    var biggerMin     = int.MaxValue;
                    var tabIndexesMin = int.MaxValue;
                    foreach (var index in tabIndexes.Keys)
                    {
                        if (index > tabIndex && biggerMin > index)
                        {
                            biggerMin = index;
                        }
                        if (tabIndexesMin > index)
                        {
                            tabIndexesMin = index;
                        }
                    }
                    tabIndex = biggerMin != int.MaxValue ? biggerMin : tabIndexesMin;
                    return(tabIndexes[tabIndex][0]);
                }
            }
        }
예제 #3
0
        public static IDictionary <int, List <ITabStopElement> > GetTabIndexesOnParentPage(this ITabStopElement element, out int countChildrensWithTabStopWithoutThis, bool checkContainsElement = true)
        {
            countChildrensWithTabStopWithoutThis = 0;

            Element parentPage = (element as NavigableElement).Parent;

            while (parentPage != null && !(parentPage is Page))
            {
                parentPage = parentPage.Parent;
            }

            var descendantsOnPage = parentPage?.VisibleDescendants();

            if (parentPage is Shell shell)
            {
                descendantsOnPage = shell.Items;
            }

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

            var childrensWithTabStop = new List <ITabStopElement>();

            foreach (var descendant in descendantsOnPage)
            {
                if (descendant is ITabStopElement visualElement && visualElement.IsTabStop)
                {
                    childrensWithTabStop.Add(visualElement);
                }
            }
            if (checkContainsElement && !childrensWithTabStop.Contains(element))
            {
                return(null);
            }

            countChildrensWithTabStopWithoutThis = childrensWithTabStop.Count - 1;
            return(childrensWithTabStop.GroupToDictionary(c => c.TabIndex));
        }