| Index: ui/gfx/render_text.h
|
| diff --git a/ui/gfx/render_text.h b/ui/gfx/render_text.h
|
| index 4346916bcf8968ed57e883fea9d29efec8f6f64a..6442ab86819a984f80736f7df774687da23999c8 100644
|
| --- a/ui/gfx/render_text.h
|
| +++ b/ui/gfx/render_text.h
|
| @@ -91,23 +91,6 @@ enum HorizontalAlignment {
|
| ALIGN_RIGHT,
|
| };
|
|
|
| -// VisualCursorDirection and LogicalCursorDirection represent directions of
|
| -// motion of the cursor in BiDi text. The combinations that make sense are:
|
| -//
|
| -// base::i18n::TextDirection VisualCursorDirection LogicalCursorDirection
|
| -// LEFT_TO_RIGHT CURSOR_LEFT CURSOR_BACKWARD
|
| -// LEFT_TO_RIGHT CURSOR_RIGHT CURSOR_FORWARD
|
| -// RIGHT_TO_LEFT CURSOR_RIGHT CURSOR_BACKWARD
|
| -// RIGHT_TO_LEFT CURSOR_LEFT CURSOR_FORWARD
|
| -enum VisualCursorDirection {
|
| - CURSOR_LEFT,
|
| - CURSOR_RIGHT
|
| -};
|
| -enum LogicalCursorDirection {
|
| - CURSOR_BACKWARD,
|
| - CURSOR_FORWARD
|
| -};
|
| -
|
| // RenderText represents an abstract model of styled text and its corresponding
|
| // visual layout. Support is built in for a cursor, a selection, simple styling,
|
| // complex scripts, and bi-directional text. Implementations provide mechanisms
|
| @@ -136,8 +119,6 @@ class UI_EXPORT RenderText {
|
| // Get the first font in |font_list_|.
|
| const Font& GetFont() const;
|
|
|
| - const SelectionModel& selection_model() const { return selection_model_; }
|
| -
|
| bool cursor_enabled() const { return cursor_enabled_; }
|
| void SetCursorEnabled(bool cursor_enabled);
|
|
|
| @@ -173,11 +154,11 @@ class UI_EXPORT RenderText {
|
| background_is_transparent_ = transparent;
|
| }
|
|
|
| - // This cursor position corresponds to SelectionModel::selection_end. In
|
| - // addition to representing the selection end, it's also where logical text
|
| - // edits take place, and doesn't necessarily correspond to
|
| - // SelectionModel::caret_pos.
|
| - size_t GetCursorPosition() const;
|
| + const SelectionModel& selection_model() const { return selection_model_; }
|
| +
|
| + const ui::Range& selection() const { return selection_model_.selection(); }
|
| +
|
| + size_t cursor_position() const { return selection_model_.caret_pos(); }
|
| void SetCursorPosition(size_t position);
|
|
|
| // Moves the cursor left or right. Cursor movement is visual, meaning that
|
| @@ -188,11 +169,10 @@ class UI_EXPORT RenderText {
|
| bool select);
|
|
|
| // Set the selection_model_ to the value of |selection|.
|
| - // The selection model components are modified if invalid.
|
| + // The selection range is clamped to text().length() if out of range.
|
| // Returns true if the cursor position or selection range changed.
|
| - // If |selectin_start_| or |selection_end_| or |caret_pos_| in
|
| - // |selection_model| is not a cursorable position (not on grapheme boundary),
|
| - // it is a NO-OP and returns false.
|
| + // If any index in |selection_model| is not a cursorable position (not on a
|
| + // grapheme boundary), it is a no-op and returns false.
|
| bool MoveCursorTo(const SelectionModel& selection_model);
|
|
|
| // Move the cursor to the position associated with the clicked point.
|
| @@ -207,19 +187,6 @@ class UI_EXPORT RenderText {
|
| // boundary), it is a NO-OP and returns false. Otherwise, returns true.
|
| bool SelectRange(const ui::Range& range);
|
|
|
| - size_t GetSelectionStart() const {
|
| - return selection_model_.selection_start();
|
| - }
|
| - size_t MinOfSelection() const {
|
| - return std::min(GetSelectionStart(), GetCursorPosition());
|
| - }
|
| - size_t MaxOfSelection() const {
|
| - return std::max(GetSelectionStart(), GetCursorPosition());
|
| - }
|
| - bool EmptySelection() const {
|
| - return GetSelectionStart() == GetCursorPosition();
|
| - }
|
| -
|
| // Returns true if the local point is over selected text.
|
| bool IsPointInSelection(const Point& point);
|
|
|
| @@ -245,8 +212,8 @@ class UI_EXPORT RenderText {
|
| // |GetTextDirection()|, not the direction of a particular run.
|
| VisualCursorDirection GetVisualDirectionOfLogicalEnd();
|
|
|
| - // Get the width of the entire string.
|
| - virtual int GetStringWidth() = 0;
|
| + // Get the size in pixels of the entire string.
|
| + virtual Size GetStringSize() = 0;
|
|
|
| void Draw(Canvas* canvas);
|
|
|
| @@ -258,8 +225,7 @@ class UI_EXPORT RenderText {
|
| // bounds of the associated glyph. These bounds are in local coordinates, but
|
| // may be outside the visible region if the text is longer than the textfield.
|
| // Subsequent text, cursor, or bounds changes may invalidate returned values.
|
| - virtual Rect GetCursorBounds(const SelectionModel& selection,
|
| - bool insert_mode) = 0;
|
| + Rect GetCursorBounds(const SelectionModel& selection, bool insert_mode);
|
|
|
| // Compute the current cursor bounds, panning the text to show the cursor in
|
| // the display rect if necessary. These bounds are in local coordinates.
|
| @@ -310,19 +276,24 @@ class UI_EXPORT RenderText {
|
|
|
| // Get the SelectionModels corresponding to visual text ends.
|
| // The returned value represents a cursor/caret position without a selection.
|
| - virtual SelectionModel EdgeSelectionModel(
|
| - VisualCursorDirection direction) = 0;
|
| + SelectionModel EdgeSelectionModel(VisualCursorDirection direction);
|
|
|
| // Sets the selection model, the argument is assumed to be valid.
|
| virtual void SetSelectionModel(const SelectionModel& model);
|
|
|
| - // Get the visual bounds containing the logical substring within |from| to
|
| - // |to|. If |from| equals |to|, the result is empty. These bounds could be
|
| - // visually discontinuous if the substring is split by a LTR/RTL level change.
|
| + // Get the height and horizontal bounds (relative to the left of the text, not
|
| + // the view) of the glyph starting at |index|. If the glyph is RTL then
|
| + // xspan->is_reversed(). This does not return a Rect because a Rect can't have
|
| + // a negative width.
|
| + virtual void GetGlyphBounds(size_t index, ui::Range* xspan, int* height) = 0;
|
| +
|
| + // Get the visual bounds containing the logical substring within the |range|.
|
| + // If |range| is empty, the result is empty. These bounds could be visually
|
| + // discontinuous if the substring is split by a LTR/RTL level change.
|
| // These bounds are in local coordinates, but may be outside the visible
|
| // region if the text is longer than the textfield. Subsequent text, cursor,
|
| // or bounds changes may invalidate returned values.
|
| - virtual std::vector<Rect> GetSubstringBounds(size_t from, size_t to) = 0;
|
| + virtual std::vector<Rect> GetSubstringBounds(ui::Range range) = 0;
|
|
|
| // Return true if cursor can appear in front of the character at |position|,
|
| // which means it is a grapheme boundary or the first character in the text.
|
| @@ -367,6 +338,12 @@ class UI_EXPORT RenderText {
|
| // Applies fade effects to |renderer|.
|
| void ApplyFadeEffects(internal::SkiaTextRenderer* renderer);
|
|
|
| + // A convenience function to check whether the glyph attached to the caret
|
| + // is within the given range.
|
| + static bool RangeContainsCaret(const ui::Range& range,
|
| + size_t caret_pos,
|
| + LogicalCursorDirection caret_affinity);
|
| +
|
| private:
|
| friend class RenderTextTest;
|
|
|
| @@ -376,7 +353,7 @@ class UI_EXPORT RenderText {
|
| FRIEND_TEST_ALL_PREFIXES(RenderTextTest, StyleRangesAdjust);
|
| FRIEND_TEST_ALL_PREFIXES(RenderTextTest, PasswordCensorship);
|
| FRIEND_TEST_ALL_PREFIXES(RenderTextTest, GraphemePositions);
|
| - FRIEND_TEST_ALL_PREFIXES(RenderTextTest, SelectionModels);
|
| + FRIEND_TEST_ALL_PREFIXES(RenderTextTest, EdgeSelectionModels);
|
| FRIEND_TEST_ALL_PREFIXES(RenderTextTest, OriginForSkiaDrawing);
|
|
|
| // Set the cursor to |position|, with the caret trailing the previous
|
|
|