// 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 "xfa/fxfa/app/xfa_ffsignature.h"

#include "xfa/fxfa/app/xfa_ffdoc.h"
#include "xfa/fxfa/app/xfa_fffield.h"
#include "xfa/fxfa/app/xfa_ffpageview.h"
#include "xfa/fxfa/app/xfa_ffwidget.h"

CXFA_FFSignature::CXFA_FFSignature(CXFA_FFPageView* pPageView,
                                   CXFA_WidgetAcc* pDataAcc)
    : CXFA_FFField(pPageView, pDataAcc) {}
CXFA_FFSignature::~CXFA_FFSignature() {}
FX_BOOL CXFA_FFSignature::LoadWidget() {
  return CXFA_FFField::LoadWidget();
}
void CXFA_FFSignature::RenderWidget(CFX_Graphics* pGS,
                                    CFX_Matrix* pMatrix,
                                    FX_DWORD dwStatus,
                                    int32_t iRotate) {
  if (!IsMatchVisibleStatus(dwStatus)) {
    return;
  }
  CFX_Matrix mtRotate;
  GetRotateMatrix(mtRotate);
  if (pMatrix) {
    mtRotate.Concat(*pMatrix);
  }
  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
  CXFA_Border borderUI = m_pDataAcc->GetUIBorder();
  DrawBorder(pGS, borderUI, m_rtUI, &mtRotate);
  RenderCaption(pGS, &mtRotate);
  DrawHighlight(pGS, &mtRotate, dwStatus, FALSE);
  CFX_RectF rtWidget = m_rtUI;
  IXFA_DocProvider* pDocProvider = m_pDataAcc->GetDoc()->GetDocProvider();
  FXSYS_assert(pDocProvider);
  pDocProvider->RenderCustomWidget(this, pGS, &mtRotate, rtWidget);
}
FX_BOOL CXFA_FFSignature::OnMouseEnter() {
  return FALSE;
}
FX_BOOL CXFA_FFSignature::OnMouseExit() {
  return FALSE;
}
FX_BOOL CXFA_FFSignature::OnLButtonDown(FX_DWORD dwFlags,
                                        FX_FLOAT fx,
                                        FX_FLOAT fy) {
  return FALSE;
}
FX_BOOL CXFA_FFSignature::OnLButtonUp(FX_DWORD dwFlags,
                                      FX_FLOAT fx,
                                      FX_FLOAT fy) {
  return FALSE;
}
FX_BOOL CXFA_FFSignature::OnLButtonDblClk(FX_DWORD dwFlags,
                                          FX_FLOAT fx,
                                          FX_FLOAT fy) {
  return FALSE;
}
FX_BOOL CXFA_FFSignature::OnMouseMove(FX_DWORD dwFlags,
                                      FX_FLOAT fx,
                                      FX_FLOAT fy) {
  return FALSE;
}
FX_BOOL CXFA_FFSignature::OnMouseWheel(FX_DWORD dwFlags,
                                       int16_t zDelta,
                                       FX_FLOAT fx,
                                       FX_FLOAT fy) {
  return FALSE;
}
FX_BOOL CXFA_FFSignature::OnRButtonDown(FX_DWORD dwFlags,
                                        FX_FLOAT fx,
                                        FX_FLOAT fy) {
  return FALSE;
}
FX_BOOL CXFA_FFSignature::OnRButtonUp(FX_DWORD dwFlags,
                                      FX_FLOAT fx,
                                      FX_FLOAT fy) {
  return FALSE;
}
FX_BOOL CXFA_FFSignature::OnRButtonDblClk(FX_DWORD dwFlags,
                                          FX_FLOAT fx,
                                          FX_FLOAT fy) {
  return FALSE;
}
FX_BOOL CXFA_FFSignature::OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags) {
  return FALSE;
}
FX_BOOL CXFA_FFSignature::OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags) {
  return FALSE;
}
FX_BOOL CXFA_FFSignature::OnChar(FX_DWORD dwChar, FX_DWORD dwFlags) {
  return FALSE;
}
FX_DWORD CXFA_FFSignature::OnHitTest(FX_FLOAT fx, FX_FLOAT fy) {
  if (m_pNormalWidget) {
    FX_FLOAT ffx = fx, ffy = fy;
    FWLToClient(ffx, ffy);
    FX_DWORD dwWidgetHit = m_pNormalWidget->HitTest(ffx, ffy);
    if (dwWidgetHit != FWL_WGTHITTEST_Unknown) {
      return FWL_WGTHITTEST_Client;
    }
  }
  CFX_RectF rtBox;
  GetRectWithoutRotate(rtBox);
  if (!rtBox.Contains(fx, fy)) {
    return FWL_WGTHITTEST_Unknown;
  }
  if (m_rtCaption.Contains(fx, fy)) {
    return FWL_WGTHITTEST_Titlebar;
  }
  return FWL_WGTHITTEST_Client;
}
FX_BOOL CXFA_FFSignature::OnSetCursor(FX_FLOAT fx, FX_FLOAT fy) {
  return FALSE;
}
