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

#ifndef FPDFSDK_INCLUDE_PDFWINDOW_PWL_LISTCTRL_H_
#define FPDFSDK_INCLUDE_PDFWINDOW_PWL_LISTCTRL_H_

#include "PWL_Wnd.h"

class CPWL_ListCtrl : public CPWL_Wnd {
 public:
  CPWL_ListCtrl();
  virtual ~CPWL_ListCtrl();

  void SetScrollPos(const CPDF_Point& point);
  CPDF_Point GetScrollPos() const;
  CPDF_Rect GetScrollArea() const;
  void SetItemSpace(FX_FLOAT fSpace);
  void SetTopSpace(FX_FLOAT fSpace);
  void SetBottomSpace(FX_FLOAT fSpace);
  void ResetFace();
  void ResetContent(int32_t nStart);
  int32_t GetItemIndex(CPWL_Wnd* pItem);
  FX_FLOAT GetContentsHeight(FX_FLOAT fLimitWidth);
  CPDF_Point InToOut(const CPDF_Point& point) const;
  CPDF_Point OutToIn(const CPDF_Point& point) const;
  CPDF_Rect InToOut(const CPDF_Rect& rect) const;
  CPDF_Rect OutToIn(const CPDF_Rect& rect) const;

 protected:
  virtual void RePosChildWnd();
  virtual void DrawChildAppearance(CFX_RenderDevice* pDevice,
                                   CPDF_Matrix* pUser2Device);

 private:
  void ResetAll(FX_BOOL bMove, int32_t nStart);

  CPDF_Rect m_rcContent;
  CPDF_Point m_ptScroll;
  FX_FLOAT m_fItemSpace;
  FX_FLOAT m_fTopSpace;
  FX_FLOAT m_fBottomSpace;
};

#endif  // FPDFSDK_INCLUDE_PDFWINDOW_PWL_LISTCTRL_H_
