Chromium Code Reviews| Index: ui/gfx/render_text.cc |
| =================================================================== |
| --- ui/gfx/render_text.cc (revision 111848) |
| +++ ui/gfx/render_text.cc (working copy) |
| @@ -123,6 +123,8 @@ |
| // Reset selection model. SetText should always followed by SetSelectionModel |
| // or SetCursorPosition in upper layer. |
| SetSelectionModel(SelectionModel(0, 0, SelectionModel::LEADING)); |
| + |
| + UpdateLayout(); |
| } |
| void RenderText::ToggleInsertMode() { |
| @@ -344,57 +346,9 @@ |
| } |
| void RenderText::Draw(Canvas* canvas) { |
|
Alexei Svitkine (slow)
2011/11/29 15:41:37
Can you make this return early if text().empty()?
xji
2011/11/29 23:07:15
bypass DrawSelection and DrarVisualText when text(
|
| - // Clip the canvas to the text display area. |
| - canvas->ClipRect(display_rect_); |
| - |
| - // Draw the selection. |
| - std::vector<Rect> selection(GetSubstringBounds(GetSelectionStart(), |
| - GetCursorPosition())); |
| - SkColor selection_color = |
| - focused() ? kFocusedSelectionColor : kUnfocusedSelectionColor; |
| - for (std::vector<Rect>::const_iterator i = selection.begin(); |
| - i < selection.end(); ++i) { |
| - Rect r(*i); |
| - canvas->FillRect(selection_color, r); |
| - } |
| - |
| - // Create a temporary copy of the style ranges for composition and selection. |
| - StyleRanges style_ranges(style_ranges_); |
| - ApplyCompositionAndSelectionStyles(&style_ranges); |
| - |
| - // Draw the text. |
| - Rect bounds(display_rect_); |
| - bounds.Offset(GetUpdatedDisplayOffset()); |
| - for (StyleRanges::const_iterator i = style_ranges.begin(); |
| - i < style_ranges.end(); ++i) { |
| - const Font& font = !i->underline ? i->font : |
| - i->font.DeriveFont(0, i->font.GetStyle() | Font::UNDERLINED); |
| - string16 text = text_.substr(i->range.start(), i->range.length()); |
| - bounds.set_width(font.GetStringWidth(text)); |
| - canvas->DrawStringInt(text, font, i->foreground, bounds); |
| - |
| - // Draw the strikethrough. |
| - if (i->strike) { |
| - SkPaint paint; |
| - paint.setAntiAlias(true); |
| - paint.setStyle(SkPaint::kFill_Style); |
| - paint.setColor(i->foreground); |
| - paint.setStrokeWidth(kStrikeWidth); |
| - canvas->GetSkCanvas()->drawLine(SkIntToScalar(bounds.x()), |
| - SkIntToScalar(bounds.bottom()), |
| - SkIntToScalar(bounds.right()), |
| - SkIntToScalar(bounds.y()), |
| - paint); |
| - } |
| - |
| - bounds.set_x(bounds.x() + bounds.width()); |
| - } |
| - |
| - // Paint cursor. Replace cursor is drawn as rectangle for now. |
| - Rect cursor(GetUpdatedCursorBounds()); |
| - if (cursor_visible() && focused()) |
| - canvas->DrawRectInt(kCursorColor, cursor.x(), cursor.y(), |
| - cursor.width(), cursor.height()); |
| + DrawSelection(canvas); |
| + DrawVisualText(canvas); |
| + DrawCursor(canvas); |
| } |
| SelectionModel RenderText::FindCursorPosition(const Point& point) { |
| @@ -426,13 +380,6 @@ |
| return SelectionModel(left_pos); |
| } |
| -Rect RenderText::GetCursorBounds(const SelectionModel& selection, |
| - bool insert_mode) { |
| - size_t from = selection.selection_end(); |
| - size_t to = insert_mode ? from : std::min(text_.length(), from + 1); |
| - return GetSubstringBounds(from, to)[0]; |
| -} |
| - |
| const Rect& RenderText::GetUpdatedCursorBounds() { |
| UpdateCachedBoundsAndOffset(); |
| return cursor_bounds_; |
| @@ -549,24 +496,23 @@ |
| return SelectionModel(cursor, caret_pos, placement); |
| } |
| +void RenderText::SetSelectionModel(const SelectionModel& selection_model) { |
| + DCHECK_LE(selection_model.selection_start(), text().length()); |
| + selection_model_.set_selection_start(selection_model.selection_start()); |
| + DCHECK_LE(selection_model.selection_end(), text().length()); |
| + selection_model_.set_selection_end(selection_model.selection_end()); |
| + DCHECK_LT(selection_model.caret_pos(), |
| + std::max(text().length(), static_cast<size_t>(1))); |
| + selection_model_.set_caret_pos(selection_model.caret_pos()); |
| + selection_model_.set_caret_placement(selection_model.caret_placement()); |
| + |
| + cached_bounds_and_offset_valid_ = false; |
| +} |
| + |
| size_t RenderText::GetIndexOfPreviousGrapheme(size_t position) { |
| return IndexOfAdjacentGrapheme(position, false); |
| } |
| -std::vector<Rect> RenderText::GetSubstringBounds(size_t from, size_t to) { |
| - size_t start = std::min(from, to); |
| - size_t end = std::max(from, to); |
| - const Font& font = default_style_.font; |
| - int start_x = font.GetStringWidth(text().substr(0, start)); |
| - int end_x = font.GetStringWidth(text().substr(0, end)); |
| - Rect rect(start_x, 0, end_x - start_x, font.GetHeight()); |
| - rect.Offset(display_rect_.origin()); |
| - rect.Offset(GetUpdatedDisplayOffset()); |
| - // Center the rect vertically in |display_rect_|. |
| - rect.Offset(Point(0, (display_rect_.height() - rect.height()) / 2)); |
| - return std::vector<Rect>(1, rect); |
| -} |
| - |
| void RenderText::ApplyCompositionAndSelectionStyles( |
| StyleRanges* style_ranges) const { |
| // TODO(msw): This pattern ought to be reconsidered; what about composition |
| @@ -605,20 +551,6 @@ |
| return p; |
| } |
| -void RenderText::SetSelectionModel(const SelectionModel& selection_model) { |
| - DCHECK_LE(selection_model.selection_start(), text().length()); |
| - selection_model_.set_selection_start(selection_model.selection_start()); |
| - DCHECK_LE(selection_model.selection_end(), text().length()); |
| - selection_model_.set_selection_end(selection_model.selection_end()); |
| - DCHECK_LT(selection_model.caret_pos(), |
| - std::max(text().length(), static_cast<size_t>(1))); |
| - selection_model_.set_caret_pos(selection_model.caret_pos()); |
| - selection_model_.set_caret_placement(selection_model.caret_placement()); |
| - |
| - cached_bounds_and_offset_valid_ = false; |
| - UpdateLayout(); |
| -} |
| - |
| void RenderText::MoveCursorTo(size_t position, bool select) { |
| size_t cursor = std::min(position, text().length()); |
| size_t caret_pos = GetIndexOfPreviousGrapheme(cursor); |
| @@ -664,4 +596,21 @@ |
| cursor_bounds_.Offset(delta_offset, 0); |
| } |
| +void RenderText::DrawSelection(Canvas* canvas) { |
| + std::vector<Rect> sel; |
| + GetSubstringBounds(GetSelectionStart(), GetCursorPosition(), &sel); |
| + SkColor color = focused() ? kFocusedSelectionColor : kUnfocusedSelectionColor; |
| + for (std::vector<Rect>::const_iterator i = sel.begin(); i < sel.end(); ++i) |
| + canvas->FillRect(color, *i); |
| +} |
| + |
| +void RenderText::DrawCursor(Canvas* canvas) { |
| + // Paint cursor. Replace cursor is drawn as rectangle for now. |
| + // TODO(msw): Draw a better cursor with a better indication of association. |
| + if (cursor_visible() && focused()) { |
| + Rect r(GetUpdatedCursorBounds()); |
| + canvas->DrawRectInt(kCursorColor, r.x(), r.y(), r.width(), r.height()); |
| + } |
| +} |
| + |
| } // namespace gfx |