summaryrefslogtreecommitdiff
path: root/xfa/fde/cfde_texteditengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xfa/fde/cfde_texteditengine.cpp')
-rw-r--r--xfa/fde/cfde_texteditengine.cpp44
1 files changed, 26 insertions, 18 deletions
diff --git a/xfa/fde/cfde_texteditengine.cpp b/xfa/fde/cfde_texteditengine.cpp
index 8075ea7a98..0c64e39aeb 100644
--- a/xfa/fde/cfde_texteditengine.cpp
+++ b/xfa/fde/cfde_texteditengine.cpp
@@ -588,31 +588,29 @@ void CFDE_TextEditEngine::SelectAll() {
has_selection_ = true;
selection_.start_idx = 0;
- selection_.end_idx = text_length_ - 1;
+ selection_.count = text_length_;
}
void CFDE_TextEditEngine::ClearSelection() {
has_selection_ = false;
selection_.start_idx = 0;
- selection_.end_idx = 0;
+ selection_.count = 0;
}
-void CFDE_TextEditEngine::SetSelection(size_t start_idx, size_t end_idx) {
- // If the points are the same, then we pretend the selection doesn't exist
- // anymore.
- if (start_idx == end_idx) {
+void CFDE_TextEditEngine::SetSelection(size_t start_idx, size_t count) {
+ if (count == 0) {
ClearSelection();
return;
}
if (start_idx > text_length_)
return;
- if (end_idx > text_length_)
- end_idx = text_length_ - 1;
+ if (start_idx + count > text_length_)
+ count = text_length_ - start_idx;
has_selection_ = true;
selection_.start_idx = start_idx;
- selection_.end_idx = end_idx;
+ selection_.count = count;
}
WideString CFDE_TextEditEngine::GetSelectedText() const {
@@ -621,22 +619,30 @@ WideString CFDE_TextEditEngine::GetSelectedText() const {
WideString text;
if (selection_.start_idx < gap_position_) {
- if (selection_.end_idx < gap_position_) {
+ // Fully on left of gap.
+ if (selection_.start_idx + selection_.count < gap_position_) {
text += WideStringView(content_.data() + selection_.start_idx,
- selection_.end_idx - selection_.start_idx + 1);
+ selection_.count);
return text;
}
+ // Pre-gap text
text += WideStringView(content_.data() + selection_.start_idx,
gap_position_ - selection_.start_idx);
- text += WideStringView(
- content_.data() + gap_position_ + gap_size_,
- selection_.end_idx - (gap_position_ - selection_.start_idx) + 1);
+
+ if (selection_.count - (gap_position_ - selection_.start_idx) > 0) {
+ // Post-gap text
+ text += WideStringView(
+ content_.data() + gap_position_ + gap_size_,
+ selection_.count - (gap_position_ - selection_.start_idx));
+ }
+
return text;
}
+ // Fully right of gap
text += WideStringView(content_.data() + gap_size_ + selection_.start_idx,
- selection_.end_idx - selection_.start_idx + 1);
+ selection_.count);
return text;
}
@@ -645,8 +651,7 @@ WideString CFDE_TextEditEngine::DeleteSelectedText(
if (!has_selection_)
return L"";
- return Delete(selection_.start_idx,
- selection_.end_idx - selection_.start_idx + 1, add_operation);
+ return Delete(selection_.start_idx, selection_.count, add_operation);
}
WideString CFDE_TextEditEngine::Delete(size_t start_idx,
@@ -965,6 +970,9 @@ std::vector<CFX_RectF> CFDE_TextEditEngine::GetCharacterRectsInRange(
std::pair<size_t, size_t> CFDE_TextEditEngine::BoundsForWordAt(
size_t idx) const {
+ if (idx > text_length_)
+ return {0, 0};
+
CFDE_TextEditEngine::Iterator iter(this);
iter.SetAt(idx);
iter.FindNextBreakPos(true);
@@ -972,7 +980,7 @@ std::pair<size_t, size_t> CFDE_TextEditEngine::BoundsForWordAt(
iter.FindNextBreakPos(false);
size_t end_idx = iter.GetAt();
- return {start_idx, end_idx};
+ return {start_idx, end_idx - start_idx + 1};
}
CFDE_TextEditEngine::Iterator::Iterator(const CFDE_TextEditEngine* engine)