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

#include "ppapi/cpp/text_input_controller.h"

#include "ppapi/cpp/module_impl.h"
#include "ppapi/cpp/rect.h"
#include "ppapi/cpp/var.h"

namespace pp {

namespace {

template <> const char* interface_name<PPB_TextInputController_1_0>() {
  return PPB_TEXTINPUTCONTROLLER_INTERFACE_1_0;
}

}  // namespace


TextInputController::TextInputController(const InstanceHandle& instance)
    : instance_(instance) {
}

TextInputController::~TextInputController() {
}

void TextInputController::SetTextInputType(PP_TextInput_Type type) {
  if (has_interface<PPB_TextInputController_1_0>()) {
    get_interface<PPB_TextInputController_1_0>()->SetTextInputType(
        instance_.pp_instance(), type);
  }
}

void TextInputController::UpdateCaretPosition(const Rect& caret) {
  if (has_interface<PPB_TextInputController_1_0>()) {
    get_interface<PPB_TextInputController_1_0>()->UpdateCaretPosition(
        instance_.pp_instance(), &caret.pp_rect());
  }
}

void TextInputController::CancelCompositionText() {
  if (has_interface<PPB_TextInputController_1_0>()) {
    get_interface<PPB_TextInputController_1_0>()->CancelCompositionText(
        instance_.pp_instance());
  }
}

void TextInputController::UpdateSurroundingText(const Var& text,
                                                uint32_t caret,
                                                uint32_t anchor) {
  if (has_interface<PPB_TextInputController_1_0>()) {
    get_interface<PPB_TextInputController_1_0>()->UpdateSurroundingText(
        instance_.pp_instance(),
        text.pp_var(),
        caret,
        anchor);
  }
}


}  // namespace pp
