| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef FLUTTER_SHELL_PLATFORM_CPP_TEXT_INPUT_MODEL_H_ |
| #define FLUTTER_SHELL_PLATFORM_CPP_TEXT_INPUT_MODEL_H_ |
| |
| #include <memory> |
| #include <string> |
| |
| namespace flutter { |
| // Handles underlying text input state, using a simple ASCII model. |
| // |
| // Ignores special states like "insert mode" for now. |
| class TextInputModel { |
| public: |
| TextInputModel(); |
| virtual ~TextInputModel(); |
| |
| // Attempts to set the text state. |
| // |
| // Returns false if the state is not valid (base or extent are out of |
| // bounds, or base is less than extent). |
| bool SetEditingState(size_t selection_base, |
| size_t selection_extent, |
| const std::string& text); |
| |
| // Adds a Unicode code point. |
| // |
| // Either appends after the cursor (when selection base and extent are the |
| // same), or deletes the selected text, replacing it with the given |
| // code point. |
| void AddCodePoint(char32_t c); |
| |
| // Adds UTF-16 text. |
| // |
| // Either appends after the cursor (when selection base and extent are the |
| // same), or deletes the selected text, replacing it with the given text. |
| void AddText(const std::u16string& text); |
| |
| // Adds UTF-8 text. |
| // |
| // Either appends after the cursor (when selection base and extent are the |
| // same), or deletes the selected text, replacing it with the given text. |
| void AddText(const std::string& text); |
| |
| // Deletes either the selection, or one character ahead of the cursor. |
| // |
| // Deleting one character ahead of the cursor occurs when the selection base |
| // and extent are the same. |
| // |
| // Returns true if any deletion actually occurred. |
| bool Delete(); |
| |
| // Deletes text near the cursor. |
| // |
| // A section is made starting at @offset code points past the cursor (negative |
| // values go before the cursor). @count code points are removed. The selection |
| // may go outside the bounds of the text and will result in only the part |
| // selection that covers the available text being deleted. The existing |
| // selection is ignored and removed after this operation. |
| // |
| // Returns true if any deletion actually occurred. |
| bool DeleteSurrounding(int offset_from_cursor, int count); |
| |
| // Deletes either the selection, or one character behind the cursor. |
| // |
| // Deleting one character behind the cursor occurs when the selection base |
| // and extent are the same. |
| // |
| // Returns true if any deletion actually occurred. |
| bool Backspace(); |
| |
| // Attempts to move the cursor backward. |
| // |
| // Returns true if the cursor could be moved. If a selection is active, moves |
| // to the start of the selection. |
| bool MoveCursorBack(); |
| |
| // Attempts to move the cursor forward. |
| // |
| // Returns true if the cursor could be moved. If a selection is active, moves |
| // to the end of the selection. |
| bool MoveCursorForward(); |
| |
| // Attempts to move the cursor to the beginning. |
| // |
| // Returns true if the cursor could be moved. |
| bool MoveCursorToBeginning(); |
| |
| // Attempts to move the cursor to the back. |
| // |
| // Returns true if the cursor could be moved. |
| bool MoveCursorToEnd(); |
| |
| // Gets the current text as UTF-8. |
| std::string GetText() const; |
| |
| // Gets the cursor position as a byte offset in UTF-8 string returned from |
| // GetText(). |
| int GetCursorOffset() const; |
| |
| // The position where the selection starts. |
| int selection_base() const { |
| return static_cast<int>(selection_base_ - text_.begin()); |
| } |
| |
| // The position of the cursor. |
| int selection_extent() const { |
| return static_cast<int>(selection_extent_ - text_.begin()); |
| } |
| |
| private: |
| void DeleteSelected(); |
| |
| std::u16string text_; |
| std::u16string::iterator selection_base_; |
| std::u16string::iterator selection_extent_; |
| |
| // Returns the left hand side of the selection. |
| std::u16string::iterator selection_start() { |
| return selection_base_ < selection_extent_ ? selection_base_ |
| : selection_extent_; |
| } |
| |
| // Returns the right hand side of the selection. |
| std::u16string::iterator selection_end() { |
| return selection_base_ > selection_extent_ ? selection_base_ |
| : selection_extent_; |
| } |
| }; |
| |
| } // namespace flutter |
| |
| #endif // FLUTTER_SHELL_PLATFORM_CPP_TEXT_INPUT_MODEL_H_ |