// 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/fwl/basewidget/fwl_formproxyimp.h"

#include "xfa/fwl/core/fwl_formimp.h"
#include "xfa/fwl/core/fwl_noteimp.h"
#include "xfa/fwl/core/fwl_widgetimp.h"

CFWL_FormProxyImp::CFWL_FormProxyImp(const CFWL_WidgetImpProperties& properties,
                                     IFWL_Widget* pOuter)
    : CFWL_FormImp(properties, pOuter) {}

CFWL_FormProxyImp::~CFWL_FormProxyImp() {}

FWL_Error CFWL_FormProxyImp::GetClassName(CFX_WideString& wsClass) const {
  wsClass = FWL_CLASS_FormProxy;
  return FWL_Error::Succeeded;
}

FWL_Type CFWL_FormProxyImp::GetClassID() const {
  return FWL_Type::FormProxy;
}

FX_BOOL CFWL_FormProxyImp::IsInstance(const CFX_WideStringC& wsClass) const {
  if (wsClass == CFX_WideStringC(FWL_CLASS_FormProxy)) {
    return TRUE;
  }
  return CFWL_FormImp::IsInstance(wsClass);
}
FWL_Error CFWL_FormProxyImp::Initialize() {
  if (CFWL_WidgetImp::Initialize() != FWL_Error::Succeeded)
    return FWL_Error::Indefinite;
  m_pDelegate = new CFWL_FormProxyImpDelegate(this);
  return FWL_Error::Succeeded;
}
FWL_Error CFWL_FormProxyImp::Finalize() {
  delete m_pDelegate;
  m_pDelegate = nullptr;
  return CFWL_WidgetImp::Finalize();
}
FWL_Error CFWL_FormProxyImp::Update() {
  return FWL_Error::Succeeded;
}
FWL_Error CFWL_FormProxyImp::DrawWidget(CFX_Graphics* pGraphics,
                                        const CFX_Matrix* pMatrix) {
  return FWL_Error::Succeeded;
}

CFWL_FormProxyImpDelegate::CFWL_FormProxyImpDelegate(CFWL_FormProxyImp* pOwner)
    : m_pOwner(pOwner) {}

void CFWL_FormProxyImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
  IFWL_WidgetDelegate* pDelegate = m_pOwner->m_pOuter->SetDelegate(NULL);
  pDelegate->OnProcessMessage(pMessage);
}
