Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[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(FX_BSTR 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, public CFX_Object\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 : public CFX_Object {\r
50         FX_INT32 nStart;\r
51         FX_INT32 nCount;\r
52     };\r
53     typedef _FDE_TXTEDTSELRANGE         FDE_TXTEDTSELRANGE;\r
54     typedef _FDE_TXTEDTSELRANGE *       FDE_LPTXTEDTSELRANGE;\r
55     struct _FDE_TXTEDTPARAGPOS : public CFX_Object {\r
56         FX_INT32        nParagIndex;\r
57         FX_INT32        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 FX_INT32                                    CountPages() const;\r
69     virtual IFDE_TxtEdtPage*                    GetPage(FX_INT32 nIndex);\r
70 \r
71     virtual FX_BOOL             SetBufChunkSize(FX_INT32 nChunkSize);\r
72     virtual void                SetTextByStream(IFX_Stream *pStream);\r
73     virtual void                SetText(const CFX_WideString &wsText);\r
74     virtual FX_INT32    GetTextLength() const;\r
75     virtual void                GetText(CFX_WideString &wsText, FX_INT32 nStart, FX_INT32 nCount = -1);\r
76     virtual void                ClearText();\r
77 \r
78     virtual FX_INT32    GetCaretRect(CFX_RectF &rtCaret) const;\r
79     virtual FX_INT32    GetCaretPos() const;\r
80     virtual FX_INT32    SetCaretPos(FX_INT32 nIndex, FX_BOOL bBefore);\r
81     virtual FX_INT32    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 FX_INT32    Insert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLength);\r
87     virtual FX_INT32    Delete(FX_INT32 nStart, FX_BOOL bBackspace = FALSE);\r
88     virtual FX_INT32    DeleteRange(FX_INT32 nStart, FX_INT32 nCount = -1);\r
89     virtual FX_INT32    Replace(FX_INT32 nStart, FX_INT32 nLength, const CFX_WideString &wsReplace);\r
90 \r
91     virtual     void            SetLimit(FX_INT32 nLimit);\r
92     virtual     void            SetAliasChar(FX_WCHAR wcAlias);\r
93     virtual void                SetFormatBlock(FX_INT32 nIndex, const CFX_WideString &wsBlockFormat);\r
94     virtual FX_INT32    CountEditBlocks() const;\r
95     virtual void                GetEditBlockText(FX_INT32 nIndex, CFX_WideString &wsBlockText) const;\r
96     virtual FX_INT32    CountEditFields(FX_INT32 nBlockIndex) const;\r
97     virtual void                GetEditFieldText(FX_INT32 nBlockIndex, FX_INT32 nFieldIndex, CFX_WideString &wsFieldText) const;\r
98     virtual void                StartEdit();\r
99     virtual void                EndEdit();\r
100 \r
101     void                                RemoveSelRange(FX_INT32 nStart, FX_INT32 nCount = -1);\r
102 \r
103     virtual void                AddSelRange(FX_INT32 nStart, FX_INT32 nCount = -1);\r
104     virtual FX_INT32    CountSelRanges();\r
105     virtual FX_INT32    GetSelRange(FX_INT32 nIndex, FX_INT32 &nStart);\r
106     virtual void                ClearSelection();\r
107 \r
108     virtual FX_BOOL             Redo(FX_BSTR bsRedo);\r
109     virtual FX_BOOL             Undo(FX_BSTR bsUndo);\r
110 \r
111     virtual FX_INT32    StartLayout();\r
112     virtual FX_INT32    DoLayout(IFX_Pause *pPause);\r
113     virtual void                EndLayout();\r
114 \r
115     virtual FX_BOOL             Optimize(IFX_Pause * pPause = NULL);\r
116     virtual FX_INT32                    CountParags() const;\r
117     virtual IFDE_TxtEdtParag*   GetParag(FX_INT32 nParagIndex) const;\r
118     virtual IFX_CharIter*               CreateCharIter();\r
119     IFDE_TxtEdtBuf*     GetTextBuf() const;\r
120     FX_INT32            GetTextBufLength() const;\r
121     IFX_TxtBreak*       GetTextBreak() const;\r
122     FX_INT32    GetLineCount() const;\r
123     FX_INT32    GetPageLineCount() const;\r
124 \r
125     FX_INT32                    Line2Parag(FX_INT32 nStartParag, FX_INT32 nStartLineofParag,\r
126                                    FX_INT32 nLineIndex, FX_INT32 &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(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLength);\r
136 #ifdef FDE_USEFORMATBLOCK\r
137     void        RawInsert(FX_INT32 nStart, FX_LPCWSTR lpText, FX_INT32 nLength);\r
138 #endif\r
139     void        GetPreDeleteText(CFX_WideString &wsText, FX_INT32 nIndex, FX_INT32 nLength);\r
140     void        GetPreInsertText(CFX_WideString &wsText, FX_INT32 nIndex, FX_LPCWSTR lpText, FX_INT32 nLength);\r
141     void        GetPreReplaceText(CFX_WideString &wsText, FX_INT32 nIndex, FX_INT32 nOriginLength, FX_LPCWSTR lpText, FX_INT32 nLength);\r
142 \r
143     void        Inner_DeleteRange(FX_INT32 nStart, FX_INT32 nCount = -1);\r
144     void        DeleteRange_DoRecord(FX_INT32 nStart, FX_INT32 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_LPWSTR &lpText, FX_INT32 &nLength, FX_BOOL bPreIsCR = FALSE);\r
154     void        RecoverParagEnd(CFX_WideString &wsText);\r
155     FX_INT32    MovePage2Char(FX_INT32 nIndex);\r
156     void                TextPos2ParagPos(FX_INT32 nIndex, FDE_TXTEDTPARAGPOS &ParagPos) const;\r
157     FX_INT32    MoveForward(FX_BOOL &bBefore);\r
158     FX_INT32    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(FX_INT32 nIndex, FX_BOOL bBefore = TRUE);\r
169     void        GetCaretRect(CFX_RectF &rtCaret, FX_INT32 nPageIndex, FX_INT32 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     FX_INT32    m_nPageLineCount;\r
181     FX_INT32    m_nLineCount;\r
182     FX_INT32    m_nAnchorPos;\r
183     FX_INT32    m_nLayoutPos;\r
184     FX_FLOAT    m_fCaretPosReserve;\r
185     FX_INT32    m_nCaret;\r
186     FX_BOOL             m_bBefore;\r
187     FX_INT32    m_nCaretPage;\r
188     CFX_RectF   m_rtCaret;\r
189     FX_DWORD    m_dwFindFlags;\r
190 \r
191     FX_BOOL             m_bLock;\r
192     FX_INT32    m_nLimit;\r
193     FX_WCHAR    m_wcAliasChar;\r
194     FX_INT32    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, public CFX_Object\r
201 {\r
202 public:\r
203     CFDE_TxtEdtDoRecord_Insert(FX_BSTR bsDoRecord);\r
204     CFDE_TxtEdtDoRecord_Insert( CFDE_TxtEdtEngine * pEngine,\r
205                                 FX_INT32 nCaret,\r
206                                 FX_LPCWSTR lpText,\r
207                                 FX_INT32 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(FX_BSTR bsDoRecord);\r
215 private:\r
216     CFDE_TxtEdtEngine * m_pEngine;\r
217     FX_INT32                    m_nCaret;\r
218     CFX_WideString              m_wsInsert;\r
219 };\r
220 class CFDE_TxtEdtDoRecord_DeleteRange : public IFDE_TxtEdtDoRecord, public CFX_Object\r
221 {\r
222 public:\r
223     CFDE_TxtEdtDoRecord_DeleteRange(FX_BSTR bsDoRecord);\r
224     CFDE_TxtEdtDoRecord_DeleteRange(CFDE_TxtEdtEngine * pEngine,\r
225                                     FX_INT32 nIndex,\r
226                                     FX_INT32 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(FX_BSTR bsDoRecord);\r
236 private:\r
237     CFDE_TxtEdtEngine * m_pEngine;\r
238     FX_BOOL                             m_bSel;\r
239     FX_INT32                    m_nIndex;\r
240     FX_INT32                    m_nCaret;\r
241     CFX_WideString              m_wsRange;\r
242 };\r
243 #ifdef FDE_USEFORMATBLOCK\r
244 class CFDE_TxtEdtDoRecord_FieldInsert : public IFDE_TxtEdtDoRecord, public CFX_Object\r
245 {\r
246 public:\r
247     CFDE_TxtEdtDoRecord_FieldInsert(FX_BSTR bsDoRecord);\r
248     CFDE_TxtEdtDoRecord_FieldInsert(CFDE_TxtEdtEngine * pEngine,\r
249                                     FX_INT32 nCaret,\r
250                                     CFDE_TxtEdtField * pField,\r
251                                     FX_INT32 nIndexInField,\r
252                                     FX_INT32 nFieldBgn,\r
253                                     FX_INT32 nOldFieldLength,\r
254                                     FX_INT32 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(FX_BSTR bsDoRecord);\r
264 \r
265 private:\r
266     CFDE_TxtEdtEngine * m_pEngine;\r
267     FX_INT32                    m_nCaret;\r
268     CFDE_TxtEdtField *  m_pField;\r
269     FX_INT32                    m_nIndexInField;\r
270     FX_INT32                    m_nFieldBgn;\r
271     FX_INT32                    m_nOldFieldLength;\r
272     FX_INT32                    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, public CFX_Object\r
277 {\r
278 public:\r
279     CFDE_TxtEdtDoRecord_FieldDelete(FX_BSTR bsDoRecord);\r
280     CFDE_TxtEdtDoRecord_FieldDelete(CFDE_TxtEdtEngine * pEngine,\r
281                                     FX_INT32 nCaret,\r
282                                     CFDE_TxtEdtField * pField,\r
283                                     FX_INT32 nIndexInField,\r
284                                     FX_INT32 nFieldBgn,\r
285                                     FX_INT32 nOldLength,\r
286                                     FX_INT32 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(FX_BSTR bsDoRecord);\r
296 private:\r
297     CFDE_TxtEdtEngine * m_pEngine;\r
298     FX_INT32                    m_nCaret;\r
299     CFDE_TxtEdtField *  m_pField;\r
300     FX_INT32                    m_nIndexInField;\r
301     FX_INT32                    m_nFieldBgn;\r
302     FX_INT32                    m_nOldFieldLength;\r
303     FX_INT32                    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, public CFX_Object\r
308 {\r
309 public:\r
310     CFDE_TxtEdtDoRecord_FieldReplace(FX_BSTR bsDoRecord);\r
311     CFDE_TxtEdtDoRecord_FieldReplace(   CFDE_TxtEdtEngine * pEngine,\r
312                                         FX_INT32 nCaret,\r
313                                         FX_INT32 nNewCaret,\r
314                                         CFDE_TxtEdtField * pField,\r
315                                         FX_INT32        nIndexInField,\r
316                                         FX_INT32        nFieldBgn,\r
317                                         FX_INT32        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(FX_BSTR bsDoRecord);\r
328 private:\r
329     CFDE_TxtEdtEngine * m_pEngine;\r
330     FX_INT32                    m_nCaret;\r
331     FX_INT32                    m_nNewCaret;\r
332     CFDE_TxtEdtField *  m_pField;\r
333     FX_INT32                    m_nIndexInField;\r
334     FX_INT32                    m_nFieldBgn;\r
335     FX_INT32                    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