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

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef FXJS_CJS_EVENT_H_
#define FXJS_CJS_EVENT_H_

#include "fxjs/js_define.h"

class CJS_Event : public CJS_Object {
 public:
  static void DefineJSObjects(CFXJS_Engine* pEngine);

  CJS_Event(v8::Local<v8::Object> pObject, CJS_Runtime* pRuntime);
  ~CJS_Event() override;

  JS_STATIC_PROP(change, change, CJS_Event);
  JS_STATIC_PROP(changeEx, change_ex, CJS_Event);
  JS_STATIC_PROP(commitKey, commit_key, CJS_Event);
  JS_STATIC_PROP(fieldFull, field_full, CJS_Event);
  JS_STATIC_PROP(keyDown, key_down, CJS_Event);
  JS_STATIC_PROP(modifier, modifier, CJS_Event);
  JS_STATIC_PROP(name, name, CJS_Event);
  JS_STATIC_PROP(rc, rc, CJS_Event);
  JS_STATIC_PROP(richChange, rich_change, CJS_Event);
  JS_STATIC_PROP(richChangeEx, rich_change_ex, CJS_Event);
  JS_STATIC_PROP(richValue, rich_value, CJS_Event);
  JS_STATIC_PROP(selEnd, sel_end, CJS_Event);
  JS_STATIC_PROP(selStart, sel_start, CJS_Event);
  JS_STATIC_PROP(shift, shift, CJS_Event);
  JS_STATIC_PROP(source, source, CJS_Event);
  JS_STATIC_PROP(target, target, CJS_Event);
  JS_STATIC_PROP(targetName, target_name, CJS_Event);
  JS_STATIC_PROP(type, type, CJS_Event);
  JS_STATIC_PROP(value, value, CJS_Event);
  JS_STATIC_PROP(willCommit, will_commit, CJS_Event);

 private:
  static int ObjDefnID;
  static const char kName[];
  static const JSPropertySpec PropertySpecs[];

  CJS_Return get_change(CJS_Runtime* pRuntime);
  CJS_Return set_change(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_change_ex(CJS_Runtime* pRuntime);
  CJS_Return set_change_ex(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_commit_key(CJS_Runtime* pRuntime);
  CJS_Return set_commit_key(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_field_full(CJS_Runtime* pRuntime);
  CJS_Return set_field_full(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_key_down(CJS_Runtime* pRuntime);
  CJS_Return set_key_down(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_modifier(CJS_Runtime* pRuntime);
  CJS_Return set_modifier(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_name(CJS_Runtime* pRuntime);
  CJS_Return set_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_rc(CJS_Runtime* pRuntime);
  CJS_Return set_rc(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_rich_change(CJS_Runtime* pRuntime);
  CJS_Return set_rich_change(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_rich_change_ex(CJS_Runtime* pRuntime);
  CJS_Return set_rich_change_ex(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_rich_value(CJS_Runtime* pRuntime);
  CJS_Return set_rich_value(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_sel_end(CJS_Runtime* pRuntime);
  CJS_Return set_sel_end(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_sel_start(CJS_Runtime* pRuntime);
  CJS_Return set_sel_start(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_shift(CJS_Runtime* pRuntime);
  CJS_Return set_shift(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_source(CJS_Runtime* pRuntime);
  CJS_Return set_source(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_target(CJS_Runtime* pRuntime);
  CJS_Return set_target(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_target_name(CJS_Runtime* pRuntime);
  CJS_Return set_target_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_type(CJS_Runtime* pRuntime);
  CJS_Return set_type(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_value(CJS_Runtime* pRuntime);
  CJS_Return set_value(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Return get_will_commit(CJS_Runtime* pRuntime);
  CJS_Return set_will_commit(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
};

#endif  // FXJS_CJS_EVENT_H_
