static public Menu ReadMenu(UINodeInfoInTree menuNode)
        {
            if (!(menuNode?.VisibleIncludingInheritance ?? false))
            {
                return(null);
            }

            var setEntryNode =
                menuNode.MatchingNodesFromSubtreeBreadthFirst(
                    kandidaat => kandidaat?.PyObjTypNameMatchesRegexPatternIgnoreCase(MenuEntryPyTypeName) ?? false,
                    null, 3, 1);

            var baseElement = menuNode.AsUIElementIfVisible();

            var setEntry =
                setEntryNode
                ?.Select(kandidaatAst => ReadMenuEntry(kandidaatAst, baseElement?.Region ?? RectInt.Empty)).ToArray();

            var listEntry = setEntry?.OrdnungLabel()?.ToArray();

            return(new Menu(baseElement)
            {
                Entry = listEntry,
            });
        }
        public void Berecne()
        {
            var uiElementBase = EWarElementAst?.AsUIElementIfVisible();

            if (uiElementBase == null)
            {
                return;
            }

            EWarButtonAst = EWarElementAst;

            IconAst =
                EWarElementAst?.FirstMatchingNodeFromSubtreeBreadthFirst(kandidaat =>
                                                                         (string.Equals("Icon", kandidaat.PyObjTypName, StringComparison.InvariantCultureIgnoreCase) ||
                                                                          string.Equals("EveIcon", kandidaat.PyObjTypName, StringComparison.InvariantCultureIgnoreCase)),
                                                                         3, 1);

            if (!(IconAst?.VisibleIncludingInheritance ?? false))
            {
                return;                 //	Annaame diise EWar Anzaige isc nit aktiiv.
            }
            var EWarTypeString = EWarElementAst?.Name;

            this.Ergeebnis = new ShipUiEWarElement(uiElementBase)
            {
                EWarType    = EWarTypeString,
                IconTexture = IconAst?.TextureIdent0?.AsObjectIdInMemory(),
            };
        }
        public void Berecne()
        {
            if (null == AstMessage)
            {
                return;
            }

            if (!(true == AstMessage.VisibleIncludingInheritance))
            {
                return;
            }

            AstLabel =
                Optimat.EveOnline.AuswertGbs.Extension.FirstMatchingNodeFromSubtreeBreadthFirst(
                    AstMessage, (Kandidaat) => string.Equals("Label", Kandidaat.PyObjTypName, StringComparison.InvariantCultureIgnoreCase),
                    2, 1);

            if (null != AstLabel)
            {
                AstLabelSetText = AstLabel.SetText;
            }

            this.Ergeebnis = new UIElementText(AstMessage.AsUIElementIfVisible())
            {
                Text = AstLabelText
            };
        }
        public void Berecne()
        {
            ListAst =
                Optimat.EveOnline.AuswertGbs.Extension.FirstMatchingNodeFromSubtreeBreadthFirst(
                    InventoryAst, (Kandidaat) => "Scroll".EqualsIgnoreCase(Kandidaat.PyObjTypName),
                    1, 1);

            var MengeInvItemAst =
                Optimat.EveOnline.AuswertGbs.Extension.MatchingNodesFromSubtreeBreadthFirst(
                    InventoryAst,
                    (Kandidaat) => true == Kandidaat.VisibleIncludingInheritance && "InvItem".EqualsIgnoreCase(Kandidaat.PyObjTypName), null, null, null);

            if (null != MengeInvItemAst)
            {
                foreach (var InvItemAst in MengeInvItemAst)
                {
                    if (null == InvItemAst)
                    {
                        continue;
                    }

                    var InvItemAstGrööse = InvItemAst.Grööse;

                    if (!InvItemAstGrööse.HasValue)
                    {
                        continue;
                    }

                    if (44 < InvItemAstGrööse.Value.B)
                    {
                        SictwaiseScaintGeseztAufListNict = true;
                        break;
                    }
                }
            }

            if (null == ListAst)
            {
                return;
            }

            ListAuswert = new SictAuswertGbsListViewport <IListEntry>(ListAst, SictAuswertGbsListViewport <IListEntry> .ListEntryKonstruktSctandard);
            ListAuswert.Read();

            var ListAuswertErgeebnis = ListAuswert.Result;

            if (null == ListAuswertErgeebnis)
            {
                return;
            }

            var Ergeebnis = new Inventory(InventoryAst.AsUIElementIfVisible())
            {
                ListView = ListAuswertErgeebnis,
            };

            this.Ergeebnis = Ergeebnis;
        }
Beispiel #5
0
 static public Sprite AlsSprite(
     this UINodeInfoInTree GbsAst) =>
 !(GbsAst?.VisibleIncludingInheritance ?? false) ? null :
 new Sprite(GbsAst.AsUIElementIfVisible())
 {
     Name        = GbsAst?.Name,
     Color       = GbsAst?.Color.AsColorORGBIfAnyHasValue(),
     Texture0Id  = GbsAst?.TextureIdent0?.AsObjectIdInMemory(),
     HintText    = GbsAst?.Hint,
     TexturePath = GbsAst?.texturePath,
 };
Beispiel #6
0
        static public WindowAgentPane PaneAuswert(UINodeInfoInTree paneAst)
        {
            if (!(paneAst?.VisibleIncludingInheritance ?? false))
            {
                return(null);
            }

            var EditAst = paneAst?.FirstMatchingNodeFromSubtreeBreadthFirst(k => k?.PyObjTypNameEqualsIgnoreCase("Edit") ?? false);

            return
                (new WindowAgentPane(paneAst?.AsUIElementIfVisible())
            {
                Html = EditAst?.SrHtmlstr,
            });
        }
Beispiel #7
0
        static ShipUiTargetAssignedGroup AusAstBerecneAssignedModuleOderDroneGrupe(
            UINodeInfoInTree ast)
        {
            if (null == ast)
            {
                return(null);
            }

            bool?IstDrone = null;

            var SpriteAst =
                Optimat.EveOnline.AuswertGbs.Extension.FirstMatchingNodeFromSubtreeBreadthFirst(
                    ast,
                    (kandidaat) => string.Equals("Sprite", kandidaat.PyObjTypName, StringComparison.InvariantCultureIgnoreCase),
                    2,
                    1);

            var IconAst =
                Optimat.EveOnline.AuswertGbs.Extension.FirstMatchingNodeFromSubtreeBreadthFirst(
                    ast,
                    AuswertGbs.Glob.GbsAstTypeIstEveIcon,
                    2,
                    1);

            if (null != SpriteAst)
            {
                var SpriteAstHint = SpriteAst.Hint;

                if (null != SpriteAstHint)
                {
                    IstDrone = Regex.Match(SpriteAstHint, "Drone", RegexOptions.IgnoreCase).Success;
                }
            }

            var IconTextureIdent = IconAst?.TextureIdent0;

            var ModuleOderDroneGrupe = new ShipUiTargetAssignedGroup(ast.AsUIElementIfVisible())
            {
                IconTexture = IconTextureIdent?.AsObjectIdInMemory(),
            };

            return(ModuleOderDroneGrupe);
        }
Beispiel #8
0
        static public Window Window(
            this UINodeInfoInTree uiNode,
            bool?isModal,
            string caption,
            bool?headerButtonsVisible = null,
            Sprite[] headerButton     = null)
        {
            string GbsAstType = null;

            if (null != uiNode)
            {
                GbsAstType = uiNode.PyObjTypName;
            }

            return(new Window(uiNode.AsUIElementIfVisible())
            {
                isModal = isModal,
                Caption = caption,
                HeaderButtonsVisible = headerButtonsVisible,
                HeaderButton = headerButton,
            });
        }
Beispiel #9
0
        public void Berecne()
        {
            if (null == AstMission)
            {
                return;
            }

            AstLabel =
                Optimat.EveOnline.AuswertGbs.Extension.FirstMatchingNodeFromSubtreeBreadthFirst(
                    AstMission, (kandidaat) => string.Equals("EveLabelMedium", kandidaat.PyObjTypName, StringComparison.InvariantCultureIgnoreCase), 3, 1);

            if (null == AstLabel)
            {
                return;
            }

            var AstLabelBescriftung = AstLabel.LabelText();

            Ergeebnis = new UIElementText(AstMission.AsUIElementIfVisible(), AstLabelBescriftung);

            this.Ergeebnis = Ergeebnis;
        }
		public void Read()
		{
			if (!(ListViewNode?.VisibleIncludingInheritance ?? false))
				return;

			var scrollReader = new ScrollReader(ListViewNode);
			scrollReader.Read();

			var scroll = scrollReader.Result;

			if (null == scroll)
				return;

			ListeHeader = scroll.ColumnHeader;

			var ListeHeaderInfo =
				ListeHeader
				?.Select((header, index) => new ColumnHeader(header) { ColumnIndex = index })
				?.ToArray();

			ScrollClipperContentNode = scrollReader.ClipperContentNode;

			var clipperRegion = ScrollClipperContentNode?.AsUIElementIfVisible()?.Region;

			var listEntry =
				ScrollClipperContentNode?.ListChild
				?.Select(kandidaatEntryAst => CallbackListEntryConstruct(kandidaatEntryAst, ListeHeaderInfo, clipperRegion))
				?.WhereNotDefault()
				?.OrderBy(entry => entry.Region.Center().B)
				?.ToArray();

			Result = new ListViewAndControl<EntryT>(ListViewNode.AsUIElementIfVisible())
			{
				ColumnHeader = ListeHeader,
				Entry = listEntry,
				Scroll = scroll,
			};
		}
        virtual public void Berecne()
        {
            if (null == TabAst)
            {
                return;
            }

            if (!(true == TabAst.VisibleIncludingInheritance))
            {
                return;
            }

            LabelAst = TabAst.LargestLabelInSubtree(3);

            if (null == LabelAst)
            {
                return;
            }

            LabelColor = ColorORGB.VonVal(LabelAst.Color);
            LabelText  = LabelAst.LabelText();

            if (null == LabelText || null == LabelColor)
            {
                return;
            }

            var LabelColorOpazitäätMili = LabelColor.OMilli;

            var Label = new UIElementText(LabelAst.AsUIElementIfVisible(), LabelText);

            Ergeebnis = new Tab(TabAst.AsUIElementIfVisible())
            {
                Label = Label,
                LabelColorOpacityMilli = LabelColorOpazitäätMili,
            };
        }
Beispiel #12
0
        static public Container AlsContainer(
            this UINodeInfoInTree containerNode,
            bool treatIconAsSprite   = false,
            RectInt?regionConstraint = null)
        {
            if (!(containerNode?.VisibleIncludingInheritance ?? false))
            {
                return(null);
            }

            var MengeKandidaatInputTextAst =
                containerNode?.MatchingNodesFromSubtreeBreadthFirst(k =>
                                                                    k.PyObjTypNameMatchesRegexPatternIgnoreCase("SinglelineEdit|QuickFilterEdit"));

            var ListeInputText =
                MengeKandidaatInputTextAst
                ?.Select(textBoxAst =>
            {
                var LabelAst = textBoxAst.LargestLabelInSubtree();

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

                var LabelText = LabelAst?.LabelText();

                return(new UIElementInputText(textBoxAst.AsUIElementIfVisible(), LabelText));
            })
                ?.WhereNotDefault()
                ?.OrdnungLabel()
                ?.ToArrayIfNotEmpty();

            var ListeButton =
                containerNode?.ExtraktMengeButtonLabelString()?.OrdnungLabel()
                ?.ToArrayIfNotEmpty();

            var ListeButtonAst = ListeButton?.Select(button => containerNode.FirstNodeWithPyObjAddressFromSubtreeBreadthFirst(button.Id))?.ToArray();

            var ListeTextBoxAst = ListeInputText?.Select(textBox => containerNode.FirstNodeWithPyObjAddressFromSubtreeBreadthFirst(textBox.Id))?.ToArray();

            var LabelContainerAussclus = new[] { ListeButtonAst, ListeTextBoxAst }.ConcatNullable().ToArray();

            var ListeLabelText =
                containerNode?.ExtraktMengeLabelString()
                ?.WhereNitEnthalte(LabelContainerAussclus)
                ?.OrdnungLabel()
                ?.ToArrayIfNotEmpty();

            var setSprite =
                containerNode.SetSpriteFromChildren(treatIconAsSprite)
                ?.OrdnungLabel()
                ?.ToArrayIfNotEmpty();

            var baseElement = containerNode.AsUIElementIfVisible();

            if (regionConstraint.HasValue)
            {
                baseElement = baseElement.WithRegionConstrainedToIntersection(regionConstraint.Value);
            }

            return(new Container(baseElement)
            {
                ButtonText = ListeButton,
                InputText = ListeInputText,
                LabelText = ListeLabelText,
                Sprite = setSprite,
            });
        }
Beispiel #13
0
 static public IUIElementText AsUIElementText(this UINodeInfoInTree GbsAst) =>
 (GbsAst?.VisibleIncludingInheritance ?? false) ? new UIElementText(GbsAst.AsUIElementIfVisible(), GbsAst.LabelText() ?? GbsAst.Text) : null;
Beispiel #14
0
        public void Berecne()
        {
            if (!(slotNode?.VisibleIncludingInheritance ?? false))
            {
                return;
            }

            ModuleButtonAst =
                slotNode?.FirstMatchingNodeFromSubtreeBreadthFirst(kandidaat => string.Equals(ModuleButtonPyTypeName, kandidaat.PyObjTypName, StringComparison.InvariantCultureIgnoreCase), 1, 1);

            ModuleButtonIconAst =
                ModuleButtonAst?.FirstMatchingNodeFromSubtreeBreadthFirst((kandidaat) =>
                                                                          (string.Equals("Icon", kandidaat.PyObjTypName, StringComparison.InvariantCultureIgnoreCase) ||
                                                                           string.Equals("EveIcon", kandidaat.PyObjTypName, StringComparison.InvariantCultureIgnoreCase)),
                                                                          1, 1);

            ModuleButtonQuantityAst =
                ModuleButtonAst?.FirstMatchingNodeFromSubtreeBreadthFirst((kandidaat) => string.Equals("quantityParent", kandidaat.Name, StringComparison.InvariantCultureIgnoreCase), 1, 1);

            ModuleButtonQuantityLabelAst =
                ModuleButtonQuantityAst?.FirstMatchingNodeFromSubtreeBreadthFirst((kandidaat) => string.Equals("Label", kandidaat.PyObjTypName, StringComparison.InvariantCultureIgnoreCase), 1, 1);

            var MengeSpriteAst =
                slotNode?.MatchingNodesFromSubtreeBreadthFirst((kandidaat) =>
                                                               true == kandidaat.VisibleIncludingInheritance &&
                                                               string.Equals("Sprite", kandidaat.PyObjTypName, StringComparison.InvariantCultureIgnoreCase), null, 1, 1);

            SpriteHiliteAst =
                (null == MengeSpriteAst) ? null :
                MengeSpriteAst.FirstOrDefault((kandidaat) => string.Equals("hilite", kandidaat.Name, StringComparison.InvariantCultureIgnoreCase));

            SpriteGlowAst =
                (null == MengeSpriteAst) ? null :
                MengeSpriteAst.FirstOrDefault((kandidaat) => string.Equals("glow", kandidaat.Name, StringComparison.InvariantCultureIgnoreCase));

            SpriteBusyAst =
                (null == MengeSpriteAst) ? null :
                MengeSpriteAst.FirstOrDefault((kandidaat) => string.Equals("busy", kandidaat.Name, StringComparison.InvariantCultureIgnoreCase));

            MengeKandidaatRampAst =
                slotNode?.MatchingNodesFromSubtreeBreadthFirst((kandidaat) =>
                                                               true == kandidaat.VisibleIncludingInheritance &&
                                                               Regex.Match(kandidaat.PyObjTypName ?? "", "ramps", RegexOptions.IgnoreCase).Success, 1, 1);

            MengeKandidaatRampAuswert =
                MengeKandidaatRampAst?.Select((kandidaatRampAst) =>
            {
                var Auswert = new SictAuswertGbsShipModuleButtonRamps(kandidaatRampAst);
                Auswert.Berecne();
                return(Auswert);
            }).ToArray();

            var RampAuswert =
                MengeKandidaatRampAuswert
                ?.FirstOrDefault((kandidaat) => null != kandidaat.LeftRampAst || kandidaat.RampAktiiv);

            AstMainShape =
                slotNode?.FirstMatchingNodeFromSubtreeBreadthFirst((kandidaat) => string.Equals("mainshape", kandidaat.Name, StringComparison.InvariantCultureIgnoreCase), 1, 1);

            if (null == AstMainShape)
            {
                return;
            }

            bool?SpriteHiliteSictbar = null;

            bool?SpriteGlowSictbar = null;
            bool?SpriteBusySictbar = null;

            if (null != SpriteHiliteAst)
            {
                SpriteHiliteSictbar = true == SpriteHiliteAst.VisibleIncludingInheritance;
            }

            if (null != SpriteGlowAst)
            {
                SpriteGlowSictbar = true == SpriteGlowAst.VisibleIncludingInheritance;
            }

            if (null != SpriteBusyAst)
            {
                SpriteBusySictbar = true == SpriteBusyAst.VisibleIncludingInheritance;
            }

            var ModuleButtonSictbar = ModuleButtonAst?.VisibleIncludingInheritance;

            var ModuleButtonFlächeToggle =
                ModuleButtonAst.AsUIElementIfVisible().WithRegionSizePivotAtCenter(new Vektor2DInt(16, 16));

            var ModuleButtonIconTextureIdent = ModuleButtonIconAst?.TextureIdent0;

            var rampActive        = ModuleButtonAst?.RampActive ?? RampAuswert?.RampAktiiv ?? false;
            var rampRotationMilli = RampAuswert?.RotatioonMili;

            bool?overloadOn = null;

            var overloadButton =
                slotNode?.FirstMatchingNodeFromSubtreeBreadthFirst(node => node.PyObjTypNameIsSprite() && (node?.Name?.RegexMatchSuccessIgnoreCase("OverloadB(tn|utton)") ?? false));

            if (null != overloadButton)
            {
                if (overloadButton?.Hint?.RegexMatchSuccessIgnoreCase(overloadOffHintRegexPattern) ?? false)
                {
                    overloadOn = false;
                }

                if (overloadButton?.Hint?.RegexMatchSuccessIgnoreCase(overloadOnHintRegexPattern) ?? false)
                {
                    overloadOn = true;
                }
            }

            var ModuleRepr = new ShipUiModule(slotNode.AsUIElementIfVisible())
            {
                ModuleButtonVisible     = ModuleButtonSictbar,
                ModuleButtonIconTexture = ModuleButtonIconTextureIdent?.AsObjectIdInMemory(),
                ModuleButtonQuantity    = ModuleButtonQuantityLabelAst?.SetText,
                RampActive        = rampActive,
                RampRotationMilli = rampRotationMilli,
                HiliteVisible     = SpriteHiliteSictbar,
                GlowVisible       = SpriteGlowSictbar,
                BusyVisible       = SpriteBusySictbar,
                OverloadOn        = overloadOn,
            };

            this.ModuleRepr = ModuleRepr;
        }
Beispiel #15
0
        public void Berecne()
        {
            if (null == NeocomAst)
            {
                return;
            }

            if (!(true == NeocomAst.VisibleIncludingInheritance))
            {
                return;
            }

            NeocomMainContAst =
                Optimat.EveOnline.AuswertGbs.Extension.FirstMatchingNodeFromSubtreeBreadthFirst(
                    NeocomAst, (Kandidaat) =>
                    string.Equals("mainCont", Kandidaat.Name, StringComparison.InvariantCultureIgnoreCase),
                    2, 1);

            NeocomMainContButtonContAst =
                Optimat.EveOnline.AuswertGbs.Extension.FirstMatchingNodeFromSubtreeBreadthFirst(
                    NeocomMainContAst, (Kandidaat) =>
                    string.Equals("buttonCont", Kandidaat.Name, StringComparison.InvariantCultureIgnoreCase),
                    2, 1);

            var EveMenuButton =
                NeocomMainContAst?.FirstMatchingNodeFromSubtreeBreadthFirst(k => k.PyObjTypNameMatchesRegex(EveMenuButtonPyTypeRegex))
                ?.AsUIElementIfVisible();

            var CharButton =
                //	2015.08.23 ShipFitting+FittingManagement+Lobby.AgentEntry:	Name = "charSheetBtn"
                NeocomMainContAst?.FirstMatchingNodeFromSubtreeBreadthFirst(k => k.PyObjTypNameIsButton() && k.NameMatchesRegexPatternIgnoreCase("charSheet"))
                ?.AsUIElementIfVisible();

            var NeocomListButtonAst =
                NeocomMainContButtonContAst
                .MatchingNodesFromSubtreeBreadthFirst(k => k.PyObjTypNameIsButton())
                ?.ToArray();

            var NeocomListButton =
                NeocomListButtonAst
                ?.Where(ButtonAst => ButtonAst?.VisibleIncludingInheritance ?? false)
                ?.Select(ButtonAst => new UIElementText(ButtonAst.AsUIElementIfVisible(), ButtonAst?.Name))
                ?.OrdnungLabel()
                ?.ToArray();

            var Button =
                NeocomListButtonAst
                ?.Select(ButtonAst => ButtonAst?.FirstMatchingNodeFromSubtreeBreadthFirst(k => k.PyObjTypNameIsSprite()))
                ?.WhereNotDefault()
                ?.Select(Extension.AlsSprite)
                ?.OrdnungLabel()
                ?.ToArray();

            NeocomClockLabelAst =
                Optimat.EveOnline.AuswertGbs.Extension.FirstMatchingNodeFromSubtreeBreadthFirst(
                    NeocomMainContAst, (Kandidaat) =>
                    string.Equals("clockLabel", Kandidaat.Name, StringComparison.InvariantCultureIgnoreCase),
                    5, 1);

            if (null != NeocomClockLabelAst)
            {
                NeocomClockBescriftung = new UIElementText(
                    NeocomClockLabelAst.AsUIElementIfVisible(), NeocomClockLabelAst.LabelText()?.RemoveXmlTag());
            }

            NeocomCharContAst =
                Optimat.EveOnline.AuswertGbs.Extension.FirstMatchingNodeFromSubtreeBreadthFirst(
                    NeocomMainContAst, (Kandidaat) =>
                    string.Equals("charCont", Kandidaat.Name, StringComparison.InvariantCultureIgnoreCase),
                    3, 1);

            Ergeebnis = new Neocom(NeocomAst.AsUIElementIfVisible())
            {
                EveMenuButton = EveMenuButton,
                CharButton    = CharButton,
                Button        = Button,
                Clock         = NeocomClockBescriftung,
            };
        }
Beispiel #16
0
        virtual public void Read()
        {
            if (!(ScrollNode?.VisibleIncludingInheritance ?? false))
            {
                return;
            }

            var mainContainerNode =
                ScrollNode?.FirstMatchingNodeFromSubtreeBreadthFirst(
                    candidate => string.Equals(MainContainerUIElementName, candidate.Name, StringComparison.InvariantCultureIgnoreCase),
                    2, 0);

            var scrollHeadersContainerNode =
                ScrollNode?.FirstMatchingNodeFromSubtreeBreadthFirst(candidate =>
                                                                     candidate.PyObjTypNameIsContainer() &&
                                                                     (Regex.Match(candidate.Name ?? "", "scrollHeader", RegexOptions.IgnoreCase).Success) ||
                                                                     Regex.Match(candidate.PyObjTypName ?? "", "SortHeader", RegexOptions.IgnoreCase).Success ||
                                                                     candidate.PyObjTypNameMatchesRegexPatternIgnoreCase("ScrollColumnHeader"),
                                                                     3, 1);

            var setCandidateForColumnHeaderNode =
                scrollHeadersContainerNode?.MatchingNodesFromSubtreeBreadthFirst(candidate =>
                                                                                 Regex.Match(candidate.PyObjTypName ?? "", "ColumnHeader", RegexOptions.IgnoreCase).Success ||
                                                                                 candidate.PyObjTypNameIsContainer(),
                                                                                 null, 2, 1)
                ?.ToArray();

            var listColumnHeader =
                setCandidateForColumnHeaderNode
                ?.Select(SictAuswertGbsListColumnHeader.Read)
                ?.Where((columnHeader) => null != columnHeader)
                ?.Where((columnHeader) => !(columnHeader?.Text).IsNullOrEmpty())
                .TailmengeUnterste(ScrollNode)
                ?.OrderBy((columnHeader) => columnHeader.Region.Center().A)
                ?.GroupBy(header => header.Id)
                ?.Select(headerGroup => headerGroup.FirstOrDefault())
                ?.ToArray();

            var mainContainerScrollControlsNode =
                mainContainerNode?.FirstMatchingNodeFromSubtreeBreadthFirst(
                    candidate => string.Equals("ScrollControls", candidate.PyObjTypName, StringComparison.InvariantCultureIgnoreCase),
                    2, 1);

            var mainContainerScrollControlsScrollHandleNode =
                mainContainerScrollControlsNode?.FirstMatchingNodeFromSubtreeBreadthFirst(
                    candidate => string.Equals("ScrollHandle", candidate.PyObjTypName, StringComparison.InvariantCultureIgnoreCase),
                    3, 1);

            var mainContainerClipperNode =
                mainContainerNode?.FirstMatchingNodeFromSubtreeBreadthFirst(
                    candidate => string.Equals(ClipperUIElementName, candidate.Name, StringComparison.InvariantCultureIgnoreCase),
                    2, 1);

            ClipperContentNode =
                mainContainerClipperNode?.FirstMatchingNodeFromSubtreeBreadthFirst(
                    candidate => candidate.PyObjTypNameIsContainer() &&
                    string.Equals(ClipperContentUIElementName, candidate.Name, StringComparison.InvariantCultureIgnoreCase),
                    2, 1);

            Result = new Scroll(ScrollNode.AsUIElementIfVisible())
            {
                ColumnHeader      = listColumnHeader,
                Clipper           = mainContainerClipperNode.AsUIElementIfVisible(),
                ScrollHandleBound = mainContainerScrollControlsNode.AsUIElementIfVisible(),
                ScrollHandle      = mainContainerScrollControlsScrollHandleNode.AsUIElementIfVisible(),
            };
        }