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

#include "xfa/src/foxitlib.h"

CFWL_ScrollBar* CFWL_ScrollBar::Create() {
  return new CFWL_ScrollBar;
}
FWL_ERR CFWL_ScrollBar::Initialize(const CFWL_WidgetProperties* pProperties) {
  if (m_pIface)
    return FWL_ERR_Indefinite;
  if (pProperties) {
    *m_pProperties = *pProperties;
  }
  std::unique_ptr<IFWL_ScrollBar> pScrollBar(IFWL_ScrollBar::Create(
      m_pProperties->MakeWidgetImpProperties(nullptr), nullptr));
  FWL_ERR ret = pScrollBar->Initialize();
  if (ret != FWL_ERR_Succeeded) {
    return ret;
  }
  m_pIface = pScrollBar.release();
  CFWL_Widget::Initialize();
  return FWL_ERR_Succeeded;
}
FX_BOOL CFWL_ScrollBar::IsVertical() {
  if (!m_pIface)
    return FALSE;
  return static_cast<IFWL_ScrollBar*>(m_pIface)->IsVertical();
}
FWL_ERR CFWL_ScrollBar::GetRange(FX_FLOAT& fMin, FX_FLOAT& fMax) {
  if (!m_pIface)
    return FWL_ERR_Indefinite;
  return static_cast<IFWL_ScrollBar*>(m_pIface)->GetRange(fMin, fMax);
}
FWL_ERR CFWL_ScrollBar::SetRange(FX_FLOAT fMin, FX_FLOAT fMax) {
  if (!m_pIface)
    return FWL_ERR_Indefinite;
  return static_cast<IFWL_ScrollBar*>(m_pIface)->SetRange(fMin, fMax);
}
FX_FLOAT CFWL_ScrollBar::GetPageSize() {
  if (!m_pIface)
    return 0;
  return static_cast<IFWL_ScrollBar*>(m_pIface)->GetPageSize();
}
FWL_ERR CFWL_ScrollBar::SetPageSize(FX_FLOAT fPageSize) {
  if (!m_pIface)
    return FWL_ERR_Indefinite;
  return static_cast<IFWL_ScrollBar*>(m_pIface)->SetPageSize(fPageSize);
}
FX_FLOAT CFWL_ScrollBar::GetStepSize() {
  if (!m_pIface)
    return 0;
  return static_cast<IFWL_ScrollBar*>(m_pIface)->GetStepSize();
}
FWL_ERR CFWL_ScrollBar::SetStepSize(FX_FLOAT fStepSize) {
  if (!m_pIface)
    return FWL_ERR_Indefinite;
  return static_cast<IFWL_ScrollBar*>(m_pIface)->SetStepSize(fStepSize);
}
FX_FLOAT CFWL_ScrollBar::GetPos() {
  if (!m_pIface)
    return -1;
  return static_cast<IFWL_ScrollBar*>(m_pIface)->GetPos();
}
FWL_ERR CFWL_ScrollBar::SetPos(FX_FLOAT fPos) {
  if (!m_pIface)
    return FWL_ERR_Indefinite;
  return static_cast<IFWL_ScrollBar*>(m_pIface)->SetPos(fPos);
}
FX_FLOAT CFWL_ScrollBar::GetTrackPos() {
  if (!m_pIface)
    return -1;
  return static_cast<IFWL_ScrollBar*>(m_pIface)->GetTrackPos();
}
FWL_ERR CFWL_ScrollBar::SetTrackPos(FX_FLOAT fTrackPos) {
  if (!m_pIface)
    return FWL_ERR_Indefinite;
  return static_cast<IFWL_ScrollBar*>(m_pIface)->SetTrackPos(fTrackPos);
}
FX_BOOL CFWL_ScrollBar::DoScroll(FX_DWORD dwCode, FX_FLOAT fPos) {
  if (!m_pIface)
    return FALSE;
  return static_cast<IFWL_ScrollBar*>(m_pIface)->DoScroll(dwCode, fPos);
}
CFWL_ScrollBar::CFWL_ScrollBar() {}
CFWL_ScrollBar::~CFWL_ScrollBar() {}
