Home | History | Annotate | Download | only in fee
      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'+'))
     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 }
     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 }
     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 }
     85 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 }
     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 }
    103 int32_t CFDE_TxtEdtBlock::CountField() const {
    104   return m_EditFieldArr.GetSize();
    105 }
    106 void CFDE_TxtEdtBlock::GetFieldText(int32_t nIndex, CFX_WideString& wsField) {
    107   CFDE_TxtEdtField* pField = m_EditFieldArr[nIndex];
    108   pField->GetFieldText(wsField);
    109 }
    110 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 }
    119 int32_t CFDE_TxtEdtBlock::GetPos() const {
    120   return m_nPosition;
    121 }
    122 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 }
    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 }
    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 }
    143 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 }
    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 }
    188 int32_t CFDE_TxtEdtFieldFormatParser::CountItems() const {
    189   return m_ItemArr.GetSize();
    190 }
    191 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 }
    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 }
    226 void CFDE_TxtEdtField::Release() {
    227   delete this;
    228 }
    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 }
    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 }
    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 }
    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 }
    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 }
    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 }
    364 void CFDE_TxtEdtField::GetFieldText(CFX_WideString& wsField) {
    365   wsField = m_wsField;
    366 }
    367 int32_t CFDE_TxtEdtField::GetFieldTextLength() const {
    368   return m_wsField.GetLength();
    369 }
    370 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 }
    387 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 }
    413 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 }
    423 void CFDE_TxtEdtField::Backup() {
    424   m_wsBackup = m_wsField;
    425 }
    426 void CFDE_TxtEdtField::Restore() {
    427   m_wsField = m_wsBackup;
    428 }
    429 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 }
    436 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 }
    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 }
    483 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 }
    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 }
    540 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 }
    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 }
    608 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 }
    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 }
    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 }
    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 }
    665 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