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

#include "../../../core/include/fxcrt/fx_string.h"
#include "../../../core/include/fxcrt/fx_system.h"

class CJS_Context;
class CPDFSDK_Annot;
class CPDFSDK_Document;
class CPDF_Bookmark;
class CPDF_FormField;
class Field;

enum JS_EVENT_T
{
	JET_UNKNOWN,
	JET_APP_INIT,
	JET_DOC_OPEN,
	JET_DOC_WILLPRINT,
	JET_DOC_DIDPRINT,
	JET_DOC_WILLSAVE,
	JET_DOC_DIDSAVE,
	JET_DOC_WILLCLOSE,
	JET_PAGE_OPEN,
	JET_PAGE_CLOSE,
	JET_PAGE_INVIEW,
	JET_PAGE_OUTVIEW,
	JET_FIELD_MOUSEDOWN,
	JET_FIELD_MOUSEUP,
	JET_FIELD_MOUSEENTER,
	JET_FIELD_MOUSEEXIT,
	JET_FIELD_FOCUS,
	JET_FIELD_BLUR,
	JET_FIELD_KEYSTROKE,
	JET_FIELD_VALIDATE,
	JET_FIELD_CALCULATE,
	JET_FIELD_FORMAT,
	JET_SCREEN_FOCUS,
	JET_SCREEN_BLUR,
	JET_SCREEN_OPEN,
	JET_SCREEN_CLOSE,
	JET_SCREEN_MOUSEDOWN,
	JET_SCREEN_MOUSEUP,
	JET_SCREEN_MOUSEENTER,
	JET_SCREEN_MOUSEEXIT,
	JET_SCREEN_INVIEW,
	JET_SCREEN_OUTVIEW,
	JET_BATCH_EXEC,
	JET_MENU_EXEC,
	JET_CONSOLE_EXEC,
	JET_EXTERNAL_EXEC,
	JET_BOOKMARK_MOUSEUP,
	JET_LINK_MOUSEUP
};

class CJS_EventHandler
{
public:
	CJS_EventHandler(CJS_Context * pContext);
	virtual ~CJS_EventHandler();

	void					OnApp_Init();

	void					OnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString& strTargetName);
	void					OnDoc_WillPrint(CPDFSDK_Document* pDoc);
	void					OnDoc_DidPrint(CPDFSDK_Document* pDoc);
	void					OnDoc_WillSave(CPDFSDK_Document* pDoc);
	void					OnDoc_DidSave(CPDFSDK_Document* pDoc);
	void					OnDoc_WillClose(CPDFSDK_Document* pDoc);

	void					OnPage_Open(CPDFSDK_Document* pDoc);
	void					OnPage_Close(CPDFSDK_Document* pDoc);
	void					OnPage_InView(CPDFSDK_Document* pTarget);
	void					OnPage_OutView(CPDFSDK_Document* pTarget);

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

	void					OnField_MouseDown(bool bModifier, bool bShift, CPDF_FormField *pTarget);
	void					OnField_MouseEnter(bool bModifier, bool bShift, CPDF_FormField *pTarget);
	void					OnField_MouseExit(bool bModifier, bool bShift, CPDF_FormField *pTarget);
	void					OnField_MouseUp(bool bModifier, bool bShift, CPDF_FormField *pTarget);
	void					OnField_Blur(bool bModifier, bool bShift, CPDF_FormField* pTarget, const CFX_WideString& Value);
	void					OnField_Focus(bool bModifier, bool bShift, CPDF_FormField* pTarget, const CFX_WideString& Value);

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

	void					OnBookmark_MouseUp(CPDF_Bookmark* pBookMark);
	void					OnLink_MouseUp(CPDFSDK_Document* pTarget);

	void					OnMenu_Exec(CPDFSDK_Document* pTarget, const CFX_WideString& strTargetName);
	void					OnBatchExec(CPDFSDK_Document *pTarget);
	void					OnConsole_Exec();
	void					OnExternal_Exec();

public:
    void					Initial(JS_EVENT_T type);
	void					Destroy();
	bool					IsValid();


	CFX_WideString&			Change();
	CFX_WideString			ChangeEx();
	int						CommitKey();
	bool					FieldFull();
	bool					KeyDown();
	bool					Modifier();
	const FX_WCHAR*				Name();
	const FX_WCHAR*				Type();
	bool&				Rc();
	int&					SelEnd();
	int&					SelStart();
	bool					Shift();
	Field*					Source();
	Field*					Target_Field();
	CFX_WideString&			Value();
	bool					WillCommit();
	CFX_WideString			TargetName();

	JS_EVENT_T				EventType() {return m_eEventType;};

public:
	CJS_Context*			m_pJSContext;
	JS_EVENT_T				m_eEventType;
	bool					m_bValid;

	CFX_WideString			m_strTargetName;
	CFX_WideString			m_strSourceName;
	CFX_WideString*			m_pWideStrChange;
	CFX_WideString			m_WideStrChangeDu;
	CFX_WideString			m_WideStrChangeEx;
	int						m_nCommitKey;
	bool					m_bKeyDown;
	bool					m_bModifier;
	bool					m_bShift;
	int*					m_pISelEnd;
	int						m_nSelEndDu;
	int*					m_pISelStart;
	int						m_nSelStartDu;
	bool					m_bWillCommit;
	CFX_WideString*			m_pValue;
	bool					m_bFieldFull;
	bool*				m_pbRc;
	bool					m_bRcDu;

	CPDFSDK_Document*		m_pSourceDoc;
	CPDF_Bookmark*			m_pTargetBookMark;
	CPDFSDK_Document*		m_pTargetDoc;
	CPDFSDK_Annot*			m_pTargetAnnot;
};

#endif  // FPDFSDK_INCLUDE_JAVASCRIPT_JS_EVENTHANDLER_H_
