#pragma once #include "../Resource.hpp" #include "Base.hpp" #include "cru/common/Event.hpp" #include #include #include namespace cru::platform::native { struct CompositionClause { int start; int end; bool target; }; using CompositionClauses = std::vector; struct CompositionText { std::u16string text; CompositionClauses clauses; TextRange selection; }; // inline std::basic_ostream& operator<<( // std::basic_ostream& stream, // const CompositionText& composition_text) { // stream << u"text: " << composition_text.text << u"\n" << u"clauses:\n"; // for (int i = 0; i < static_cast(composition_text.clauses.size()); i++) { // const auto& clause = composition_text.clauses[i]; // stream << u"\t" << i << u". start:" << clause.start << u" end:" // << clause.end; // if (clause.target) { // stream << u" target"; // } // stream << u"\n"; // } // stream << u"selection: position:" << composition_text.selection.position // << u" count:" << composition_text.selection.count; // return stream; // } struct IInputMethodContext : virtual INativeResource { // Return true if you should draw composition text manually. Return false if // system will take care of that for you. virtual bool ShouldManuallyDrawCompositionText() = 0; virtual void EnableIME() = 0; virtual void DisableIME() = 0; virtual void CompleteComposition() = 0; virtual void CancelComposition() = 0; virtual CompositionText GetCompositionText() = 0; // Set the candidate window lefttop. Use this method to prepare typing. virtual void SetCandidateWindowPosition(const Point& point) = 0; // Triggered when user starts composition. virtual IEvent* CompositionStartEvent() = 0; // Triggered when user stops composition. virtual IEvent* CompositionEndEvent() = 0; // Triggered every time composition text changes. virtual IEvent* CompositionEvent() = 0; virtual IEvent* TextEvent() = 0; }; struct IInputMethodManager : virtual INativeResource { virtual std::unique_ptr GetContext( INativeWindow* window) = 0; }; } // namespace cru::platform::native