/// <summary>
        /// Creates an appropriate Word UI element.
        /// </summary>
        /// <param name="windowHandle">The window handle.</param>
        /// <param name="rangeInfo">The info on the element.</param>
        /// <returns>The Word UI element.</returns>
        internal UITechnologyElement GetWordRange(IntPtr windowHandle, WordRangeInfo rangeInfo)
        {
            WordSelectionInfo wsi = rangeInfo as WordSelectionInfo;

            if (wsi != null)
            {
                return(new WordSelectionRange(windowHandle, wsi, this));
            }

            WordDocumentInfo wdi = rangeInfo as WordDocumentInfo;

            return(wdi != null ? new WordDocumentRange(windowHandle, wdi, this) : new WordRange(windowHandle, this));
        }
        /// <summary>
        /// Gets the element from the given native (underlying) technology element.
        /// </summary>
        /// <param name="nativeElement">The native technology element (like IAccessible).</param>
        /// <returns>The IUITechnologyElement from the native element.</returns>
        /// <seealso cref="UITechnologyElement.NativeElement"/>
        public override IUITechnologyElement GetElementFromNativeElement(object nativeElement)
        {
            object[] parts = nativeElement as object[];
            if (parts != null && parts.Length == 2 && parts[0] is IntPtr && parts[1] is WordRangeInfo)
            {
                // Get the selection or document as appropriate.
                IntPtr        windowHandle = (IntPtr)parts[0];
                WordRangeInfo elementInfo  = (WordRangeInfo)parts[1];
                return(this.GetWordRange(windowHandle, elementInfo));
            }

            if (nativeElement is IntPtr)
            {
                // For window handle, get the Word worksheet.
                return(this.GetElementFromWindowHandle((IntPtr)nativeElement));
            }

            return(null);
        }