// 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.

// Protocol messages to be used for mozc configuration.
syntax = "proto2";

package mozc.config;

option java_outer_classname = "ProtoConfig";
option java_package = "org.mozc.android.inputmethod.japanese.protobuf";

message GeneralConfig {
  //////////////////////////////////////////////////////////////
  //
  // General config (1-9)
  //

  // config version, corresponding to the suffix of config file
  optional uint32 config_version = 1 [ default = 0 ];

  // The product version that wrote this config
  optional string last_modified_product_version = 2 [ default = "0.0.0.0" ];

  // last modified time in UTC second
  optional uint64 last_modified_time = 3 [ default = 0 ];

  // These fileds are not used now
  // platform of machine that wrote this config
  optional string platform = 4  [ default = "" ];

  // UI locale of machine that wrote this config
  optional string ui_locale = 5 [ default = "" ];

  // Whether to upload usage stats
  // This flag is used only for Android.
  optional bool upload_usage_stats = 6 [default = false];
};

message OBSOLETE_SyncConfig {
  optional bool use_config_sync = 1 [ default = false ];
  optional bool use_user_dictionary_sync = 2 [ default = false ];
  optional bool use_user_history_sync = 3 [ default = false ];
  optional bool use_learning_preference_sync = 4 [ default = false ];
  optional bool use_contact_list_sync = 5 [ default = false ];
};

message Config {
  // General config and logging/debugging:
  // We won't use 2-9 and 20-39 ids anymore for historical reasons.
  optional GeneralConfig general_config = 1;

  //////////////////////////////////////////////////////////////
  //
  // Logging/Debugging (10-19)
  //

  // set verbose level of logging library (FLAGS_v)
  optional int32 verbose_level = 10 [ default = 0 ];

  // This flag is not used
  optional bool DEPRECATED_log_all_commands = 11 [ default = false ];

  //////////////////////////////////////////////////////////////
  //
  // Misc fields (20-39)
  //

  // Incognito mode:
  // Disable all mutable operation if incognito_mode is true
  optional bool incognito_mode = 20 [default = false];

  // whether to show the set default dialog on startup
  optional bool check_default = 22 [ default = true ];

  // Presentation mode:
  // disable all suggestion temporally.
  optional bool presentation_mode = 23 [ default = false ];

  //////////////////////////////////////////////////////////////
  //
  // Basic features (40-79)
  //
  enum PreeditMethod {
    ROMAN = 0;
    KANA = 1;
  };

  // Roman/Kana
  optional PreeditMethod preedit_method = 40 [default = ROMAN];

  enum SessionKeymap {
    // If NONE is selected, it will be replaced with MSIME or KOTOERI.
    // NONE is used only for a placeholder, so a configuration program
    // should not show NONE as one of selections.  NONE should be the
    // last of the items due to the limitation of the Qt GUI's
    // implementation. Note that keymap number should be correspoinding
    // to the index of QComboBox in config dialog. Since NONE is not
    // used, we set -1 here.
    NONE = -1;
    CUSTOM = 0;
    ATOK = 1;
    MSIME = 2;
    KOTOERI = 3;
    MOBILE = 4;
    CHROMEOS = 5;
  };
  optional SessionKeymap session_keymap = 41 [default = NONE];

  // custom keymap
  // TODO(taku): replace it with repeated field
  optional bytes custom_keymap_table = 42;

  // custom roman table
  optional bytes custom_roman_table = 43;

  enum PunctuationMethod {
    KUTEN_TOUTEN = 0;
    COMMA_PERIOD = 1;
    KUTEN_PERIOD = 2;
    COMMA_TOUTEN = 3;
  };
  optional PunctuationMethod punctuation_method = 45 [default = KUTEN_TOUTEN];

  enum SymbolMethod {
    CORNER_BRACKET_MIDDLE_DOT = 0;
    SQUARE_BRACKET_SLASH = 1;
    CORNER_BRACKET_SLASH = 2;
    SQUARE_BRACKET_MIDDLE_DOT = 3;
  };
  optional SymbolMethod symbol_method = 46 [default = CORNER_BRACKET_MIDDLE_DOT];

  enum FundamentalCharacterForm {
    FUNDAMENTAL_INPUT_MODE = 0;   // follow the input mode
    FUNDAMENTAL_FULL_WIDTH = 1;   // always FullWidth
    FUNDAMENTAL_HALF_WIDTH = 2;   // always HalfWidth
  };
  optional FundamentalCharacterForm space_character_form = 47 [ default = FUNDAMENTAL_INPUT_MODE ];

  // If this flag is true, Mozc toggles preedit method with some predefined
  // key events when IME is turned on.  Otherwise, Mozc ignores such kind of
  // key events so that their preferred can be preserved even when the toggle
  // key is pressed by accident.
  // As for Mozc, only Windows client supports such kind of toggle so this flag
  // is currently valid only on Windows.
  //
  // Background:
  //   Traditional Japanese IMEs have used "Roma-Ji" key in Japanese 106/109
  //   keyboard to toggle the preedit method between Roman and Kana style and
  //   this behavior was finally adopted into JIS X 4064:2002 as a basic
  //   functionality which is expected to support by a Japanese Input Method.
  //   However, people who are not aware of this functionality have been
  //   puzzled because the default key stroke is likely to be pressed
  //   by accident.
  optional bool use_keyboard_to_change_preedit_method = 48 [ default = false ];

  // User history learning
  enum HistoryLearningLevel {
    DEFAULT_HISTORY = 0;
    READ_ONLY = 1;
    NO_HISTORY = 2;
  };
  optional HistoryLearningLevel history_learning_level = 50 [default = DEFAULT_HISTORY];

  enum SelectionShortcut {
    NO_SHORTCUT = 0;
    SHORTCUT_123456789 = 1;
    SHORTCUT_ASDFGHJKL = 2;
  };
  optional SelectionShortcut selection_shortcut = 52 [default = SHORTCUT_123456789];

  // character form (Halfwidth/Fullwidth
  enum CharacterForm {
    HALF_WIDTH = 0;
    FULL_WIDTH = 1;
    LAST_FORM = 2;
    NO_CONVERSION = 3;
  };
  message CharacterFormRule {
    optional string group = 1;
    optional CharacterForm preedit_character_form = 2 [ default = FULL_WIDTH ];
    optional CharacterForm conversion_character_form = 3 [ default = FULL_WIDTH ];
  };
  repeated CharacterFormRule character_form_rules = 54;

  // auto IME turn off feature
  optional bool use_auto_ime_turn_off = 56 [ default = true ];

  // Toggle to use cascanding window for debuging.
  optional bool use_cascading_window = 58 [ default = true ];

  // Shift key mode switch
  enum ShiftKeyModeSwitch {
    OFF = 0;  // Case insensitive
    ASCII_INPUT_MODE = 1;  // MSIME, ATOK behavior
    KATAKANA_INPUT_MODE = 2;  // Kotoeri behavior
  };
  optional ShiftKeyModeSwitch shift_key_mode_switch = 59 [ default = ASCII_INPUT_MODE ];

  enum NumpadCharacterForm {
    NUMPAD_INPUT_MODE = 0;
    NUMPAD_FULL_WIDTH = 1;
    NUMPAD_HALF_WIDTH = 2;
    NUMPAD_DIRECT_INPUT = 3;
  };
  optional NumpadCharacterForm numpad_character_form = 60 [ default = NUMPAD_HALF_WIDTH ];

  enum AutoConversionKey {
    AUTO_CONVERSION_OFF = 0;
    AUTO_CONVERSION_KUTEN = 1;
    AUTO_CONVERSION_TOUTEN = 2;
    AUTO_CONVERSION_QUESTION_MARK = 4;
    AUTO_CONVERSION_EXCLAMATION_MARK = 8;
  };
  optional bool use_auto_conversion = 61 [ default = false ];

  // can't use AutoConversionKey as a type since
  // undefined enum type is not correctly handled.
  optional uint32 auto_conversion_key = 62 [ default = 13 ];

  // Mac only config items: yen_sign_character and use_japanese_layout.
  enum YenSignCharacter {
    YEN_SIGN = 0;
    BACKSLASH = 1;
  };
  // Mac-original JIS key layout has "yen-sign" key which generates
  // U+00A5 instead of U+005C and sometimes users get troubles with
  // them because they expect backslashes which are rendered as
  // yen-sign.  If this configuration is BACKSLASH, Mozc will
  // interpret U+005C even when the original key event is U+00A5.
  optional YenSignCharacter yen_sign_character = 63 [ default = YEN_SIGN ];

  // Use Japanese keyboard layout even when the user uses other
  // keyboard layouts.  In Mac OSX people can use several keyboard
  // layouts such like French or Spanish but some people want to use
  // Japanese layout for Japanese.  See http://b/2917320
  optional bool use_japanese_layout = 64 [ default = false ];

  // Use kana modifier insensitive conversion.
  // e.g. かつこう -> 学校
  // Note that Request message has the same field.
  // - Request's one is controlled by the client. A user cannot control it.
  //   On the other hand Config's is under a user's control.
  // - Whether the feature is activated or not is decided by logical-AND
  //   of Request's and Config's.
  optional bool use_kana_modifier_insensitive_conversion = 65 [ default = false ];

  // Use typing correction feature.
  // e.g. sunkai -> 深海
  optional bool use_typing_correction = 66 [ default = false ];

  //////////////////////////////////////////////////////////////
  //
  // Dictionary (80-99)
  //
  optional bool use_date_conversion = 80 [ default = true ];
  optional bool use_single_kanji_conversion = 81 [ default = true ];
  optional bool use_symbol_conversion = 82 [ default = true ];
  optional bool use_number_conversion = 83 [ default = true ];
  optional bool use_emoticon_conversion = 84 [ default = true ];
  optional bool use_calculator = 85 [ default = true ];
  optional bool use_t13n_conversion = 86 [ default = true ];
  optional bool use_zip_code_conversion = 87  [ default = true ];
  optional bool use_spelling_correction = 88  [ default = true ];
  optional bool use_emoji_conversion = 89 [ default = false ];

  message InformationListConfig {
    optional bool use_local_usage_dictionary = 1 [ default = true ];
  };
  optional InformationListConfig information_list_config = 90;

  //////////////////////////////////////////////////////////////
  //
  // Suggest (100-119)
  //
  // Use history-based suggest feature.
  optional bool use_history_suggest = 100 [ default = true ];

  // Use dictionary-based suggest feature.
  optional bool use_dictionary_suggest = 101 [ default = true ];

  // Use realtime conversion feature.
  optional bool use_realtime_conversion = 102 [ default = true ];

  // Size of suggestions.
  optional uint32 suggestions_size = 110 [ default = 3 ];

  //////////////////////////////////////////////////////////////
  //
  // Renderer (120-139)
  //
  // Use mode indicator feature.
  optional bool use_mode_indicator = 120 [ default = true ];

  //////////////////////////////////////////////////////////////
  //
  // Cloud (300-319)
  //
  // Configuration for cloud sync feature. This field is obsolete.
  optional OBSOLETE_SyncConfig OBSOLETE_sync_config = 300;

  // Allow the cloud handwriting.  The handwriting UI has to notice
  // user before activating the feature, and set this field to true
  // when the user permit.
  // NOTE: OSS version does not handle this field.
  optional bool allow_cloud_handwriting = 301 [ default = false ];

};
