// 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 #include "rapidjson/document.h" namespace flutter { // Handles underlying text input state, using a simple ASCII model. // // Ignores special states like "insert mode" for now. class TextInputModel { public: TextInputModel(int client_id, const rapidjson::Value& config); 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 character. // // Either appends after the cursor (when selection base and extent are the // same), or deletes the selected characters, replacing the text with the // character specified. void AddCharacter(char32_t c); // 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 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. Changes base and extent to be // equal to either the extent (if extent is at the end of the string), or // for extent to be equal to bool MoveCursorBack(); // Attempts to move the cursor forward. // // Returns true if the cursor could be moved. bool MoveCursorForward(); // Attempts to move the cursor to the beginning. // // Returns true if the cursor could be moved. void MoveCursorToBeginning(); // Attempts to move the cursor to the back. // // Returns true if the cursor could be moved. void MoveCursorToEnd(); // Returns the state in the form of a platform message. std::unique_ptr GetState() const; // Id of the text input client. int client_id() const { return client_id_; } // Keyboard type of the client. See available options: // https://docs.flutter.io/flutter/services/TextInputType-class.html std::string input_type() const { return input_type_; } // An action requested by the user on the input client. See available options: // https://docs.flutter.io/flutter/services/TextInputAction-class.html std::string input_action() const { return input_action_; } private: void DeleteSelected(); std::u32string text_; int client_id_; std::string input_type_; std::string input_action_; std::u32string::iterator selection_base_; std::u32string::iterator selection_extent_; }; } // namespace flutter #endif // FLUTTER_SHELL_PLATFORM_CPP_TEXT_INPUT_MODEL_H_