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