/// <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); }
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); }