Exemplo n.º 1
0
        private void SplitBlock(int blockId, int position)
        {
            var block    = blocks[blockId];
            var newBlock = new CharBlock
            {
                Id              = blockId + 1,
                BlockPosition   = block.BlockPosition + position,
                VisibleElements = block.VisibleElements.Where(t => t.Position >= position).ToArray(),
                Elements        = block.Elements.Skip(position).ToArray(),
            };

            block.Elements        = block.Elements.Take(position).ToArray();
            block.VisibleElements = block.VisibleElements.Where(t => t.Position < position).ToArray();
            blocks.Insert(blockId + 1, newBlock);
            for (var i = blockId + 2; i < blocks.Count; i++)
            {
                blocks[i].Id++;
            }

            position = 0;
            foreach (var element in newBlock.Elements)
            {
                element.Block    = newBlock;
                element.Position = position++;
            }
            newBlock.BlockVisiblePosition = block.BlockVisiblePosition + block.VisibleElements.Length;
            position = 0;
            foreach (var element in newBlock.VisibleElements)
            {
                element.VisiblePosition = position++;
            }
        }
Exemplo n.º 2
0
        public void Delete(Char[] toDeleteChars)
        {
            Length -= toDeleteChars.Length;

            var shift        = toDeleteChars.Length;
            var lastBlock    = blocks.Count - 1;
            int lastPosition = blocks.Last().VisibleElements.Length;

            CharBlock prevBlock = null;

            for (var j = toDeleteChars.Length - 1; j >= 0; j--)
            {
                var ci = idToChar[toDeleteChars[j].Id];
                var cb = ci.Block;

                if (lastBlock >= cb.Id + 1)
                {
                    for (var i = cb.Id + 1; i <= lastBlock; i++)
                    {
                        blocks[i].BlockVisiblePosition -= shift;
                    }
                    lastPosition = cb.Elements.Length;
                }

                for (var i = ci.VisiblePosition + 1; i < lastPosition; i++)
                {
                    cb.VisibleElements[i].VisiblePosition -= shift;
                }

                if (cb != prevBlock && prevBlock != null)
                {
                    prevBlock.VisibleElements = prevBlock.VisibleElements.Where(t => t.VisiblePosition >= 0).ToArray();
                }
                prevBlock = cb;

                shift--;
                lastBlock          = cb.Id;
                lastPosition       = ci.VisiblePosition;
                ci.VisiblePosition = -1;
            }
            if (prevBlock != null)
            {
                prevBlock.VisibleElements = prevBlock.VisibleElements.Where(t => t.VisiblePosition >= 0).ToArray();
            }
        }