/// <summary> /// 对字符元素进行合并操作 /// </summary> /// <param name="sourceList">元素列表</param> /// <returns>合并后的元素列表</returns> public static DomElementList MergeElements( DomElementList sourceList, bool includeSelectionOnly) { DomElementList result = new DomElementList(); if (sourceList.Count == 0) { return(result); } DomStringElement myString = null; //XTextParagraphList plist = null; DomDocumentContentElement ce = sourceList[0].DocumentContentElement; foreach (DomElement element in sourceList) { if (includeSelectionOnly) { if (element.HasSelection == false) { continue; } } if (element is DomCharElement) { DomCharElement c = (DomCharElement)element; if (myString != null && myString.CanMerge(c)) { myString.Merge(c); } else { myString = new DomStringElement(); myString.OwnerDocument = c.OwnerDocument; result.Add(myString); myString.Merge(c); } continue; } myString = null; result.Add(element); } return(result); }
private void Execute(XUndoEventArgs args, bool undo) { myDocument.UndoList.RefreshElements.Clear(); myDocument.UndoList._ContentRefreshInfos.Clear(); myDocument.UndoList.ContentChangedContainer.Clear(); myDocument.UndoList.NeedRefreshDocument = false; if (undo) { base.Undo(args); } else { base.Redo(args); } if (myDocument.UndoList.NeedRefreshDocument) { // 需要刷新整个文档。 if (this.Document.EditorControl != null) { this.Document.EditorControl.RefreshDocument(); return; } } // 指定了要刷新的元素 DomElementList RedrawElements = new DomElementList(); Dictionary <DomContentElement, int> startIndexs = new Dictionary <DomContentElement, int>(); if (this.Document.UndoList._ContentRefreshInfos.Count > 0) { // 直接获得要刷新排版的位置信息 DomDocumentContentElement dce2 = null; foreach (DomContentElement ce in this.Document.UndoList._ContentRefreshInfos.Keys) { dce2 = ce.DocumentContentElement; ce.UpdateContentElements(false); startIndexs[ce] = this.Document.UndoList._ContentRefreshInfos[ce]; } dce2.UpdateContentElements(false); }//if if (this.Document.UndoList.RefreshElements.Count > 0) { // 获得要刷新排版的位置信息 foreach (DomElement element in this.Document.UndoList.RefreshElements) { DomContentElement ce = element.ContentElement; if (startIndexs.ContainsKey(ce)) { int index = ce.PrivateContent.IndexOf(element); if (index >= 0 && index < startIndexs[ce]) { for (int iCount = startIndexs[ce]; iCount >= index; iCount--) { DomElement element2 = ce.PrivateContent[iCount]; if (element2.OwnerLine != null) { // 声明文本行无效 element2.OwnerLine.InvalidateState = true; } } startIndexs[ce] = index; } } else { ce.UpdateContentElements(true); int index = ce.PrivateContent.IndexOf(element.FirstContentElement); if (index >= 0) { startIndexs[ce] = index; } } }//foreach using (System.Drawing.Graphics g = this.Document.CreateGraphics()) { foreach (DomElement element in this.Document.UndoList.RefreshElements) { DomContentElement ce = element.ContentElement; int index2 = ce.PrivateContent.IndexOf(element.FirstContentElement); if (index2 >= 0) { //element.SizeInvalid = true; if (element.SizeInvalid || element.ViewInvalid) { RedrawElements.Add(element); } if (element.SizeInvalid) { this.Document.Render.RefreshSize(element, g); } //if (StartIndex == int.MinValue || StartIndex > index2) //{ // StartIndex = index2; //} //if (EndIndex == -1 || EndIndex < index2) //{ // EndIndex = index2; //} } //if } //foreach } //using } //if DomDocumentContentElement dce = this.Document.Body; foreach (DomContentElement ce in startIndexs.Keys) { dce = ce.DocumentContentElement; //ce.UpdateContentElements(); int index = startIndexs[ce]; if (index > 0) { //index--; } ce.RefreshPrivateContent(index, -1, true); }//foreach if (this.Document.PageRefreshed == false) { this.Document.RefreshPages(); if (this.Document.EditorControl != null) { this.Document.EditorControl.UpdatePages(); this.Document.EditorControl.Invalidate(); } } dce.Content.AutoClearSelection = true; dce.Content.LineEndFlag = false; if (undo) { dce.SetSelection(intOldSelectionStart, 0); } else { dce.SetSelection(intNewSelectionStart, 0); } //myDocument.Content.MoveSelectStart( intOldSelectionStart ); foreach (DomElement element in RedrawElements) { element.ViewInvalid = true; element.InvalidateView(); } if (this.Document.UndoList.ContentChangedContainer.Count > 0) { // 触发文档内容修改事件 foreach (DomContainerElement container in this.Document.UndoList.ContentChangedContainer) { // 触发文档事件 ContentChangedEventArgs args2 = new ContentChangedEventArgs(); args2.UndoRedoCause = true; args2.Document = this.Document; args2.Element = container; container.RaiseBubbleOnContentChanged(args2); } this.Document.HighlightManager.UpdateHighlightInfos(); this.Document.OnDocumentContentChanged(); } if (this.Document.EditorControl != null) { this.Document.EditorControl.UpdateTextCaret(); this.Document.EditorControl.Update(); } }