| Index: ui/gfx/render_text_win.cc
|
| ===================================================================
|
| --- ui/gfx/render_text_win.cc (revision 102037)
|
| +++ ui/gfx/render_text_win.cc (working copy)
|
| @@ -237,10 +237,6 @@
|
| return SelectionModel(cursor, caret, placement);
|
| }
|
|
|
| -size_t RenderTextWin::GetIndexOfPreviousGrapheme(size_t position) {
|
| - return IndexOfAdjacentGrapheme(position, false);
|
| -}
|
| -
|
| std::vector<Rect> RenderTextWin::GetSubstringBounds(size_t from, size_t to) {
|
| ui::Range range(from, to);
|
| DCHECK(ui::Range(0, text().length()).Contains(range));
|
| @@ -295,6 +291,41 @@
|
| return bounds;
|
| }
|
|
|
| +bool RenderTextWin::IsCursorablePosition(size_t position) {
|
| + if (position == 0 || position == text().length())
|
| + return true;
|
| +
|
| + size_t run_index = GetRunContainingPosition(position);
|
| + if (run_index >= runs_.size())
|
| + return false;
|
| +
|
| + internal::TextRun* run = runs_[run_index];
|
| + size_t start = run->range.start();
|
| + if (position == start)
|
| + return true;
|
| + return run->logical_clusters[position - start] !=
|
| + run->logical_clusters[position - start - 1];
|
| +}
|
| +
|
| +size_t RenderTextWin::IndexOfAdjacentGrapheme(size_t index, bool next) {
|
| + size_t run_index = GetRunContainingPosition(index);
|
| + internal::TextRun* run = run_index < runs_.size() ? runs_[run_index] : NULL;
|
| + long start = run ? run->range.start() : 0;
|
| + long length = run ? run->range.length() : text().length();
|
| + long ch = index - start;
|
| + WORD cluster = run ? run->logical_clusters[ch] : 0;
|
| +
|
| + if (!next) {
|
| + do {
|
| + ch--;
|
| + } while (ch >= 0 && run && run->logical_clusters[ch] == cluster);
|
| + } else {
|
| + while (ch < length && run && run->logical_clusters[ch] == cluster)
|
| + ch++;
|
| + }
|
| + return std::max(static_cast<long>(std::min(ch, length) + start), 0L);
|
| +}
|
| +
|
| void RenderTextWin::ItemizeLogicalText() {
|
| text_is_dirty_ = false;
|
| STLDeleteContainerPointers(runs_.begin(), runs_.end());
|
| @@ -461,34 +492,16 @@
|
| return run;
|
| }
|
|
|
| -size_t RenderTextWin::IndexOfAdjacentGrapheme(size_t index, bool next) const {
|
| - size_t run_index = GetRunContainingPosition(index);
|
| - internal::TextRun* run = run_index < runs_.size() ? runs_[run_index] : NULL;
|
| - long start = run ? run->range.start() : 0;
|
| - long length = run ? run->range.length() : text().length();
|
| - long ch = index - start;
|
| - WORD cluster = run ? run->logical_clusters[ch] : 0;
|
|
|
| - if (!next) {
|
| - do {
|
| - ch--;
|
| - } while (ch >= 0 && run && run->logical_clusters[ch] == cluster);
|
| - } else {
|
| - while (ch < length && run && run->logical_clusters[ch] == cluster)
|
| - ch++;
|
| - }
|
| - return std::max(static_cast<long>(std::min(ch, length) + start), 0L);
|
| -}
|
| -
|
| SelectionModel RenderTextWin::FirstSelectionModelInsideRun(
|
| - internal::TextRun* run) const {
|
| + internal::TextRun* run) {
|
| size_t caret = run->range.start();
|
| size_t cursor = IndexOfAdjacentGrapheme(caret, true);
|
| return SelectionModel(cursor, caret, SelectionModel::TRAILING);
|
| }
|
|
|
| SelectionModel RenderTextWin::LastSelectionModelInsideRun(
|
| - internal::TextRun* run) const {
|
| + internal::TextRun* run) {
|
| size_t caret = IndexOfAdjacentGrapheme(run->range.end(), false);
|
| return SelectionModel(caret, caret, SelectionModel::LEADING);
|
| }
|
|
|