private int InsertAnnotateByOffset(HCAnnotateItem annotateItem, int itemNo, int offset) { int vResult = 0; if (offset == HC.OffsetBefor) // 在最开始 { annotateItem.ParaFirst = Items[itemNo].ParaFirst; annotateItem.PageBreak = Items[itemNo].PageBreak; if (Items[itemNo].StyleNo > HCStyle.Null && Items[itemNo].Text == "") // 空item { UndoAction_DeleteItem(itemNo, 0); Items.Delete(itemNo); vResult--; } else { if (Items[itemNo].ParaFirst) { UndoAction_ItemParaFirst(itemNo, 0, false); Items[itemNo].ParaFirst = false; } if (Items[itemNo].PageBreak) { UndoAction_ItemPageBreak(itemNo, 0, false); Items[itemNo].PageBreak = false; } } Items.Insert(itemNo, annotateItem); UndoAction_InsertItem(itemNo, HC.OffsetBefor); vResult++; } else if (offset == GetItemOffsetAfter(itemNo)) // 在最后面 { Items.Insert(itemNo + 1, annotateItem); UndoAction_InsertItem(itemNo + 1, HC.OffsetBefor); vResult++; } else // 在item中间 if (IsRectItem(itemNo)) // 在RectItem中间按最后面算 { Items.Insert(itemNo + 1, annotateItem); UndoAction_InsertItem(itemNo + 1, HC.OffsetBefor); vResult++; } else // 在结束TextItem中间打断 { string vS = (Items[itemNo] as HCTextItem).SubString(offset + 1, Items[itemNo].Length - offset); UndoAction_DeleteText(itemNo, offset + 1, vS); // 原位置后半部分 HCCustomItem vAfterItem = Items[itemNo].BreakByOffset(offset); // 插入原TextItem后半部分增加Text后的 Style.States.Include(HCState.hosInsertBreakItem); // 最后一个是原文在插入前就存在的内容,为插入事件提供更精细化的处理 try { Items.Insert(itemNo + 1, vAfterItem); } finally { Style.States.Exclude(HCState.hosInsertBreakItem); } UndoAction_InsertItem(itemNo + 1, 0); vResult++; Items.Insert(itemNo + 1, annotateItem); UndoAction_InsertItem(itemNo + 1, HC.OffsetBefor); vResult++; } return(vResult); }
public bool InsertAnnotate(string aTitle, string aText) { bool vResult = false; if (Items[SelectInfo.StartItemNo].StyleNo < HCStyle.Null && SelectInfo.StartItemOffset == HC.OffsetInner) { Undo_New(); HCCustomRectItem vRectItem = Items[SelectInfo.StartItemNo] as HCCustomRectItem; if (vRectItem.MangerUndo) { UndoAction_ItemSelf(SelectInfo.StartItemNo, HC.OffsetInner); } else { UndoAction_ItemMirror(SelectInfo.StartItemNo, HC.OffsetInner); } vResult = (Items[SelectInfo.StartItemNo] as HCCustomRectItem).InsertAnnotate(aTitle, aText); int vFormatFirstDrawItemNo = -1, vFormatLastItemNo = -1; if (vRectItem.IsFormatDirty) { GetFormatRange(ref vFormatFirstDrawItemNo, ref vFormatLastItemNo); FormatPrepare(vFormatFirstDrawItemNo, vFormatLastItemNo); ReFormatData(vFormatFirstDrawItemNo, vFormatLastItemNo); } else { this.FormatInit(); } return(vResult); } else { if (!CanEdit()) { return(false); } this.Style.States.Include(HCState.hosBatchInsert); // 批量插入防止插入1个起始触发取配对时,结束还没插入呢 try { int vIncCount = 0, vFormatFirstDrawItemNo = -1, vFormatLastItemNo = -1; Undo_New(); if (this.SelectExists()) { vFormatFirstDrawItemNo = GetFormatFirstDrawItem(SelectInfo.StartItemNo, SelectInfo.StartItemOffset); vFormatLastItemNo = GetParaLastItemNo(SelectInfo.EndItemNo); } else { GetFormatRange(SelectInfo.StartItemNo, 1, ref vFormatFirstDrawItemNo, ref vFormatLastItemNo); } FormatPrepare(vFormatFirstDrawItemNo, vFormatLastItemNo); FNextID++; // 插入尾 HCAnnotateItem vAnnotateItem = new HCAnnotateItem(this); vAnnotateItem.MarkType = MarkType.cmtEnd; vAnnotateItem.ID = FNextID; vAnnotateItem.Content.Title = aTitle; vAnnotateItem.Content.Text = aText; if (SelectInfo.EndItemNo >= 0) // 有选中结束item { vIncCount = InsertAnnotateByOffset(vAnnotateItem, SelectInfo.EndItemNo, SelectInfo.EndItemOffset); } else { vIncCount = InsertAnnotateByOffset(vAnnotateItem, SelectInfo.StartItemNo, SelectInfo.StartItemOffset); } // 插入头 vAnnotateItem = new HCAnnotateItem(this); vAnnotateItem.MarkType = MarkType.cmtBeg; vAnnotateItem.ID = FNextID; vIncCount = vIncCount + InsertAnnotateByOffset(vAnnotateItem, SelectInfo.StartItemNo, SelectInfo.StartItemOffset); ReFormatData(vFormatFirstDrawItemNo, vFormatLastItemNo + vIncCount, vIncCount); } finally { this.Style.States.Exclude(HCState.hosBatchInsert); } Style.UpdateInfoRePaint(); Style.UpdateInfoReCaret(); // 因上面批量屏蔽了取当前位置域的功能,所以都插完后,取一下当前位置域情况 ReSetSelectAndCaret(SelectInfo.StartItemNo); return(true); } }
public void GetAnnotateFrom(int itemNo, int offset, HCAnnotateInfo annotateInfo) { annotateInfo.Clear(); if (itemNo < 0 || offset < 0) { return; } HCAnnotateItem vAnnotateItem = null; uint vID = 0; if (Items[itemNo].StyleNo == HCStyle.Annotate) // 起始位置就是批注 { vAnnotateItem = Items[itemNo] as HCAnnotateItem; if (vAnnotateItem.MarkType == MarkType.cmtBeg) // 起始位置是起始标记 { if (offset == HC.OffsetAfter) // 光标在起始标记后面 { annotateInfo.Data = this; annotateInfo.BeginNo = itemNo; // 当前即为起始标识 vID = vAnnotateItem.ID; annotateInfo.EndNo = GetAnnotateEndAfter(itemNo + 1, vID); // 这里+1是批注不会出现不配对的前提下 return; } } else // 起始位置是结束标记 { if (offset == HC.OffsetBefor) // 光标在结束标记前面 { annotateInfo.Data = this; annotateInfo.EndNo = itemNo; vID = vAnnotateItem.ID; annotateInfo.BeginNo = GetAnnotateBeginBefor(itemNo - 1, vID); // 这里-1是批注不会出现不配对的前提下 return; } } } FIDStrack.Clear(); for (int i = itemNo; i >= 0; i--) { if (Items[i].StyleNo == HCStyle.Annotate) { vAnnotateItem = Items[i] as HCAnnotateItem; if (vAnnotateItem.MarkType == MarkType.cmtEnd) // 是结束 { FIDStrack.Push(vAnnotateItem.ID); } else // 是起始 { if (FIDStrack.Count > 0) // 有栈 { vID = FIDStrack.Peek(); if (vAnnotateItem.ID == vID) // 消除配对 { FIDStrack.Pop(); } else { annotateInfo.Data = this; annotateInfo.BeginNo = i; vID = vAnnotateItem.ID; break; } } else // 没有栈 { annotateInfo.Data = this; annotateInfo.BeginNo = i; vID = vAnnotateItem.ID; break; } } } } if (annotateInfo.BeginNo >= 0) { annotateInfo.EndNo = GetAnnotateEndAfter(itemNo + 1, vID); } }