Chromium Code Reviews| Index: views/controls/textfield/textfield_views_model.h |
| diff --git a/views/controls/textfield/textfield_views_model.h b/views/controls/textfield/textfield_views_model.h |
| index c7e7e9a2ffe15bbcd65201847a38fb4c07d84fa4..285ab17cf60eea58a8f9acbd2b0344c781bbb09f 100644 |
| --- a/views/controls/textfield/textfield_views_model.h |
| +++ b/views/controls/textfield/textfield_views_model.h |
| @@ -10,6 +10,7 @@ |
| #include "base/string16.h" |
| #include "third_party/skia/include/core/SkColor.h" |
| +#include "ui/base/ime/composition.h" |
| #include "ui/gfx/rect.h" |
| namespace gfx { |
| @@ -26,7 +27,19 @@ namespace views { |
| // It supports editing, selection and cursor manipulation. |
| class TextfieldViewsModel { |
| public: |
| - TextfieldViewsModel(); |
| + |
| + // Delegate interface implemented by the textfield view class to provided |
| + // additional functionalities required by the model. |
| + class Delegate { |
| + public: |
| + // Called when the current composition text is confirmed or cleared. |
| + virtual void OnCompositionConfirmedOrCleared() = 0; |
| + |
| + protected: |
| + virtual ~Delegate() {} |
|
oshima
2011/03/22 01:50:39
move this to .cc.
James Su
2011/03/22 08:41:14
Done.
|
| + }; |
| + |
| + explicit TextfieldViewsModel(Delegate* delegate); |
| virtual ~TextfieldViewsModel(); |
| // Text fragment info. Used to draw selected text. |
| @@ -34,13 +47,16 @@ class TextfieldViewsModel { |
| // in the future to support multi-color text |
| // for omnibox. |
| struct TextFragment { |
| - TextFragment(size_t b, size_t e, bool s) |
| - : begin(b), end(e), selected(s) { |
| + TextFragment(size_t s, size_t e, bool sel, bool u) |
| + : start(s), end(e), selected(sel), underline(u) { |
| } |
| - // The begin and end position of text fragment. |
| - size_t begin, end; |
| + // The start and end position of text fragment. |
| + size_t start, end; |
| // True if the text is selected. |
| bool selected; |
| + // True if the text has underline. |
| + // TODO(suzhe): support underline color and thick style. |
| + bool underline; |
| }; |
| typedef std::vector<TextFragment> TextFragments; |
| @@ -55,25 +71,41 @@ class TextfieldViewsModel { |
| // Edit related methods. |
| // Sest the text. Returns true if the text has been modified. |
| + // The current composition text will be confirmed first. |
| bool SetText(const string16& text); |
| + // Inserts given |text| at the current cursor position. |
| + // The current composition text will be cleared. |
| + void InsertText(const string16& text); |
| + |
| // Inserts a character at the current cursor position. |
| - void Insert(char16 c); |
| + void InsertChar(char16 c) { |
| + InsertText(string16(&c, 1)); |
| + } |
| + |
| + // Replaces characters at the current position with characters in given text. |
| + // The current composition text will be cleared. |
| + void ReplaceText(const string16& text); |
| // Replaces the char at the current position with given character. |
| - void Replace(char16 c); |
| + void ReplaceChar(char16 c) { |
| + ReplaceText(string16(&c, 1)); |
| + } |
| // Appends the text. |
| + // The current composition text will be confirmed. |
| void Append(const string16& text); |
| // Deletes the first character after the current cursor position (as if, the |
| // the user has pressed delete key in the textfield). Returns true if |
| // the deletion is successful. |
| + // If there is composition text, it'll be deleted instead. |
| bool Delete(); |
| // Deletes the first character before the current cursor position (as if, the |
| // the user has pressed backspace key in the textfield). Returns true if |
| // the removal is successful. |
| + // If there is composition text, it'll be deleted instead. |
| bool Backspace(); |
| // Cursor related methods. |
| @@ -83,31 +115,38 @@ class TextfieldViewsModel { |
| // Moves the cursor left by one position (as if, the user has pressed the left |
| // arrow key). If |select| is true, it updates the selection accordingly. |
| + // The current composition text will be confirmed. |
| void MoveCursorLeft(bool select); |
| // Moves the cursor right by one position (as if, the user has pressed the |
| // right arrow key). If |select| is true, it updates the selection |
| // accordingly. |
| + // The current composition text will be confirmed. |
| void MoveCursorRight(bool select); |
| // Moves the cursor left by one word (word boundry is defined by space). |
| // If |select| is true, it updates the selection accordingly. |
| + // The current composition text will be confirmed. |
| void MoveCursorToPreviousWord(bool select); |
| // Moves the cursor right by one word (word boundry is defined by space). |
| // If |select| is true, it updates the selection accordingly. |
| + // The current composition text will be confirmed. |
| void MoveCursorToNextWord(bool select); |
| // Moves the cursor to start of the textfield contents. |
| // If |select| is true, it updates the selection accordingly. |
| - void MoveCursorToStart(bool select); |
| + // The current composition text will be confirmed. |
| + void MoveCursorToHome(bool select); |
| // Moves the cursor to end of the textfield contents. |
| // If |select| is true, it updates the selection accordingly. |
| + // The current composition text will be confirmed. |
| void MoveCursorToEnd(bool select); |
| // Moves the cursor to the specified |position|. |
| // If |select| is true, it updates the selection accordingly. |
| + // The current composition text will be confirmed. |
| bool MoveCursorTo(size_t position, bool select); |
| // Returns the bounds of character at the current cursor. |
| @@ -120,15 +159,19 @@ class TextfieldViewsModel { |
| void GetSelectedRange(ui::Range* range) const; |
| + // The current composition text will be confirmed. |
| void SelectRange(const ui::Range& range); |
| // Selects all text. |
| + // The current composition text will be confirmed. |
| void SelectAll(); |
| // Selects the word at which the cursor is currently positioned. |
| + // The current composition text will be confirmed. |
| void SelectWord(); |
| // Clears selection. |
| + // The current composition text will be confirmed. |
| void ClearSelection(); |
| // Returns visible text. If the field is password, it returns the |
| @@ -148,15 +191,43 @@ class TextfieldViewsModel { |
| // if text has changed after pasting. |
| bool Paste(); |
| - // Tells if any text is selected. |
| + // Tells if any text is selected, even if the selection is in composition |
| + // text. |
|
oshima
2011/03/22 01:50:39
Is this true? Looks like this only checks selectio
James Su
2011/03/22 08:41:14
It's true. selection_start_ and _end_ are also use
|
| bool HasSelection() const; |
| + // Deletes the selected text. This method shouldn't be called with |
| + // composition text. |
| + void DeleteSelection(); |
| + |
| + // Retrieves the text content in a given range. |
| + string16 GetTextFromRange(const ui::Range& range) const; |
| + |
| + // Retrieves the range containing all text in the model. |
| + void GetTextRange(ui::Range* range) const; |
| + |
| + // Sets composition text and attributes. If there is composition text already, |
| + // it’ll be replaced by the new one. Otherwise, current selection will be |
| + // replaced. If there is no selection, the composition text will be inserted |
| + // at the insertion point. |
| + // Any changes to the model except text insertion will confirm the current |
| + // composition text. |
| + void SetComposition(const ui::Composition& composition); |
| + |
| + // Converts current composition text into final content. |
| + void ConfirmComposition(); |
| + |
| + // Removes current composition text. |
| + void ClearComposition(); |
| + |
| + // Retrieves the range of current composition text. |
| + void GetCompositionRange(ui::Range* range) const; |
| + |
| + // Returns true if there is composition text. |
| + bool HasComposition() const; |
| + |
| private: |
| friend class NativeTextfieldViews; |
| - // Deletes the selected text. |
| - void DeleteSelection(); |
| - |
| // Returns the visible text given |start| and |end|. |
| string16 GetVisibleText(size_t start, size_t end) const; |
| @@ -167,6 +238,8 @@ class TextfieldViewsModel { |
| // text length. |
| size_t GetSafePosition(size_t position) const; |
| + Delegate* delegate_; |
| + |
| // The text in utf16 format. |
| string16 text_; |
| @@ -174,7 +247,14 @@ class TextfieldViewsModel { |
| size_t cursor_pos_; |
| // Selection range. |
| - size_t selection_begin_; |
| + size_t selection_start_; |
| + |
| + // Composition range. |
| + size_t composition_start_; |
| + size_t composition_end_; |
| + |
| + // Underline information of the composition text. |
| + ui::CompositionUnderlines composition_underlines_; |
| // True if the text is the password. |
| bool is_password_; |