// 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 #include 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(selection_base_ - text_.begin()); } // The position of the cursor. int selection_extent() const { return static_cast(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_