// 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_LABEL_H_
#define FPDFSDK_INCLUDE_PDFWINDOW_PWL_LABEL_H_

#include "PWL_Wnd.h"

class IFX_Edit;

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

	virtual CFX_ByteString			GetClassName() const;
	virtual void					SetFontSize(FX_FLOAT fFontSize);
	virtual FX_FLOAT				GetFontSize() const;

	void							SetText(const FX_WCHAR* csText);
	CFX_WideString					GetText() const;
	void							SetLimitChar(int32_t nLimitChar);
	void							SetHorzScale(int32_t nHorzScale);
	void							SetCharSpace(FX_FLOAT fCharSpace);
	CPDF_Rect						GetContentRect() const;
	int32_t						GetTotalWords();
	CFX_ByteString					GetTextAppearanceStream(const CPDF_Point & ptOffset) const;

protected:
	virtual void					OnCreated();
	virtual void					DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
	virtual void					GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
	virtual void					RePosChildWnd();

private:
	void							SetParamByFlag();

	IFX_Edit*						m_pEdit;
};

#endif  // FPDFSDK_INCLUDE_PDFWINDOW_PWL_LABEL_H_
