public void TraverseItem(HCItemTraverse aTraverse) { if (aTraverse != null) { HCDomainInfo vDomainInfo; for (int i = 0; i <= Items.Count - 1; i++) { if (aTraverse.Stop) { break; } if (Items[i] is HCDomainItem) { if (HCDomainItem.IsBeginMark(Items[i])) { vDomainInfo = new HCDomainInfo(); GetDomainFrom(i, HC.OffsetAfter, vDomainInfo); aTraverse.DomainStack.Push(vDomainInfo); } else { aTraverse.DomainStack.Pop(); } } aTraverse.Process(this, i, aTraverse.Tag, aTraverse.DomainStack, ref aTraverse.Stop); if (Items[i].StyleNo < HCStyle.Null) { (Items[i] as HCCustomRectItem).TraverseItem(aTraverse); } } } }
public bool DeleteDomain(HCDomainInfo aDomain) { if (aDomain.BeginNo < 0) { return(false); } Undo_New(); int vCaretItemNo = aDomain.BeginNo; int vFirstDrawItemNo = GetFormatFirstDrawItem(Items[aDomain.BeginNo].FirstDItemNo); int vParaLastItemNo = GetParaLastItemNo(aDomain.EndNo); if (Items[aDomain.BeginNo].ParaFirst) { if (aDomain.EndNo == vParaLastItemNo) { if (aDomain.BeginNo > 0) { vFirstDrawItemNo = GetFormatFirstDrawItem(Items[aDomain.BeginNo].FirstDItemNo - 1); } } else // 域结束不是段尾,起始是段首 { UndoAction_ItemParaFirst(aDomain.EndNo + 1, 0, true); Items[aDomain.EndNo + 1].ParaFirst = true; } } FormatPrepare(vFirstDrawItemNo, vParaLastItemNo); int vDelCount = 0; for (int i = aDomain.EndNo; i >= aDomain.BeginNo; i--) // 删除域及域范围内的Ite { UndoAction_DeleteItem(i, 0); Items.Delete(i); vDelCount++; } FActiveDomain.Clear(); ReFormatData(vFirstDrawItemNo, vParaLastItemNo - vDelCount, -vDelCount); this.InitializeField(); if (vCaretItemNo > Items.Count - 1) { ReSetSelectAndCaret(vCaretItemNo - 1); } else { ReSetSelectAndCaret(vCaretItemNo, 0); } Style.UpdateInfoRePaint(); Style.UpdateInfoReCaret(); return(true); }
public HCViewData(HCStyle aStyle) : base(aStyle) { FDomainStartDeletes = new List <int>(); FHotDomain = new HCDomainInfo(); FHotDomain.Data = this; FActiveDomain = new HCDomainInfo(); FActiveDomain.Data = this; }
public void GetDomainStackFrom(int aItemNo, int aOffset, Stack <HCDomainInfo> aDomainStack) { HCDomainInfo vDomainInfo; for (int i = 0; i < aItemNo; i++) { if (Items[i] is HCDomainItem) { if (HCDomainItem.IsBeginMark(Items[i])) { vDomainInfo = new HCDomainInfo(); vDomainInfo.Data = this; vDomainInfo.BeginNo = i; aDomainStack.Push(vDomainInfo); } else { aDomainStack.Pop(); } } } }
/// <summary> 用于从流加载完Items后,检查不合格的Item并删除 </summary> protected override int CheckInsertItemCount(int aStartNo, int aEndNo) { int vResult = base.CheckInsertItemCount(aStartNo, aEndNo); if (this.Loading) { return(vResult); } int vLevel = -1; HCDomainInfo vDomainInfo = new HCDomainInfo(); GetDomainFrom(aStartNo, 0, vDomainInfo); if (vDomainInfo.BeginNo >= 0) { vLevel = (Items[vDomainInfo.BeginNo] as HCDomainItem).Level; } for (int i = aStartNo; i <= aEndNo; i++) { if (Items[i] is HCDomainItem) // 域标识 { if ((Items[i] as HCDomainItem).MarkType == MarkType.cmtBeg) // 是起始 { vLevel++; } (Items[i] as HCDomainItem).Level = (byte)vLevel; if ((Items[i] as HCDomainItem).MarkType == MarkType.cmtEnd) // 是结束 { vLevel--; } } } return(vResult); }
private void GetDomainFrom(int aItemNo, int aOffset, HCDomainInfo aDomainInfo) { aDomainInfo.Clear(); if ((aItemNo < 0) || (aOffset < 0)) { return; } /* 找起始标识 }*/ int vCount = 0; byte vLevel = 0; // 确定往前找的起始位置 int vStartNo = aItemNo; int vEndNo = aItemNo; if (Items[aItemNo] is HCDomainItem) { if ((Items[aItemNo] as HCDomainItem).MarkType == MarkType.cmtBeg) { if (aOffset == HC.OffsetAfter) { aDomainInfo.BeginNo = aItemNo; // 当前即为起始标识 vLevel = (Items[aItemNo] as HCDomainItem).Level; vEndNo = aItemNo + 1; } else // 光标在前面 { if (aItemNo > 0) { vStartNo = aItemNo - 1; // 从前一个往前 } else // 是在第一个前面 { return; // 不用找了 } } } else // 查找位置是结束标记 { if (aOffset == HC.OffsetAfter) { if (aItemNo < Items.Count - 1) { vEndNo = aItemNo + 1; } else // 是最后一个后面 { return; // 不用找了 } } else // 光标在前面 { aDomainInfo.EndNo = aItemNo; vStartNo = aItemNo - 1; } } } if (aDomainInfo.BeginNo < 0) { vCount = 0; if (vStartNo < Items.Count / 2) // 在前半程 { for (int i = vStartNo; i >= 0; i--) // 先往前找起始 { if (Items[i] is HCDomainItem) { if ((Items[i] as HCDomainItem).MarkType == MarkType.cmtBeg) // 起始标记 { if (vCount != 0) { vCount--; } else { aDomainInfo.BeginNo = i; vLevel = (Items[i] as HCDomainItem).Level; break; } } else // 结束标记 { vCount++; // 有嵌套 } } } if ((aDomainInfo.BeginNo >= 0) && (aDomainInfo.EndNo < 0)) // 找结束标识 { for (int i = vEndNo; i <= Items.Count - 1; i++) { if (Items[i] is HCDomainItem) { if ((Items[i] as HCDomainItem).MarkType == MarkType.cmtEnd) // 是结尾 { if ((Items[i] as HCDomainItem).Level == vLevel) { aDomainInfo.EndNo = i; break; } } } } if (aDomainInfo.EndNo < 0) { throw new Exception("异常:获取数据组结束出错!"); } } } else // 在后半程 { for (int i = vEndNo; i <= this.Items.Count - 1; i++) // 先往后找结 { if (Items[i] is HCDomainItem) { if ((Items[i] as HCDomainItem).MarkType == MarkType.cmtEnd) { if (vCount > 0) { vCount--; } else { aDomainInfo.EndNo = i; vLevel = (Items[i] as HCDomainItem).Level; break; } } else { vCount++; } } } if ((aDomainInfo.EndNo >= 0) && (aDomainInfo.BeginNo < 0)) { for (int i = vStartNo; i >= 0; i--) { if (Items[i] is HCDomainItem) { if ((Items[i] as HCDomainItem).MarkType == MarkType.cmtBeg) { if ((Items[i] as HCDomainItem).Level == vLevel) { aDomainInfo.BeginNo = i; break; } } } } if (aDomainInfo.BeginNo < 0) { throw new Exception("异常:获取域起始位置出错!"); } } } } else if (aDomainInfo.EndNo < 0) { for (int i = vEndNo; i <= this.Items.Count - 1; i++) { if (Items[i] is HCDomainItem) { if ((Items[i] as HCDomainItem).MarkType == MarkType.cmtEnd) // 是结尾 { if ((Items[i] as HCDomainItem).Level == vLevel) { aDomainInfo.EndNo = i; break; } } } } if (aDomainInfo.EndNo < 0) { throw new Exception("异常:获取域起始位置出错!"); } } }
public bool DeleteDomain(HCDomainInfo aDomain) { return(DeleteDomainByItemNo(aDomain.BeginNo, aDomain.EndNo)); }