// 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_XFA_CJX_EVENTPSEUDOMODEL_H_
#define FXJS_XFA_CJX_EVENTPSEUDOMODEL_H_

#include "fxjs/jse_define.h"
#include "fxjs/xfa/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 final : public CJX_Object {
 public:
  explicit CJX_EventPseudoModel(CScript_EventPseudoModel* model);
  ~CJX_EventPseudoModel() override;

  JSE_METHOD(emit, CJX_EventPseudoModel);
  JSE_METHOD(reset, CJX_EventPseudoModel);

  JSE_PROP(cancelAction);
  JSE_PROP(change);
  JSE_PROP(commitKey);
  JSE_PROP(fullText);
  JSE_PROP(keyDown);
  JSE_PROP(modifier);
  JSE_PROP(newContentType);
  JSE_PROP(newText);
  JSE_PROP(prevContentType);
  JSE_PROP(prevText);
  JSE_PROP(reenter);
  JSE_PROP(selEnd);
  JSE_PROP(selStart);
  JSE_PROP(shift);
  JSE_PROP(soapFaultCode);
  JSE_PROP(soapFaultString);
  JSE_PROP(target);

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

  static const CJX_MethodSpec MethodSpecs[];
};

#endif  // FXJS_XFA_CJX_EVENTPSEUDOMODEL_H_
