// Copyright 2017 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_CJX_EVENTPSEUDOMODEL_H_
#define FXJS_CJX_EVENTPSEUDOMODEL_H_

#include "fxjs/CJX_Define.h"
#include "fxjs/cjx_object.h"

class CFXJSE_Value;
class CScript_EventPseudoModel;

enum class XFA_Event {
  Change = 0,
  CommitKey,
  FullText,
  Keydown,
  Modifier,
  NewContentType,
  NewText,
  PreviousContentType,
  PreviousText,
  Reenter,
  SelectionEnd,
  SelectionStart,
  Shift,
  SoapFaultCode,
  SoapFaultString,
  Target,
  CancelAction
};

class CJX_EventPseudoModel : public CJX_Object {
 public:
  explicit CJX_EventPseudoModel(CScript_EventPseudoModel* model);
  ~CJX_EventPseudoModel() override;

  void Change(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute);
  void CommitKey(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute);
  void FullText(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute);
  void KeyDown(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute);
  void Modifier(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute);
  void NewContentType(CFXJSE_Value* pValue,
                      bool bSetting,
                      XFA_Attribute eAttribute);
  void NewText(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute);
  void PrevContentType(CFXJSE_Value* pValue,
                       bool bSetting,
                       XFA_Attribute eAttribute);
  void PrevText(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute);
  void Reenter(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute);
  void SelEnd(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute);
  void SelStart(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute);
  void Shift(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute);
  void SoapFaultCode(CFXJSE_Value* pValue,
                     bool bSetting,
                     XFA_Attribute eAttribute);
  void SoapFaultString(CFXJSE_Value* pValue,
                       bool bSetting,
                       XFA_Attribute eAttribute);
  void Target(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute);

  JS_METHOD(emit, CJX_EventPseudoModel);
  JS_METHOD(reset, CJX_EventPseudoModel);

 private:
  void Property(CFXJSE_Value* pValue, XFA_Event dwFlag, bool bSetting);

  static const CJX_MethodSpec MethodSpecs[];
};

#endif  // FXJS_CJX_EVENTPSEUDOMODEL_H_
