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

#include "fpdfsdk/cpdfsdk_annot.h"

#include "fpdfsdk/cpdfsdk_pageview.h"
#include "third_party/base/check.h"

CPDFSDK_Annot::CPDFSDK_Annot(CPDFSDK_PageView* pPageView)
    : m_pPageView(pPageView) {
  DCHECK(m_pPageView);
}

CPDFSDK_Annot::~CPDFSDK_Annot() = default;

CPDFSDK_BAAnnot* CPDFSDK_Annot::AsBAAnnot() {
  return nullptr;
}

CPDFXFA_Widget* CPDFSDK_Annot::AsXFAWidget() {
  return nullptr;
}

// static
void CPDFSDK_Annot::OnMouseEnter(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                 Mask<FWL_EVENTFLAG> nFlags) {
  pAnnot->GetUnsafeInputHandlers()->OnMouseEnter(nFlags);
}

// static
void CPDFSDK_Annot::OnMouseExit(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                Mask<FWL_EVENTFLAG> nFlags) {
  pAnnot->GetUnsafeInputHandlers()->OnMouseExit(nFlags);
}

// static
bool CPDFSDK_Annot::OnLButtonDown(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                  Mask<FWL_EVENTFLAG> nFlags,
                                  const CFX_PointF& point) {
  return pAnnot->GetUnsafeInputHandlers()->OnLButtonDown(nFlags, point);
}

// static
bool CPDFSDK_Annot::OnLButtonUp(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                Mask<FWL_EVENTFLAG> nFlags,
                                const CFX_PointF& point) {
  return pAnnot->GetUnsafeInputHandlers()->OnLButtonUp(nFlags, point);
}

// static
bool CPDFSDK_Annot::OnLButtonDblClk(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                    Mask<FWL_EVENTFLAG> nFlags,
                                    const CFX_PointF& point) {
  return pAnnot->GetUnsafeInputHandlers()->OnLButtonDblClk(nFlags, point);
}

// static
bool CPDFSDK_Annot::OnMouseMove(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                Mask<FWL_EVENTFLAG> nFlags,
                                const CFX_PointF& point) {
  return pAnnot->GetUnsafeInputHandlers()->OnMouseMove(nFlags, point);
}

// static
bool CPDFSDK_Annot::OnMouseWheel(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                 Mask<FWL_EVENTFLAG> nFlags,
                                 const CFX_PointF& point,
                                 const CFX_Vector& delta) {
  return pAnnot->GetUnsafeInputHandlers()->OnMouseWheel(nFlags, point, delta);
}

// static
bool CPDFSDK_Annot::OnRButtonDown(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                  Mask<FWL_EVENTFLAG> nFlags,
                                  const CFX_PointF& point) {
  return pAnnot->GetUnsafeInputHandlers()->OnRButtonDown(nFlags, point);
}

// static
bool CPDFSDK_Annot::OnRButtonUp(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                Mask<FWL_EVENTFLAG> nFlags,
                                const CFX_PointF& point) {
  return pAnnot->GetUnsafeInputHandlers()->OnRButtonUp(nFlags, point);
}

// static
bool CPDFSDK_Annot::OnChar(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                           uint32_t nChar,
                           Mask<FWL_EVENTFLAG> nFlags) {
  return pAnnot->GetUnsafeInputHandlers()->OnChar(nChar, nFlags);
}

// static
bool CPDFSDK_Annot::OnKeyDown(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                              FWL_VKEYCODE nKeyCode,
                              Mask<FWL_EVENTFLAG> nFlags) {
  return pAnnot->GetUnsafeInputHandlers()->OnKeyDown(nKeyCode, nFlags);
}

// static
bool CPDFSDK_Annot::OnSetFocus(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                               Mask<FWL_EVENTFLAG> nFlags) {
  return pAnnot->GetUnsafeInputHandlers()->OnSetFocus(nFlags);
}

// static
bool CPDFSDK_Annot::OnKillFocus(ObservedPtr<CPDFSDK_Annot>& pAnnot,
                                Mask<FWL_EVENTFLAG> nFlags) {
  return pAnnot->GetUnsafeInputHandlers()->OnKillFocus(nFlags);
}

IPDF_Page* CPDFSDK_Annot::GetXFAPage() {
#ifdef PDF_ENABLE_XFA
  return m_pPageView->GetXFAPage();
#else
  return nullptr;
#endif
}

int CPDFSDK_Annot::GetLayoutOrder() const {
  return 5;
}

CPDF_Annot* CPDFSDK_Annot::GetPDFAnnot() const {
  return nullptr;
}

IPDF_Page* CPDFSDK_Annot::GetPage() {
#ifdef PDF_ENABLE_XFA
  IPDF_Page* pXFAPage = GetXFAPage();
  if (pXFAPage)
    return pXFAPage;
#endif  // PDF_ENABLE_XFA
  return GetPDFPage();
}

CPDF_Page* CPDFSDK_Annot::GetPDFPage() {
  return m_pPageView->GetPDFPage();
}
