| // Copyright 2010-2014, Google Inc. |
| // All rights reserved. |
| // |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions are |
| // met: |
| // |
| // * Redistributions of source code must retain the above copyright |
| // notice, this list of conditions and the following disclaimer. |
| // * Redistributions in binary form must reproduce the above |
| // copyright notice, this list of conditions and the following disclaimer |
| // in the documentation and/or other materials provided with the |
| // distribution. |
| // * Neither the name of Google Inc. nor the names of its |
| // contributors may be used to endorse or promote products derived from |
| // this software without specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| // A class handling the converter on the session layer. |
| |
| #ifndef MOZC_SESSION_SESSION_CONVERTER_INTERFACE_H_ |
| #define MOZC_SESSION_SESSION_CONVERTER_INTERFACE_H_ |
| |
| #include <string> |
| |
| #include "base/port.h" |
| #include "converter/segments.h" |
| #include "transliteration/transliteration.h" |
| |
| namespace mozc { |
| class ConverterInterface; |
| |
| namespace commands { |
| class Context; |
| class Output; |
| class Request; |
| } |
| |
| namespace composer { |
| class Composer; |
| } |
| |
| namespace session { |
| class CandidateList; |
| |
| struct ConversionPreferences { |
| bool use_history; |
| int max_history_size; |
| |
| // This is a flag to check if the converter should return the suggestion |
| // or not. Indeed, the design is actually twisted, because clients should |
| // be able to avoid the invocation of SessionConverter::Suggest, if they'd |
| // like. However, The current SessionConverter's architecture is too |
| // complicated and has too many limitations to ensure the full state |
| // transition. In order to support "skipping suggestion" for the performance |
| // without current client's breakage in short period, this flag is |
| // introduced. |
| // TODO(hidehiko,komatsu): Remove this flag, when the full SessionConverter |
| // refactoring is done and gets safer for future development/extensions. |
| bool request_suggestion; |
| }; |
| |
| // Do not forget to update SessionConverter::SetOperationPreferences() |
| // when update this struct. |
| struct OperationPreferences { |
| bool use_cascading_window; |
| string candidate_shortcuts; |
| OperationPreferences() { |
| #ifdef OS_LINUX |
| // TODO(komatsu): Move this logic to the client code. |
| use_cascading_window = false; |
| #else |
| use_cascading_window = true; |
| #endif |
| } |
| }; |
| |
| // Class handling ConverterInterface with a session state. This class |
| // support stateful operations related with the converter. |
| class SessionConverterInterface { |
| public: |
| SessionConverterInterface() {} |
| virtual ~SessionConverterInterface() {} |
| |
| // Update OperationPreferences. |
| virtual void SetOperationPreferences(const OperationPreferences &preferences) |
| = 0; |
| |
| typedef int States; |
| enum State { |
| NO_STATE = 0, |
| COMPOSITION = 1, |
| SUGGESTION = 2, |
| PREDICTION = 4, |
| CONVERSION = 8, |
| }; |
| |
| // Check if the current state is in the state bitmap. |
| virtual bool CheckState(States) const = 0; |
| |
| // Indicate if the conversion session is active or not. In general, |
| // Convert functions make it active and Cancel, Reset and Commit |
| // functions make it deactive. |
| virtual bool IsActive() const = 0; |
| |
| // Return the default conversion preferences to be used for custom |
| // conversion. |
| virtual const ConversionPreferences &conversion_preferences() const = 0; |
| |
| // Gets the selected candidate. If no candidate is selected, returns NULL. |
| virtual const Segment::Candidate * |
| GetSelectedCandidateOfFocusedSegment() const = 0; |
| |
| // Send a conversion request to the converter. |
| virtual bool Convert(const composer::Composer &composer) = 0; |
| virtual bool ConvertWithPreferences( |
| const composer::Composer &composer, |
| const ConversionPreferences &preferences) = 0; |
| |
| // Get reading text (e.g. from "猫" to "ねこ"). |
| virtual bool GetReadingText(const string &str, string *reading) = 0; |
| |
| // Send a transliteration request to the converter. |
| virtual bool ConvertToTransliteration( |
| const composer::Composer &composer, |
| transliteration::TransliterationType type) = 0; |
| |
| // Convert the current composition to half-width characters. |
| // NOTE(komatsu): This function might be merged to ConvertToTransliteration. |
| virtual bool ConvertToHalfWidth(const composer::Composer &composer) = 0; |
| |
| // Switch the composition to Hiragana, full-width Katakana or |
| // half-width Katakana by rotation. |
| virtual bool SwitchKanaType(const composer::Composer &composer) = 0; |
| |
| // Send a suggestion request to the converter. |
| virtual bool Suggest(const composer::Composer &composer) = 0; |
| virtual bool SuggestWithPreferences( |
| const composer::Composer &composer, |
| const ConversionPreferences &preferences) = 0; |
| |
| // Send a prediction request to the converter. |
| virtual bool Predict(const composer::Composer &composer) = 0; |
| virtual bool PredictWithPreferences( |
| const composer::Composer &composer, |
| const ConversionPreferences &preferences) = 0; |
| |
| // Send a prediction request to the converter. |
| // The result is added at the tail of existing candidate list as "suggestion" |
| // candidates. |
| virtual bool ExpandSuggestion(const composer::Composer &composer) = 0; |
| virtual bool ExpandSuggestionWithPreferences( |
| const composer::Composer &composer, |
| const ConversionPreferences &preferences) = 0; |
| |
| // Clear conversion segments, but keep the context. |
| virtual void Cancel() = 0; |
| |
| // Clear conversion segments and the context. |
| virtual void Reset() = 0; |
| |
| // Fix the conversion with the current status. |
| virtual void Commit(const composer::Composer &composer, |
| const commands::Context &context) = 0; |
| |
| // Fix the suggestion candidate. True is returned if the selected |
| // candidate is successfully committed. |
| virtual bool CommitSuggestionByIndex( |
| size_t index, |
| const composer::Composer &composer, |
| const commands::Context &context, |
| size_t *committed_key_size) = 0; |
| |
| // Select a candidate and commit the selected candidate. True is |
| // returned if the selected candidate is successfully committed. |
| virtual bool CommitSuggestionById( |
| int id, |
| const composer::Composer &composer, |
| const commands::Context &context, |
| size_t *committed_key_size) = 0; |
| |
| // Fix only the conversion of the first segment, and keep the rest. |
| // The caller should delete characters from composer based on returned |
| // |committed_key_size|. |
| virtual void CommitFirstSegment(const composer::Composer &composer, |
| const commands::Context &context, |
| size_t *committed_key_size) = 0; |
| |
| // Fix only the [0, focused] conversion segments, and keep the rest. |
| // The caller should delete characters from composer based on returned |
| // |committed_key_size|. |
| virtual void CommitHeadToFocusedSegments( |
| const composer::Composer &composer, |
| const commands::Context &context, |
| size_t *committed_key_size) = 0; |
| |
| // Commit the preedit string represented by Composer. |
| virtual void CommitPreedit(const composer::Composer &composer, |
| const commands::Context &context) = 0; |
| |
| // Commit prefix of the preedit string represented by Composer. |
| // The caller should delete characters from composer based on returned |
| // |commited_size|. |
| virtual void CommitHead(size_t count, |
| const composer::Composer &composer, |
| size_t *commited_size) = 0; |
| |
| // Revert the last "Commit" operation |
| virtual void Revert() = 0; |
| |
| // Move the focus of segments. |
| virtual void SegmentFocusRight() = 0; |
| virtual void SegmentFocusLast() = 0; |
| virtual void SegmentFocusLeft() = 0; |
| virtual void SegmentFocusLeftEdge() = 0; |
| |
| // Resize the focused segment. |
| virtual void SegmentWidthExpand(const composer::Composer &composer) = 0; |
| virtual void SegmentWidthShrink(const composer::Composer &composer) = 0; |
| |
| // Move the focus of candidates. |
| virtual void CandidateNext(const composer::Composer &composer) = 0; |
| virtual void CandidateNextPage() = 0; |
| virtual void CandidatePrev() = 0; |
| virtual void CandidatePrevPage() = 0; |
| // Move the focus to the candidate represented by the id. |
| virtual void CandidateMoveToId( |
| int id, const composer::Composer &composer) = 0; |
| // Move the focus to the index from the beginning of the current page. |
| virtual void CandidateMoveToPageIndex(size_t index) = 0; |
| // Move the focus to the candidate represented by the shortcut. If |
| // the shortcut is not bound with any candidate, false is returned. |
| virtual bool CandidateMoveToShortcut(char shortcut) = 0; |
| |
| // Operation for the candidate list. |
| virtual void SetCandidateListVisible(bool visible) = 0; |
| |
| // Fill protocol buffers and update internal status. |
| virtual void PopOutput( |
| const composer::Composer &composer, commands::Output *output) = 0; |
| |
| // Fill protocol buffers |
| virtual void FillOutput( |
| const composer::Composer &composer, |
| commands::Output *output) const = 0; |
| |
| // Set setting by the request. |
| // Currently this is especially for SessionConverter. |
| virtual void SetRequest(const commands::Request *request) = 0; |
| |
| // Update the internal state by the context. |
| virtual void OnStartComposition(const commands::Context &context) = 0; |
| |
| // Clone instance. |
| // Callee object doesn't have the ownership of the cloned instance. |
| virtual SessionConverterInterface *Clone() const = 0; |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(SessionConverterInterface); |
| }; |
| |
| } // namespace session |
| } // namespace mozc |
| |
| #endif // MOZC_SESSION_SESSION_CONVERTER_INTERFACE_H_ |