/// <summary> /// Inserts the specified string into the html over the current selection /// </summary> /// <param name="html"></param> public void InsertHtml(string html) { Selection.SynchronizeSelection(); if (Selection.Type == HtmlSelectionType.ElementSelection) { //If it's a control range, we can only insert if we are in a div or td Interop.IHtmlControlRange controlRange = (Interop.IHtmlControlRange)Selection.MSHTMLSelection; int selectedItemCount = controlRange.GetLength(); if (selectedItemCount == 1) { Interop.IHTMLElement element = controlRange.Item(0); if ((String.Compare(element.GetTagName(), "div", true) == 0) || (String.Compare(element.GetTagName(), "td", true) == 0)) { element.InsertAdjacentHTML("beforeEnd", html); } } } else { Interop.IHTMLTxtRange textRange = (Interop.IHTMLTxtRange)Selection.MSHTMLSelection; textRange.PasteHTML(html); } }
/// <summary> /// Synchronizes the selection state held in this object with the selection state in MSHTML /// </summary> /// <returns>true if the selection has changed</returns> public bool SynchronizeSelection() { //Get the selection object from the MSHTML document if (_document == null) { _document = _editor.MSHTMLDocument; } Interop.IHTMLSelectionObject selectionObj = _document.GetSelection(); //Get the current selection from that selection object object currentSelection = null; try { currentSelection = selectionObj.CreateRange(); } catch { } ArrayList oldItems = _items; HtmlSelectionType oldType = _type; int oldLength = _selectionLength; //Default to an empty selection _type = HtmlSelectionType.Empty; _selectionLength = 0; if (currentSelection != null) { _mshtmlSelection = currentSelection; _items = new ArrayList(); //If it's a text selection if (currentSelection is Interop.IHTMLTxtRange) { Interop.IHTMLTxtRange textRange = (Interop.IHTMLTxtRange)currentSelection; //IntPtr ptr = Marshal.GetIUnknownForObject(textRange); Interop.IHTMLElement parentElement = textRange.ParentElement(); // If the document is in full document mode or we're selecting a non-body tag, allow it to select // otherwise, leave the selection as empty (since we don't want the body tag to be selectable on an ASP.NET // User Control if (IsSelectableElement(Element.GetWrapperFor(parentElement, _editor))) { //Add the parent of the text selection if (parentElement != null) { _text = textRange.GetText(); if (_text != null) { _selectionLength = _text.Length; } else { _selectionLength = 0; } _type = HtmlSelectionType.TextSelection; _items.Add(parentElement); } } } //If it's a control selection else if (currentSelection is Interop.IHtmlControlRange) { Interop.IHtmlControlRange controlRange = (Interop.IHtmlControlRange)currentSelection; int selectedCount = controlRange.GetLength(); //Add all elements selected if (selectedCount > 0) { _type = HtmlSelectionType.ElementSelection; for (int i = 0; i < selectedCount; i++) { Interop.IHTMLElement currentElement = controlRange.Item(i); _items.Add(currentElement); } _selectionLength = selectedCount; } } } _sameParentValid = false; bool selectionChanged = false; //Now check if there was a change of selection //If the two selections have different lengths, then the selection has changed if (_type != oldType) { selectionChanged = true; } else if (_selectionLength != oldLength) { selectionChanged = true; } else { if (_items != null) { //If the two selections have a different element, then the selection has changed for (int i = 0; i < _items.Count; i++) { if (_items[i] != oldItems[i]) { selectionChanged = true; break; } } } } if (selectionChanged) { //Set _elements to null so no one can retrieve a dirty copy of the selection element wrappers _elements = null; OnSelectionChanged(); return(true); } return(false); }