// Copyright (c) 2012 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.

#ifndef PPAPI_CPP_DEV_TEXT_INPUT_DEV_H_
#define PPAPI_CPP_DEV_TEXT_INPUT_DEV_H_

#include <string>

#include "ppapi/c/dev/ppb_text_input_dev.h"
#include "ppapi/cpp/instance_handle.h"

namespace pp {

class Rect;
class Instance;

// This class allows you to associate the PPP_TextInput_Dev and
// PPB_TextInput_Dev C-based interfaces with an object. It associates itself
// with the given instance, and registers as the global handler for handling the
// PPP_TextInput_Dev interface that the browser calls.
//
// You would typically use this either via inheritance on your instance:
//   class MyInstance : public pp::Instance, public pp::TextInput_Dev {
//     MyInstance() : pp::TextInput_Dev(this) {
//     }
//     ...
//   };
//
// or by composition:
//   class MyTextInput : public pp::TextInput_Dev {
//     ...
//   };
//
//   class MyInstance : public pp::Instance {
//     MyInstance() : text_input_(this) {
//     }
//
//     MyTextInput text_input_;
//   };
class TextInput_Dev {
 public:
  explicit TextInput_Dev(Instance* instance);
  virtual ~TextInput_Dev();

  virtual void RequestSurroundingText(uint32_t desired_number_of_characters);

  void SetTextInputType(PP_TextInput_Type_Dev type);
  void UpdateCaretPosition(const Rect& caret, const Rect& bounding_box);
  void CancelCompositionText();
  void SelectionChanged();
  void UpdateSurroundingText(const std::string& text,
                             uint32_t caret, uint32_t anchor);

 private:
  InstanceHandle instance_;
};

}  // namespace pp

#endif  // PPAPI_CPP_DEV_TEXT_INPUT_DEV_H_
