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

class CJS_Context;
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, FX_BOOL& bRc);
	void					OnField_Format(int nCommitKey, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit);
	void					OnField_Keystroke(int nCommitKey, 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);
	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);

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

	void					OnScreen_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
	void					OnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
	void					OnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
	void					OnScreen_Close(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
	void					OnScreen_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
	void					OnScreen_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
	void					OnScreen_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
	void					OnScreen_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
	void					OnScreen_InView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
	void					OnScreen_OutView(FX_BOOL bModifier, FX_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();
	FX_BOOL					IsValid();

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

	JS_EVENT_T				EventType() {return m_eEventType;};	

public:
	CJS_Context*			m_pJSContext;
	JS_EVENT_T				m_eEventType;
	FX_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;
	FX_BOOL					m_bKeyDown;
	FX_BOOL					m_bModifier;
	FX_BOOL					m_bShift;
	int*					m_pISelEnd;
	int						m_nSelEndDu;
	int*					m_pISelStart;
	int						m_nSelStartDu;
	FX_BOOL					m_bWillCommit;
	CFX_WideString*			m_pValue;
	FX_BOOL					m_bFieldFull;
	FX_BOOL*				m_pbRc;
	FX_BOOL					m_bRcDu;

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

#endif //_JS_EVENTHANDLER_H_

