blob: c1059f26cc88fa44d867098879eff464ed23b3d5 [file] [log] [blame]
// Copyright 2010-2015, 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_