// 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

// #include "../../include/formfiller/FormFiller.h"
#include "../../include/formfiller/FFL_FormFiller.h"
#include "../../include/formfiller/FFL_Notify.h"
// #include "../../include/formfiller/FFL_ComboBox.h"
// #include "../../include/formfiller/FFL_Module.h"

/* -------------------------------- CFFL_Notify ------------------------------ */

//#pragma warning(disable: 4800)

CFFL_Notify::CFFL_Notify(CFFL_FormFiller * pFormFiller) : 
	m_pFormFiller(pFormFiller),
	m_bDoActioning(FALSE),
	m_nNotifyFlag(0)
{
	ASSERT(m_pFormFiller != NULL);
}

CFFL_Notify::~CFFL_Notify()
{
}

void CFFL_Notify::BeforeNotify()
{
	m_nNotifyFlag ++;
}


void CFFL_Notify::AfterNotify()
{
	m_nNotifyFlag --;
}

FX_BOOL CFFL_Notify::OnMouseUp(FX_BOOL & bExit)
{
	BeforeNotify();
	FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::ButtonUp, bExit);
	AfterNotify();
	return bRet;
}

FX_BOOL CFFL_Notify::OnMouseDown(FX_BOOL & bExit)
{
	BeforeNotify();
	FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::ButtonDown, bExit);
	AfterNotify();
	return bRet;
}

FX_BOOL CFFL_Notify::OnMouseEnter(FX_BOOL & bExit)
{
	BeforeNotify();
	FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::CursorEnter, bExit);
	AfterNotify();
	return bRet;
}

FX_BOOL CFFL_Notify::OnMouseExit(FX_BOOL & bExit)
{
	BeforeNotify();
	FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::CursorExit, bExit);
	AfterNotify();
	return bRet;
}

FX_BOOL CFFL_Notify::OnSetFocus(FX_BOOL & bExit)
{
	BeforeNotify();
	FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::GetFocus, bExit);
	AfterNotify();
	return bRet;
}

FX_BOOL CFFL_Notify::OnKillFocus(FX_BOOL & bExit)
{
	BeforeNotify();
	FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::LoseFocus, bExit);
	AfterNotify();
	return bRet;
}

FX_BOOL CFFL_Notify::OnCalculate()
{
	return TRUE;
}

FX_BOOL CFFL_Notify::OnFormat(int iCommitKey)
{
	return TRUE;
}

FX_BOOL CFFL_Notify::OnKeyStroke(CPDF_FormField* pFormField, int nCommitKey, CFX_WideString& strValue, CFX_WideString& strChange, 
							   const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, FX_BOOL bModifier,
							   FX_BOOL bShift, FX_BOOL bWillCommit, FX_BOOL bFieldFull, 
							   int& nSelStart, int& nSelEnd, FX_BOOL& bRC)
{
	return TRUE;
}

FX_BOOL CFFL_Notify::OnValidate(CPDF_FormField* pFormField, CFX_WideString& strValue, CFX_WideString & strChange, 
									   const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, FX_BOOL bModifier,
									   FX_BOOL bShift, FX_BOOL & bRC)
{
	return TRUE;
}

FX_BOOL	CFFL_Notify::DoAAction(CPDF_AAction::AActionType eAAT, FX_BOOL & bExit)
{
	if (this->m_bDoActioning) return FALSE;
	
	CPDF_Action action;
	if (!FindAAction(eAAT,action)) return FALSE;

	this->m_bDoActioning = TRUE;	
	ExecuteActionTree(eAAT,action,bExit);	
	this->m_bDoActioning = FALSE;
	return TRUE;
}

FX_BOOL	CFFL_Notify::ExecuteActionTree(CPDF_AAction::AActionType eAAT,CPDF_Action & action, FX_BOOL& bExit)
{
	if (!ExecuteAction(eAAT,action,bExit)) return FALSE;
	if (bExit) return TRUE;

	for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
	{
		CPDF_Action subaction = action.GetSubAction(i);
		if (!ExecuteActionTree(eAAT,subaction,bExit)) return FALSE;
		if (bExit) break;
	}

	return TRUE;
}


FX_BOOL	CFFL_Notify::FindAAction(CPDF_AAction::AActionType eAAT,CPDF_Action & action)
{
	return FALSE;
}

FX_BOOL CFFL_Notify::FindAAction(CPDF_AAction aaction,CPDF_AAction::AActionType eAAT,CPDF_Action & action)
{
	CPDF_Action MyAction;

	if (aaction.ActionExist(eAAT))
	{
		MyAction = aaction.GetAction(eAAT);
	}
	else
		return FALSE;


	if (MyAction.GetType() == CPDF_Action::Unknown)
		return FALSE;

	action = MyAction;

	return TRUE;
}

FX_BOOL	CFFL_Notify::ExecuteAction(CPDF_AAction::AActionType eAAT,CPDF_Action & action,FX_BOOL& bExit)
{
	return FALSE;
}
//#pragma warning(default: 4800)