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