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