Merge to XFA: Remove FX_BSTR and FX_WSTR typedefs.
[pdfium.git] / xfa / src / fee / src / fee / fde_txtedtengine.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_TXTEDTENGINE_H\r
8 #define _FDE_TXTEDTENGINE_H\r
9 class CFDE_TxtEdtBuf;\r
10 class CFDE_TxtEdtPage;\r
11 class IFX_TxtBreak;\r
12 class CFDE_TxtEdtParag;\r
13 class CFDE_TxtEdtKMPMatch;\r
14 class IFDE_TxtEdtFormator;\r
15 class CFDE_TxtEdtField;\r
16 class CFDE_TxtEdtBlock;\r
17 class IFX_CharIter;\r
18 class CFDE_TxtEdtEngine;\r
19 class CFDE_TxtEdtDoRecord_Insert;\r
20 class CFDE_TxtEdtDoRecord_DeleteRange;\r
21 #ifdef FDE_USEFORMATBLOCK\r
22 class CFDE_TxtEdtDoRecord_FormatInsert;\r
23 class CFDE_TxtEdtDoRecord_FormatDelete;\r
24 class CFDE_TxtEdtDoRecord_FormatReplace;\r
25 class CFDE_TxtEdtDoRecord_FieldInsert;\r
26 class CFDE_TxtEdtDoRecord_FieldDelete;\r
27 class CFDE_TxtEdtDoRecord_FieldReplace;\r
28 #endif\r
29 class IFDE_TxtEdtDoRecord\r
30 {\r
31 public:\r
32     static IFDE_TxtEdtDoRecord * Create(const CFX_ByteStringC& bsDoRecord);\r
33     virtual void        Release() = 0;\r
34     virtual FX_BOOL Redo() = 0;\r
35     virtual FX_BOOL Undo() = 0;\r
36     virtual void        Serialize(CFX_ByteString &bsDoRecord) const = 0;\r
37 };\r
38 class CFDE_TxtEdtEngine : public IFDE_TxtEdtEngine\r
39 {\r
40     friend class CFDE_TxtEdtDoRecord_Insert;\r
41     friend class CFDE_TxtEdtDoRecord_DeleteRange;\r
42     friend class CFDE_TxtEdtPage;\r
43 #ifdef FDE_USEFORMATBLOCK\r
44     friend class CFDE_TxtEdtDoRecord_FormatInsert;\r
45     friend class CFDE_TxtEdtDoRecord_FormatDelete;\r
46     friend class CFDE_TxtEdtDoRecord_FormatReplace;\r
47     friend class CFDE_TxtEdtBlock;\r
48 #endif\r
49     struct _FDE_TXTEDTSELRANGE {\r
50         int32_t nStart;\r
51         int32_t nCount;\r
52     };\r
53     typedef _FDE_TXTEDTSELRANGE         FDE_TXTEDTSELRANGE;\r
54     typedef _FDE_TXTEDTSELRANGE *       FDE_LPTXTEDTSELRANGE;\r
55     struct _FDE_TXTEDTPARAGPOS {\r
56         int32_t nParagIndex;\r
57         int32_t nCharIndex;\r
58     };\r
59     typedef _FDE_TXTEDTPARAGPOS         FDE_TXTEDTPARAGPOS;\r
60     typedef _FDE_TXTEDTPARAGPOS *       FDE_LPTXTEDTPARAGPOS;\r
61 public:\r
62     CFDE_TxtEdtEngine();\r
63     virtual void                                                Release();\r
64 \r
65     virtual void                                                SetEditParams(const FDE_TXTEDTPARAMS &params);\r
66     virtual const FDE_TXTEDTPARAMS*             GetEditParams() const;\r
67 \r
68     virtual int32_t                                     CountPages() const;\r
69     virtual IFDE_TxtEdtPage*                    GetPage(int32_t nIndex);\r
70 \r
71     virtual FX_BOOL             SetBufChunkSize(int32_t nChunkSize);\r
72     virtual void                SetTextByStream(IFX_Stream *pStream);\r
73     virtual void                SetText(const CFX_WideString &wsText);\r
74     virtual int32_t     GetTextLength() const;\r
75     virtual void                GetText(CFX_WideString &wsText, int32_t nStart, int32_t nCount = -1);\r
76     virtual void                ClearText();\r
77 \r
78     virtual int32_t     GetCaretRect(CFX_RectF &rtCaret) const;\r
79     virtual int32_t     GetCaretPos() const;\r
80     virtual int32_t     SetCaretPos(int32_t nIndex, FX_BOOL bBefore);\r
81     virtual int32_t     MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret, FX_BOOL bShift = FALSE, FX_BOOL bCtrl = FALSE);\r
82     virtual void        Lock();\r
83     virtual void        Unlock();\r
84     virtual FX_BOOL     IsLocked() const;\r
85 \r
86     virtual int32_t     Insert(int32_t nStart, const FX_WCHAR* lpText, int32_t nLength);\r
87     virtual int32_t     Delete(int32_t nStart, FX_BOOL bBackspace = FALSE);\r
88     virtual int32_t     DeleteRange(int32_t nStart, int32_t nCount = -1);\r
89     virtual int32_t     Replace(int32_t nStart, int32_t nLength, const CFX_WideString &wsReplace);\r
90 \r
91     virtual     void            SetLimit(int32_t nLimit);\r
92     virtual     void            SetAliasChar(FX_WCHAR wcAlias);\r
93     virtual void                SetFormatBlock(int32_t nIndex, const CFX_WideString &wsBlockFormat);\r
94     virtual int32_t     CountEditBlocks() const;\r
95     virtual void                GetEditBlockText(int32_t nIndex, CFX_WideString &wsBlockText) const;\r
96     virtual int32_t     CountEditFields(int32_t nBlockIndex) const;\r
97     virtual void                GetEditFieldText(int32_t nBlockIndex, int32_t nFieldIndex, CFX_WideString &wsFieldText) const;\r
98     virtual void                StartEdit();\r
99     virtual void                EndEdit();\r
100 \r
101     void                                RemoveSelRange(int32_t nStart, int32_t nCount = -1);\r
102 \r
103     virtual void                AddSelRange(int32_t nStart, int32_t nCount = -1);\r
104     virtual int32_t     CountSelRanges();\r
105     virtual int32_t     GetSelRange(int32_t nIndex, int32_t &nStart);\r
106     virtual void                ClearSelection();\r
107 \r
108     virtual FX_BOOL             Redo(const CFX_ByteStringC& bsRedo);\r
109     virtual FX_BOOL             Undo(const CFX_ByteStringC& bsUndo);\r
110 \r
111     virtual int32_t     StartLayout();\r
112     virtual int32_t     DoLayout(IFX_Pause *pPause);\r
113     virtual void                EndLayout();\r
114 \r
115     virtual FX_BOOL             Optimize(IFX_Pause * pPause = NULL);\r
116     virtual int32_t                     CountParags() const;\r
117     virtual IFDE_TxtEdtParag*   GetParag(int32_t nParagIndex) const;\r
118     virtual IFX_CharIter*               CreateCharIter();\r
119     IFDE_TxtEdtBuf*     GetTextBuf() const;\r
120     int32_t             GetTextBufLength() const;\r
121     IFX_TxtBreak*       GetTextBreak() const;\r
122     int32_t     GetLineCount() const;\r
123     int32_t     GetPageLineCount() const;\r
124 \r
125     int32_t                     Line2Parag(int32_t nStartParag, int32_t nStartLineofParag,\r
126                                    int32_t nLineIndex, int32_t &nStartLine) const;\r
127     FX_WCHAR                    GetAliasChar() const\r
128     {\r
129         return m_wcAliasChar;\r
130     }\r
131 \r
132 protected:\r
133     virtual ~CFDE_TxtEdtEngine();\r
134 private:\r
135     void        Inner_Insert(int32_t nStart, const FX_WCHAR* lpText, int32_t nLength);\r
136 #ifdef FDE_USEFORMATBLOCK\r
137     void        RawInsert(int32_t nStart, const FX_WCHAR* lpText, int32_t nLength);\r
138 #endif\r
139     void        GetPreDeleteText(CFX_WideString &wsText, int32_t nIndex, int32_t nLength);\r
140     void        GetPreInsertText(CFX_WideString &wsText, int32_t nIndex, const FX_WCHAR* lpText, int32_t nLength);\r
141     void        GetPreReplaceText(CFX_WideString &wsText, int32_t nIndex, int32_t nOriginLength, const FX_WCHAR* lpText, int32_t nLength);\r
142 \r
143     void        Inner_DeleteRange(int32_t nStart, int32_t nCount = -1);\r
144     void        DeleteRange_DoRecord(int32_t nStart, int32_t nCount, FX_BOOL bSel = FALSE);\r
145     void        ResetEngine();\r
146     void        RebuildParagraphs();\r
147     void        RemoveAllParags();\r
148     void        RemoveAllPages();\r
149     void        UpdateParags();\r
150     void        UpdatePages();\r
151     void        UpdateTxtBreak();\r
152 \r
153     FX_BOOL     ReplaceParagEnd(FX_WCHAR* &lpText, int32_t &nLength, FX_BOOL bPreIsCR = FALSE);\r
154     void        RecoverParagEnd(CFX_WideString &wsText);\r
155     int32_t     MovePage2Char(int32_t nIndex);\r
156     void                TextPos2ParagPos(int32_t nIndex, FDE_TXTEDTPARAGPOS &ParagPos) const;\r
157     int32_t     MoveForward(FX_BOOL &bBefore);\r
158     int32_t     MoveBackward(FX_BOOL &bBefore);\r
159     FX_BOOL             MoveUp(CFX_PointF &ptCaret);\r
160     FX_BOOL             MoveDown(CFX_PointF &ptCaret);\r
161     FX_BOOL             MoveLineStart();\r
162     FX_BOOL             MoveLineEnd();\r
163     FX_BOOL             MoveParagStart();\r
164     FX_BOOL             MoveParagEnd();\r
165     FX_BOOL             MoveHome();\r
166     FX_BOOL             MoveEnd();\r
167     FX_BOOL             IsFitArea(CFX_WideString &wsText);\r
168     void        UpdateCaretRect(int32_t nIndex, FX_BOOL bBefore = TRUE);\r
169     void        GetCaretRect(CFX_RectF &rtCaret, int32_t nPageIndex, int32_t nCaret, FX_BOOL bBefore = TRUE);\r
170     void        UpdateCaretIndex(const CFX_PointF & ptCaret);\r
171 \r
172     FX_BOOL     IsSelect();\r
173     void        DeleteSelect();\r
174     IFDE_TxtEdtBuf*             m_pTxtBuf;\r
175     IFX_TxtBreak*               m_pTextBreak;\r
176     FDE_TXTEDTPARAMS    m_Param;\r
177     CFX_ArrayTemplate<IFDE_TxtEdtPage*>                 m_PagePtrArray;\r
178     CFX_ArrayTemplate<CFDE_TxtEdtParag*>                m_ParagPtrArray;\r
179     CFX_ArrayTemplate<FDE_LPTXTEDTSELRANGE>             m_SelRangePtrArr;\r
180     int32_t     m_nPageLineCount;\r
181     int32_t     m_nLineCount;\r
182     int32_t     m_nAnchorPos;\r
183     int32_t     m_nLayoutPos;\r
184     FX_FLOAT    m_fCaretPosReserve;\r
185     int32_t     m_nCaret;\r
186     FX_BOOL             m_bBefore;\r
187     int32_t     m_nCaretPage;\r
188     CFX_RectF   m_rtCaret;\r
189     FX_DWORD    m_dwFindFlags;\r
190 \r
191     FX_BOOL             m_bLock;\r
192     int32_t     m_nLimit;\r
193     FX_WCHAR    m_wcAliasChar;\r
194     int32_t     m_nFirstLineEnd;\r
195     FX_BOOL             m_bAutoLineEnd;\r
196     FX_WCHAR    m_wLineEnd;\r
197 \r
198     FDE_TXTEDT_TEXTCHANGE_INFO m_ChangeInfo;\r
199 };\r
200 class CFDE_TxtEdtDoRecord_Insert : public IFDE_TxtEdtDoRecord\r
201 {\r
202 public:\r
203     CFDE_TxtEdtDoRecord_Insert(const CFX_ByteStringC& bsDoRecord);\r
204     CFDE_TxtEdtDoRecord_Insert( CFDE_TxtEdtEngine * pEngine,\r
205                                 int32_t nCaret,\r
206                                 const FX_WCHAR* lpText,\r
207                                 int32_t nLength);\r
208     virtual void        Release();\r
209     virtual FX_BOOL Undo();\r
210     virtual FX_BOOL Redo();\r
211     virtual void        Serialize(CFX_ByteString &bsDoRecord) const;\r
212 protected:\r
213     ~CFDE_TxtEdtDoRecord_Insert();\r
214     void                        Deserialize(const CFX_ByteStringC& bsDoRecord);\r
215 private:\r
216     CFDE_TxtEdtEngine * m_pEngine;\r
217     int32_t                     m_nCaret;\r
218     CFX_WideString              m_wsInsert;\r
219 };\r
220 class CFDE_TxtEdtDoRecord_DeleteRange : public IFDE_TxtEdtDoRecord\r
221 {\r
222 public:\r
223     CFDE_TxtEdtDoRecord_DeleteRange(const CFX_ByteStringC& bsDoRecord);\r
224     CFDE_TxtEdtDoRecord_DeleteRange(CFDE_TxtEdtEngine * pEngine,\r
225                                     int32_t nIndex,\r
226                                     int32_t nCaret,\r
227                                     const CFX_WideString &wsRange,\r
228                                     FX_BOOL bSel = FALSE);\r
229     virtual     void    Release();\r
230     virtual FX_BOOL Undo();\r
231     virtual FX_BOOL Redo();\r
232     virtual void        Serialize(CFX_ByteString &bsDoRecord) const;\r
233 protected:\r
234     ~CFDE_TxtEdtDoRecord_DeleteRange();\r
235     void                        Deserialize(const CFX_ByteStringC& bsDoRecord);\r
236 private:\r
237     CFDE_TxtEdtEngine * m_pEngine;\r
238     FX_BOOL                             m_bSel;\r
239     int32_t                     m_nIndex;\r
240     int32_t                     m_nCaret;\r
241     CFX_WideString              m_wsRange;\r
242 };\r
243 #ifdef FDE_USEFORMATBLOCK\r
244 class CFDE_TxtEdtDoRecord_FieldInsert : public IFDE_TxtEdtDoRecord\r
245 {\r
246 public:\r
247     CFDE_TxtEdtDoRecord_FieldInsert(const CFX_ByteStringC& bsDoRecord);\r
248     CFDE_TxtEdtDoRecord_FieldInsert(CFDE_TxtEdtEngine * pEngine,\r
249                                     int32_t nCaret,\r
250                                     CFDE_TxtEdtField * pField,\r
251                                     int32_t nIndexInField,\r
252                                     int32_t nFieldBgn,\r
253                                     int32_t nOldFieldLength,\r
254                                     int32_t nNewFieldLength,\r
255                                     const CFX_WideString &wsIns,\r
256                                     FX_BOOL bSel = FALSE);\r
257     virtual void        Release();\r
258     virtual FX_BOOL     Undo();\r
259     virtual FX_BOOL     Redo();\r
260     virtual void        Serialize(CFX_ByteString &bsDoRecord) const;\r
261 protected:\r
262     ~CFDE_TxtEdtDoRecord_FieldInsert();\r
263     void        Deserialize(const CFX_ByteStringC& bsDoRecord);\r
264 \r
265 private:\r
266     CFDE_TxtEdtEngine * m_pEngine;\r
267     int32_t                     m_nCaret;\r
268     CFDE_TxtEdtField *  m_pField;\r
269     int32_t                     m_nIndexInField;\r
270     int32_t                     m_nFieldBgn;\r
271     int32_t                     m_nOldFieldLength;\r
272     int32_t                     m_nNewFieldLength;\r
273     CFX_WideString              m_wsIns;\r
274     FX_BOOL                             m_bSel;\r
275 };\r
276 class CFDE_TxtEdtDoRecord_FieldDelete : public IFDE_TxtEdtDoRecord\r
277 {\r
278 public:\r
279     CFDE_TxtEdtDoRecord_FieldDelete(const CFX_ByteStringC& bsDoRecord);\r
280     CFDE_TxtEdtDoRecord_FieldDelete(CFDE_TxtEdtEngine * pEngine,\r
281                                     int32_t nCaret,\r
282                                     CFDE_TxtEdtField * pField,\r
283                                     int32_t nIndexInField,\r
284                                     int32_t nFieldBgn,\r
285                                     int32_t nOldLength,\r
286                                     int32_t nNewLength,\r
287                                     const CFX_WideString &wsDel,\r
288                                     FX_BOOL bSel = FALSE);\r
289     virtual void        Release();\r
290     virtual FX_BOOL     Undo();\r
291     virtual FX_BOOL     Redo();\r
292     virtual void        Serialize(CFX_ByteString &bsDoRecord) const;\r
293 protected:\r
294     ~CFDE_TxtEdtDoRecord_FieldDelete();\r
295     void        Deserialize(const CFX_ByteStringC& bsDoRecord);\r
296 private:\r
297     CFDE_TxtEdtEngine * m_pEngine;\r
298     int32_t                     m_nCaret;\r
299     CFDE_TxtEdtField *  m_pField;\r
300     int32_t                     m_nIndexInField;\r
301     int32_t                     m_nFieldBgn;\r
302     int32_t                     m_nOldFieldLength;\r
303     int32_t                     m_nNewFieldLength;\r
304     CFX_WideString              m_wsDel;\r
305     FX_BOOL                             m_bSel;\r
306 };\r
307 class CFDE_TxtEdtDoRecord_FieldReplace : public IFDE_TxtEdtDoRecord\r
308 {\r
309 public:\r
310     CFDE_TxtEdtDoRecord_FieldReplace(const CFX_ByteStringC& bsDoRecord);\r
311     CFDE_TxtEdtDoRecord_FieldReplace(   CFDE_TxtEdtEngine * pEngine,\r
312                                         int32_t nCaret,\r
313                                         int32_t nNewCaret,\r
314                                         CFDE_TxtEdtField * pField,\r
315                                         int32_t nIndexInField,\r
316                                         int32_t nFieldBgn,\r
317                                         int32_t nFieldNewLength,\r
318                                         const CFX_WideString &wsDel,\r
319                                         const CFX_WideString &wsIns,\r
320                                         FX_BOOL bSel);\r
321     virtual void        Release();\r
322     virtual FX_BOOL     Undo();\r
323     virtual FX_BOOL     Redo();\r
324     virtual void        Serialize(CFX_ByteString &bsDoRecord) const;\r
325 protected:\r
326     ~CFDE_TxtEdtDoRecord_FieldReplace();\r
327     void        Deserialize(const CFX_ByteStringC& bsDoRecord);\r
328 private:\r
329     CFDE_TxtEdtEngine * m_pEngine;\r
330     int32_t                     m_nCaret;\r
331     int32_t                     m_nNewCaret;\r
332     CFDE_TxtEdtField *  m_pField;\r
333     int32_t                     m_nIndexInField;\r
334     int32_t                     m_nFieldBgn;\r
335     int32_t                     m_nFieldNewLength;\r
336     CFX_WideString              m_wsDel;\r
337     CFX_WideString              m_wsIns;\r
338     FX_BOOL                             m_bSel;\r
339 };\r
340 #endif\r
341 #endif\r