Merge to XFA: Use stdint.h types throughout PDFium.
[pdfium.git] / xfa / src / fee / src / fee / fde_txtedtblock.cpp
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 #include "../../../foxitlib.h"\r
8 #include "fde_txtedtblock.h"\r
9 #ifdef FDE_USEFORMATBLOCK\r
10 #define FDE_TXTEDT_FORMATBLOCK_BGN              0xFFF9\r
11 #define FDE_TXTEDT_FORMATBLOCK_END              0xFFFB\r
12 #define FDE_TXTEDT_ZEROWIDTHSPACE               0x200B\r
13 #define FDE_TXTEDT_ISINTEGER(a) ((a) >= L'0' && (a) <= L'9')\r
14 #define FDE_TXTEDT_ISSIGN(a)    (((a) == L'-') || ((a) == L'+'))\r
15 CFDE_TxtEdtBlock::CFDE_TxtEdtBlock(CFDE_TxtEdtEngine * pEngine, const CFX_WideString &wsBlock, int32_t nPosition)\r
16     : m_pEngine(pEngine)\r
17     , m_nDisplayLength(0)\r
18     , m_nIndex(0)\r
19     , m_nPosition(nPosition)\r
20 {\r
21     FX_LPCWSTR lpBuf = FX_LPCWSTR(wsBlock);\r
22     int32_t nCount      = wsBlock.GetLength();\r
23     int32_t i           = 0;\r
24     CFX_WideString wsFix;\r
25     int32_t j = 0;\r
26     while (i < nCount) {\r
27         if (lpBuf[i] != L'%') {\r
28             wsFix += lpBuf[i];\r
29         } else {\r
30             i ++;\r
31             if (i < nCount) {\r
32                 if (lpBuf[i] == L'%') {\r
33                     wsFix += lpBuf[i];\r
34                 } else {\r
35                     if (!wsFix.IsEmpty()) {\r
36                         CFDE_TxtEdtField * pField = CFDE_TxtEdtField::Create(wsFix, j, this);\r
37                         j ++;\r
38                         FXSYS_assert(pField);\r
39                         m_FieldArr.Add(pField);\r
40                         m_nDisplayLength += pField->GetDisplayLength();\r
41                         wsFix.Empty();\r
42                     }\r
43                     int32_t nPos = i - 1;\r
44                     while (lpBuf[i ++] != L')')\r
45                         ;\r
46                     i ++;\r
47                     CFX_WideStringC wsField(lpBuf + nPos, i - nPos);\r
48                     CFDE_TxtEdtField * pField = CFDE_TxtEdtField::Create(wsField, j, this);\r
49                     j ++;\r
50                     FXSYS_assert(pField);\r
51                     m_FieldArr.Add(pField);\r
52                     m_EditFieldArr.Add(pField);\r
53                     m_nDisplayLength += pField->GetDisplayLength();\r
54                     i --;\r
55                 }\r
56             }\r
57         }\r
58         i ++;\r
59     }\r
60     if (!wsFix.IsEmpty()) {\r
61         CFDE_TxtEdtField * pField = CFDE_TxtEdtField::Create(wsFix, j, this);\r
62         FXSYS_assert(pField);\r
63         m_FieldArr.Add(pField);\r
64         m_nDisplayLength += pField->GetDisplayLength();\r
65     }\r
66 }\r
67 CFDE_TxtEdtBlock::~CFDE_TxtEdtBlock()\r
68 {\r
69     int32_t nCount = m_FieldArr.GetSize();\r
70     for (int32_t i = 0; i < nCount; i ++) {\r
71         CFDE_TxtEdtField * pField = m_FieldArr[i];\r
72         pField->Release();\r
73     }\r
74     m_FieldArr.RemoveAll();\r
75 }\r
76 void CFDE_TxtEdtBlock::GetDisplayText(CFX_WideString &wsDisplay)\r
77 {\r
78     int32_t nCount = m_FieldArr.GetSize();\r
79     for (int32_t i = 0; i < nCount; i ++) {\r
80         CFDE_TxtEdtField * pField = m_FieldArr[i];\r
81         CFX_WideString wsTemp;\r
82         pField->GetDisplayText(wsTemp);\r
83         wsDisplay += wsTemp;\r
84     }\r
85 }\r
86 int32_t CFDE_TxtEdtBlock::GetLength() const\r
87 {\r
88     int32_t nDisplayLength = 0;\r
89     int32_t nCount = m_FieldArr.GetSize();\r
90     for (int32_t i = 0; i < nCount; i ++) {\r
91         CFDE_TxtEdtField * pField = m_FieldArr[i];\r
92         nDisplayLength += pField->GetDisplayLength();\r
93     }\r
94     return nDisplayLength;\r
95 }\r
96 void CFDE_TxtEdtBlock::GetBlockText(CFX_WideString &wsBlock)\r
97 {\r
98     int32_t nCount = m_FieldArr.GetSize();\r
99     for (int32_t i = 0; i < nCount; i ++) {\r
100         CFDE_TxtEdtField * pField = m_FieldArr[i];\r
101         CFX_WideString wsTemp;\r
102         pField->GetFieldText(wsTemp);\r
103         wsBlock += wsTemp;\r
104     }\r
105 }\r
106 int32_t CFDE_TxtEdtBlock::CountField() const\r
107 {\r
108     return m_EditFieldArr.GetSize();\r
109 }\r
110 void CFDE_TxtEdtBlock::GetFieldText(int32_t nIndex, CFX_WideString &wsField)\r
111 {\r
112     CFDE_TxtEdtField * pField = m_EditFieldArr[nIndex];\r
113     pField->GetFieldText(wsField);\r
114 }\r
115 int32_t CFDE_TxtEdtBlock::GetFieldTextLength() const\r
116 {\r
117     int32_t nTotalLength = 0;\r
118     int32_t nCount = m_EditFieldArr.GetSize();\r
119     for (int32_t i = 0; i < nCount; i ++) {\r
120         CFDE_TxtEdtField * pField = m_EditFieldArr[i];\r
121         nTotalLength = pField->GetFieldTextLength();\r
122     }\r
123     return nTotalLength;\r
124 }\r
125 int32_t CFDE_TxtEdtBlock::GetPos() const\r
126 {\r
127     return m_nPosition;\r
128 }\r
129 void CFDE_TxtEdtBlock::GetRealText(CFX_WideString &wsText) const\r
130 {\r
131     int32_t nCount = m_FieldArr.GetSize();\r
132     for (int32_t i = 0; i < nCount; i ++) {\r
133         CFDE_TxtEdtField * pField = m_FieldArr[i];\r
134         CFX_WideString wsTemp;\r
135         pField->GetFieldText(wsTemp);\r
136         wsText += wsTemp;\r
137     }\r
138 }\r
139 void CFDE_TxtEdtBlock::Backup()\r
140 {\r
141     int32_t nCount = m_EditFieldArr.GetSize();\r
142     for (int32_t i = 0; i < nCount; i ++) {\r
143         m_EditFieldArr[i]->Backup();\r
144     }\r
145 }\r
146 void CFDE_TxtEdtBlock::Restore()\r
147 {\r
148     int32_t nCount = m_EditFieldArr.GetSize();\r
149     for (int32_t i = 0; i < nCount; i ++) {\r
150         m_EditFieldArr[i]->Restore();\r
151     }\r
152 }\r
153 CFDE_TxtEdtFieldFormatParser::CFDE_TxtEdtFieldFormatParser()\r
154 {\r
155 }\r
156 CFDE_TxtEdtFieldFormatParser::~CFDE_TxtEdtFieldFormatParser()\r
157 {\r
158     FDE_LPTXTEDTFORMATITEM lpItem = NULL;\r
159     int32_t nCount = m_ItemArr.GetSize();\r
160     for (int32_t i = 0; i < nCount; i ++) {\r
161         lpItem = m_ItemArr[i];\r
162         delete lpItem;\r
163     }\r
164     m_ItemArr.RemoveAll();\r
165 }\r
166 FX_BOOL CFDE_TxtEdtFieldFormatParser::Parse(const CFX_WideString &wsFormat)\r
167 {\r
168     m_wsFormat = wsFormat;\r
169     FX_LPCWSTR  pBuf    = FX_LPCWSTR(m_wsFormat);\r
170     int32_t     nCount  = m_wsFormat.GetLength();\r
171     nCount -= 2;\r
172     int32_t i = 0;\r
173     for (; i < nCount; i ++) {\r
174         FX_WCHAR wChar = pBuf[i];\r
175         if (wChar == L'(') {\r
176             break;\r
177         }\r
178     }\r
179     i ++;\r
180     FDE_TXTEDTFORMATITEM FormatItem;\r
181     for (; i < nCount; i ++) {\r
182         while (pBuf[i] == L' ') {\r
183             i ++;\r
184         }\r
185         FormatItem.nKeyStart = i;\r
186         while (pBuf[i] != L':') {\r
187             i ++;\r
188         }\r
189         FormatItem.nKeyCount = i - FormatItem.nKeyStart;\r
190         i ++;\r
191         FormatItem.nValStart = i;\r
192         while (pBuf[i] != L';' && i < nCount) {\r
193             i ++;\r
194         }\r
195         FormatItem.nValCount = i - FormatItem.nValStart;\r
196         FDE_LPTXTEDTFORMATITEM pFormatItem = FX_NEW FDE_TXTEDTFORMATITEM;\r
197         FXSYS_memcpy(pFormatItem, &FormatItem, sizeof(FDE_TXTEDTFORMATITEM));\r
198         m_ItemArr.Add(pFormatItem);\r
199     }\r
200     return TRUE;\r
201 }\r
202 int32_t CFDE_TxtEdtFieldFormatParser::CountItems() const\r
203 {\r
204     return m_ItemArr.GetSize();\r
205 }\r
206 void CFDE_TxtEdtFieldFormatParser::GetItem(int32_t nIndex, CFX_WideString &wsKey, CFX_WideString &wsValue) const\r
207 {\r
208     FDE_LPTXTEDTFORMATITEM lpItem = m_ItemArr[nIndex];\r
209     FX_LPCWSTR lpSrcBuf = FX_LPCWSTR(m_wsFormat);\r
210     FX_LPWSTR lpDstBuf = wsKey.GetBuffer(lpItem->nKeyCount);\r
211     FXSYS_memcpy(lpDstBuf, lpSrcBuf + lpItem->nKeyStart, lpItem->nKeyCount * sizeof(FX_WCHAR));\r
212     wsKey.ReleaseBuffer(lpItem->nKeyCount);\r
213     lpDstBuf = wsValue.GetBuffer(lpItem->nValCount);\r
214     FXSYS_memcpy(lpDstBuf, lpSrcBuf + lpItem->nValStart, lpItem->nValCount * sizeof(FX_WCHAR));\r
215     wsValue.ReleaseBuffer(lpItem->nValCount);\r
216 }\r
217 CFDE_TxtEdtField * CFDE_TxtEdtField::Create(const CFX_WideString &wsField, int32_t nIndex, CFDE_TxtEdtBlock * pBlock)\r
218 {\r
219     if (wsField[0] != L'%' || (wsField[0] == L'%' && wsField[1] == L'%')) {\r
220         return FX_NEW CFDE_TxtEdtField_Fixed(wsField, nIndex, pBlock);\r
221     }\r
222     FX_WCHAR wcType = wsField[wsField.GetLength() - 1];\r
223     switch(wcType) {\r
224         case L'd':\r
225             return FX_NEW CFDE_TxtEdtField_Integer(wsField, nIndex, pBlock);\r
226         case L'f':\r
227             return FX_NEW CFDE_TxtEdtField_Float(wsField, nIndex, pBlock);\r
228         case L's':\r
229             return FX_NEW CFDE_TxtEdtField_String(wsField, nIndex, pBlock);\r
230         case L'p':\r
231             return FX_NEW CFDE_TxtEdtField_Password(wsField, nIndex, pBlock);\r
232         default:\r
233             break;\r
234     }\r
235     return NULL;\r
236 }\r
237 void CFDE_TxtEdtField::Release()\r
238 {\r
239     delete this;\r
240 }\r
241 CFDE_TxtEdtField::CFDE_TxtEdtField(int32_t nIndex, CFDE_TxtEdtBlock * pBlock)\r
242     : m_nLength(-1)\r
243     , m_wcFill(L' ')\r
244     , m_bReserveSpace(FALSE)\r
245     , m_bLeftAlignment(TRUE)\r
246     , m_nIndex(nIndex)\r
247     , m_pBlock(pBlock)\r
248 {\r
249     FXSYS_assert(pBlock);\r
250 }\r
251 int32_t CFDE_TxtEdtField::Insert(int32_t nIndex, const CFX_WideString &wsIns,\r
252                                   int32_t &nCaret, FX_BOOL &bBefore)\r
253 {\r
254     int32_t nFieldLength        = m_wsField.GetLength();\r
255     int32_t nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE;\r
256     if (m_bReserveSpace && !m_bLeftAlignment) {\r
257         nInnerIndex -= (m_nLength - nFieldLength);\r
258     }\r
259     FXSYS_assert(nInnerIndex >= 0 && nInnerIndex <= nFieldLength);\r
260     CFX_WideString wsTemp = m_wsField;\r
261     int32_t nInsLength = wsIns.GetLength();\r
262     for (int32_t i = 0; i < nInsLength; i ++, nInnerIndex ++) {\r
263         wsTemp.Insert(nInnerIndex, wsIns[i]);\r
264     }\r
265     int32_t nRet = Validate(wsTemp);\r
266     switch (nRet) {\r
267         case FDE_FORMAT_FIELD_VALIDATE_F_FULL:\r
268             return FDE_FORMAT_FIELD_INSERT_RET_F_FULL;\r
269         case FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE:\r
270             return FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE;\r
271         case FDE_FORMAT_FIELD_VALIDATE_S:\r
272         default:\r
273             break;\r
274     }\r
275     m_wsField   = wsTemp;\r
276     nCaret              = nIndex + ((m_bReserveSpace && !m_bLeftAlignment) ? -nInsLength : nInsLength);\r
277     bBefore             = TRUE;\r
278     return (nFieldLength + nInsLength < m_nLength) ? FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL : FDE_FORMAT_FIELD_INSERT_RET_S_FULL;\r
279 }\r
280 int32_t CFDE_TxtEdtField::Delete(int32_t nIndex, int32_t nCount,\r
281                                   CFX_WideString &wsDel, int32_t &nCaret, FX_BOOL &bBefore)\r
282 {\r
283     int32_t nFieldLength        = m_wsField.GetLength();\r
284     int32_t nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE;\r
285     if (m_bReserveSpace && !m_bLeftAlignment) {\r
286         nInnerIndex -= (m_nLength - nFieldLength);\r
287     }\r
288     if (nInnerIndex < 0 || (nInnerIndex + nCount) > nFieldLength) {\r
289         return FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY;\r
290     }\r
291     CFX_WideString wsTemp = m_wsField;\r
292     wsTemp.Delete(nInnerIndex, nCount);\r
293     int32_t nRet = Validate(wsTemp);\r
294     switch (nRet) {\r
295         case FDE_FORMAT_FIELD_VALIDATE_F_FULL:\r
296             return FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY;\r
297         case FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE:\r
298             return FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE;\r
299         case FDE_FORMAT_FIELD_VALIDATE_S:\r
300         default:\r
301             break;\r
302     }\r
303     FX_LPWSTR lpBuf = wsDel.GetBuffer(nCount);\r
304     FXSYS_memcpy(lpBuf, FX_LPCWSTR(m_wsField) + nInnerIndex, nCount * sizeof(FX_WCHAR));\r
305     wsDel.ReleaseBuffer(nCount);\r
306     m_wsField   = wsTemp;\r
307     nCaret              = nIndex + (m_bReserveSpace && !m_bLeftAlignment) ? nCount : 0;\r
308     bBefore             = TRUE;\r
309     return FDE_FORMAT_FIELD_DELETE_RET_S;\r
310 }\r
311 int32_t CFDE_TxtEdtField::Replace(int32_t nIndex, int32_t nCount, const CFX_WideString &wsIns,\r
312                                    CFX_WideString &wsDel, int32_t &nCaret, FX_BOOL &bBefore)\r
313 {\r
314     int32_t             nInnerIndex             = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE;\r
315     int32_t             nInsLength              = wsIns.GetLength();\r
316     int32_t             nFieldLength    = m_wsField.GetLength();\r
317     CFX_WideString      wsTemp                  = m_wsField;\r
318     if (m_bReserveSpace && !m_bLeftAlignment) {\r
319         nInnerIndex -= (m_nLength - nFieldLength);\r
320     }\r
321     FXSYS_assert(nInnerIndex >= 0 && nInnerIndex <= nFieldLength);\r
322     if (nInnerIndex + nCount > nFieldLength) {\r
323         return FALSE;\r
324     }\r
325     wsTemp.Delete(nInnerIndex, nCount);\r
326     int32_t nInnerIndexBK = nInnerIndex;\r
327     for (int32_t i = 0; i < nInsLength; i ++, nInnerIndex ++) {\r
328         wsTemp.Insert(nInnerIndex, wsIns[i]);\r
329     }\r
330     int32_t nRet = Validate(wsTemp);\r
331     switch(nRet) {\r
332         case FDE_FORMAT_FIELD_VALIDATE_F_FULL:\r
333             return FDE_FORMAT_FIELD_INSERT_RET_F_FULL;\r
334         case FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE:\r
335             return FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE;\r
336         default:\r
337             break;\r
338     }\r
339     FX_LPWSTR   lpBuffer = wsDel.GetBuffer(nCount);\r
340     FX_LPCWSTR  lpSrcBuf = FX_LPCWSTR(m_wsField);\r
341     FXSYS_memcpy(lpBuffer, lpSrcBuf + nInnerIndexBK, nCount * sizeof(FX_WCHAR));\r
342     wsDel.ReleaseBuffer(nCount);\r
343     m_wsField   = wsTemp;\r
344     nCaret              = nIndex + ((m_bReserveSpace && !m_bLeftAlignment) ? (nCount - nInsLength) : (nInsLength));\r
345     return FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL;\r
346 }\r
347 void CFDE_TxtEdtField::GetDisplayText(CFX_WideString &wsDisplay)\r
348 {\r
349     CFX_WideString wsField;\r
350     GetNormalizedFieldText(wsField);\r
351     int32_t nLength     = wsField.GetLength() + FDE_FORMAT_EDIT_FIELD_HADERSIZE + FDE_FORMAT_EDIT_FIELD_TAILSIZE;\r
352     FX_LPWSTR lpBuffer  = wsDisplay.GetBuffer(nLength);\r
353     lpBuffer[0]                         = FDE_TXTEDT_FORMATBLOCK_BGN;\r
354     lpBuffer[nLength - 1]       = FDE_TXTEDT_FORMATBLOCK_END;\r
355     FX_DWORD nAddress = (FX_DWORD)this;\r
356     FXSYS_memcpy(lpBuffer + 1, &nAddress, sizeof(FX_DWORD));\r
357     FXSYS_memcpy(lpBuffer + 3, FX_LPCWSTR(wsField), (nLength - 4) * sizeof(FX_WCHAR));\r
358     wsDisplay.ReleaseBuffer(nLength);\r
359 }\r
360 int32_t CFDE_TxtEdtField::GetDisplayLength()\r
361 {\r
362     return (m_bReserveSpace ? m_nLength : m_wsField.GetLength()) + FDE_FORMAT_EDIT_FIELD_HADERSIZE + FDE_FORMAT_EDIT_FIELD_TAILSIZE;\r
363 }\r
364 void CFDE_TxtEdtField::GetFieldText(CFX_WideString &wsField)\r
365 {\r
366     wsField = m_wsField;\r
367 }\r
368 int32_t CFDE_TxtEdtField::GetFieldTextLength() const\r
369 {\r
370     return m_wsField.GetLength();\r
371 }\r
372 int32_t CFDE_TxtEdtField::GetRealIndex(int32_t nIndex) const\r
373 {\r
374     int32_t nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE;\r
375     if (nInnerIndex < 0) {\r
376         return 0;\r
377     }\r
378     int32_t nFieldLength        = m_wsField.GetLength();\r
379     if (m_bReserveSpace && !m_bLeftAlignment) {\r
380         nInnerIndex -= (m_nLength - nFieldLength);\r
381     }\r
382     if (nInnerIndex < 0) {\r
383         return 0;\r
384     }\r
385     if (nInnerIndex >= nFieldLength) {\r
386         return nFieldLength;\r
387     }\r
388     return nInnerIndex + 1;\r
389 }\r
390 int32_t CFDE_TxtEdtField::NormalizeCaretPos(int32_t nIndex, FDE_FORMAT_CARET_DIRECTION eDirection ) const\r
391 {\r
392     nIndex -= FDE_FORMAT_EDIT_FIELD_HADERSIZE;\r
393     int32_t nLength = m_wsField.GetLength();\r
394     if (m_bReserveSpace) {\r
395         int32_t nFieldLength = m_wsField.GetLength();\r
396         if (m_bLeftAlignment) {\r
397             if (nIndex > nFieldLength) {\r
398                 if (eDirection == FDE_FORMAT_CARET_FORWARD) {\r
399                     return -1;\r
400                 }\r
401                 nIndex = nFieldLength;\r
402             }\r
403         } else {\r
404             int32_t nReserveLength = m_nLength - nFieldLength;\r
405             if (nIndex < nReserveLength) {\r
406                 if (eDirection == FDE_FORMAT_CARET_BACKWARD) {\r
407                     return -2;\r
408                 }\r
409                 nIndex = nReserveLength;\r
410             }\r
411         }\r
412     }\r
413     return nIndex + FDE_FORMAT_EDIT_FIELD_HADERSIZE;\r
414 }\r
415 FX_BOOL CFDE_TxtEdtField::GetEditableRange(int32_t &nBgn, int32_t &nEnd) const\r
416 {\r
417     if (m_bReserveSpace && !m_bLeftAlignment) {\r
418         nEnd = FDE_FORMAT_EDIT_FIELD_HADERSIZE + m_nLength;\r
419         nBgn = nEnd - m_wsField.GetLength();\r
420     } else {\r
421         nBgn = FDE_FORMAT_EDIT_FIELD_HADERSIZE;\r
422         nEnd = nBgn + m_wsField.GetLength();\r
423     }\r
424     return TRUE;\r
425 }\r
426 void CFDE_TxtEdtField::Backup()\r
427 {\r
428     m_wsBackup = m_wsField;\r
429 }\r
430 void CFDE_TxtEdtField::Restore()\r
431 {\r
432     m_wsField = m_wsBackup;\r
433 }\r
434 int32_t CFDE_TxtEdtField::Validate(const CFX_WideString & wsText) const\r
435 {\r
436     if (m_nLength < 0) {\r
437         return FDE_FORMAT_FIELD_DELETE_RET_S;\r
438     }\r
439     return wsText.GetLength() <= m_nLength ? FDE_FORMAT_FIELD_VALIDATE_S : FDE_FORMAT_FIELD_VALIDATE_F_FULL;\r
440 }\r
441 void CFDE_TxtEdtField::GetNormalizedFieldText(CFX_WideString &wsField) const\r
442 {\r
443     wsField = m_wsField;\r
444     if (m_nLength == -1) {\r
445         return;\r
446     }\r
447     if (m_bReserveSpace) {\r
448         int32_t nField  = wsField.GetLength();\r
449         int32_t nFill   = m_nLength - nField;\r
450         if (m_bLeftAlignment) {\r
451             while (nFill --) {\r
452                 wsField.Insert(nField++, m_wcFill);\r
453             }\r
454         } else {\r
455             while (nFill --) {\r
456                 wsField.Insert(0, m_wcFill);\r
457             }\r
458         }\r
459     }\r
460 }\r
461 CFDE_TxtEdtField_Integer::CFDE_TxtEdtField_Integer(const CFX_WideString &wsField, int32_t nIndex, CFDE_TxtEdtBlock * pBlock)\r
462     : m_bSign(FALSE)\r
463     , CFDE_TxtEdtField(nIndex, pBlock)\r
464 {\r
465     CFDE_TxtEdtFieldFormatParser FormatParser;\r
466     FormatParser.Parse(wsField);\r
467     int32_t nCount = FormatParser.CountItems();\r
468     CFX_WideString wskey;\r
469     CFX_WideString wsVal;\r
470     for (int32_t i = 0; i < nCount; i ++) {\r
471         FormatParser.GetItem(i, wskey, wsVal);\r
472         if (wskey.Equal(L"Length")) {\r
473             m_nLength = wsVal.GetInteger();\r
474         } else if (wskey.Equal(L"Sign")) {\r
475             m_bSign = wsVal.GetInteger() != 0;\r
476         } else if (wskey.Equal(L"FillChar")) {\r
477             m_wcFill = wsVal[0];\r
478         } else {\r
479             FXSYS_assert(0);\r
480         }\r
481         wskey.Empty();\r
482         wsVal.Empty();\r
483     }\r
484     if (m_nLength == -1) {\r
485         m_bReserveSpace = FALSE;\r
486     }\r
487 }\r
488 int32_t CFDE_TxtEdtField_Integer::Validate(const CFX_WideString &wsText) const\r
489 {\r
490     int32_t i   = 0;\r
491     if (m_bSign) {\r
492         FX_WCHAR wcTemp = wsText[0];\r
493         if (FDE_TXTEDT_ISSIGN(wcTemp)) {\r
494             i ++;\r
495         }\r
496     }\r
497     int32_t nLength = wsText.GetLength();\r
498     if (m_nLength > 0) {\r
499         if (nLength - i > (m_nLength - (m_bSign ? 1 : 0))) {\r
500             return FDE_FORMAT_FIELD_VALIDATE_F_FULL;\r
501         }\r
502     }\r
503     for (; i < nLength; i ++) {\r
504         FX_WCHAR wcTemp = wsText[i];\r
505         if (!FDE_TXTEDT_ISINTEGER(wcTemp)) {\r
506             return FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE;\r
507         }\r
508     }\r
509     return FDE_FORMAT_FIELD_VALIDATE_S;\r
510 }\r
511 CFDE_TxtEdtField_Float::CFDE_TxtEdtField_Float(const CFX_WideString &wsField, int32_t nIndex, CFDE_TxtEdtBlock * pBlock)\r
512     : CFDE_TxtEdtField(nIndex, pBlock)\r
513     , m_bSigned(FALSE)\r
514     , m_nIntPartlength(-1)\r
515     , m_nDecPartLength(-1)\r
516 {\r
517     CFDE_TxtEdtFieldFormatParser FormatParser;\r
518     FormatParser.Parse(wsField);\r
519     int32_t nCount = FormatParser.CountItems();\r
520     CFX_WideString wskey;\r
521     CFX_WideString wsVal;\r
522     for (int32_t i = 0; i < nCount; i ++) {\r
523         FormatParser.GetItem(i, wskey, wsVal);\r
524         if (wskey.Equal(L"DecLength")) {\r
525             m_nDecPartLength = wsVal.GetInteger();\r
526         } else if (wskey.Equal(L"IntLength")) {\r
527             m_nIntPartlength = wsVal.GetInteger();\r
528         } else if (wskey.Equal(L"Sign")) {\r
529             m_bSigned = wsVal.GetInteger() != 0;\r
530         } else if (wskey.Equal(L"FillChar")) {\r
531             m_wcFill = wsVal[0];\r
532         } else {\r
533             FXSYS_assert(0);\r
534         }\r
535         if (m_nIntPartlength == -1 || m_nDecPartLength == -1) {\r
536             m_nLength = -1;\r
537         } else {\r
538             m_nLength = m_nIntPartlength + m_nDecPartLength + 1 + (m_bSigned ? 1 : 0);\r
539         }\r
540         m_bReserveSpace = TRUE;\r
541         wskey.Empty();\r
542         wsVal.Empty();\r
543     }\r
544 }\r
545 int32_t CFDE_TxtEdtField_Float::Validate(const CFX_WideString & wsText) const\r
546 {\r
547     int32_t nLength = wsText.GetLength();\r
548     if (m_nLength != -1 && (nLength > m_nLength)) {\r
549         return FDE_FORMAT_FIELD_VALIDATE_F_FULL;\r
550     }\r
551     FX_LPCWSTR lpBuf = FX_LPCWSTR(wsText);\r
552     int32_t i = 0;\r
553     if (m_bSigned) {\r
554         FX_WCHAR wcTemp = lpBuf[0];\r
555         if (FDE_TXTEDT_ISSIGN(wcTemp)) {\r
556             i ++;\r
557         }\r
558     }\r
559     int32_t nIntPart    = 0;\r
560     int32_t nPoint              = 0;\r
561     for (; i < nLength; i ++) {\r
562         FX_WCHAR wcTemp = lpBuf[i];\r
563         if (!FDE_TXTEDT_ISINTEGER(wcTemp)) {\r
564             if (wcTemp != L'.') {\r
565                 return FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE;\r
566             }\r
567             nPoint = 1;\r
568             break;\r
569         }\r
570         nIntPart ++;\r
571     }\r
572     if (m_nIntPartlength != -1 && (nIntPart > m_nIntPartlength)) {\r
573         return FDE_FORMAT_FIELD_VALIDATE_F_FULL;\r
574     }\r
575     if (m_nDecPartLength != -1 && (nLength - nIntPart - nPoint > m_nDecPartLength)) {\r
576         return FDE_FORMAT_FIELD_VALIDATE_F_FULL;\r
577     }\r
578     i ++;\r
579     for (; i < nLength; i ++) {\r
580         FX_WCHAR wcTemp = lpBuf[i];\r
581         if (!FDE_TXTEDT_ISINTEGER(wcTemp)) {\r
582             return FDE_FORMAT_FIELD_VALIDATE_F_FULL;\r
583         }\r
584     }\r
585     return FDE_FORMAT_FIELD_VALIDATE_S;\r
586 }\r
587 CFDE_TxtEdtField_Password::CFDE_TxtEdtField_Password(const CFX_WideString &wsField, int32_t nIndex, CFDE_TxtEdtBlock * pBlock)\r
588     : CFDE_TxtEdtField(nIndex, pBlock)\r
589     , m_wcAlias(L'*')\r
590 {\r
591     CFDE_TxtEdtFieldFormatParser FormatParser;\r
592     FormatParser.Parse(wsField);\r
593     int32_t nCount = FormatParser.CountItems();\r
594     CFX_WideString wskey;\r
595     CFX_WideString wsVal;\r
596     for (int32_t i = 0; i < nCount; i ++) {\r
597         FormatParser.GetItem(i, wskey, wsVal);\r
598         if (wskey.Equal(L"Length")) {\r
599             m_nLength = wsVal.GetInteger();\r
600         } else if (wskey.Equal(L"AliasChar")) {\r
601             m_wcAlias = wsVal[0];\r
602         } else {\r
603             FXSYS_assert(0);\r
604         }\r
605         wskey.Empty();\r
606         wsVal.Empty();\r
607     }\r
608     if (m_nLength == -1) {\r
609         m_bReserveSpace = FALSE;\r
610     }\r
611 }\r
612 void CFDE_TxtEdtField_Password::GetNormalizedFieldText(CFX_WideString &wsField) const\r
613 {\r
614     int32_t nFiledLength        = m_wsField.GetLength();\r
615     int32_t nLength             = m_bReserveSpace ? m_nLength : nFiledLength;\r
616     FX_LPWSTR lpBuf                     = wsField.GetBuffer(nLength);\r
617     int32_t nSpaceLength        = nLength - nFiledLength;\r
618     int32_t nFirstPart          = m_bLeftAlignment ? nFiledLength : nSpaceLength;\r
619     FX_WCHAR wFirstChar         = m_bLeftAlignment ? m_wcAlias : L' ';\r
620     FX_WCHAR wSecondChar        = m_bLeftAlignment ? L' ' : m_wcAlias;\r
621     int32_t i = 0;\r
622     for (; i < nFirstPart; i ++) {\r
623         lpBuf[i] = wFirstChar;\r
624     }\r
625     for (; i < nLength; i ++) {\r
626         lpBuf[i] = wSecondChar;\r
627     }\r
628     wsField.ReleaseBuffer(nLength);\r
629 }\r
630 CFDE_TxtEdtField_String::CFDE_TxtEdtField_String(const CFX_WideString &wsField, int32_t nIndex, CFDE_TxtEdtBlock * pBlock)\r
631     : CFDE_TxtEdtField(nIndex, pBlock)\r
632 {\r
633     CFDE_TxtEdtFieldFormatParser FormatParser;\r
634     FormatParser.Parse(wsField);\r
635     int32_t nCount = FormatParser.CountItems();\r
636     CFX_WideString wskey;\r
637     CFX_WideString wsVal;\r
638     for (int32_t i = 0; i < nCount; i ++) {\r
639         FormatParser.GetItem(i, wskey, wsVal);\r
640         if (wskey.Equal(L"Length")) {\r
641             m_nLength = wsVal.GetInteger();\r
642         } else {\r
643             FXSYS_assert(0);\r
644         }\r
645         wskey.Empty();\r
646         wsVal.Empty();\r
647     }\r
648 }\r
649 CFDE_TxtEdtField_Fixed::CFDE_TxtEdtField_Fixed(const CFX_WideString &wsField, int32_t nIndex, CFDE_TxtEdtBlock * pBlock)\r
650     : CFDE_TxtEdtField(nIndex, pBlock)\r
651 {\r
652     m_wsField = wsField;\r
653     m_nLength = wsField.GetLength();\r
654 }\r
655 void CFDE_TxtEdtField_Fixed::GetDisplayText(CFX_WideString &wsDisplay)\r
656 {\r
657     int32_t nLength     = m_wsField.GetLength() + FDE_FORMAT_EDIT_FIELD_HADERSIZE + FDE_FORMAT_EDIT_FIELD_TAILSIZE;\r
658     FX_LPWSTR lpBuffer  = wsDisplay.GetBuffer(nLength);\r
659     lpBuffer[0]                         = FDE_TXTEDT_FORMATBLOCK_BGN;\r
660     lpBuffer[nLength - 1]       = FDE_TXTEDT_FORMATBLOCK_END;\r
661     FX_DWORD nAddress = (FX_DWORD)this;\r
662     FXSYS_memcpy(lpBuffer + 1, &nAddress, sizeof(FX_DWORD));\r
663     FXSYS_memcpy(lpBuffer + 3, FX_LPCWSTR(m_wsField), (nLength - 4) * sizeof(FX_WCHAR));\r
664     wsDisplay.ReleaseBuffer(nLength);\r
665 }\r
666 int32_t CFDE_TxtEdtField_Fixed::NormalizeCaretPos(int32_t nIndex, FDE_FORMAT_CARET_DIRECTION eDirection ) const\r
667 {\r
668     FXSYS_assert(nIndex >= 0 && nIndex <= m_nLength);\r
669     if (eDirection == FDE_FORMAT_CARET_MIDDLE) {\r
670         return (nIndex > m_wsField.GetLength() / 2) ? -1 : -2;\r
671     }\r
672     return eDirection == FDE_FORMAT_CARET_BACKWARD ? -2 : -1;\r
673 }\r
674 #endif\r