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_TXTEDTPAGE_H
8#define _FDE_TXTEDTPAGE_H
9class CFDE_TxtEdtEngine;
10class IFX_CharIter;
11class CFDE_TxtEdtPage;
12class CFDE_TxtEdtLineExt;
13class CFDE_TxtEdtTextSet;
14class CFDE_TxtEdtParag;
15enum FDE_TXTEDT_CHARTYPE {
16  FDE_TXTEDT_CHARTYPE_Unknown = 0,
17  FDE_TXTEDT_CHARTYPE_Tab,
18  FDE_TXTEDT_CHARTYPE_Space,
19  FDE_TXTEDT_CHARTYPE_Punctuation,
20  FDE_TXTEDT_CHARTYPE_LineBreak,
21  FDE_TXTEDT_CHARTYPE_Number,
22  FDE_TXTEDT_CHARTYPE_Char,
23  FDE_TXTEDT_CHARTYPE_CJK,
24};
25inline FDE_TXTEDT_CHARTYPE FDE_GetEditSelCharType(FX_WCHAR wChar) {
26  if (wChar == 0x9) {
27    return FDE_TXTEDT_CHARTYPE_Tab;
28  } else if (wChar == 0x20 || wChar == 0xA0) {
29    return FDE_TXTEDT_CHARTYPE_Space;
30  } else if (wChar == 0x9 || wChar == 0x20 || wChar == 0xA0 ||
31             (wChar >= L'!' && wChar <= L'/') ||
32             (wChar >= L':' && wChar <= L'@') ||
33             (wChar >= L'[' && wChar <= L'^') ||
34             (wChar >= L'{' && wChar <= L'~') || wChar == 0x60) {
35    return FDE_TXTEDT_CHARTYPE_Punctuation;
36  } else if (wChar == 0x0a || wChar == 0x0d) {
37    return FDE_TXTEDT_CHARTYPE_LineBreak;
38  } else if (wChar >= '0' && wChar <= '9') {
39    return FDE_TXTEDT_CHARTYPE_Number;
40  } else if ((wChar >= 0x2e80 && wChar <= 0x2eff) ||
41             (wChar >= 0x3000 && wChar <= 0x303f) ||
42             (wChar >= 0x31c0 && wChar <= 0x31ef) ||
43             (wChar >= 0x3200 && wChar <= 0x32ff) ||
44             (wChar >= 0x3300 && wChar <= 0x33ff) ||
45             (wChar >= 0x3400 && wChar <= 0x4dbf) ||
46             (wChar >= 0x4e00 && wChar <= 0x9fff) ||
47             (wChar >= 0xf900 && wChar <= 0xfaff) ||
48             (wChar >= 0xfe30 && wChar <= 0xfe4f)) {
49    return FDE_TXTEDT_CHARTYPE_CJK;
50  } else {
51    return FDE_TXTEDT_CHARTYPE_Char;
52  }
53}
54typedef struct _FDE_TXTEDTPIECE {
55  int32_t nStart;
56  int32_t nCount;
57  int32_t nBidiLevel;
58  CFX_RectF rtPiece;
59  FX_DWORD dwCharStyles;
60} FDE_TEXTEDITPIECE, *FDE_LPTEXTEDITPIECE;
61typedef CFX_MassArrayTemplate<FDE_TEXTEDITPIECE> CFDE_TXTEDTPieceMassArray;
62class CFDE_TxtEdtTextSet : public IFDE_TextSet {
63 public:
64  CFDE_TxtEdtTextSet(CFDE_TxtEdtPage* pPage);
65  ~CFDE_TxtEdtTextSet();
66
67  virtual FDE_VISUALOBJTYPE GetType();
68  virtual FX_BOOL GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF& bbox);
69  virtual FX_BOOL GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix& matrix);
70  virtual FX_BOOL GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt);
71  virtual FX_BOOL GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt);
72  virtual int32_t GetString(FDE_HVISUALOBJ hText, CFX_WideString& wsText);
73  virtual IFX_Font* GetFont(FDE_HVISUALOBJ hText);
74  virtual FX_FLOAT GetFontSize(FDE_HVISUALOBJ hText);
75  virtual FX_ARGB GetFontColor(FDE_HVISUALOBJ hText);
76  virtual int32_t GetDisplayPos(FDE_HVISUALOBJ hText,
77                                FXTEXT_CHARPOS* pCharPos,
78                                FX_BOOL bCharCode = FALSE,
79                                CFX_WideString* pWSForms = NULL);
80  virtual int32_t GetCharRects(FDE_HVISUALOBJ hText, CFX_RectFArray& rtArray);
81  virtual int32_t GetCharRects_Impl(FDE_HVISUALOBJ hText,
82                                    CFX_RectFArray& rtArray,
83                                    FX_BOOL bBBox = FALSE);
84
85 private:
86  CFDE_TxtEdtPage* m_pPage;
87};
88class CFDE_TxtEdtPage : public IFDE_TxtEdtPage {
89 public:
90  CFDE_TxtEdtPage(IFDE_TxtEdtEngine* pEngine, int32_t nLineIndex);
91
92  virtual void Release();
93  virtual IFDE_TxtEdtEngine* GetEngine() const;
94
95  virtual FDE_VISUALOBJTYPE GetType();
96  virtual FX_BOOL GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF& bbox);
97  virtual FX_BOOL GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix& matrix);
98  virtual FX_BOOL GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt);
99  virtual FX_BOOL GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt);
100  virtual int32_t GetCharRect(int32_t nIndex,
101                              CFX_RectF& rect,
102                              FX_BOOL bBBox = FALSE) const;
103  virtual int32_t GetCharIndex(const CFX_PointF& fPoint, FX_BOOL& bBefore);
104  virtual int32_t SelectWord(const CFX_PointF& fPoint, int32_t& nCount);
105  virtual int32_t GetCharStart() const;
106  virtual int32_t GetCharCount() const;
107  virtual void CalcRangeRectArray(int32_t nStart,
108                                  int32_t nCount,
109                                  CFX_RectFArray& RectFArr) const;
110  virtual int32_t GetDisplayPos(const CFX_RectF& rtClip,
111                                FXTEXT_CHARPOS*& pCharPos,
112                                FX_LPRECTF pBBox) const;
113
114  virtual FX_BOOL IsLoaded(FX_LPCRECTF pClipBox = NULL);
115  virtual int32_t LoadPage(FX_LPCRECTF pClipBox = NULL,
116                           IFX_Pause* pPause = NULL);
117  virtual void UnloadPage(FX_LPCRECTF pClipBox = NULL);
118
119  virtual const CFX_RectF& GetContentsBox();
120  virtual FX_POSITION GetFirstPosition(FDE_HVISUALOBJ hCanvas);
121  virtual FDE_HVISUALOBJ GetNext(FDE_HVISUALOBJ hCanvas,
122                                 FX_POSITION& pos,
123                                 IFDE_VisualSet*& pVisualSet);
124  virtual FDE_HVISUALOBJ GetParentCanvas(FDE_HVISUALOBJ hCanvas,
125                                         IFDE_VisualSet*& pVisualSet);
126  virtual FX_WCHAR GetChar(void* pIdentity, int32_t index) const;
127  virtual int32_t GetWidth(void* pIdentity, int32_t index) const;
128
129 protected:
130  virtual ~CFDE_TxtEdtPage();
131
132 private:
133  void NormalizePt2Rect(CFX_PointF& ptF,
134                        const CFX_RectF& rtF,
135                        FX_FLOAT fTolerance) const;
136  IFX_CharIter* m_pIter;
137  CFDE_TxtEdtTextSet* m_pTextSet;
138  CFDE_TxtEdtEngine* m_pEditEngine;
139  CFDE_TXTEDTPieceMassArray m_PieceMassArr;
140  CFDE_TxtEdtParag* m_pBgnParag;
141  CFDE_TxtEdtParag* m_pEndParag;
142
143  int32_t m_nRefCount;
144  int32_t m_nPageStart;
145  int32_t m_nCharCount;
146  int32_t m_nPageIndex;
147  FX_BOOL m_bLoaded;
148  CFX_RectF m_rtPage;
149  CFX_RectF m_rtPageMargin;
150  CFX_RectF m_rtPageContents;
151  CFX_RectF m_rtPageCanvas;
152  int32_t* m_pCharWidth;
153};
154#endif
155