/// <summary>
        ///     Each node in the tree can have an associated tracking object used to indentify it.
        ///     The branch can override this method to return the row index corresponding to the given
        ///     object.
        /// </summary>
        /// <param name="locateData">
        ///     If the object is a direct child of this branch, set locateData.Options = TrackingObjectAction.ThisLevel.
        ///     If the object is deeper in the tree, the branch should set it to TrackingObjectAction.NextLevel,
        ///     locateData.Row should be set to the row where the search should continue.
        /// </param>
        /// <param name="tracked">Object to track</param>
        protected virtual LocateObjectData LocateTrackingObject(object tracked, LocateObjectData locateData)
        {
            // base implementation handles searching in this branch, but searching 
            // deeper in the tree requires knowledge not available 
            // in the base class.
            locateData.Row = -1;

            locateData.Row = GetIndexForElement(tracked);

            locateData.Options = locateData.Row >= 0 ? (int)TrackingObjectAction.ThisLevel : (int)TrackingObjectAction.NotTracked;

            return locateData;
        }
        /// <summary>
        ///     IBranch interface implementation.
        /// </summary>
        public LocateObjectData /* IBranch */ LocateObject(object obj, ObjectStyle style, int locateOptions)
        {
            var locateData = new LocateObjectData(-1, 0, 0);
            switch (style)
            {
                case ObjectStyle.ExpandedBranch:
                case ObjectStyle.SubItemExpansion:
                    locateData.Options = (int)BranchLocationAction.DiscardBranch;
                    break;

                case ObjectStyle.TrackingObject:
                    locateData = LocateTrackingObject(obj, locateData);
                    break;
            }
            return locateData;
        }
        LocateObjectData IBranch.LocateObject(object obj, ObjectStyle style, int locateOptions)
        {
            var locateData = new LocateObjectData();
            locateData.Row = -1;
            foreach (IBranch branch in _branchList)
            {
                locateData = branch.LocateObject(obj, style, locateOptions);
                if (locateData.Row != -1)
                {
                    return locateData;
                }
            }

            return locateData;
        }