1// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#ifndef _FDE_TXTEDTBUF_H
8#define _FDE_TXTEDTBUF_H
9class IFX_CharIter;
10class CFDE_TxtEdtBufIter;
11class CFDE_TxtEdtBuf;
12class CFDE_TxtEdtBufIter : public IFX_CharIter {
13 public:
14#ifdef FDE_USEFORMATBLOCK
15  CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf* pBuf, FX_BOOL bForDisplay = TRUE);
16#else
17  CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf* pBuf, FX_WCHAR wcAlias = 0);
18#endif
19
20  virtual void Release();
21  virtual FX_BOOL Next(FX_BOOL bPrev = FALSE);
22  virtual FX_WCHAR GetChar();
23  virtual void SetAt(int32_t nIndex);
24  virtual int32_t GetAt() const;
25  virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const;
26  virtual IFX_CharIter* Clone();
27
28 protected:
29  ~CFDE_TxtEdtBufIter();
30
31 private:
32  CFDE_TxtEdtBuf* m_pBuf;
33  int32_t m_nCurChunk;
34  int32_t m_nCurIndex;
35  int32_t m_nIndex;
36#ifdef FDE_USEFORMATBLOCK
37  FX_BOOL m_bForDisplay;
38  int32_t m_nAliasCount;
39#endif
40  FX_WCHAR m_Alias;
41};
42class CFDE_TxtEdtBuf : public IFDE_TxtEdtBuf {
43  friend class CFDE_TxtEdtBufIter;
44  struct _FDE_CHUNKHEADER {
45    int32_t nUsed;
46    FX_WCHAR wChars[1];
47  };
48  typedef _FDE_CHUNKHEADER FDE_CHUNKHEADER;
49  typedef _FDE_CHUNKHEADER* FDE_LPCHUNKHEADER;
50  struct _FDE_CHUNKPLACE {
51    int32_t nChunkIndex;
52    int32_t nCharIndex;
53  };
54  typedef _FDE_CHUNKPLACE FDE_CHUNKPLACE;
55  typedef _FDE_CHUNKPLACE* FDE_LPCHUNKPLACE;
56
57 public:
58  CFDE_TxtEdtBuf(int32_t nDefChunkSize = FDE_DEFCHUNKLENGTH);
59
60  virtual void Release();
61  virtual FX_BOOL SetChunkSize(int32_t nChunkSize);
62  virtual int32_t GetChunkSize() const;
63  virtual int32_t GetTextLength() const;
64  virtual void SetText(const CFX_WideString& wsText);
65  virtual void GetText(CFX_WideString& wsText) const;
66  virtual FX_WCHAR GetCharByIndex(int32_t nIndex) const;
67  virtual void GetRange(CFX_WideString& wsText,
68                        int32_t nBegine,
69                        int32_t nCount = -1) const;
70
71  virtual void Insert(int32_t nPos,
72                      const FX_WCHAR* lpText,
73                      int32_t nLength = 1);
74  virtual void Delete(int32_t nIndex, int32_t nLength = 1);
75  virtual void Clear(FX_BOOL bRelease = TRUE);
76
77  virtual FX_BOOL Optimize(IFX_Pause* pPause = NULL);
78
79 protected:
80  virtual ~CFDE_TxtEdtBuf();
81
82 private:
83  void ResetChunkBuffer(int32_t nDefChunkCount, int32_t nChunkSize);
84  int32_t CP2Index(const FDE_CHUNKPLACE& cp) const;
85  void Index2CP(int32_t nIndex, FDE_CHUNKPLACE& cp) const;
86
87  int32_t m_nChunkSize;
88
89  int32_t m_nTotal;
90  FX_BOOL m_bChanged;
91  CFX_PtrArray m_Chunks;
92  IFX_MEMAllocator* m_pAllocator;
93};
94#endif
95