From b7e8a244416945ce8850b3ff148289607c1ee31f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Sun, 19 Jan 2014 15:51:45 +0100 Subject: [PATCH] Paragraph: Added Remove(), untested. --- src/apps/haiku-depot/textview/Paragraph.cpp | 49 +++++++++++++++++++++ src/apps/haiku-depot/textview/Paragraph.h | 1 + 2 files changed, 50 insertions(+) diff --git a/src/apps/haiku-depot/textview/Paragraph.cpp b/src/apps/haiku-depot/textview/Paragraph.cpp index df968254a5..2c4f401027 100644 --- a/src/apps/haiku-depot/textview/Paragraph.cpp +++ b/src/apps/haiku-depot/textview/Paragraph.cpp @@ -127,6 +127,55 @@ Paragraph::Insert(int32 offset, const TextSpan& newSpan) } +bool +Paragraph::Remove(int32 offset, int32 length) +{ + if (length == 0) + return true; + + int32 index = 0; + while (index < fTextSpans.CountItems()) { + const TextSpan& span = fTextSpans.ItemAtFast(index); + if (offset - span.CharCount() < 0) + break; + offset -= span.CharCount(); + } + + if (index >= fTextSpans.CountItems()) + return false; + + TextSpan span = fTextSpans.ItemAtFast(index).SubSpan(0, offset); + fTextSpans.Replace(index, span); + index += 1; + if (index >= fTextSpans.CountItems()) + return true; + + while (length > 0) { + int32 spanLength = fTextSpans.ItemAtFast(index).CharCount(); + if (spanLength <= length) { + fTextSpans.Remove(index); + length -= spanLength; + } else { + // Reached last span + int32 removeLength = std::min(length, spanLength); + TextSpan lastSpan = fTextSpans.ItemAtFast(index).SubSpan( + removeLength, spanLength - removeLength); + // Try to merge with first span, otherwise replace span at index + if (lastSpan.Style() == span.Style()) { + span.Insert(span.CharCount(), lastSpan.Text()); + fTextSpans.Replace(index - 1, span); + } else { + fTextSpans.Replace(index, lastSpan); + } + + break; + } + } + + return true; +} + + void Paragraph::Clear() { diff --git a/src/apps/haiku-depot/textview/Paragraph.h b/src/apps/haiku-depot/textview/Paragraph.h index 98d4fd1afd..64ca2cbe93 100644 --- a/src/apps/haiku-depot/textview/Paragraph.h +++ b/src/apps/haiku-depot/textview/Paragraph.h @@ -32,6 +32,7 @@ public: bool Append(const TextSpan& span); bool Insert(int32 offset, const TextSpan& span); + bool Remove(int32 offset, int32 length); void Clear(); int32 Length() const;