// Copyright 2016 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_IJS_EVENT_CONTEXT_H_
#define FXJS_IJS_EVENT_CONTEXT_H_

#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/fx_system.h"
#include "fxjs/ijs_runtime.h"
#include "third_party/base/optional.h"

class CPDF_Bookmark;
class CPDF_FormField;
class CPDFSDK_Annot;
class CPDFSDK_FormFillEnvironment;

// Records the details of an event and triggers JS execution for it. There
// can be more than one of these at any given time, as JS callbacks to C++
// may trigger new events on top of one another.
class IJS_EventContext {
 public:
  virtual ~IJS_EventContext() {}

  virtual Optional<IJS_Runtime::JS_Error> RunScript(
      const WideString& script) = 0;

  virtual void OnApp_Init() = 0;

  virtual void OnDoc_Open(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const WideString& strTargetName) = 0;
  virtual void OnDoc_WillPrint(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0;
  virtual void OnDoc_DidPrint(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0;
  virtual void OnDoc_WillSave(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0;
  virtual void OnDoc_DidSave(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0;
  virtual void OnDoc_WillClose(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0;

  virtual void OnPage_Open(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0;
  virtual void OnPage_Close(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0;
  virtual void OnPage_InView(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0;
  virtual void OnPage_OutView(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0;

  virtual void OnField_MouseDown(bool bModifier,
                                 bool bShift,
                                 CPDF_FormField* pTarget) = 0;
  virtual void OnField_MouseEnter(bool bModifier,
                                  bool bShift,
                                  CPDF_FormField* pTarget) = 0;
  virtual void OnField_MouseExit(bool bModifier,
                                 bool bShift,
                                 CPDF_FormField* pTarget) = 0;
  virtual void OnField_MouseUp(bool bModifier,
                               bool bShift,
                               CPDF_FormField* pTarget) = 0;
  virtual void OnField_Focus(bool bModifier,
                             bool bShift,
                             CPDF_FormField* pTarget,
                             WideString* Value) = 0;
  virtual void OnField_Blur(bool bModifier,
                            bool bShift,
                            CPDF_FormField* pTarget,
                            WideString* Value) = 0;
  virtual void OnField_Calculate(CPDF_FormField* pSource,
                                 CPDF_FormField* pTarget,
                                 WideString* Value,
                                 bool* bRc) = 0;
  virtual void OnField_Format(CPDF_FormField* pTarget,
                              WideString* Value,
                              bool bWillCommit) = 0;
  virtual void OnField_Keystroke(WideString* strChange,
                                 const WideString& strChangeEx,
                                 bool KeyDown,
                                 bool bModifier,
                                 int* nSelEnd,
                                 int* nSelStart,
                                 bool bShift,
                                 CPDF_FormField* pTarget,
                                 WideString* Value,
                                 bool bWillCommit,
                                 bool bFieldFull,
                                 bool* bRc) = 0;
  virtual void OnField_Validate(WideString* strChange,
                                const WideString& strChangeEx,
                                bool bKeyDown,
                                bool bModifier,
                                bool bShift,
                                CPDF_FormField* pTarget,
                                WideString* Value,
                                bool* bRc) = 0;

  virtual void OnScreen_Focus(bool bModifier,
                              bool bShift,
                              CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_Blur(bool bModifier,
                             bool bShift,
                             CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_Open(bool bModifier,
                             bool bShift,
                             CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_Close(bool bModifier,
                              bool bShift,
                              CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_MouseDown(bool bModifier,
                                  bool bShift,
                                  CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_MouseUp(bool bModifier,
                                bool bShift,
                                CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_MouseEnter(bool bModifier,
                                   bool bShift,
                                   CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_MouseExit(bool bModifier,
                                  bool bShift,
                                  CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_InView(bool bModifier,
                               bool bShift,
                               CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_OutView(bool bModifier,
                                bool bShift,
                                CPDFSDK_Annot* pScreen) = 0;

  virtual void OnBookmark_MouseUp(CPDF_Bookmark* pBookMark) = 0;
  virtual void OnLink_MouseUp(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0;

  virtual void OnMenu_Exec(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                           const WideString&) = 0;
  virtual void OnBatchExec(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0;
  virtual void OnConsole_Exec() = 0;
  virtual void OnExternal_Exec() = 0;
};

#endif  // FXJS_IJS_EVENT_CONTEXT_H_
