// Copyright 2016 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 XFA_FDE_CFDE_TXTEDTTEXTSET_H_
#define XFA_FDE_CFDE_TXTEDTTEXTSET_H_

#include <vector>

#include "xfa/fde/fde_visualset.h"

class CFDE_TxtEdtPage;

class CFDE_TxtEdtTextSet : public IFDE_TextSet {
 public:
  explicit CFDE_TxtEdtTextSet(CFDE_TxtEdtPage* pPage);
  ~CFDE_TxtEdtTextSet() override;

  // IFDE_VisualSet
  FDE_VISUALOBJTYPE GetType() override;
  void GetRect(FDE_TEXTEDITPIECE* hVisualObj, CFX_RectF& rt) override;

  // IFDE_TextSet
  int32_t GetString(FDE_TEXTEDITPIECE* pPiece, CFX_WideString& wsText) override;
  CFX_RetainPtr<CFGAS_GEFont> GetFont() override;
  FX_FLOAT GetFontSize() override;
  FX_ARGB GetFontColor() override;
  int32_t GetDisplayPos(FDE_TEXTEDITPIECE* pPiece,
                        FXTEXT_CHARPOS* pCharPos,
                        bool bCharCode = false,
                        CFX_WideString* pWSForms = nullptr) override;
  int32_t GetCharRects(const FDE_TEXTEDITPIECE* pPiece,
                       std::vector<CFX_RectF>* rtArray,
                       bool bBBox) override;

 private:
  CFDE_TxtEdtPage* const m_pPage;
};

#endif  // XFA_FDE_CFDE_TXTEDTTEXTSET_H_
