// 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 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(FX_BOOL bTextExist);
	void								SetImageFlag(FX_BOOL bImageExist);
	void								SetFoxitFlag(FX_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;

	FX_BOOL								m_bTextExist;
	FX_BOOL								m_bImageExist;
	FX_BOOL								m_bFlagExist;
};

#endif  // FPDFSDK_INCLUDE_PDFWINDOW_PWL_SIGNATURE_H_
