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

#include "fpdfsdk/pdfwindow/PWL_Wnd.h"

class IFX_Edit;

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

  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);
  CFX_FloatRect GetContentRect() const;
  int32_t GetTotalWords();
  CFX_ByteString GetTextAppearanceStream(const CFX_FloatPoint& ptOffset) const;

 protected:
  // CPWL_Wnd
  CFX_ByteString GetClassName() const override;
  void SetFontSize(FX_FLOAT fFontSize) override;
  FX_FLOAT GetFontSize() const override;
  void OnCreated() override;
  void DrawThisAppearance(CFX_RenderDevice* pDevice,
                          CFX_Matrix* pUser2Device) override;
  void GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) override;
  void RePosChildWnd() override;

 private:
  void SetParamByFlag();

  IFX_Edit* m_pEdit;
};

#endif  // FPDFSDK_PDFWINDOW_PWL_LABEL_H_
