Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fee / src / fee / fde_txtedtpage.h
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #ifndef _FDE_TXTEDTPAGE_H\r
8 #define _FDE_TXTEDTPAGE_H\r
9 class CFDE_TxtEdtEngine;\r
10 class IFX_CharIter;\r
11 class CFDE_TxtEdtPage;\r
12 class CFDE_TxtEdtLineExt;\r
13 class CFDE_TxtEdtTextSet;\r
14 class CFDE_TxtEdtParag;\r
15 enum FDE_TXTEDT_CHARTYPE {\r
16     FDE_TXTEDT_CHARTYPE_Unknown = 0     ,\r
17     FDE_TXTEDT_CHARTYPE_Tab                     ,\r
18     FDE_TXTEDT_CHARTYPE_Space           ,\r
19     FDE_TXTEDT_CHARTYPE_Punctuation     ,\r
20     FDE_TXTEDT_CHARTYPE_LineBreak       ,\r
21     FDE_TXTEDT_CHARTYPE_Number          ,\r
22     FDE_TXTEDT_CHARTYPE_Char            ,\r
23     FDE_TXTEDT_CHARTYPE_CJK                     ,\r
24 };\r
25 static FDE_TXTEDT_CHARTYPE FDE_GetEditSelCharType(FX_WCHAR wChar)\r
26 {\r
27     if (wChar == 0x9) {\r
28         return FDE_TXTEDT_CHARTYPE_Tab;\r
29     } else if (wChar == 0x20 || wChar == 0xA0) {\r
30         return FDE_TXTEDT_CHARTYPE_Space;\r
31     } else if (wChar == 0x9 || wChar == 0x20 || wChar == 0xA0 || (wChar >= L'!' && wChar <= L'/') || (wChar >= L':' && wChar <= L'@') || (wChar >= L'[' && wChar <= L'^') ||\r
32                (wChar >= L'{' && wChar <= L'~') || wChar == 0x60) {\r
33         return FDE_TXTEDT_CHARTYPE_Punctuation;\r
34     } else if (wChar == 0x0a || wChar == 0x0d) {\r
35         return FDE_TXTEDT_CHARTYPE_LineBreak;\r
36     } else if (wChar >= '0' && wChar <= '9') {\r
37         return FDE_TXTEDT_CHARTYPE_Number;\r
38     } else if ((wChar >= 0x2e80 && wChar <= 0x2eff) || (wChar >= 0x3000 && wChar <= 0x303f) || (wChar >= 0x31c0 && wChar <= 0x31ef)\r
39                || (wChar >= 0x3200 && wChar <= 0x32ff) || (wChar >= 0x3300 && wChar <= 0x33ff) || (wChar >= 0x3400 && wChar <= 0x4dbf)\r
40                || (wChar >= 0x4e00 && wChar <= 0x9fff) || (wChar >= 0xf900 && wChar <= 0xfaff) || (wChar >= 0xfe30 && wChar <= 0xfe4f)) {\r
41         return FDE_TXTEDT_CHARTYPE_CJK;\r
42     } else {\r
43         return FDE_TXTEDT_CHARTYPE_Char;\r
44     }\r
45 }\r
46 typedef struct _FDE_TXTEDTPIECE : public CFX_Object {\r
47     FX_INT32    nStart;\r
48     FX_INT32    nCount;\r
49     FX_INT32    nBidiLevel;\r
50     CFX_RectF   rtPiece;\r
51     FX_DWORD    dwCharStyles;\r
52 } FDE_TEXTEDITPIECE, * FDE_LPTEXTEDITPIECE;\r
53 typedef CFX_MassArrayTemplate<FDE_TEXTEDITPIECE> CFDE_TXTEDTPieceMassArray;\r
54 class CFDE_TxtEdtTextSet : public IFDE_TextSet, public CFX_Object\r
55 {\r
56 public:\r
57     CFDE_TxtEdtTextSet(CFDE_TxtEdtPage * pPage);\r
58     ~CFDE_TxtEdtTextSet();\r
59 \r
60     virtual FDE_VISUALOBJTYPE   GetType();\r
61     virtual FX_BOOL             GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF &bbox);\r
62     virtual FX_BOOL             GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix &matrix);\r
63     virtual FX_BOOL             GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt);\r
64     virtual FX_BOOL             GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt);\r
65     virtual FX_INT32    GetString(FDE_HVISUALOBJ hText, CFX_WideString &wsText);\r
66     virtual IFX_Font*   GetFont(FDE_HVISUALOBJ hText);\r
67     virtual FX_FLOAT    GetFontSize(FDE_HVISUALOBJ hText);\r
68     virtual FX_ARGB             GetFontColor(FDE_HVISUALOBJ hText);\r
69     virtual FX_INT32    GetDisplayPos(FDE_HVISUALOBJ hText, FXTEXT_CHARPOS *pCharPos, FX_BOOL bCharCode = FALSE, CFX_WideString *pWSForms = NULL);\r
70     virtual FX_INT32    GetCharRects(FDE_HVISUALOBJ hText, CFX_RectFArray &rtArray);\r
71     virtual FX_INT32    GetCharRects_Impl(FDE_HVISUALOBJ hText, CFX_RectFArray &rtArray, FX_BOOL bBBox = FALSE);\r
72 private:\r
73 \r
74     CFDE_TxtEdtPage * m_pPage;\r
75 };\r
76 class CFDE_TxtEdtPage : public CFX_Object, public IFDE_TxtEdtPage\r
77 {\r
78 public:\r
79     CFDE_TxtEdtPage(IFDE_TxtEdtEngine * pEngine, FX_INT32 nLineIndex);\r
80 \r
81     virtual void                                Release();\r
82     virtual IFDE_TxtEdtEngine * GetEngine() const;\r
83 \r
84     virtual FDE_VISUALOBJTYPE   GetType();\r
85     virtual FX_BOOL             GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF &bbox);\r
86     virtual FX_BOOL             GetMatrix(FDE_HVISUALOBJ hVisualObj, CFX_Matrix &matrix);\r
87     virtual FX_BOOL             GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt);\r
88     virtual FX_BOOL             GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF &rt);\r
89     virtual FX_INT32    GetCharRect(FX_INT32 nIndex, CFX_RectF &rect, FX_BOOL bBBox = FALSE) const;\r
90     virtual FX_INT32    GetCharIndex(const CFX_PointF &fPoint, FX_BOOL &bBefore);\r
91     virtual FX_INT32    SelectWord(const CFX_PointF &fPoint, FX_INT32 &nCount);\r
92     virtual FX_INT32    GetCharStart() const;\r
93     virtual FX_INT32    GetCharCount() const;\r
94     virtual void                CalcRangeRectArray(FX_INT32 nStart, FX_INT32 nCount, CFX_RectFArray &RectFArr) const;\r
95     virtual FX_INT32    GetDisplayPos(const CFX_RectF &rtClip, FXTEXT_CHARPOS *&pCharPos, FX_LPRECTF pBBox) const;\r
96 \r
97     virtual FX_BOOL                             IsLoaded(FX_LPCRECTF pClipBox = NULL);\r
98     virtual FX_INT32                    LoadPage(FX_LPCRECTF pClipBox = NULL, IFX_Pause *pPause = NULL);\r
99     virtual void                                UnloadPage(FX_LPCRECTF pClipBox = NULL);\r
100 \r
101     virtual const CFX_RectF&    GetContentsBox();\r
102     virtual FX_POSITION                 GetFirstPosition(FDE_HVISUALOBJ hCanvas);\r
103     virtual FDE_HVISUALOBJ              GetNext(FDE_HVISUALOBJ hCanvas, FX_POSITION &pos, IFDE_VisualSet *&pVisualSet);\r
104     virtual FDE_HVISUALOBJ              GetParentCanvas(FDE_HVISUALOBJ hCanvas, IFDE_VisualSet *&pVisualSet);\r
105     virtual FX_WCHAR    GetChar(FX_LPVOID pIdentity, FX_INT32 index) const;\r
106     virtual FX_INT32    GetWidth(FX_LPVOID pIdentity, FX_INT32 index) const;\r
107 protected:\r
108     virtual ~CFDE_TxtEdtPage();\r
109 private:\r
110     void NormalizePt2Rect(CFX_PointF &ptF, const CFX_RectF &rtF, FX_FLOAT fTolerance) const;\r
111     IFX_CharIter                                *m_pIter;\r
112     CFDE_TxtEdtTextSet                  *m_pTextSet;\r
113     CFDE_TxtEdtEngine                   *m_pEditEngine;\r
114     CFDE_TXTEDTPieceMassArray   m_PieceMassArr;\r
115     CFDE_TxtEdtParag *                  m_pBgnParag;\r
116     CFDE_TxtEdtParag *                  m_pEndParag;\r
117 \r
118     FX_INT32    m_nRefCount;\r
119     FX_INT32    m_nPageStart;\r
120     FX_INT32    m_nCharCount;\r
121     FX_INT32    m_nPageIndex;\r
122     FX_BOOL             m_bLoaded;\r
123     FX_BOOL             m_bLastPage;\r
124     CFX_RectF   m_rtPage;\r
125     CFX_RectF   m_rtPageMargin;\r
126     CFX_RectF   m_rtPageContents;\r
127     CFX_RectF   m_rtPageCanvas;\r
128     FX_INT32*   m_pCharWidth;\r
129 };\r
130 #endif\r