Chromium Code Reviews| Index: ui/gfx/render_text_linux.cc |
| =================================================================== |
| --- ui/gfx/render_text_linux.cc (revision 100008) |
| +++ ui/gfx/render_text_linux.cc (working copy) |
| @@ -123,13 +123,19 @@ |
| } |
| SelectionModel RenderTextLinux::FindCursorPosition(const Point& point) { |
| - // TODO(xji): when points outside of text, return HOME/END position. |
| PangoLayout* layout = EnsureLayout(); |
| if (text().empty()) |
| return SelectionModel(0, 0, SelectionModel::LEADING); |
| Point p(ToTextPoint(point)); |
| + |
| + // When the point is outside of text, return HOME/END position. |
| + if (p.x() < 0) |
| + return LeftEndSelectionModel(); |
| + else if (p.x() > GetStringWidth()) |
| + return RightEndSelectionModel(); |
| + |
| int caret_pos, trailing; |
| pango_layout_xy_to_index(layout, p.x() * PANGO_SCALE, p.y() * PANGO_SCALE, |
| &caret_pos, &trailing); |
| @@ -212,7 +218,7 @@ |
| return SelectionModel(text().length(), caret, SelectionModel::LEADING); |
| } else { // RTL. |
| size_t caret = Utf16IndexOfAdjacentGrapheme(item->offset + item->length, |
| - PREVIOUS); |
| + false); |
| return SelectionModel(text().length(), caret, SelectionModel::TRAILING); |
| } |
| } |
| @@ -227,7 +233,7 @@ |
| PangoItem* item = last_visual_run->item; |
| if (item->analysis.level % 2 == 0) { // LTR. |
| size_t caret = Utf16IndexOfAdjacentGrapheme(item->offset + item->length, |
| - PREVIOUS); |
| + false); |
| return SelectionModel(text().length(), caret, SelectionModel::TRAILING); |
| } else { // RTL. |
| size_t caret = Utf8IndexToUtf16Index(item->offset); |
| @@ -238,16 +244,18 @@ |
| return SelectionModel(0, 0, SelectionModel::LEADING); |
| } |
| -size_t RenderTextLinux::GetIndexOfPreviousGrapheme(size_t position) { |
| +bool RenderTextLinux::IsCursorablePosition(size_t position) { |
| + if (position == 0 && text().empty()) |
| + return true; |
| + |
| EnsureLayout(); |
| - size_t index = Utf16IndexToUtf8Index(position); |
| - return Utf16IndexOfAdjacentGrapheme(index, PREVIOUS); |
| + return (position >= 0 && position < static_cast<size_t>(num_log_attrs_) && |
| + log_attrs_[position].is_cursor_position); |
| } |
| -size_t RenderTextLinux::GetIndexOfNextGrapheme(size_t position) { |
| +size_t RenderTextLinux::IndexOfAdjacentGrapheme(size_t index, bool next) { |
| EnsureLayout(); |
| - size_t index = Utf16IndexToUtf8Index(position); |
| - return Utf16IndexOfAdjacentGrapheme(index, NEXT); |
| + return Utf16IndexOfAdjacentGrapheme(Utf16IndexToUtf8Index(index), next); |
| } |
| GSList* RenderTextLinux::GetRunContainingPosition(size_t position) const { |
| @@ -265,13 +273,12 @@ |
| } |
| size_t RenderTextLinux::Utf8IndexOfAdjacentGrapheme( |
| - size_t utf8_index_of_current_grapheme, |
| - RelativeLogicalPosition pos) const { |
| + size_t utf8_index_of_current_grapheme, bool next) const { |
|
msw
2011/09/16 17:39:08
|next| belongs on the following line, our style gu
xji
2011/09/16 20:29:24
Done.
|
| const char* ch = layout_text_ + utf8_index_of_current_grapheme; |
| int char_offset = static_cast<int>(g_utf8_pointer_to_offset(layout_text_, |
| ch)); |
| int start_char_offset = char_offset; |
| - if (pos == PREVIOUS) { |
| + if (!next) { |
| if (char_offset > 0) { |
| do { |
| --char_offset; |
| @@ -291,24 +298,23 @@ |
| } |
| size_t RenderTextLinux::Utf16IndexOfAdjacentGrapheme( |
| - size_t utf8_index_of_current_grapheme, |
| - RelativeLogicalPosition pos) const { |
| + size_t utf8_index_of_current_grapheme, bool next) const { |
|
msw
2011/09/16 17:39:08
|next| on next line.
xji
2011/09/16 20:29:24
Done.
|
| size_t utf8_index = Utf8IndexOfAdjacentGrapheme( |
| - utf8_index_of_current_grapheme, pos); |
| + utf8_index_of_current_grapheme, next); |
| return Utf8IndexToUtf16Index(utf8_index); |
| } |
| SelectionModel RenderTextLinux::FirstSelectionModelInsideRun( |
| const PangoItem* item) const { |
| size_t caret = Utf8IndexToUtf16Index(item->offset); |
| - size_t cursor = Utf16IndexOfAdjacentGrapheme(item->offset, NEXT); |
| + size_t cursor = Utf16IndexOfAdjacentGrapheme(item->offset, true); |
| return SelectionModel(cursor, caret, SelectionModel::TRAILING); |
| } |
| SelectionModel RenderTextLinux::LastSelectionModelInsideRun( |
| const PangoItem* item) const { |
| size_t caret = Utf16IndexOfAdjacentGrapheme(item->offset + item->length, |
| - PREVIOUS); |
| + false); |
| return SelectionModel(caret, caret, SelectionModel::LEADING); |
| } |