// 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/core/cfwl_checkbox.h"

#include <memory>

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

IFWL_CheckBox* CFWL_CheckBox::GetWidget() {
  return static_cast<IFWL_CheckBox*>(m_pIface.get());
}

const IFWL_CheckBox* CFWL_CheckBox::GetWidget() const {
  return static_cast<IFWL_CheckBox*>(m_pIface.get());
}

FWL_Error CFWL_CheckBox::Initialize(const CFWL_WidgetProperties* pProperties) {
  if (m_pIface)
    return FWL_Error::Indefinite;
  if (pProperties) {
    *m_pProperties = *pProperties;
  }
  std::unique_ptr<IFWL_CheckBox> pCheckBox(new IFWL_CheckBox(
      m_pProperties->MakeWidgetImpProperties(&m_checkboxData)));
  FWL_Error ret = pCheckBox->Initialize();
  if (ret != FWL_Error::Succeeded) {
    return ret;
  }
  m_pIface = std::move(pCheckBox);
  CFWL_Widget::Initialize();
  return FWL_Error::Succeeded;
}

FWL_Error CFWL_CheckBox::SetCaption(const CFX_WideStringC& wsCaption) {
  m_checkboxData.m_wsCaption = wsCaption;
  return FWL_Error::Succeeded;
}

FWL_Error CFWL_CheckBox::SetBoxSize(FX_FLOAT fHeight) {
  m_checkboxData.m_fBoxHeight = fHeight;
  return FWL_Error::Succeeded;
}

int32_t CFWL_CheckBox::GetCheckState() {
  return GetWidget()->GetCheckState();
}

FWL_Error CFWL_CheckBox::SetCheckState(int32_t iCheck) {
  return GetWidget()->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_Error CFWL_CheckBox::CFWL_CheckBoxDP::GetCaption(
    IFWL_Widget* pWidget,
    CFX_WideString& wsCaption) {
  wsCaption = m_wsCaption;
  return FWL_Error::Succeeded;
}

FX_FLOAT CFWL_CheckBox::CFWL_CheckBoxDP::GetBoxSize(IFWL_Widget* pWidget) {
  return m_fBoxHeight;
}
