Пример #1
0
        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);
                    }
                }
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
 public HCViewData(HCStyle aStyle) : base(aStyle)
 {
     FDomainStartDeletes = new List <int>();
     FHotDomain          = new HCDomainInfo();
     FHotDomain.Data     = this;
     FActiveDomain       = new HCDomainInfo();
     FActiveDomain.Data  = this;
 }
Пример #4
0
        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();
                    }
                }
            }
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        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("异常:获取域起始位置出错!");
                }
            }
        }
Пример #7
0
 public bool DeleteDomain(HCDomainInfo aDomain)
 {
     return(DeleteDomainByItemNo(aDomain.BeginNo, aDomain.EndNo));
 }