Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(455)

Unified Diff: ui/gfx/render_text.cc

Issue 7511029: Implement Pango RenderText for Linux. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/gfx/render_text.cc
===================================================================
--- ui/gfx/render_text.cc (revision 99969)
+++ ui/gfx/render_text.cc (working copy)
@@ -135,6 +135,7 @@
}
void RenderText::SetText(const string16& text) {
+ DCHECK(!composition_range_.IsValid());
size_t old_text_length = text_.length();
text_ = text;
@@ -162,6 +163,10 @@
CheckStyleRanges(style_ranges_, text_.length());
#endif
cached_bounds_and_offset_valid_ = false;
+
+ // Reset selection model. SetText should always followed by SetSelectionModel
+ // or SetCursorPosition in upper layer.
+ SetSelectionModel(SelectionModel(0, 0, SelectionModel::LEADING));
}
void RenderText::ToggleInsertMode() {
@@ -188,10 +193,9 @@
// Cancelling a selection moves to the edge of the selection.
if (break_type != LINE_BREAK && !EmptySelection() && !select) {
// Use the selection start if it is left of the selection end.
- SelectionModel selection_start(GetSelectionStart(), GetSelectionStart(),
- SelectionModel::LEADING);
- if (GetCursorBounds(selection_start, false).x() <
- GetCursorBounds(position, false).x())
+ SelectionModel selection_start = GetSelectionModelForSelectionStart();
+ if (GetCursorBounds(selection_start, true).x() <
+ GetCursorBounds(position, true).x())
position = selection_start;
// For word breaks, use the nearest word boundary left of the selection.
if (break_type == WORD_BREAK)
@@ -210,10 +214,9 @@
// Cancelling a selection moves to the edge of the selection.
if (break_type != LINE_BREAK && !EmptySelection() && !select) {
// Use the selection start if it is right of the selection end.
- SelectionModel selection_start(GetSelectionStart(), GetSelectionStart(),
- SelectionModel::LEADING);
- if (GetCursorBounds(selection_start, false).x() >
- GetCursorBounds(position, false).x())
+ SelectionModel selection_start = GetSelectionModelForSelectionStart();
+ if (GetCursorBounds(selection_start, true).x() >
+ GetCursorBounds(position, true).x())
position = selection_start;
// For word breaks, use the nearest word boundary right of the selection.
if (break_type == WORD_BREAK)
@@ -353,7 +356,7 @@
cached_bounds_and_offset_valid_ = false;
}
-base::i18n::TextDirection RenderText::GetTextDirection() const {
+base::i18n::TextDirection RenderText::GetTextDirection() {
if (base::i18n::IsRTL())
return base::i18n::RIGHT_TO_LEFT;
return base::i18n::LEFT_TO_RIGHT;
@@ -430,7 +433,7 @@
if (x >= right) return SelectionModel(right_pos);
// binary searching the cursor position.
// TODO(oshima): use the center of character instead of edge.
- // Binary search may not work for language like arabic.
+ // Binary search may not work for language like Arabic.
while (std::abs(static_cast<long>(right_pos - left_pos)) > 1) {
int pivot_pos = left_pos + (right_pos - left_pos) / 2;
int pivot = font.GetStringWidth(text().substr(0, pivot_pos));
@@ -465,7 +468,7 @@
cursor_bounds_(),
cursor_visible_(false),
insert_mode_(true),
- composition_range_(),
+ composition_range_(ui::Range::InvalidRange()),
style_ranges_(),
default_style_(),
display_rect_(),
@@ -487,7 +490,7 @@
if (break_type == CHARACTER_BREAK)
return SelectionModel(pos, pos, SelectionModel::LEADING);
- // Notes: We always iterate words from the begining.
+ // Notes: We always iterate words from the beginning.
// This is probably fast enough for our usage, but we may
// want to modify WordIterator so that it can start from the
// middle of string and advance backwards.
@@ -519,6 +522,8 @@
SelectionModel RenderText::GetRightSelectionModel(const SelectionModel& current,
BreakType break_type) {
+ if (text_.empty())
+ return SelectionModel(0, 0, SelectionModel::LEADING);
if (break_type == LINE_BREAK)
return SelectionModel(text().length(),
GetIndexOfPreviousGrapheme(text().length()), SelectionModel::TRAILING);
@@ -652,9 +657,16 @@
// Show all text whenever the text fits to the size.
delta_offset = -display_offset_.x();
} else if (cursor_bounds_.right() > display_rect_.right()) {
+ // TODO(xji): when the character overflow is a RTL character, currently, if
+ // we pan cursor at the rightmost position, the entered RTL character is not
+ // displayed. Should pan cursor to show the last logical characters.
+ //
// Pan to show the cursor when it overflows to the right,
delta_offset = display_rect_.right() - cursor_bounds_.right();
} else if (cursor_bounds_.x() < display_rect_.x()) {
+ // TODO(xji): have similar problem as above when overflow character is a
+ // LTR character.
+ //
// Pan to show the cursor when it overflows to the left.
delta_offset = display_rect_.x() - cursor_bounds_.x();
}
@@ -662,4 +674,18 @@
cursor_bounds_.Offset(delta_offset, 0);
}
+SelectionModel RenderText::GetSelectionModelForSelectionStart() {
+ size_t selection_start = GetSelectionStart();
+ size_t selection_end = GetCursorPosition();
+ if (selection_start < selection_end)
+ return SelectionModel(selection_start,
+ selection_start,
+ SelectionModel::LEADING);
+ else if (selection_start > selection_end)
+ return SelectionModel(selection_start,
+ GetIndexOfPreviousGrapheme(selection_start),
+ SelectionModel::TRAILING);
+ return selection_model_;
+}
+
} // namespace gfx
« no previous file with comments | « ui/gfx/render_text.h ('k') | ui/gfx/render_text_linux.h » ('j') | ui/gfx/render_text_linux.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698