// 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/include/fwl/lightwidget/checkbox.h"

#include <memory>

#include "xfa/include/fwl/core/fwl_error.h"

CFWL_CheckBox* CFWL_CheckBox::Create() {
  return new CFWL_CheckBox;
}
FWL_ERR CFWL_CheckBox::Initialize(const CFWL_WidgetProperties* pProperties) {
  if (m_pIface)
    return FWL_ERR_Indefinite;
  if (pProperties) {
    *m_pProperties = *pProperties;
  }
  std::unique_ptr<IFWL_CheckBox> pCheckBox(IFWL_CheckBox::Create(
      m_pProperties->MakeWidgetImpProperties(&m_checkboxData), nullptr));
  FWL_ERR ret = pCheckBox->Initialize();
  if (ret != FWL_ERR_Succeeded) {
    return ret;
  }
  m_pIface = pCheckBox.release();
  CFWL_Widget::Initialize();
  return FWL_ERR_Succeeded;
}
FWL_ERR CFWL_CheckBox::SetCaption(const CFX_WideStringC& wsCaption) {
  m_checkboxData.m_wsCaption = wsCaption;
  return FWL_ERR_Succeeded;
}
FWL_ERR CFWL_CheckBox::SetBoxSize(FX_FLOAT fHeight) {
  m_checkboxData.m_fBoxHeight = fHeight;
  return FWL_ERR_Succeeded;
}
int32_t CFWL_CheckBox::GetCheckState() {
  return static_cast<IFWL_CheckBox*>(m_pIface)->GetCheckState();
}
FWL_ERR CFWL_CheckBox::SetCheckState(int32_t iCheck) {
  return static_cast<IFWL_CheckBox*>(m_pIface)->SetCheckState(iCheck);
}
CFWL_CheckBox::CFWL_CheckBox() {}
CFWL_CheckBox::~CFWL_CheckBox() {}
CFWL_CheckBox::CFWL_CheckBoxDP::CFWL_CheckBoxDP()
    : m_fBoxHeight(16.0f), m_wsCaption(L"Check box") {}
FWL_ERR CFWL_CheckBox::CFWL_CheckBoxDP::GetCaption(IFWL_Widget* pWidget,
                                                   CFX_WideString& wsCaption) {
  wsCaption = m_wsCaption;
  return FWL_ERR_Succeeded;
}
FX_FLOAT CFWL_CheckBox::CFWL_CheckBoxDP::GetBoxSize(IFWL_Widget* pWidget) {
  return m_fBoxHeight;
}
