// 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/lightwidget/cfwl_scrollbar.h"

#include <memory>

#include "xfa/fwl/basewidget/ifwl_scrollbar.h"

CFWL_ScrollBar* CFWL_ScrollBar::Create() {
  return new CFWL_ScrollBar;
}

CFWL_ScrollBar::CFWL_ScrollBar() {}

CFWL_ScrollBar::~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(uint32_t dwCode, FX_FLOAT fPos) {
  if (!m_pIface)
    return FALSE;
  return static_cast<IFWL_ScrollBar*>(m_pIface)->DoScroll(dwCode, fPos);
}
