// 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_PDFWINDOW_PWL_SIGNATURE_H_
#define FPDFSDK_PDFWINDOW_PWL_SIGNATURE_H_

#include "fpdfsdk/pdfwindow/PWL_Icon.h"
#include "fpdfsdk/pdfwindow/PWL_Wnd.h"

class CFX_DIBSource;
class CPWL_Label;

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

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

 protected:
  // CPWL_Image
  void DrawThisAppearance(CFX_RenderDevice* pDevice,
                          CFX_Matrix* pUser2Device) override;
  void GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) override;
  void GetScale(FX_FLOAT& fHScale, FX_FLOAT& fVScale) override;

 private:
  CFX_DIBSource* m_pImage;
};

class CPWL_Signature : public CPWL_Wnd {
 public:
  CPWL_Signature();
  ~CPWL_Signature() override;

  void SetText(const FX_WCHAR* sText);
  void SetDescription(const FX_WCHAR* str);
  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:
  // CPWL_Wnd
  void RePosChildWnd() override;
  void CreateChildWnd(const PWL_CREATEPARAM& cp) override;
  void DrawThisAppearance(CFX_RenderDevice* pDevice,
                          CFX_Matrix* pUser2Device) override;
  void GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) override;

 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_PDFWINDOW_PWL_SIGNATURE_H_
