コード例 #1
0
ファイル: HtmlControl.cs プロジェクト: mingyangzhu/writer
        /// <summary>Finds the specified string in the content of the control and selects it if it exists.</summary>
        /// <param name="searchString">The string to find</param>
        /// <param name="matchCase">Set to true to match casing of the string.</param>
        /// <param name="wholeWord">Set to true to only find whole words.</param>
        /// <returns></returns>
        public bool Find(string searchString, bool matchCase, bool wholeWord, bool searchUp)
        {
            NativeMethods.IHTMLSelectionObject selectionObj = this.site.Document.GetSelection();

            // Check if a selection actually exists.
            bool selectionExists = false;

            if (selectionObj != null)
            {
                selectionExists = selectionObj.GetSelectionType().Equals("Text");
            }
            NativeMethods.IHTMLTxtRange textRange = null;
            if (selectionExists)
            {
                object o = selectionObj.CreateRange();
                textRange = o as NativeMethods.IHTMLTxtRange;
            }
            if (textRange == null)
            {
                // If no selection exists, select the entire body.
                NativeMethods.IHtmlBodyElement bodyElement = this.site.Document.GetBody() as NativeMethods.IHtmlBodyElement;
                Debug.Assert(bodyElement != null, "Couldn't get body element in HtmlControl.Find");
                selectionExists = false;
                textRange       = bodyElement.createTextRange();
            }

            // Set up the bounds of the search.
            if (searchUp)
            {
                // If we're search up in the document.
                if (selectionExists)
                {
                    // If a selection exists, move the range's end to one character before the selection.
                    textRange.MoveEnd("character", -1);
                }

                // Move the range's beginning to the start of the document.
                int temp = 1;
                while (temp == 1)
                {
                    temp = textRange.MoveStart("textedit", -1);
                }
            }
            else
            {
                // If we're searching down in the document.
                if (selectionExists)
                {
                    // If a selection exists, start one char after the selection.
                    textRange.MoveStart("character", 1);
                }

                // Move the range's end to the end of the document.
                int temp = 1;
                while (temp == 1)
                {
                    temp = textRange.MoveEnd("textedit", 1);
                }
            }

            // Set up the flags for matching case and whole word search
            int flags     = (matchCase ? 0x4 : 0) | (wholeWord ? 0x2 : 0);
            int direction = searchUp ? -10000000 : 10000000;

            // Do the search.
            bool success = textRange.FindText(searchString, direction, flags);

            if (success)
            {
                // If we succeeded, select the text, scroll it into view, and we're done!
                textRange.Select();
                textRange.ScrollIntoView(true);
                return(true);
            }
            else if (selectionExists)
            {
                // If we only searched a portion of the document we need to wrap around the document...
                textRange = selectionObj.CreateRange() as NativeMethods.IHTMLTxtRange;

                // Set up the bounds of the search.
                if (searchUp)
                {
                    // If we're searching up in the document. Start one char after the selection.
                    textRange.MoveStart("character", 1);

                    // Move the range's end to the end of the document.
                    int temp = 1;
                    while (temp == 1)
                    {
                        temp = textRange.MoveEnd("textedit", 1);
                    }
                }
                else
                {
                    // If we're searching down in the document. Move the range's end to one character before the selection.
                    textRange.MoveEnd("character", -1);

                    // Move the range's beginning to the start of the document.
                    int temp = 1;
                    while (temp == 1)
                    {
                        temp = textRange.MoveStart("textedit", -1);
                    }
                }

                success = textRange.FindText(searchString, direction, flags);
                if (success)
                {
                    // If we succeeded, select the text, scroll it into view, and we're done!
                    textRange.Select();
                    textRange.ScrollIntoView(true);
                    return(true);
                }
            }
            return(false);
        }
コード例 #2
0
        public bool SelectElements(ICollection elements)
        {
            NativeMethods.IHTMLElement       body      = this.control.HtmlDocument.GetBody();
            NativeMethods.IHTMLTextContainer container = body as NativeMethods.IHTMLTextContainer;
            Debug.Assert(container != null);
            object controlRange = container.createControlRange();

            NativeMethods.IHtmlControlRange htmlControlRange = controlRange as NativeMethods.IHtmlControlRange;
            Debug.Assert(htmlControlRange != null);
            if (htmlControlRange == null)
            {
                return(false);
            }

            NativeMethods.IHtmlControlRange2 htmlControlRange2 = controlRange as NativeMethods.IHtmlControlRange2;
            Debug.Assert(htmlControlRange2 != null);
            if (htmlControlRange2 == null)
            {
                return(false);
            }

            int hr = 0;

            foreach (object o in elements)
            {
                NativeMethods.IHTMLElement element = this.GetHtmlElement(o);
                if (element == null)
                {
                    return(false);
                }
                hr = htmlControlRange2.addElement(element);
                if (hr != NativeMethods.S_OK)
                {
                    break;
                }
            }
            if (hr == NativeMethods.S_OK)
            {
                //If it succeeded, simply select the control range
                htmlControlRange.Select();
            }
            else
            {
                // elements like DIV and SPAN, w/o layout, cannot be added to a control selelction.
                NativeMethods.IHtmlBodyElement bodyElement = (NativeMethods.IHtmlBodyElement)body;
                NativeMethods.IHTMLTxtRange    textRange   = bodyElement.createTextRange();
                if (textRange != null)
                {
                    foreach (object o in elements)
                    {
                        try
                        {
                            NativeMethods.IHTMLElement element = this.GetHtmlElement(o);
                            if (element == null)
                            {
                                return(false);
                            }
                            textRange.MoveToElementText(element);
                        }
                        catch
                        {
                        }
                    }
                    textRange.Select();
                }
            }
            return(true);
        }