// 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_bDoActioning(FALSE), m_nNotifyFlag(0) {
  ASSERT(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 (m_bDoActioning)
    return FALSE;

  CPDF_Action action;
  if (!FindAAction(eAAT, action))
    return FALSE;

  m_bDoActioning = TRUE;
  ExecuteActionTree(eAAT, action, bExit);
  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 (int32_t 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)