Beispiel #1
0
 public void AddContentRefreshInfo(DomContentElement contentElement, int startIndex)
 {
     if (_ContentRefreshInfos.ContainsKey(contentElement))
     {
         _ContentRefreshInfos[contentElement] = Math.Min(_ContentRefreshInfos[contentElement], startIndex);
     }
     else
     {
         _ContentRefreshInfos[contentElement] = startIndex;
     }
 }
        private void AddRefreshElements(DomElement startElement, DomElement endElement)
        {
            DomContentElement ce  = myContainer.ContentElement;
            DomElementList    res = this.OwnerList.RefreshElements;

            if (res.Contains(startElement) == false)
            {
                res.Add(startElement);
            }
            DomContentLine startLine = null;

            while (startElement != null)
            {
                // 可能存在元素不显示在文档中,例如处于图形模式下的XTextShapeInputFieldElement中,
                // 内容就不显示,在此向上查询显示出来的内容。
                if (ce.PrivateContent.Contains(startElement))
                {
                    startLine = startElement.OwnerLine;
                    if (res.Contains(startElement) == false)
                    {
                        res.Add(startElement);
                    }
                    break;
                }
                startElement = startElement.Parent;
            }//while

            if (res.Contains(endElement) == false)
            {
                res.Add(endElement);
            }
            DomContentLine endLine = null;

            while (endElement != null)
            {
                if (ce.PrivateContent.Contains(endElement))
                {
                    endLine = endElement.OwnerLine;
                    if (res.Contains(endElement) == false)
                    {
                        res.Add(endElement);
                    }
                    break;
                }
                endElement = endElement.Parent;
            }//while

            ce.SetLinesInvalidateState(
                startLine,
                endLine);
        }
Beispiel #3
0
        ///// <summary>
        ///// 设置容器元素的可见性
        ///// </summary>
        ///// <param name="visible">新的可见性</param>
        ///// <returns>操作是否成功</returns>
        //public bool EditorSetVisible(bool visible)
        //{
        //    bool result = false;
        //    bool oldVisible = this.Visible;
        //    if( oldVisible != visible )
        //    {
        //        this.Visible = visible;
        //        bool visible2 = this.Visible;
        //        if (visible2 == visible)
        //        {
        //            // 成功的修改了元素的可见性
        //            if (visible)
        //            {
        //                this.OwnerDocument.HighlightManager.InvalidateHighlightInfo(this);
        //            }
        //            else
        //            {
        //                this.OwnerDocument.HighlightManager.Remove(this);
        //            }
        //            result = true;
        //            XTextElement fc = this.FirstContentElement;
        //            XTextElement lc = this.LastContentElement;
        //            XTextContentElement content = this.ContentElement;
        //            int startIndex = 0;
        //            if (oldVisible)
        //            {
        //                startIndex = content.PrivateContent.IndexOf(fc);
        //            }
        //            this.UpdateContentVersion();
        //            content.UpdateContentElements(true);
        //            if (oldVisible == false)
        //            {
        //                startIndex = content.PrivateContent.IndexOf(fc);
        //            }
        //            content.RefreshPrivateContent(startIndex, -1, false);
        //        }
        //    }
        //    return result;
        //}

        /// <summary>
        /// 声明容器元素内容无效,需要重新排版
        /// </summary>
        public void EditorInvalidateContent()
        {
            DomContentElement ce = this.ContentElement;

            DomElement currentElementBack = this.DocumentContentElement.CurrentElement;
            //XTextElementList contentElements = new XTextElementList();
            //this.AppendContent(contentElements , true );

            DomElement firstElement = ce.PrivateContent.GetPreElement(this.FirstContentElement);

            if (firstElement == null)
            {
                firstElement = this.FirstContentElement;
            }
            DomElement lastElement = ce.PrivateContent.GetNextElement(this.LastContentElement);

            if (lastElement == null)
            {
                lastElement = ce.PrivateContent.LastElement;
            }
            // 声明所经过的文本行无效
            int endIndex = ce.PrivateContent.IndexOf(lastElement);

            for (int iCount = ce.PrivateContent.IndexOf(firstElement); iCount <= endIndex; iCount++)
            {
                if (ce.PrivateContent[iCount].OwnerLine != null)
                {
                    ce.PrivateContent[iCount].OwnerLine.InvalidateState = true;
                }
            }
            this.UpdateContentVersion();
            ce.UpdateContentElements(true);
            ce.RefreshPrivateContent(
                ce.PrivateContent.IndexOf(firstElement),
                ce.PrivateContent.IndexOf(lastElement),
                false);
            // 确认新的插入点的位置
            DomDocumentContentElement dce = this.DocumentContentElement;

            dce.RefreshGlobalLines();
            if (currentElementBack != null)
            {
                dce.Content.AutoClearSelection = true;
                dce.Content.LineEndFlag        = false;

                int newSelectionPosition = currentElementBack.ViewIndex;
                dce.Content.MoveSelectStart(newSelectionPosition);
            }
        }
        /// <summary>
        /// 收集各层元素包含的文档行对象
        /// </summary>
        /// <param name="contentElement"></param>
        /// <param name="lines"></param>
        private void FillLines(DomContentElement contentElement, DomContentLineList lines)
        {
            foreach (DomContentLine line in contentElement.PrivateLines)
            {
                if (line.Count == 0)
                {
                    throw new InvalidOperationException("line count = 0 ");
                }

                else
                {
                    lines.Add(line);
                }
            }
        }
        private DomElement GetContentElement(DomElement element)
        {
            DomContentElement ce = myContainer.ContentElement;
            DomElement        e  = element;

            while (e != null)
            {
                // 可能存在元素不显示在文档中,例如处于图形模式下的XTextShapeInputFieldElement中,
                // 内容就不显示,在此向上查询显示出来的内容。
                if (ce.PrivateContent.Contains(e))
                {
                    return(e);
                }
                e = e.Parent;
            }//while
            return(element.FirstContentElement);
            //return null;
        }
Beispiel #6
0
        /// <summary>
        /// 根据内容创建一个新的文档对象,而且不包含已经被逻辑删除的内容.
        /// </summary>
        /// <returns>创建的文档对象</returns>
        public DomDocument CreateDocument()
        {
            DomDocument         document       = ( DomDocument )this.Document.Clone(false);
            DomDocument         sourceDocument = this.Document;
            DomContainerElement body           = document.Body;
            // 寻找所有内容共同的文档容器元素
            DomElementList parents1 = WriterUtils.GetParentList(this.ContentElements.FirstElement);
            DomElementList parents2 = WriterUtils.GetParentList(this.ContentElements.LastElement);

            foreach (DomContainerElement parent in parents1)
            {
                if (parents2.Contains(parent))
                {
                    DomContentElement ce = parent.ContentElement;
                    CloneElements(parent, ref body);
                    break;
                }
            }

            //CloneElements(this.DocumentContent, ref body );

            // 删除用户操作历史记录信息
            foreach (DocumentContentStyle style in document.ContentStyles.Styles)
            {
                style.CreatorIndex = -1;
                style.DeleterIndex = -1;
            }
            document.UserHistories.Clear();

            // 删除没有引用的样式
            document.DeleteUselessStyle();
            document.EditorControl      = null;
            document.DocumentControler  = null;
            document.HighlightManager   = null;
            document.EditorCurrentStyle = null;
            document.HoverElement       = null;
            if (document.UndoList != null)
            {
                document.EndLogUndo();
                document.UndoList.Clear();
            }
            document.FixDomState();
            return(document);
        }
Beispiel #7
0
        private void btnOK_Click(object sender, EventArgs e)
        {
            if (this.SourceEventArgs != null && this.SourceEventArgs.Element is DomImageElement)
            {
                DomDocument     document = this.SourceEventArgs.Document;
                DomImageElement element  = (DomImageElement)this.SourceEventArgs.Element;
                element.OwnerDocument = document;
                bool   logUndo  = this.SourceEventArgs.LogUndo && document.CanLogUndo;
                bool   modified = false;
                string txt      = txtID.Text.Trim();
                if (txt.Length == 0)
                {
                    txt = null;
                }
                if (txt != element.ID)
                {
                    if (logUndo)
                    {
                        document.UndoList.AddProperty("ID", element.ID, txt, element);
                    }
                    element.ID = txt;
                    modified   = true;
                }

                txt = txtTitle.Text.Trim();
                if (txt.Length == 0)
                {
                    txt = null;
                }
                if (txt != element.Title)
                {
                    if (logUndo)
                    {
                        document.UndoList.AddProperty("Title", element.Title, txt, element);
                    }
                    element.Title = txt;
                    modified      = true;
                }

                txt = txtAlt.Text.Trim();
                if (txt.Length == 0)
                {
                    txt = null;
                }
                if (txt != element.Alt)
                {
                    if (logUndo)
                    {
                        document.UndoList.AddProperty("Alt", element.Alt, txt, element);
                    }
                    element.Alt = txt;
                    modified    = true;
                }

                txt = txtSource.Text.Trim();
                if (txt.Length == 0)
                {
                    txt = null;
                }
                if (txt != element.Source)
                {
                    if (logUndo)
                    {
                        document.UndoList.AddProperty("Source", element.Source, txt, element);
                    }
                    element.Source = txt;
                    modified       = true;
                    element.UpdateImageContent();
                }

                if (chkKeepWidthHeightRate.Checked != element.KeepWidthHeightRate)
                {
                    if (logUndo)
                    {
                        document.UndoList.AddProperty(
                            "KeepWidthHeightRate",
                            element.KeepWidthHeightRate,
                            chkKeepWidthHeightRate.Checked,
                            element);
                    }
                    element.KeepWidthHeightRate = chkKeepWidthHeightRate.Checked;
                    modified = true;
                }

                if (chkSaveContentInFile.Checked != element.SaveContentInFile)
                {
                    if (logUndo)
                    {
                        document.UndoList.AddProperty(
                            "SaveContentInFile",
                            element.SaveContentInFile,
                            chkSaveContentInFile.Checked,
                            element);
                    }
                    element.SaveContentInFile = chkSaveContentInFile.Checked;
                    modified = true;
                }

                if (picImage.Tag != element.Image)
                {
                    XImageValue img = (XImageValue)picImage.Tag;
                    if (img == null)
                    {
                        img = new XImageValue();
                    }
                    if (img.HasContent)
                    {
                        if (logUndo)
                        {
                            document.UndoList.AddProperty(
                                "Image",
                                element.Image,
                                img,
                                element);
                        }
                        element.Image = img;
                        modified      = true;
                    }
                }
                if (modified)
                {
                    SizeF oldSize = new SizeF(element.Width, element.Height);
                    element.UpdateSize();
                    SizeF newSize = new SizeF(element.Width, element.Height);
                    if (logUndo)
                    {
                        document.UndoList.AddProperty("Width", oldSize.Width, element.Width, element);
                        document.UndoList.AddProperty("Height", oldSize.Height, element.Height, element);
                    }
                }
                if (this.SourceEventArgs.Method == ElementEditMethod.Edit)
                {
                    if (modified)
                    {
                        element.UpdateContentVersion();
                        DomContentElement ce = element.ContentElement;
                        ce.SetLinesInvalidateState(
                            element.OwnerLine,
                            element.OwnerLine);
                        ce.UpdateContentElements(true);
                        element.SizeInvalid = true;
                        ce.RefreshPrivateContent(element.ViewIndex);
                        ContentChangedEventArgs args = new ContentChangedEventArgs();
                        args.Document        = element.OwnerDocument;
                        args.Element         = element;
                        args.LoadingDocument = false;
                        element.Parent.RaiseBubbleOnContentChanged(args);
                    }
                }
                else
                {
                    this.DialogResult = System.Windows.Forms.DialogResult.OK;
                }
                this.Close();
            }
        }
 /// <summary>
 /// 重复操作
 /// </summary>
 public override void Redo(DCSoft.CSharpWriter.Undo.XUndoEventArgs args)
 {
     if (myContainer != null)
     {
         DomContentElement ce = myContainer.ContentElement;
         //args.Parameters["ContentElement"] = ce;
         if (_OldElements != null && _NewElements == null)
         {
             // 光删除,重复操作就是重复删除数据
             int index = ce.PrivateContent.IndexOf(_OldElements.FirstContentElement);
             foreach (DomElement element in _OldElements)
             {
                 DomElement e2 = GetContentElement(element);
                 if (e2 != null)
                 {
                     if (e2.OwnerLine != null)
                     {
                         e2.OwnerLine.InvalidateState = true;
                     }
                 }
                 element.OwnerLine = null;
                 myContainer.Elements.Remove(element);
                 myContainer.OwnerDocument.HighlightManager.Remove(element);
             }
             myContainer.UpdateContentVersion();
             this.OwnerList.AddContentRefreshInfo(ce, index);
         }
         else if (_OldElements == null && _NewElements != null)
         {
             // 光插入,重复操作就是重复插入数据
             myContainer.Elements.InsertRange(intIndex, _NewElements);
             foreach (DomElement element in _NewElements)
             {
                 DomElement e2 = GetContentElement(element);
                 if (e2 != null && e2.OwnerLine != null)
                 {
                     e2.OwnerLine.InvalidateState = true;
                 }
                 element.OwnerLine = null;
             }//foreach
             myContainer.UpdateContentVersion();
             AddRefreshElements(
                 _NewElements.FirstContentElement,
                 _NewElements.LastContentElement);
         }
         else if (_OldElements != null && _NewElements != null)
         {
             // 替换,撤销操作就是删除旧数据并插入新数据
             int index = ce.PrivateContent.IndexOf(_OldElements.FirstContentElement);
             foreach (DomElement element in _OldElements)
             {
                 DomElement e2 = GetContentElement(element);
                 if (e2 != null && e2.OwnerLine != null)
                 {
                     e2.OwnerLine.InvalidateState = true;
                 }
                 element.OwnerLine = null;
                 myContainer.Elements.Remove(element);
                 myContainer.OwnerDocument.HighlightManager.Remove(element);
             }
             this.OwnerList.AddContentRefreshInfo(ce, index);
             myContainer.Elements.InsertRange(intIndex, _NewElements);
             foreach (DomElement element in _NewElements)
             {
                 if (element.OwnerLine != null)
                 {
                     element.OwnerLine.InvalidateState = true;
                     element.OwnerLine = null;
                 }
             }
             myContainer.UpdateContentVersion();
             ce.UpdateContentElements(true);
             AddRefreshElements(
                 _NewElements.FirstContentElement,
                 _NewElements.LastContentElement);
         }
         if (this.OwnerList.ContentChangedContainer.Contains(myContainer) == false)
         {
             this.OwnerList.ContentChangedContainer.Add(myContainer);
         }
     }
 }
        /// <summary>
        /// 撤销操作
        /// </summary>
        public override void Undo(DCSoft.CSharpWriter.Undo.XUndoEventArgs args)
        {
            if (myContainer != null)
            {
                DomContentElement ce = myContainer.ContentElement;
                args.Parameters["ContentElement"] = ce;
                if (_OldElements != null && _NewElements == null)
                {
                    // 光删除,撤销操作就是恢复数据
                    myContainer.Elements.InsertRange(intIndex, _OldElements);
                    foreach (DomElement element in _OldElements)
                    {
                        DomElement e2 = GetContentElement(element);
                        if (e2 != null && e2.OwnerLine != null)
                        {
                            e2.OwnerLine.InvalidateState = true;
                        }
                        element.OwnerLine = null;
                        element.Parent    = myContainer;
                    }
                    myContainer.UpdateContentVersion();
                    AddRefreshElements(
                        _OldElements.FirstContentElement,
                        _OldElements.LastContentElement);
                }
                else if (_OldElements == null && _NewElements != null)
                {
                    // 光插入,撤销操作就是删除数据
                    int index      = ce.PrivateContent.IndexOf(_NewElements.FirstContentElement);
                    int startIndex = index;
                    foreach (DomElement element in _NewElements)
                    {
                        startIndex = Math.Min(startIndex, element.FirstContentElement.ViewIndex);
                        myContainer.Elements.Remove(element);
                        myContainer.OwnerDocument.HighlightManager.Remove(element);

                        DomElement fce = GetContentElement(element.FirstContentElement);
                        DomElement ece = GetContentElement(element.LastContentElement);

                        ce.SetLinesInvalidateState(
                            fce == null ? null : fce.OwnerLine,
                            ece == null ? null : ece.OwnerLine);

                        if (element.OwnerLine != null)
                        {
                            element.OwnerLine.InvalidateState = true;
                            element.OwnerLine = null;
                        }
                    }
                    myContainer.UpdateContentVersion();
                    this.OwnerList.AddContentRefreshInfo(ce, startIndex);
                }
                else if (_OldElements != null && _NewElements != null)
                {
                    // 替换,撤销操作就是删除新数据并恢复旧数据
                    int index      = ce.PrivateContent.IndexOf(_NewElements.FirstContentElement);
                    int startIndex = index;
                    foreach (DomElement element in _NewElements)
                    {
                        startIndex = Math.Min(startIndex, element.FirstContentElement.ViewIndex);
                        myContainer.Elements.Remove(element);
                        myContainer.OwnerDocument.HighlightManager.Remove(element);

                        DomElement fce = GetContentElement(element.FirstContentElement);
                        DomElement ece = GetContentElement(element.LastContentElement);

                        ce.SetLinesInvalidateState(
                            fce == null ? null : fce.OwnerLine,
                            ece == null ? null : ece.OwnerLine);

                        //ce.SetLinesInvalidateState(
                        //    element.FirstContentElement.OwnerLine,
                        //    element.LastContentElement.OwnerLine);
                        element.OwnerLine = null;
                    }
                    this.OwnerList.AddContentRefreshInfo(ce, startIndex);
                    myContainer.Elements.InsertRange(intIndex, _OldElements);
                    foreach (DomElement element in _OldElements)
                    {
                        if (element.OwnerLine != null)
                        {
                            element.OwnerLine.InvalidateState = true;
                            element.OwnerLine = null;
                        }
                        element.Parent = myContainer;
                    }
                    myContainer.UpdateContentVersion();
                    this.OwnerList.RefreshElements.Add(
                        GetContentElement(
                            _OldElements.FirstContentElement));
                    this.OwnerList.RefreshElements.Add(
                        GetContentElement(
                            _OldElements.LastContentElement));
                }
                if (this.OwnerList.ContentChangedContainer.Contains(myContainer) == false)
                {
                    this.OwnerList.ContentChangedContainer.Add(myContainer);
                }
            }
        }
Beispiel #10
0
        /// <summary>
        /// 全局替换
        /// </summary>
        /// <param name="args">参数</param>
        /// <returns>替换的次数</returns>
        public int ReplaceAll(SearchReplaceCommandArgs args)
        {
            int        result = 0;
            List <int> indexs = new List <int>();
            SearchReplaceCommandArgs args2 = args.Clone();

            args2.Backward = false;
            int currentIndex = this.Content.Count - 1;

            this.Document.BeginLogUndo();
            DocumentControler controler = this.Document.DocumentControler;
            Dictionary <DomContentElement, int> startIndexs = new Dictionary <DomContentElement, int>();

            while (true)
            {
                int index = Search(args2, false, currentIndex);
                if (index >= 0)
                {
                    DomSelection mySelection = new DomSelection(this.Document.CurrentContentElement);
                    mySelection.Refresh(index, args.SearchString.Length);
                    DomContainerElement container = null;
                    int elementIndex = 0;
                    this.Content.GetPositonInfo(index, out container, out elementIndex, false);
                    DomContentElement contentElement = container.ContentElement;
                    int pi = contentElement.PrivateContent.IndexOf(this.Content[index]);
                    if (startIndexs.ContainsKey(contentElement))
                    {
                        startIndexs[contentElement] = Math.Min(startIndexs[contentElement], pi);
                    }
                    else
                    {
                        startIndexs[contentElement] = pi;
                    }
                    indexs.Add(index);
                    if (string.IsNullOrEmpty(args.ReplaceString))
                    {
                        this.Content.DeleteSelection(true, false, true, mySelection);
                    }
                    else
                    {
                        DomElementList newElements = this.Document.CreateTextElements(
                            args.ReplaceString,
                            (DocumentContentStyle)this.Document.CurrentParagraphStyle,
                            (DocumentContentStyle)this.Document.EditorCurrentStyle.Clone());
                        ReplaceElementsArgs args3 = new ReplaceElementsArgs(
                            container,
                            index,
                            0,
                            newElements,
                            true,
                            false,
                            true);
                        int repResult = this.Document.ReplaceElements(args3);
                    }
                    result++;
                }
                else
                {
                    break;
                }
                currentIndex = index + args2.SearchString.Length;
            }//while
            this.Document.EndLogUndo();
            if (startIndexs.Count > 0)
            {
                bool refreshPage = false;
                foreach (DomContentElement ce in startIndexs.Keys)
                {
                    ce.UpdateContentElements(true);
                    ce.UpdateContentVersion();
                    ce._NeedRefreshPage = false;
                    ce.RefreshPrivateContent(startIndexs[ce]);
                    if (ce._NeedRefreshPage)
                    {
                        refreshPage = true;
                    }
                }
                if (refreshPage)
                {
                    this.Document.RefreshPages();
                    if (this.Document.EditorControl != null)
                    {
                        this.Document.EditorControl.UpdatePages();
                        this.Document.EditorControl.UpdateTextCaret();
                        this.Document.EditorControl.Invalidate();
                    }
                }
            }
            return(startIndexs.Count);
        }
Beispiel #11
0
        /// <summary>
        /// 设置容器元素的可见性
        /// </summary>
        /// <param name="visible">新的可见性</param>
        /// <param name="fastMode">是否启用快速模式,当使用快速模式时,
        /// 只更新DOM结构,不更新用户界面视图</param>
        /// <returns>操作是否成功</returns>
        public virtual bool EditorSetVisible(bool visible, bool fastMode)
        {
            bool result     = false;
            bool oldVisible = this.Visible;

            if (oldVisible != visible)
            {
                this.Visible = visible;
                bool visible2 = this.Visible;
                if (visible2 == visible)
                {
                    this.InvalidateView();
                    // 成功的修改了元素的可见性
                    if (visible)
                    {
                        this.OwnerDocument.HighlightManager.InvalidateHighlightInfo(this);
                    }
                    else
                    {
                        this.OwnerDocument.HighlightManager.Remove(this);
                    }
                    result = true;
                    DomElement        fc      = this.FirstContentElement;
                    DomElement        lc      = this.LastContentElement;
                    DomContentElement content = this.ContentElement;
                    int        startIndex     = 0;
                    DomElement preElement     = content.PrivateContent.GetPreElement(fc);
                    if (oldVisible)
                    {
                        startIndex = content.PrivateContent.IndexOf(fc);
                    }
                    this.UpdateContentVersion();
                    DomDocumentContentElement dce = this.DocumentContentElement;
                    DomElement currentElementBack = dce.CurrentElement;
                    content.UpdateContentElements(true);
                    if (oldVisible == false)
                    {
                        startIndex = content.PrivateContent.IndexOf(fc);
                    }
                    else
                    {
                        if (preElement != null && content.PrivateContent.Contains(preElement))
                        {
                            startIndex = content.PrivateContent.IndexOf(preElement);
                        }
                    }
                    content.RefreshPrivateContent(startIndex, -1, fastMode);
                    if (fastMode == false)
                    {
                        if (currentElementBack != null)
                        {
                            int index = dce.Content.IndexOf(currentElementBack);
                            if (index >= 0)
                            {
                            }
                        }
                    }
                }
            }
            return(result);
        }
Beispiel #12
0
        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();
            }
        }