15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/dev/text_input_dev.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppp_text_input_dev.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/instance.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/instance_handle.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module_impl.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/rect.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kPPPTextInputInterface[] = PPP_TEXTINPUT_DEV_INTERFACE;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RequestSurroundingText(PP_Instance instance,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            uint32_t desired_number_of_characters) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* object = Instance::GetPerInstanceObject(instance,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                kPPPTextInputInterface);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!object)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static_cast<TextInput_Dev*>(object)->RequestSurroundingText(
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      desired_number_of_characters);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPP_TextInput_Dev ppp_text_input = {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &RequestSurroundingText
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <> const char* interface_name<PPB_TextInput_Dev_0_2>() {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PPB_TEXTINPUT_DEV_INTERFACE_0_2;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <> const char* interface_name<PPB_TextInput_Dev_0_1>() {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PPB_TEXTINPUT_DEV_INTERFACE_0_1;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TextInput_Dev::TextInput_Dev(Instance* instance)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : instance_(instance) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Module::Get()->AddPluginInterface(kPPPTextInputInterface,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &ppp_text_input);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance->AddPerInstanceObject(kPPPTextInputInterface, this);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TextInput_Dev::~TextInput_Dev() {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Instance::RemovePerInstanceObject(instance_, kPPPTextInputInterface, this);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TextInput_Dev::RequestSurroundingText(uint32_t) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Default implementation. Send a null range.
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateSurroundingText(std::string(), 0, 0);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochvoid TextInput_Dev::SetTextInputType(PP_TextInput_Type_Dev type) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_interface<PPB_TextInput_Dev_0_2>()) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_interface<PPB_TextInput_Dev_0_2>()->SetTextInputType(
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance_.pp_instance(), type);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (has_interface<PPB_TextInput_Dev_0_1>()) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_interface<PPB_TextInput_Dev_0_1>()->SetTextInputType(
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance_.pp_instance(), type);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TextInput_Dev::UpdateCaretPosition(const Rect& caret,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const Rect& bounding_box) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_interface<PPB_TextInput_Dev_0_2>()) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_interface<PPB_TextInput_Dev_0_2>()->UpdateCaretPosition(
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance_.pp_instance(), &caret.pp_rect(), &bounding_box.pp_rect());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (has_interface<PPB_TextInput_Dev_0_1>()) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_interface<PPB_TextInput_Dev_0_1>()->UpdateCaretPosition(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance_.pp_instance(), &caret.pp_rect(), &bounding_box.pp_rect());
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TextInput_Dev::CancelCompositionText() {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_interface<PPB_TextInput_Dev_0_2>()) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_interface<PPB_TextInput_Dev_0_2>()->CancelCompositionText(
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance_.pp_instance());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (has_interface<PPB_TextInput_Dev_0_1>()) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_interface<PPB_TextInput_Dev_0_1>()->CancelCompositionText(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance_.pp_instance());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TextInput_Dev::SelectionChanged() {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_interface<PPB_TextInput_Dev_0_2>()) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_interface<PPB_TextInput_Dev_0_2>()->SelectionChanged(
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance_.pp_instance());
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TextInput_Dev::UpdateSurroundingText(const std::string& text,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          uint32_t caret,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          uint32_t anchor) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_interface<PPB_TextInput_Dev_0_2>()) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_interface<PPB_TextInput_Dev_0_2>()->UpdateSurroundingText(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance_.pp_instance(), text.c_str(), caret, anchor);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace pp
109