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..260d493c9cc7b4bca70645bced9e91568b31823c 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_text.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 OnCompositionTextConfirmedOrCleared() = 0; |
+ |
+ protected: |
+ virtual ~Delegate(); |
+ }; |
+ |
+ 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. |
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 SetCompositionText(const ui::CompositionText& composition); |
+ |
+ // Converts current composition text into final content. |
+ void ConfirmCompositionText(); |
+ |
+ // Removes current composition text. |
+ void ClearCompositionText(); |
+ |
+ // Retrieves the range of current composition text. |
+ void GetCompositionTextRange(ui::Range* range) const; |
+ |
+ // Returns true if there is composition text. |
+ bool HasCompositionText() 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,10 @@ class TextfieldViewsModel { |
// text length. |
size_t GetSafePosition(size_t position) const; |
+ // Pointer to a TextfieldViewsModel::Delegate instance, should be provided by |
+ // the View object. |
+ Delegate* delegate_; |
+ |
// The text in utf16 format. |
string16 text_; |
@@ -174,7 +249,14 @@ class TextfieldViewsModel { |
size_t cursor_pos_; |
// Selection range. |
- size_t selection_begin_; |
+ size_t selection_start_; |
+ |
+ // Composition text 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_; |