/// <summary>
        /// Handler for child position changed events.
        /// </summary>
        private void ChildPositionChangedHdl(UIObject sender, RCIntVector prevPos, RCIntVector currPos)
        {
            UISensitiveObject sensitiveSender = sender as UISensitiveObject;

            if (sensitiveSender != null)
            {
                /// Invalidate the cached values of the sender.
                sensitiveSender.InvalidateSensitivePosition();
                sensitiveSender.InvalidateSensitiveClipRect();
                sensitiveSender.InvalidateSensitiveCloakRect();
                sensitiveSender.InvalidateSensitiveRangeRect();
            }
        }
        /// <summary>
        /// Detaches the given sensitive child of this UISensitiveObject.
        /// </summary>
        /// <param name="whichChild">The UISensitiveObject you want to detach.</param>
        public void DetachSensitive(UISensitiveObject whichChild)
        {
            if (UIRoot.Instance.GraphicsPlatform.RenderLoop.IsRendering)
            {
                throw new InvalidOperationException("Rendering is in progress!");
            }
            if (whichChild.Parent != this)
            {
                throw new UIException("The object is already detached by UIObject.Detach!");
            }
            if (whichChild == null)
            {
                throw new ArgumentNullException("whichChild");
            }

            if (!this.sensitiveChildrenSet.Contains(whichChild))
            {
                return;
            }

            /// Raise the UISensitiveObject.ObjectDetaching event of the sensitive-root.
            if (this.SensitiveRoot.ObjectDetaching != null)
            {
                this.SensitiveRoot.ObjectDetaching(whichChild);
            }

            /// Detach
            //this.Detach(whichChild);
            this.sensitiveChildrenSet.Remove(whichChild);
            this.sensitiveChildren.Remove(whichChild);
            whichChild.sensitiveParent = null;

            /// Unbscribe from the PositionChanged, ClipRectChanged, CloakRectChanged and RangeRectChanged
            /// events of whichChild
            whichChild.PositionChanged  -= this.ChildPositionChangedHdl;
            whichChild.ClipRectChanged  -= this.ChildClipRectChangedHdl;
            whichChild.CloakRectChanged -= this.ChildCloakRectChangedHdl;
            whichChild.RangeRectChanged -= this.ChildRangeRectChangedHdl;

            /// Unsubscribe from the Z-order events of whichChild
            whichChild.BroughtForward -= this.BroughtForwardHdl;
            whichChild.BroughtToTop   -= this.BroughtToTopHdl;
            whichChild.SentBackward   -= this.SentBackwardHdl;
            whichChild.SentToBottom   -= this.SentToBottomHdl;

            /// Invalidate the cached values in the detached UISensitiveObject
            whichChild.InvalidateSensitivePosition();
            whichChild.InvalidateSensitiveClipRect();
            whichChild.InvalidateSensitiveCloakRect();
            whichChild.InvalidateSensitiveRangeRect();
        }
        /// <summary>
        /// Attaches the given UISensitiveObject to this UISensitiveObject as a sensitive child.
        /// </summary>
        /// <param name="otherObj">The UISensitiveObject you want to attach as a sensitive child.</param>
        public void AttachSensitive(UISensitiveObject otherObj)
        {
            if (UIRoot.Instance.GraphicsPlatform.RenderLoop.IsRendering)
            {
                throw new InvalidOperationException("Rendering is in progress!");
            }
            if (otherObj == null)
            {
                throw new ArgumentNullException("otherObj");
            }
            if (otherObj == this)
            {
                throw new UIException("Unable to attach a UISensitiveObject to itself as a sensitive child!");
            }
            if (otherObj.Parent != this)
            {
                throw new UIException("The object must be attached first by UIObject.Attach!");
            }
            if (otherObj.sensitiveParent != null)
            {
                throw new UIException("The given UISensitiveObject must be detached from it's sensitive parent first!");
            }

            /// Attach
            //this.Attach(otherObj);
            this.sensitiveChildrenSet.Add(otherObj);
            this.sensitiveChildren.Insert(0, otherObj);
            otherObj.sensitiveParent = this;

            /// Check the tree property
            if (this.CheckTreeProperty())
            {
                /// Subscribe for the Z-order events of otherObj
                otherObj.BroughtForward += this.BroughtForwardHdl;
                otherObj.BroughtToTop   += this.BroughtToTopHdl;
                otherObj.SentBackward   += this.SentBackwardHdl;
                otherObj.SentToBottom   += this.SentToBottomHdl;

                /// Subscribe for the PositionChanged, ClipRectChanged, CloakRectChanged and RangeRectChanged
                /// events of otherObj
                otherObj.PositionChanged  += this.ChildPositionChangedHdl;
                otherObj.ClipRectChanged  += this.ChildClipRectChangedHdl;
                otherObj.CloakRectChanged += this.ChildCloakRectChangedHdl;
                otherObj.RangeRectChanged += this.ChildRangeRectChangedHdl;

                /// Invalidate the cached values in the attached UISensitiveObject
                otherObj.InvalidateSensitivePosition();
                otherObj.InvalidateSensitiveClipRect();
                otherObj.InvalidateSensitiveCloakRect();
                otherObj.InvalidateSensitiveRangeRect();

                /// Raise the UISensitiveObject.ObjectAttached event of the sensitive-root.
                if (this.SensitiveRoot.ObjectAttached != null)
                {
                    this.SensitiveRoot.ObjectAttached(otherObj);
                }
            }
            else
            {
                /// Tree property violation --> rollback and throw an exception.
                this.sensitiveChildren.RemoveAt(0);
                this.sensitiveChildrenSet.Remove(otherObj);
                otherObj.sensitiveParent = null;
                throw new UIException("Violating tree property!");
            }
        }