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++; } }
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(); } }