// 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_SIGNATURE_H_
#define FPDFSDK_INCLUDE_PDFWINDOW_PWL_SIGNATURE_H_

#include "PWL_Icon.h"
#include "PWL_Wnd.h"

class CFX_DIBSource;
class CPWL_Label;

class CPWL_Signature_Image : public CPWL_Image
{
public:
	CPWL_Signature_Image();
	virtual ~CPWL_Signature_Image();

	void								SetImage(CFX_DIBSource* pImage);
	CFX_DIBSource*						GetImage();

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

	virtual void						GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale);

private:
	CFX_DIBSource*						m_pImage;
};

class PWL_CLASS CPWL_Signature : public CPWL_Wnd
{
public:
	CPWL_Signature();
	virtual ~CPWL_Signature();

	void								SetText(const FX_WCHAR* sText);
	void								SetDescription(const FX_WCHAR* string);
	void								SetImage(CFX_DIBSource* pImage);
	void								SetImageStream(CPDF_Stream * pStream, const FX_CHAR* sImageAlias);

	void								SetTextFlag(bool bTextExist);
	void								SetImageFlag(bool bImageExist);
	void								SetFoxitFlag(bool bFlagExist);

protected:
	virtual void						RePosChildWnd();
	virtual void						CreateChildWnd(const PWL_CREATEPARAM & cp);

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

private:
	CPWL_Label*							m_pText;
	CPWL_Label*							m_pDescription;
	CPWL_Signature_Image*				m_pImage;

	bool								m_bTextExist;
	bool								m_bImageExist;
	bool								m_bFlagExist;
};

#endif  // FPDFSDK_INCLUDE_PDFWINDOW_PWL_SIGNATURE_H_
