// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Next MinVersion: 12

module arc.mojom;

import "components/arc/mojom/gfx.mojom";

// Represents the type of text input field currently focused.
[Extensible]
enum TextInputType {
  NONE,
  TEXT,
  PASSWORD,
  SEARCH,
  EMAIL,
  NUMBER,
  TELEPHONE,
  URL,
  DATE,
  TIME,
  DATETIME,
};

// Maps to ui::TextInputFlags in ui/base/ime/text_input_flags.h.
// Some flags are still missing here because they're not yet supported in ARC++
// IME.
const int32 TEXT_INPUT_FLAG_NONE = 0;
const int32 TEXT_INPUT_FLAG_AUTOCAPITALIZE_NONE = 64;         // 1 << 6
const int32 TEXT_INPUT_FLAG_AUTOCAPITALIZE_CHARACTERS = 128;  // 1 << 7
const int32 TEXT_INPUT_FLAG_AUTOCAPITALIZE_WORDS = 256;       // 1 << 8
const int32 TEXT_INPUT_FLAG_AUTOCAPITALIZE_SENTENCES = 512;   // 1 << 9

// Represents a single segment of text currently composed by IME.
struct CompositionSegment {
  // Start offset of the segment in UTF-16 index.
  uint32 start_offset;
  // End offset of the segment in UTF-16 index.
  uint32 end_offset;
  // Indicates that this segment should be emphasized.
  bool emphasized;
};

// Next method ID: 6
interface ImeHost {
  // Notifies Chrome that the text input focus is changed.
  // Each bit of the bitmask |flags| corresponds to TEXT_INPUT_FLAG_*.
  OnTextInputTypeChanged@0(
      TextInputType type,
      [MinVersion=10] bool is_personalized_learning_allowed,
      [MinVersion=11] int32 flags);

  // Notifies Chrome that the cursor poisition has changed.
  //
  // |rect| describes the coordinates in physical pixels.
  // If |is_screen_coordinates| is set to true, its origin (0,0) is the top-left
  // of the primary display. Otherwise it is the top-left of the window that has
  // the IME focus.
  OnCursorRectChanged@1(Rect rect,
                        [MinVersion=8] bool is_screen_coordinates);

  // Notifies Chrome that the current composition is canceled.
  [MinVersion=1] OnCancelComposition@2();

  // Show virtual keyboard of Chrome OS if needed.
  [MinVersion=2] ShowVirtualKeyboardIfEnabled@3();

  // Notifies Chrome that the cursor position has changed and
  // also sends surrounding text.
  //
  // |rect| describes the coordinates in physical pixels.
  // If |is_screen_coordinates| is set to true, its origin (0,0) is the top-left
  // of the primary display. Otherwise it is the top-left of the window that has
  // the IME focus.
  //
  // |text_range|, |text_in_range| and |selection_range| are piggy-backed
  // into this method because Chrome OS IME tries to retrieve these information
  // synchronously, so we need to update them all at once to keep consistency.
  [MinVersion=5] OnCursorRectChangedWithSurroundingText@4(
      Rect rect,              // The cursor position.
      Range text_range,       // The range of |text_in_range| in the current
                                  // text in the editor.
      string text_in_range,       // The text around the cursor.
      Range selection_range,  // The range of the selected text
                                  // in the current text in the editor.
      [MinVersion=8] bool is_screen_coordinates  // Whether or not the |rect|
                                                 // are in screen coordinates.
      );

  // Requests Chrome to hide the virtual keyboard.
  // Howver, hiding can be canceled if a text field gets focus.
  // TODO(yhanada): We might be able to remove this method by adding an argument
  //                to OnTextInputTypeChanged().
  [MinVersion=9] RequestHideIme@5();
};

// Next method ID: 7
interface ImeInstance {
  // DEPRECATED: Please use Init@6 instead.
  InitDeprecated@0(ImeHost host_ptr);

  // Establishes full-duplex communication with the host.
  [MinVersion=6] Init@6(ImeHost host_ptr) => ();

  // Sets composition text and attributes requested by the host IME.
  SetCompositionText@1(string text, array<CompositionSegment> segments);

  // Commits the last set composition text and clears the composition.
  ConfirmCompositionText@2();

  // Commits the specified text and clears the composition.
  InsertText@3(string text);

  // Informs the virtual keyboard availability and bounds on screen is changing.
  // |is_available| whether a virtual keyboard is visible or not.
  // |new_bounds| Represents a virtual keyboard bounds covering below windows in
  // screen coordinate. physical pixel as a unit.
  [MinVersion=3] OnKeyboardAppearanceChanging@4(
      Rect new_bounds,
      [MinVersion=7] bool is_available);

  // Deletes current selection plus the specified number of char16 values
  // before and after selection or caret.
  [MinVersion=4] ExtendSelectionAndDelete@5(uint64 before, uint64 after);
};
