Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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);
            }
        }