// 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 FPDFSDK_JAVASCRIPT_IJS_CONTEXT_H_
#define FPDFSDK_JAVASCRIPT_IJS_CONTEXT_H_

#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/fx_system.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.
class IJS_Context {
 public:
  virtual FX_BOOL RunScript(const CFX_WideString& script,
                            CFX_WideString* info) = 0;

  virtual void OnApp_Init() = 0;

  virtual void OnDoc_Open(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const CFX_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(FX_BOOL bModifier,
                                 FX_BOOL bShift,
                                 CPDF_FormField* pTarget) = 0;
  virtual void OnField_MouseEnter(FX_BOOL bModifier,
                                  FX_BOOL bShift,
                                  CPDF_FormField* pTarget) = 0;
  virtual void OnField_MouseExit(FX_BOOL bModifier,
                                 FX_BOOL bShift,
                                 CPDF_FormField* pTarget) = 0;
  virtual void OnField_MouseUp(FX_BOOL bModifier,
                               FX_BOOL bShift,
                               CPDF_FormField* pTarget) = 0;
  virtual void OnField_Focus(FX_BOOL bModifier,
                             FX_BOOL bShift,
                             CPDF_FormField* pTarget,
                             const CFX_WideString& Value) = 0;
  virtual void OnField_Blur(FX_BOOL bModifier,
                            FX_BOOL bShift,
                            CPDF_FormField* pTarget,
                            const CFX_WideString& Value) = 0;

  virtual void OnField_Calculate(CPDF_FormField* pSource,
                                 CPDF_FormField* pTarget,
                                 CFX_WideString& Value,
                                 FX_BOOL& bRc) = 0;
  virtual void OnField_Format(CPDF_FormField* pTarget,
                              CFX_WideString& Value,
                              FX_BOOL bWillCommit) = 0;
  virtual void OnField_Keystroke(CFX_WideString& strChange,
                                 const CFX_WideString& strChangeEx,
                                 FX_BOOL KeyDown,
                                 FX_BOOL bModifier,
                                 int& nSelEnd,
                                 int& nSelStart,
                                 FX_BOOL bShift,
                                 CPDF_FormField* pTarget,
                                 CFX_WideString& Value,
                                 FX_BOOL bWillCommit,
                                 FX_BOOL bFieldFull,
                                 FX_BOOL& bRc) = 0;
  virtual void OnField_Validate(CFX_WideString& strChange,
                                const CFX_WideString& strChangeEx,
                                FX_BOOL bKeyDown,
                                FX_BOOL bModifier,
                                FX_BOOL bShift,
                                CPDF_FormField* pTarget,
                                CFX_WideString& Value,
                                FX_BOOL& bRc) = 0;

  virtual void OnScreen_Focus(FX_BOOL bModifier,
                              FX_BOOL bShift,
                              CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_Blur(FX_BOOL bModifier,
                             FX_BOOL bShift,
                             CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_Open(FX_BOOL bModifier,
                             FX_BOOL bShift,
                             CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_Close(FX_BOOL bModifier,
                              FX_BOOL bShift,
                              CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_MouseDown(FX_BOOL bModifier,
                                  FX_BOOL bShift,
                                  CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_MouseUp(FX_BOOL bModifier,
                                FX_BOOL bShift,
                                CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_MouseEnter(FX_BOOL bModifier,
                                   FX_BOOL bShift,
                                   CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_MouseExit(FX_BOOL bModifier,
                                  FX_BOOL bShift,
                                  CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_InView(FX_BOOL bModifier,
                               FX_BOOL bShift,
                               CPDFSDK_Annot* pScreen) = 0;
  virtual void OnScreen_OutView(FX_BOOL bModifier,
                                FX_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 CFX_WideString&) = 0;
  virtual void OnBatchExec(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0;
  virtual void OnConsole_Exec() = 0;
  virtual void OnExternal_Exec() = 0;

 protected:
  virtual ~IJS_Context() {}
};

#endif  // FPDFSDK_JAVASCRIPT_IJS_CONTEXT_H_
