// 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 XFA_FEE_FDE_TXTEDTBUF_H_
#define XFA_FEE_FDE_TXTEDTBUF_H_

#include "xfa/fee/ifde_txtedtbuf.h"
#include "xfa/fee/ifde_txtedtengine.h"
#include "xfa/fgas/crt/fgas_memory.h"

class IFX_CharIter;
class CFDE_TxtEdtBuf;

class CFDE_TxtEdtBufIter : public IFX_CharIter {
 public:
  CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf* pBuf, FX_WCHAR wcAlias = 0);

  virtual void Release();
  virtual FX_BOOL Next(FX_BOOL bPrev = FALSE);
  virtual FX_WCHAR GetChar();
  virtual void SetAt(int32_t nIndex);
  virtual int32_t GetAt() const;
  virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const;
  virtual IFX_CharIter* Clone();

 protected:
  ~CFDE_TxtEdtBufIter();

 private:
  CFDE_TxtEdtBuf* m_pBuf;
  int32_t m_nCurChunk;
  int32_t m_nCurIndex;
  int32_t m_nIndex;
  FX_WCHAR m_Alias;
};
class CFDE_TxtEdtBuf : public IFDE_TxtEdtBuf {
  friend class CFDE_TxtEdtBufIter;
  struct _FDE_CHUNKHEADER {
    int32_t nUsed;
    FX_WCHAR wChars[1];
  };
  typedef _FDE_CHUNKHEADER FDE_CHUNKHEADER;
  typedef _FDE_CHUNKHEADER* FDE_LPCHUNKHEADER;
  struct _FDE_CHUNKPLACE {
    int32_t nChunkIndex;
    int32_t nCharIndex;
  };
  typedef _FDE_CHUNKPLACE FDE_CHUNKPLACE;
  typedef _FDE_CHUNKPLACE* FDE_LPCHUNKPLACE;

 public:
  CFDE_TxtEdtBuf(int32_t nDefChunkSize = FDE_DEFCHUNKLENGTH);

  virtual void Release();
  virtual FX_BOOL SetChunkSize(int32_t nChunkSize);
  virtual int32_t GetChunkSize() const;
  virtual int32_t GetTextLength() const;
  virtual void SetText(const CFX_WideString& wsText);
  virtual void GetText(CFX_WideString& wsText) const;
  virtual FX_WCHAR GetCharByIndex(int32_t nIndex) const;
  virtual void GetRange(CFX_WideString& wsText,
                        int32_t nBegine,
                        int32_t nCount = -1) const;

  virtual void Insert(int32_t nPos,
                      const FX_WCHAR* lpText,
                      int32_t nLength = 1);
  virtual void Delete(int32_t nIndex, int32_t nLength = 1);
  virtual void Clear(FX_BOOL bRelease = TRUE);

  virtual FX_BOOL Optimize(IFX_Pause* pPause = NULL);

 protected:
  virtual ~CFDE_TxtEdtBuf();

 private:
  void ResetChunkBuffer(int32_t nDefChunkCount, int32_t nChunkSize);
  int32_t CP2Index(const FDE_CHUNKPLACE& cp) const;
  void Index2CP(int32_t nIndex, FDE_CHUNKPLACE& cp) const;

  int32_t m_nChunkSize;

  int32_t m_nTotal;
  FX_BOOL m_bChanged;
  CFX_PtrArray m_Chunks;
  IFX_MEMAllocator* m_pAllocator;
};

#endif  // XFA_FEE_FDE_TXTEDTBUF_H_
