| Index: xfa/src/fee/src/fee/fde_txtedtblock.cpp
|
| diff --git a/xfa/src/fee/src/fee/fde_txtedtblock.cpp b/xfa/src/fee/src/fee/fde_txtedtblock.cpp
|
| index 15ef6620cc81994ef93a4c8d070ca8637dc0b1a7..66777f96532781f16723882aed92da2ac83b4e54 100644
|
| --- a/xfa/src/fee/src/fee/fde_txtedtblock.cpp
|
| +++ b/xfa/src/fee/src/fee/fde_txtedtblock.cpp
|
| @@ -1,674 +1,674 @@
|
| -// Copyright 2014 PDFium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| -
|
| -#include "xfa/src/foxitlib.h"
|
| -#include "fde_txtedtblock.h"
|
| -#ifdef FDE_USEFORMATBLOCK
|
| -#define FDE_TXTEDT_FORMATBLOCK_BGN 0xFFF9
|
| -#define FDE_TXTEDT_FORMATBLOCK_END 0xFFFB
|
| -#define FDE_TXTEDT_ZEROWIDTHSPACE 0x200B
|
| -#define FDE_TXTEDT_ISINTEGER(a) ((a) >= L'0' && (a) <= L'9')
|
| -#define FDE_TXTEDT_ISSIGN(a) (((a) == L'-') || ((a) == L'+'))
|
| -CFDE_TxtEdtBlock::CFDE_TxtEdtBlock(CFDE_TxtEdtEngine* pEngine,
|
| - const CFX_WideString& wsBlock,
|
| - int32_t nPosition)
|
| - : m_pEngine(pEngine),
|
| - m_nDisplayLength(0),
|
| - m_nIndex(0),
|
| - m_nPosition(nPosition) {
|
| - const FX_WCHAR* lpBuf = const FX_WCHAR * (wsBlock);
|
| - int32_t nCount = wsBlock.GetLength();
|
| - int32_t i = 0;
|
| - CFX_WideString wsFix;
|
| - int32_t j = 0;
|
| - while (i < nCount) {
|
| - if (lpBuf[i] != L'%') {
|
| - wsFix += lpBuf[i];
|
| - } else {
|
| - i++;
|
| - if (i < nCount) {
|
| - if (lpBuf[i] == L'%') {
|
| - wsFix += lpBuf[i];
|
| - } else {
|
| - if (!wsFix.IsEmpty()) {
|
| - CFDE_TxtEdtField* pField = CFDE_TxtEdtField::Create(wsFix, j, this);
|
| - j++;
|
| - FXSYS_assert(pField);
|
| - m_FieldArr.Add(pField);
|
| - m_nDisplayLength += pField->GetDisplayLength();
|
| - wsFix.Empty();
|
| - }
|
| - int32_t nPos = i - 1;
|
| - while (lpBuf[i++] != L')')
|
| - ;
|
| - i++;
|
| - CFX_WideStringC wsField(lpBuf + nPos, i - nPos);
|
| - CFDE_TxtEdtField* pField = CFDE_TxtEdtField::Create(wsField, j, this);
|
| - j++;
|
| - FXSYS_assert(pField);
|
| - m_FieldArr.Add(pField);
|
| - m_EditFieldArr.Add(pField);
|
| - m_nDisplayLength += pField->GetDisplayLength();
|
| - i--;
|
| - }
|
| - }
|
| - }
|
| - i++;
|
| - }
|
| - if (!wsFix.IsEmpty()) {
|
| - CFDE_TxtEdtField* pField = CFDE_TxtEdtField::Create(wsFix, j, this);
|
| - FXSYS_assert(pField);
|
| - m_FieldArr.Add(pField);
|
| - m_nDisplayLength += pField->GetDisplayLength();
|
| - }
|
| -}
|
| -CFDE_TxtEdtBlock::~CFDE_TxtEdtBlock() {
|
| - int32_t nCount = m_FieldArr.GetSize();
|
| - for (int32_t i = 0; i < nCount; i++) {
|
| - CFDE_TxtEdtField* pField = m_FieldArr[i];
|
| - pField->Release();
|
| - }
|
| - m_FieldArr.RemoveAll();
|
| -}
|
| -void CFDE_TxtEdtBlock::GetDisplayText(CFX_WideString& wsDisplay) {
|
| - int32_t nCount = m_FieldArr.GetSize();
|
| - for (int32_t i = 0; i < nCount; i++) {
|
| - CFDE_TxtEdtField* pField = m_FieldArr[i];
|
| - CFX_WideString wsTemp;
|
| - pField->GetDisplayText(wsTemp);
|
| - wsDisplay += wsTemp;
|
| - }
|
| -}
|
| -int32_t CFDE_TxtEdtBlock::GetLength() const {
|
| - int32_t nDisplayLength = 0;
|
| - int32_t nCount = m_FieldArr.GetSize();
|
| - for (int32_t i = 0; i < nCount; i++) {
|
| - CFDE_TxtEdtField* pField = m_FieldArr[i];
|
| - nDisplayLength += pField->GetDisplayLength();
|
| - }
|
| - return nDisplayLength;
|
| -}
|
| -void CFDE_TxtEdtBlock::GetBlockText(CFX_WideString& wsBlock) {
|
| - int32_t nCount = m_FieldArr.GetSize();
|
| - for (int32_t i = 0; i < nCount; i++) {
|
| - CFDE_TxtEdtField* pField = m_FieldArr[i];
|
| - CFX_WideString wsTemp;
|
| - pField->GetFieldText(wsTemp);
|
| - wsBlock += wsTemp;
|
| - }
|
| -}
|
| -int32_t CFDE_TxtEdtBlock::CountField() const {
|
| - return m_EditFieldArr.GetSize();
|
| -}
|
| -void CFDE_TxtEdtBlock::GetFieldText(int32_t nIndex, CFX_WideString& wsField) {
|
| - CFDE_TxtEdtField* pField = m_EditFieldArr[nIndex];
|
| - pField->GetFieldText(wsField);
|
| -}
|
| -int32_t CFDE_TxtEdtBlock::GetFieldTextLength() const {
|
| - int32_t nTotalLength = 0;
|
| - int32_t nCount = m_EditFieldArr.GetSize();
|
| - for (int32_t i = 0; i < nCount; i++) {
|
| - CFDE_TxtEdtField* pField = m_EditFieldArr[i];
|
| - nTotalLength = pField->GetFieldTextLength();
|
| - }
|
| - return nTotalLength;
|
| -}
|
| -int32_t CFDE_TxtEdtBlock::GetPos() const {
|
| - return m_nPosition;
|
| -}
|
| -void CFDE_TxtEdtBlock::GetRealText(CFX_WideString& wsText) const {
|
| - int32_t nCount = m_FieldArr.GetSize();
|
| - for (int32_t i = 0; i < nCount; i++) {
|
| - CFDE_TxtEdtField* pField = m_FieldArr[i];
|
| - CFX_WideString wsTemp;
|
| - pField->GetFieldText(wsTemp);
|
| - wsText += wsTemp;
|
| - }
|
| -}
|
| -void CFDE_TxtEdtBlock::Backup() {
|
| - int32_t nCount = m_EditFieldArr.GetSize();
|
| - for (int32_t i = 0; i < nCount; i++) {
|
| - m_EditFieldArr[i]->Backup();
|
| - }
|
| -}
|
| -void CFDE_TxtEdtBlock::Restore() {
|
| - int32_t nCount = m_EditFieldArr.GetSize();
|
| - for (int32_t i = 0; i < nCount; i++) {
|
| - m_EditFieldArr[i]->Restore();
|
| - }
|
| -}
|
| -CFDE_TxtEdtFieldFormatParser::CFDE_TxtEdtFieldFormatParser() {}
|
| -CFDE_TxtEdtFieldFormatParser::~CFDE_TxtEdtFieldFormatParser() {
|
| - FDE_LPTXTEDTFORMATITEM lpItem = NULL;
|
| - int32_t nCount = m_ItemArr.GetSize();
|
| - for (int32_t i = 0; i < nCount; i++) {
|
| - lpItem = m_ItemArr[i];
|
| - delete lpItem;
|
| - }
|
| - m_ItemArr.RemoveAll();
|
| -}
|
| -FX_BOOL CFDE_TxtEdtFieldFormatParser::Parse(const CFX_WideString& wsFormat) {
|
| - m_wsFormat = wsFormat;
|
| - const FX_WCHAR* pBuf = const FX_WCHAR * (m_wsFormat);
|
| - int32_t nCount = m_wsFormat.GetLength();
|
| - nCount -= 2;
|
| - int32_t i = 0;
|
| - for (; i < nCount; i++) {
|
| - FX_WCHAR wChar = pBuf[i];
|
| - if (wChar == L'(') {
|
| - break;
|
| - }
|
| - }
|
| - i++;
|
| - FDE_TXTEDTFORMATITEM FormatItem;
|
| - for (; i < nCount; i++) {
|
| - while (pBuf[i] == L' ') {
|
| - i++;
|
| - }
|
| - FormatItem.nKeyStart = i;
|
| - while (pBuf[i] != L':') {
|
| - i++;
|
| - }
|
| - FormatItem.nKeyCount = i - FormatItem.nKeyStart;
|
| - i++;
|
| - FormatItem.nValStart = i;
|
| - while (pBuf[i] != L';' && i < nCount) {
|
| - i++;
|
| - }
|
| - FormatItem.nValCount = i - FormatItem.nValStart;
|
| - FDE_LPTXTEDTFORMATITEM pFormatItem = new FDE_TXTEDTFORMATITEM;
|
| - FXSYS_memcpy(pFormatItem, &FormatItem, sizeof(FDE_TXTEDTFORMATITEM));
|
| - m_ItemArr.Add(pFormatItem);
|
| - }
|
| - return TRUE;
|
| -}
|
| -int32_t CFDE_TxtEdtFieldFormatParser::CountItems() const {
|
| - return m_ItemArr.GetSize();
|
| -}
|
| -void CFDE_TxtEdtFieldFormatParser::GetItem(int32_t nIndex,
|
| - CFX_WideString& wsKey,
|
| - CFX_WideString& wsValue) const {
|
| - FDE_LPTXTEDTFORMATITEM lpItem = m_ItemArr[nIndex];
|
| - const FX_WCHAR* lpSrcBuf = const FX_WCHAR * (m_wsFormat);
|
| - FX_WCHAR* lpDstBuf = wsKey.GetBuffer(lpItem->nKeyCount);
|
| - FXSYS_memcpy(lpDstBuf, lpSrcBuf + lpItem->nKeyStart,
|
| - lpItem->nKeyCount * sizeof(FX_WCHAR));
|
| - wsKey.ReleaseBuffer(lpItem->nKeyCount);
|
| - lpDstBuf = wsValue.GetBuffer(lpItem->nValCount);
|
| - FXSYS_memcpy(lpDstBuf, lpSrcBuf + lpItem->nValStart,
|
| - lpItem->nValCount * sizeof(FX_WCHAR));
|
| - wsValue.ReleaseBuffer(lpItem->nValCount);
|
| -}
|
| -CFDE_TxtEdtField* CFDE_TxtEdtField::Create(const CFX_WideString& wsField,
|
| - int32_t nIndex,
|
| - CFDE_TxtEdtBlock* pBlock) {
|
| - if (wsField[0] != L'%' || (wsField[0] == L'%' && wsField[1] == L'%')) {
|
| - return new CFDE_TxtEdtField_Fixed(wsField, nIndex, pBlock);
|
| - }
|
| - FX_WCHAR wcType = wsField[wsField.GetLength() - 1];
|
| - switch (wcType) {
|
| - case L'd':
|
| - return new CFDE_TxtEdtField_Integer(wsField, nIndex, pBlock);
|
| - case L'f':
|
| - return new CFDE_TxtEdtField_Float(wsField, nIndex, pBlock);
|
| - case L's':
|
| - return new CFDE_TxtEdtField_String(wsField, nIndex, pBlock);
|
| - case L'p':
|
| - return new CFDE_TxtEdtField_Password(wsField, nIndex, pBlock);
|
| - default:
|
| - break;
|
| - }
|
| - return NULL;
|
| -}
|
| -void CFDE_TxtEdtField::Release() {
|
| - delete this;
|
| -}
|
| -CFDE_TxtEdtField::CFDE_TxtEdtField(int32_t nIndex, CFDE_TxtEdtBlock* pBlock)
|
| - : m_nLength(-1),
|
| - m_wcFill(L' '),
|
| - m_bReserveSpace(FALSE),
|
| - m_bLeftAlignment(TRUE),
|
| - m_nIndex(nIndex),
|
| - m_pBlock(pBlock) {
|
| - FXSYS_assert(pBlock);
|
| -}
|
| -int32_t CFDE_TxtEdtField::Insert(int32_t nIndex,
|
| - const CFX_WideString& wsIns,
|
| - int32_t& nCaret,
|
| - FX_BOOL& bBefore) {
|
| - int32_t nFieldLength = m_wsField.GetLength();
|
| - int32_t nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE;
|
| - if (m_bReserveSpace && !m_bLeftAlignment) {
|
| - nInnerIndex -= (m_nLength - nFieldLength);
|
| - }
|
| - FXSYS_assert(nInnerIndex >= 0 && nInnerIndex <= nFieldLength);
|
| - CFX_WideString wsTemp = m_wsField;
|
| - int32_t nInsLength = wsIns.GetLength();
|
| - for (int32_t i = 0; i < nInsLength; i++, nInnerIndex++) {
|
| - wsTemp.Insert(nInnerIndex, wsIns[i]);
|
| - }
|
| - int32_t nRet = Validate(wsTemp);
|
| - switch (nRet) {
|
| - case FDE_FORMAT_FIELD_VALIDATE_F_FULL:
|
| - return FDE_FORMAT_FIELD_INSERT_RET_F_FULL;
|
| - case FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE:
|
| - return FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE;
|
| - case FDE_FORMAT_FIELD_VALIDATE_S:
|
| - default:
|
| - break;
|
| - }
|
| - m_wsField = wsTemp;
|
| - nCaret = nIndex +
|
| - ((m_bReserveSpace && !m_bLeftAlignment) ? -nInsLength : nInsLength);
|
| - bBefore = TRUE;
|
| - return (nFieldLength + nInsLength < m_nLength)
|
| - ? FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL
|
| - : FDE_FORMAT_FIELD_INSERT_RET_S_FULL;
|
| -}
|
| -int32_t CFDE_TxtEdtField::Delete(int32_t nIndex,
|
| - int32_t nCount,
|
| - CFX_WideString& wsDel,
|
| - int32_t& nCaret,
|
| - FX_BOOL& bBefore) {
|
| - int32_t nFieldLength = m_wsField.GetLength();
|
| - int32_t nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE;
|
| - if (m_bReserveSpace && !m_bLeftAlignment) {
|
| - nInnerIndex -= (m_nLength - nFieldLength);
|
| - }
|
| - if (nInnerIndex < 0 || (nInnerIndex + nCount) > nFieldLength) {
|
| - return FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY;
|
| - }
|
| - CFX_WideString wsTemp = m_wsField;
|
| - wsTemp.Delete(nInnerIndex, nCount);
|
| - int32_t nRet = Validate(wsTemp);
|
| - switch (nRet) {
|
| - case FDE_FORMAT_FIELD_VALIDATE_F_FULL:
|
| - return FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY;
|
| - case FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE:
|
| - return FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE;
|
| - case FDE_FORMAT_FIELD_VALIDATE_S:
|
| - default:
|
| - break;
|
| - }
|
| - FX_WCHAR* lpBuf = wsDel.GetBuffer(nCount);
|
| - FXSYS_memcpy(lpBuf, const FX_WCHAR*(m_wsField) + nInnerIndex,
|
| - nCount * sizeof(FX_WCHAR));
|
| - wsDel.ReleaseBuffer(nCount);
|
| - m_wsField = wsTemp;
|
| - nCaret = nIndex + (m_bReserveSpace && !m_bLeftAlignment) ? nCount : 0;
|
| - bBefore = TRUE;
|
| - return FDE_FORMAT_FIELD_DELETE_RET_S;
|
| -}
|
| -int32_t CFDE_TxtEdtField::Replace(int32_t nIndex,
|
| - int32_t nCount,
|
| - const CFX_WideString& wsIns,
|
| - CFX_WideString& wsDel,
|
| - int32_t& nCaret,
|
| - FX_BOOL& bBefore) {
|
| - int32_t nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE;
|
| - int32_t nInsLength = wsIns.GetLength();
|
| - int32_t nFieldLength = m_wsField.GetLength();
|
| - CFX_WideString wsTemp = m_wsField;
|
| - if (m_bReserveSpace && !m_bLeftAlignment) {
|
| - nInnerIndex -= (m_nLength - nFieldLength);
|
| - }
|
| - FXSYS_assert(nInnerIndex >= 0 && nInnerIndex <= nFieldLength);
|
| - if (nInnerIndex + nCount > nFieldLength) {
|
| - return FALSE;
|
| - }
|
| - wsTemp.Delete(nInnerIndex, nCount);
|
| - int32_t nInnerIndexBK = nInnerIndex;
|
| - for (int32_t i = 0; i < nInsLength; i++, nInnerIndex++) {
|
| - wsTemp.Insert(nInnerIndex, wsIns[i]);
|
| - }
|
| - int32_t nRet = Validate(wsTemp);
|
| - switch (nRet) {
|
| - case FDE_FORMAT_FIELD_VALIDATE_F_FULL:
|
| - return FDE_FORMAT_FIELD_INSERT_RET_F_FULL;
|
| - case FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE:
|
| - return FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE;
|
| - default:
|
| - break;
|
| - }
|
| - FX_WCHAR* lpBuffer = wsDel.GetBuffer(nCount);
|
| - const FX_WCHAR* lpSrcBuf = const FX_WCHAR * (m_wsField);
|
| - FXSYS_memcpy(lpBuffer, lpSrcBuf + nInnerIndexBK, nCount * sizeof(FX_WCHAR));
|
| - wsDel.ReleaseBuffer(nCount);
|
| - m_wsField = wsTemp;
|
| - nCaret =
|
| - nIndex + ((m_bReserveSpace && !m_bLeftAlignment) ? (nCount - nInsLength)
|
| - : (nInsLength));
|
| - return FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL;
|
| -}
|
| -void CFDE_TxtEdtField::GetDisplayText(CFX_WideString& wsDisplay) {
|
| - CFX_WideString wsField;
|
| - GetNormalizedFieldText(wsField);
|
| - int32_t nLength = wsField.GetLength() + FDE_FORMAT_EDIT_FIELD_HADERSIZE +
|
| - FDE_FORMAT_EDIT_FIELD_TAILSIZE;
|
| - FX_WCHAR* lpBuffer = wsDisplay.GetBuffer(nLength);
|
| - lpBuffer[0] = FDE_TXTEDT_FORMATBLOCK_BGN;
|
| - lpBuffer[nLength - 1] = FDE_TXTEDT_FORMATBLOCK_END;
|
| - FX_DWORD nAddress = (FX_DWORD) this;
|
| - FXSYS_memcpy(lpBuffer + 1, &nAddress, sizeof(FX_DWORD));
|
| - FXSYS_memcpy(lpBuffer + 3, const FX_WCHAR*(wsField),
|
| - (nLength - 4) * sizeof(FX_WCHAR));
|
| - wsDisplay.ReleaseBuffer(nLength);
|
| -}
|
| -int32_t CFDE_TxtEdtField::GetDisplayLength() {
|
| - return (m_bReserveSpace ? m_nLength : m_wsField.GetLength()) +
|
| - FDE_FORMAT_EDIT_FIELD_HADERSIZE + FDE_FORMAT_EDIT_FIELD_TAILSIZE;
|
| -}
|
| -void CFDE_TxtEdtField::GetFieldText(CFX_WideString& wsField) {
|
| - wsField = m_wsField;
|
| -}
|
| -int32_t CFDE_TxtEdtField::GetFieldTextLength() const {
|
| - return m_wsField.GetLength();
|
| -}
|
| -int32_t CFDE_TxtEdtField::GetRealIndex(int32_t nIndex) const {
|
| - int32_t nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE;
|
| - if (nInnerIndex < 0) {
|
| - return 0;
|
| - }
|
| - int32_t nFieldLength = m_wsField.GetLength();
|
| - if (m_bReserveSpace && !m_bLeftAlignment) {
|
| - nInnerIndex -= (m_nLength - nFieldLength);
|
| - }
|
| - if (nInnerIndex < 0) {
|
| - return 0;
|
| - }
|
| - if (nInnerIndex >= nFieldLength) {
|
| - return nFieldLength;
|
| - }
|
| - return nInnerIndex + 1;
|
| -}
|
| -int32_t CFDE_TxtEdtField::NormalizeCaretPos(
|
| - int32_t nIndex,
|
| - FDE_FORMAT_CARET_DIRECTION eDirection) const {
|
| - nIndex -= FDE_FORMAT_EDIT_FIELD_HADERSIZE;
|
| - int32_t nLength = m_wsField.GetLength();
|
| - if (m_bReserveSpace) {
|
| - int32_t nFieldLength = m_wsField.GetLength();
|
| - if (m_bLeftAlignment) {
|
| - if (nIndex > nFieldLength) {
|
| - if (eDirection == FDE_FORMAT_CARET_FORWARD) {
|
| - return -1;
|
| - }
|
| - nIndex = nFieldLength;
|
| - }
|
| - } else {
|
| - int32_t nReserveLength = m_nLength - nFieldLength;
|
| - if (nIndex < nReserveLength) {
|
| - if (eDirection == FDE_FORMAT_CARET_BACKWARD) {
|
| - return -2;
|
| - }
|
| - nIndex = nReserveLength;
|
| - }
|
| - }
|
| - }
|
| - return nIndex + FDE_FORMAT_EDIT_FIELD_HADERSIZE;
|
| -}
|
| -FX_BOOL CFDE_TxtEdtField::GetEditableRange(int32_t& nBgn, int32_t& nEnd) const {
|
| - if (m_bReserveSpace && !m_bLeftAlignment) {
|
| - nEnd = FDE_FORMAT_EDIT_FIELD_HADERSIZE + m_nLength;
|
| - nBgn = nEnd - m_wsField.GetLength();
|
| - } else {
|
| - nBgn = FDE_FORMAT_EDIT_FIELD_HADERSIZE;
|
| - nEnd = nBgn + m_wsField.GetLength();
|
| - }
|
| - return TRUE;
|
| -}
|
| -void CFDE_TxtEdtField::Backup() {
|
| - m_wsBackup = m_wsField;
|
| -}
|
| -void CFDE_TxtEdtField::Restore() {
|
| - m_wsField = m_wsBackup;
|
| -}
|
| -int32_t CFDE_TxtEdtField::Validate(const CFX_WideString& wsText) const {
|
| - if (m_nLength < 0) {
|
| - return FDE_FORMAT_FIELD_DELETE_RET_S;
|
| - }
|
| - return wsText.GetLength() <= m_nLength ? FDE_FORMAT_FIELD_VALIDATE_S
|
| - : FDE_FORMAT_FIELD_VALIDATE_F_FULL;
|
| -}
|
| -void CFDE_TxtEdtField::GetNormalizedFieldText(CFX_WideString& wsField) const {
|
| - wsField = m_wsField;
|
| - if (m_nLength == -1) {
|
| - return;
|
| - }
|
| - if (m_bReserveSpace) {
|
| - int32_t nField = wsField.GetLength();
|
| - int32_t nFill = m_nLength - nField;
|
| - if (m_bLeftAlignment) {
|
| - while (nFill--) {
|
| - wsField.Insert(nField++, m_wcFill);
|
| - }
|
| - } else {
|
| - while (nFill--) {
|
| - wsField.Insert(0, m_wcFill);
|
| - }
|
| - }
|
| - }
|
| -}
|
| -CFDE_TxtEdtField_Integer::CFDE_TxtEdtField_Integer(
|
| - const CFX_WideString& wsField,
|
| - int32_t nIndex,
|
| - CFDE_TxtEdtBlock* pBlock)
|
| - : m_bSign(FALSE), CFDE_TxtEdtField(nIndex, pBlock) {
|
| - CFDE_TxtEdtFieldFormatParser FormatParser;
|
| - FormatParser.Parse(wsField);
|
| - int32_t nCount = FormatParser.CountItems();
|
| - CFX_WideString wskey;
|
| - CFX_WideString wsVal;
|
| - for (int32_t i = 0; i < nCount; i++) {
|
| - FormatParser.GetItem(i, wskey, wsVal);
|
| - if (wskey.Equal(L"Length")) {
|
| - m_nLength = wsVal.GetInteger();
|
| - } else if (wskey.Equal(L"Sign")) {
|
| - m_bSign = wsVal.GetInteger() != 0;
|
| - } else if (wskey.Equal(L"FillChar")) {
|
| - m_wcFill = wsVal[0];
|
| - } else {
|
| - FXSYS_assert(0);
|
| - }
|
| - wskey.Empty();
|
| - wsVal.Empty();
|
| - }
|
| - if (m_nLength == -1) {
|
| - m_bReserveSpace = FALSE;
|
| - }
|
| -}
|
| -int32_t CFDE_TxtEdtField_Integer::Validate(const CFX_WideString& wsText) const {
|
| - int32_t i = 0;
|
| - if (m_bSign) {
|
| - FX_WCHAR wcTemp = wsText[0];
|
| - if (FDE_TXTEDT_ISSIGN(wcTemp)) {
|
| - i++;
|
| - }
|
| - }
|
| - int32_t nLength = wsText.GetLength();
|
| - if (m_nLength > 0) {
|
| - if (nLength - i > (m_nLength - (m_bSign ? 1 : 0))) {
|
| - return FDE_FORMAT_FIELD_VALIDATE_F_FULL;
|
| - }
|
| - }
|
| - for (; i < nLength; i++) {
|
| - FX_WCHAR wcTemp = wsText[i];
|
| - if (!FDE_TXTEDT_ISINTEGER(wcTemp)) {
|
| - return FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE;
|
| - }
|
| - }
|
| - return FDE_FORMAT_FIELD_VALIDATE_S;
|
| -}
|
| -CFDE_TxtEdtField_Float::CFDE_TxtEdtField_Float(const CFX_WideString& wsField,
|
| - int32_t nIndex,
|
| - CFDE_TxtEdtBlock* pBlock)
|
| - : CFDE_TxtEdtField(nIndex, pBlock),
|
| - m_bSigned(FALSE),
|
| - m_nIntPartlength(-1),
|
| - m_nDecPartLength(-1) {
|
| - CFDE_TxtEdtFieldFormatParser FormatParser;
|
| - FormatParser.Parse(wsField);
|
| - int32_t nCount = FormatParser.CountItems();
|
| - CFX_WideString wskey;
|
| - CFX_WideString wsVal;
|
| - for (int32_t i = 0; i < nCount; i++) {
|
| - FormatParser.GetItem(i, wskey, wsVal);
|
| - if (wskey.Equal(L"DecLength")) {
|
| - m_nDecPartLength = wsVal.GetInteger();
|
| - } else if (wskey.Equal(L"IntLength")) {
|
| - m_nIntPartlength = wsVal.GetInteger();
|
| - } else if (wskey.Equal(L"Sign")) {
|
| - m_bSigned = wsVal.GetInteger() != 0;
|
| - } else if (wskey.Equal(L"FillChar")) {
|
| - m_wcFill = wsVal[0];
|
| - } else {
|
| - FXSYS_assert(0);
|
| - }
|
| - if (m_nIntPartlength == -1 || m_nDecPartLength == -1) {
|
| - m_nLength = -1;
|
| - } else {
|
| - m_nLength = m_nIntPartlength + m_nDecPartLength + 1 + (m_bSigned ? 1 : 0);
|
| - }
|
| - m_bReserveSpace = TRUE;
|
| - wskey.Empty();
|
| - wsVal.Empty();
|
| - }
|
| -}
|
| -int32_t CFDE_TxtEdtField_Float::Validate(const CFX_WideString& wsText) const {
|
| - int32_t nLength = wsText.GetLength();
|
| - if (m_nLength != -1 && (nLength > m_nLength)) {
|
| - return FDE_FORMAT_FIELD_VALIDATE_F_FULL;
|
| - }
|
| - const FX_WCHAR* lpBuf = const FX_WCHAR * (wsText);
|
| - int32_t i = 0;
|
| - if (m_bSigned) {
|
| - FX_WCHAR wcTemp = lpBuf[0];
|
| - if (FDE_TXTEDT_ISSIGN(wcTemp)) {
|
| - i++;
|
| - }
|
| - }
|
| - int32_t nIntPart = 0;
|
| - int32_t nPoint = 0;
|
| - for (; i < nLength; i++) {
|
| - FX_WCHAR wcTemp = lpBuf[i];
|
| - if (!FDE_TXTEDT_ISINTEGER(wcTemp)) {
|
| - if (wcTemp != L'.') {
|
| - return FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE;
|
| - }
|
| - nPoint = 1;
|
| - break;
|
| - }
|
| - nIntPart++;
|
| - }
|
| - if (m_nIntPartlength != -1 && (nIntPart > m_nIntPartlength)) {
|
| - return FDE_FORMAT_FIELD_VALIDATE_F_FULL;
|
| - }
|
| - if (m_nDecPartLength != -1 &&
|
| - (nLength - nIntPart - nPoint > m_nDecPartLength)) {
|
| - return FDE_FORMAT_FIELD_VALIDATE_F_FULL;
|
| - }
|
| - i++;
|
| - for (; i < nLength; i++) {
|
| - FX_WCHAR wcTemp = lpBuf[i];
|
| - if (!FDE_TXTEDT_ISINTEGER(wcTemp)) {
|
| - return FDE_FORMAT_FIELD_VALIDATE_F_FULL;
|
| - }
|
| - }
|
| - return FDE_FORMAT_FIELD_VALIDATE_S;
|
| -}
|
| -CFDE_TxtEdtField_Password::CFDE_TxtEdtField_Password(
|
| - const CFX_WideString& wsField,
|
| - int32_t nIndex,
|
| - CFDE_TxtEdtBlock* pBlock)
|
| - : CFDE_TxtEdtField(nIndex, pBlock), m_wcAlias(L'*') {
|
| - CFDE_TxtEdtFieldFormatParser FormatParser;
|
| - FormatParser.Parse(wsField);
|
| - int32_t nCount = FormatParser.CountItems();
|
| - CFX_WideString wskey;
|
| - CFX_WideString wsVal;
|
| - for (int32_t i = 0; i < nCount; i++) {
|
| - FormatParser.GetItem(i, wskey, wsVal);
|
| - if (wskey.Equal(L"Length")) {
|
| - m_nLength = wsVal.GetInteger();
|
| - } else if (wskey.Equal(L"AliasChar")) {
|
| - m_wcAlias = wsVal[0];
|
| - } else {
|
| - FXSYS_assert(0);
|
| - }
|
| - wskey.Empty();
|
| - wsVal.Empty();
|
| - }
|
| - if (m_nLength == -1) {
|
| - m_bReserveSpace = FALSE;
|
| - }
|
| -}
|
| -void CFDE_TxtEdtField_Password::GetNormalizedFieldText(
|
| - CFX_WideString& wsField) const {
|
| - int32_t nFiledLength = m_wsField.GetLength();
|
| - int32_t nLength = m_bReserveSpace ? m_nLength : nFiledLength;
|
| - FX_WCHAR* lpBuf = wsField.GetBuffer(nLength);
|
| - int32_t nSpaceLength = nLength - nFiledLength;
|
| - int32_t nFirstPart = m_bLeftAlignment ? nFiledLength : nSpaceLength;
|
| - FX_WCHAR wFirstChar = m_bLeftAlignment ? m_wcAlias : L' ';
|
| - FX_WCHAR wSecondChar = m_bLeftAlignment ? L' ' : m_wcAlias;
|
| - int32_t i = 0;
|
| - for (; i < nFirstPart; i++) {
|
| - lpBuf[i] = wFirstChar;
|
| - }
|
| - for (; i < nLength; i++) {
|
| - lpBuf[i] = wSecondChar;
|
| - }
|
| - wsField.ReleaseBuffer(nLength);
|
| -}
|
| -CFDE_TxtEdtField_String::CFDE_TxtEdtField_String(const CFX_WideString& wsField,
|
| - int32_t nIndex,
|
| - CFDE_TxtEdtBlock* pBlock)
|
| - : CFDE_TxtEdtField(nIndex, pBlock) {
|
| - CFDE_TxtEdtFieldFormatParser FormatParser;
|
| - FormatParser.Parse(wsField);
|
| - int32_t nCount = FormatParser.CountItems();
|
| - CFX_WideString wskey;
|
| - CFX_WideString wsVal;
|
| - for (int32_t i = 0; i < nCount; i++) {
|
| - FormatParser.GetItem(i, wskey, wsVal);
|
| - if (wskey.Equal(L"Length")) {
|
| - m_nLength = wsVal.GetInteger();
|
| - } else {
|
| - FXSYS_assert(0);
|
| - }
|
| - wskey.Empty();
|
| - wsVal.Empty();
|
| - }
|
| -}
|
| -CFDE_TxtEdtField_Fixed::CFDE_TxtEdtField_Fixed(const CFX_WideString& wsField,
|
| - int32_t nIndex,
|
| - CFDE_TxtEdtBlock* pBlock)
|
| - : CFDE_TxtEdtField(nIndex, pBlock) {
|
| - m_wsField = wsField;
|
| - m_nLength = wsField.GetLength();
|
| -}
|
| -void CFDE_TxtEdtField_Fixed::GetDisplayText(CFX_WideString& wsDisplay) {
|
| - int32_t nLength = m_wsField.GetLength() + FDE_FORMAT_EDIT_FIELD_HADERSIZE +
|
| - FDE_FORMAT_EDIT_FIELD_TAILSIZE;
|
| - FX_WCHAR* lpBuffer = wsDisplay.GetBuffer(nLength);
|
| - lpBuffer[0] = FDE_TXTEDT_FORMATBLOCK_BGN;
|
| - lpBuffer[nLength - 1] = FDE_TXTEDT_FORMATBLOCK_END;
|
| - FX_DWORD nAddress = (FX_DWORD) this;
|
| - FXSYS_memcpy(lpBuffer + 1, &nAddress, sizeof(FX_DWORD));
|
| - FXSYS_memcpy(lpBuffer + 3, const FX_WCHAR*(m_wsField),
|
| - (nLength - 4) * sizeof(FX_WCHAR));
|
| - wsDisplay.ReleaseBuffer(nLength);
|
| -}
|
| -int32_t CFDE_TxtEdtField_Fixed::NormalizeCaretPos(
|
| - int32_t nIndex,
|
| - FDE_FORMAT_CARET_DIRECTION eDirection) const {
|
| - FXSYS_assert(nIndex >= 0 && nIndex <= m_nLength);
|
| - if (eDirection == FDE_FORMAT_CARET_MIDDLE) {
|
| - return (nIndex > m_wsField.GetLength() / 2) ? -1 : -2;
|
| - }
|
| - return eDirection == FDE_FORMAT_CARET_BACKWARD ? -2 : -1;
|
| -}
|
| -#endif
|
| +// Copyright 2014 PDFium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| +
|
| +#include "xfa/src/foxitlib.h"
|
| +#include "fde_txtedtblock.h"
|
| +#ifdef FDE_USEFORMATBLOCK
|
| +#define FDE_TXTEDT_FORMATBLOCK_BGN 0xFFF9
|
| +#define FDE_TXTEDT_FORMATBLOCK_END 0xFFFB
|
| +#define FDE_TXTEDT_ZEROWIDTHSPACE 0x200B
|
| +#define FDE_TXTEDT_ISINTEGER(a) ((a) >= L'0' && (a) <= L'9')
|
| +#define FDE_TXTEDT_ISSIGN(a) (((a) == L'-') || ((a) == L'+'))
|
| +CFDE_TxtEdtBlock::CFDE_TxtEdtBlock(CFDE_TxtEdtEngine* pEngine,
|
| + const CFX_WideString& wsBlock,
|
| + int32_t nPosition)
|
| + : m_pEngine(pEngine),
|
| + m_nDisplayLength(0),
|
| + m_nIndex(0),
|
| + m_nPosition(nPosition) {
|
| + const FX_WCHAR* lpBuf = const FX_WCHAR * (wsBlock);
|
| + int32_t nCount = wsBlock.GetLength();
|
| + int32_t i = 0;
|
| + CFX_WideString wsFix;
|
| + int32_t j = 0;
|
| + while (i < nCount) {
|
| + if (lpBuf[i] != L'%') {
|
| + wsFix += lpBuf[i];
|
| + } else {
|
| + i++;
|
| + if (i < nCount) {
|
| + if (lpBuf[i] == L'%') {
|
| + wsFix += lpBuf[i];
|
| + } else {
|
| + if (!wsFix.IsEmpty()) {
|
| + CFDE_TxtEdtField* pField = CFDE_TxtEdtField::Create(wsFix, j, this);
|
| + j++;
|
| + FXSYS_assert(pField);
|
| + m_FieldArr.Add(pField);
|
| + m_nDisplayLength += pField->GetDisplayLength();
|
| + wsFix.Empty();
|
| + }
|
| + int32_t nPos = i - 1;
|
| + while (lpBuf[i++] != L')')
|
| + ;
|
| + i++;
|
| + CFX_WideStringC wsField(lpBuf + nPos, i - nPos);
|
| + CFDE_TxtEdtField* pField = CFDE_TxtEdtField::Create(wsField, j, this);
|
| + j++;
|
| + FXSYS_assert(pField);
|
| + m_FieldArr.Add(pField);
|
| + m_EditFieldArr.Add(pField);
|
| + m_nDisplayLength += pField->GetDisplayLength();
|
| + i--;
|
| + }
|
| + }
|
| + }
|
| + i++;
|
| + }
|
| + if (!wsFix.IsEmpty()) {
|
| + CFDE_TxtEdtField* pField = CFDE_TxtEdtField::Create(wsFix, j, this);
|
| + FXSYS_assert(pField);
|
| + m_FieldArr.Add(pField);
|
| + m_nDisplayLength += pField->GetDisplayLength();
|
| + }
|
| +}
|
| +CFDE_TxtEdtBlock::~CFDE_TxtEdtBlock() {
|
| + int32_t nCount = m_FieldArr.GetSize();
|
| + for (int32_t i = 0; i < nCount; i++) {
|
| + CFDE_TxtEdtField* pField = m_FieldArr[i];
|
| + pField->Release();
|
| + }
|
| + m_FieldArr.RemoveAll();
|
| +}
|
| +void CFDE_TxtEdtBlock::GetDisplayText(CFX_WideString& wsDisplay) {
|
| + int32_t nCount = m_FieldArr.GetSize();
|
| + for (int32_t i = 0; i < nCount; i++) {
|
| + CFDE_TxtEdtField* pField = m_FieldArr[i];
|
| + CFX_WideString wsTemp;
|
| + pField->GetDisplayText(wsTemp);
|
| + wsDisplay += wsTemp;
|
| + }
|
| +}
|
| +int32_t CFDE_TxtEdtBlock::GetLength() const {
|
| + int32_t nDisplayLength = 0;
|
| + int32_t nCount = m_FieldArr.GetSize();
|
| + for (int32_t i = 0; i < nCount; i++) {
|
| + CFDE_TxtEdtField* pField = m_FieldArr[i];
|
| + nDisplayLength += pField->GetDisplayLength();
|
| + }
|
| + return nDisplayLength;
|
| +}
|
| +void CFDE_TxtEdtBlock::GetBlockText(CFX_WideString& wsBlock) {
|
| + int32_t nCount = m_FieldArr.GetSize();
|
| + for (int32_t i = 0; i < nCount; i++) {
|
| + CFDE_TxtEdtField* pField = m_FieldArr[i];
|
| + CFX_WideString wsTemp;
|
| + pField->GetFieldText(wsTemp);
|
| + wsBlock += wsTemp;
|
| + }
|
| +}
|
| +int32_t CFDE_TxtEdtBlock::CountField() const {
|
| + return m_EditFieldArr.GetSize();
|
| +}
|
| +void CFDE_TxtEdtBlock::GetFieldText(int32_t nIndex, CFX_WideString& wsField) {
|
| + CFDE_TxtEdtField* pField = m_EditFieldArr[nIndex];
|
| + pField->GetFieldText(wsField);
|
| +}
|
| +int32_t CFDE_TxtEdtBlock::GetFieldTextLength() const {
|
| + int32_t nTotalLength = 0;
|
| + int32_t nCount = m_EditFieldArr.GetSize();
|
| + for (int32_t i = 0; i < nCount; i++) {
|
| + CFDE_TxtEdtField* pField = m_EditFieldArr[i];
|
| + nTotalLength = pField->GetFieldTextLength();
|
| + }
|
| + return nTotalLength;
|
| +}
|
| +int32_t CFDE_TxtEdtBlock::GetPos() const {
|
| + return m_nPosition;
|
| +}
|
| +void CFDE_TxtEdtBlock::GetRealText(CFX_WideString& wsText) const {
|
| + int32_t nCount = m_FieldArr.GetSize();
|
| + for (int32_t i = 0; i < nCount; i++) {
|
| + CFDE_TxtEdtField* pField = m_FieldArr[i];
|
| + CFX_WideString wsTemp;
|
| + pField->GetFieldText(wsTemp);
|
| + wsText += wsTemp;
|
| + }
|
| +}
|
| +void CFDE_TxtEdtBlock::Backup() {
|
| + int32_t nCount = m_EditFieldArr.GetSize();
|
| + for (int32_t i = 0; i < nCount; i++) {
|
| + m_EditFieldArr[i]->Backup();
|
| + }
|
| +}
|
| +void CFDE_TxtEdtBlock::Restore() {
|
| + int32_t nCount = m_EditFieldArr.GetSize();
|
| + for (int32_t i = 0; i < nCount; i++) {
|
| + m_EditFieldArr[i]->Restore();
|
| + }
|
| +}
|
| +CFDE_TxtEdtFieldFormatParser::CFDE_TxtEdtFieldFormatParser() {}
|
| +CFDE_TxtEdtFieldFormatParser::~CFDE_TxtEdtFieldFormatParser() {
|
| + FDE_LPTXTEDTFORMATITEM lpItem = NULL;
|
| + int32_t nCount = m_ItemArr.GetSize();
|
| + for (int32_t i = 0; i < nCount; i++) {
|
| + lpItem = m_ItemArr[i];
|
| + delete lpItem;
|
| + }
|
| + m_ItemArr.RemoveAll();
|
| +}
|
| +FX_BOOL CFDE_TxtEdtFieldFormatParser::Parse(const CFX_WideString& wsFormat) {
|
| + m_wsFormat = wsFormat;
|
| + const FX_WCHAR* pBuf = const FX_WCHAR * (m_wsFormat);
|
| + int32_t nCount = m_wsFormat.GetLength();
|
| + nCount -= 2;
|
| + int32_t i = 0;
|
| + for (; i < nCount; i++) {
|
| + FX_WCHAR wChar = pBuf[i];
|
| + if (wChar == L'(') {
|
| + break;
|
| + }
|
| + }
|
| + i++;
|
| + FDE_TXTEDTFORMATITEM FormatItem;
|
| + for (; i < nCount; i++) {
|
| + while (pBuf[i] == L' ') {
|
| + i++;
|
| + }
|
| + FormatItem.nKeyStart = i;
|
| + while (pBuf[i] != L':') {
|
| + i++;
|
| + }
|
| + FormatItem.nKeyCount = i - FormatItem.nKeyStart;
|
| + i++;
|
| + FormatItem.nValStart = i;
|
| + while (pBuf[i] != L';' && i < nCount) {
|
| + i++;
|
| + }
|
| + FormatItem.nValCount = i - FormatItem.nValStart;
|
| + FDE_LPTXTEDTFORMATITEM pFormatItem = new FDE_TXTEDTFORMATITEM;
|
| + FXSYS_memcpy(pFormatItem, &FormatItem, sizeof(FDE_TXTEDTFORMATITEM));
|
| + m_ItemArr.Add(pFormatItem);
|
| + }
|
| + return TRUE;
|
| +}
|
| +int32_t CFDE_TxtEdtFieldFormatParser::CountItems() const {
|
| + return m_ItemArr.GetSize();
|
| +}
|
| +void CFDE_TxtEdtFieldFormatParser::GetItem(int32_t nIndex,
|
| + CFX_WideString& wsKey,
|
| + CFX_WideString& wsValue) const {
|
| + FDE_LPTXTEDTFORMATITEM lpItem = m_ItemArr[nIndex];
|
| + const FX_WCHAR* lpSrcBuf = const FX_WCHAR * (m_wsFormat);
|
| + FX_WCHAR* lpDstBuf = wsKey.GetBuffer(lpItem->nKeyCount);
|
| + FXSYS_memcpy(lpDstBuf, lpSrcBuf + lpItem->nKeyStart,
|
| + lpItem->nKeyCount * sizeof(FX_WCHAR));
|
| + wsKey.ReleaseBuffer(lpItem->nKeyCount);
|
| + lpDstBuf = wsValue.GetBuffer(lpItem->nValCount);
|
| + FXSYS_memcpy(lpDstBuf, lpSrcBuf + lpItem->nValStart,
|
| + lpItem->nValCount * sizeof(FX_WCHAR));
|
| + wsValue.ReleaseBuffer(lpItem->nValCount);
|
| +}
|
| +CFDE_TxtEdtField* CFDE_TxtEdtField::Create(const CFX_WideString& wsField,
|
| + int32_t nIndex,
|
| + CFDE_TxtEdtBlock* pBlock) {
|
| + if (wsField[0] != L'%' || (wsField[0] == L'%' && wsField[1] == L'%')) {
|
| + return new CFDE_TxtEdtField_Fixed(wsField, nIndex, pBlock);
|
| + }
|
| + FX_WCHAR wcType = wsField[wsField.GetLength() - 1];
|
| + switch (wcType) {
|
| + case L'd':
|
| + return new CFDE_TxtEdtField_Integer(wsField, nIndex, pBlock);
|
| + case L'f':
|
| + return new CFDE_TxtEdtField_Float(wsField, nIndex, pBlock);
|
| + case L's':
|
| + return new CFDE_TxtEdtField_String(wsField, nIndex, pBlock);
|
| + case L'p':
|
| + return new CFDE_TxtEdtField_Password(wsField, nIndex, pBlock);
|
| + default:
|
| + break;
|
| + }
|
| + return NULL;
|
| +}
|
| +void CFDE_TxtEdtField::Release() {
|
| + delete this;
|
| +}
|
| +CFDE_TxtEdtField::CFDE_TxtEdtField(int32_t nIndex, CFDE_TxtEdtBlock* pBlock)
|
| + : m_nLength(-1),
|
| + m_wcFill(L' '),
|
| + m_bReserveSpace(FALSE),
|
| + m_bLeftAlignment(TRUE),
|
| + m_nIndex(nIndex),
|
| + m_pBlock(pBlock) {
|
| + FXSYS_assert(pBlock);
|
| +}
|
| +int32_t CFDE_TxtEdtField::Insert(int32_t nIndex,
|
| + const CFX_WideString& wsIns,
|
| + int32_t& nCaret,
|
| + FX_BOOL& bBefore) {
|
| + int32_t nFieldLength = m_wsField.GetLength();
|
| + int32_t nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE;
|
| + if (m_bReserveSpace && !m_bLeftAlignment) {
|
| + nInnerIndex -= (m_nLength - nFieldLength);
|
| + }
|
| + FXSYS_assert(nInnerIndex >= 0 && nInnerIndex <= nFieldLength);
|
| + CFX_WideString wsTemp = m_wsField;
|
| + int32_t nInsLength = wsIns.GetLength();
|
| + for (int32_t i = 0; i < nInsLength; i++, nInnerIndex++) {
|
| + wsTemp.Insert(nInnerIndex, wsIns[i]);
|
| + }
|
| + int32_t nRet = Validate(wsTemp);
|
| + switch (nRet) {
|
| + case FDE_FORMAT_FIELD_VALIDATE_F_FULL:
|
| + return FDE_FORMAT_FIELD_INSERT_RET_F_FULL;
|
| + case FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE:
|
| + return FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE;
|
| + case FDE_FORMAT_FIELD_VALIDATE_S:
|
| + default:
|
| + break;
|
| + }
|
| + m_wsField = wsTemp;
|
| + nCaret = nIndex +
|
| + ((m_bReserveSpace && !m_bLeftAlignment) ? -nInsLength : nInsLength);
|
| + bBefore = TRUE;
|
| + return (nFieldLength + nInsLength < m_nLength)
|
| + ? FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL
|
| + : FDE_FORMAT_FIELD_INSERT_RET_S_FULL;
|
| +}
|
| +int32_t CFDE_TxtEdtField::Delete(int32_t nIndex,
|
| + int32_t nCount,
|
| + CFX_WideString& wsDel,
|
| + int32_t& nCaret,
|
| + FX_BOOL& bBefore) {
|
| + int32_t nFieldLength = m_wsField.GetLength();
|
| + int32_t nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE;
|
| + if (m_bReserveSpace && !m_bLeftAlignment) {
|
| + nInnerIndex -= (m_nLength - nFieldLength);
|
| + }
|
| + if (nInnerIndex < 0 || (nInnerIndex + nCount) > nFieldLength) {
|
| + return FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY;
|
| + }
|
| + CFX_WideString wsTemp = m_wsField;
|
| + wsTemp.Delete(nInnerIndex, nCount);
|
| + int32_t nRet = Validate(wsTemp);
|
| + switch (nRet) {
|
| + case FDE_FORMAT_FIELD_VALIDATE_F_FULL:
|
| + return FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY;
|
| + case FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE:
|
| + return FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE;
|
| + case FDE_FORMAT_FIELD_VALIDATE_S:
|
| + default:
|
| + break;
|
| + }
|
| + FX_WCHAR* lpBuf = wsDel.GetBuffer(nCount);
|
| + FXSYS_memcpy(lpBuf, const FX_WCHAR*(m_wsField) + nInnerIndex,
|
| + nCount * sizeof(FX_WCHAR));
|
| + wsDel.ReleaseBuffer(nCount);
|
| + m_wsField = wsTemp;
|
| + nCaret = nIndex + (m_bReserveSpace && !m_bLeftAlignment) ? nCount : 0;
|
| + bBefore = TRUE;
|
| + return FDE_FORMAT_FIELD_DELETE_RET_S;
|
| +}
|
| +int32_t CFDE_TxtEdtField::Replace(int32_t nIndex,
|
| + int32_t nCount,
|
| + const CFX_WideString& wsIns,
|
| + CFX_WideString& wsDel,
|
| + int32_t& nCaret,
|
| + FX_BOOL& bBefore) {
|
| + int32_t nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE;
|
| + int32_t nInsLength = wsIns.GetLength();
|
| + int32_t nFieldLength = m_wsField.GetLength();
|
| + CFX_WideString wsTemp = m_wsField;
|
| + if (m_bReserveSpace && !m_bLeftAlignment) {
|
| + nInnerIndex -= (m_nLength - nFieldLength);
|
| + }
|
| + FXSYS_assert(nInnerIndex >= 0 && nInnerIndex <= nFieldLength);
|
| + if (nInnerIndex + nCount > nFieldLength) {
|
| + return FALSE;
|
| + }
|
| + wsTemp.Delete(nInnerIndex, nCount);
|
| + int32_t nInnerIndexBK = nInnerIndex;
|
| + for (int32_t i = 0; i < nInsLength; i++, nInnerIndex++) {
|
| + wsTemp.Insert(nInnerIndex, wsIns[i]);
|
| + }
|
| + int32_t nRet = Validate(wsTemp);
|
| + switch (nRet) {
|
| + case FDE_FORMAT_FIELD_VALIDATE_F_FULL:
|
| + return FDE_FORMAT_FIELD_INSERT_RET_F_FULL;
|
| + case FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE:
|
| + return FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE;
|
| + default:
|
| + break;
|
| + }
|
| + FX_WCHAR* lpBuffer = wsDel.GetBuffer(nCount);
|
| + const FX_WCHAR* lpSrcBuf = const FX_WCHAR * (m_wsField);
|
| + FXSYS_memcpy(lpBuffer, lpSrcBuf + nInnerIndexBK, nCount * sizeof(FX_WCHAR));
|
| + wsDel.ReleaseBuffer(nCount);
|
| + m_wsField = wsTemp;
|
| + nCaret =
|
| + nIndex + ((m_bReserveSpace && !m_bLeftAlignment) ? (nCount - nInsLength)
|
| + : (nInsLength));
|
| + return FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL;
|
| +}
|
| +void CFDE_TxtEdtField::GetDisplayText(CFX_WideString& wsDisplay) {
|
| + CFX_WideString wsField;
|
| + GetNormalizedFieldText(wsField);
|
| + int32_t nLength = wsField.GetLength() + FDE_FORMAT_EDIT_FIELD_HADERSIZE +
|
| + FDE_FORMAT_EDIT_FIELD_TAILSIZE;
|
| + FX_WCHAR* lpBuffer = wsDisplay.GetBuffer(nLength);
|
| + lpBuffer[0] = FDE_TXTEDT_FORMATBLOCK_BGN;
|
| + lpBuffer[nLength - 1] = FDE_TXTEDT_FORMATBLOCK_END;
|
| + FX_DWORD nAddress = (FX_DWORD) this;
|
| + FXSYS_memcpy(lpBuffer + 1, &nAddress, sizeof(FX_DWORD));
|
| + FXSYS_memcpy(lpBuffer + 3, const FX_WCHAR*(wsField),
|
| + (nLength - 4) * sizeof(FX_WCHAR));
|
| + wsDisplay.ReleaseBuffer(nLength);
|
| +}
|
| +int32_t CFDE_TxtEdtField::GetDisplayLength() {
|
| + return (m_bReserveSpace ? m_nLength : m_wsField.GetLength()) +
|
| + FDE_FORMAT_EDIT_FIELD_HADERSIZE + FDE_FORMAT_EDIT_FIELD_TAILSIZE;
|
| +}
|
| +void CFDE_TxtEdtField::GetFieldText(CFX_WideString& wsField) {
|
| + wsField = m_wsField;
|
| +}
|
| +int32_t CFDE_TxtEdtField::GetFieldTextLength() const {
|
| + return m_wsField.GetLength();
|
| +}
|
| +int32_t CFDE_TxtEdtField::GetRealIndex(int32_t nIndex) const {
|
| + int32_t nInnerIndex = nIndex - FDE_FORMAT_EDIT_FIELD_HADERSIZE;
|
| + if (nInnerIndex < 0) {
|
| + return 0;
|
| + }
|
| + int32_t nFieldLength = m_wsField.GetLength();
|
| + if (m_bReserveSpace && !m_bLeftAlignment) {
|
| + nInnerIndex -= (m_nLength - nFieldLength);
|
| + }
|
| + if (nInnerIndex < 0) {
|
| + return 0;
|
| + }
|
| + if (nInnerIndex >= nFieldLength) {
|
| + return nFieldLength;
|
| + }
|
| + return nInnerIndex + 1;
|
| +}
|
| +int32_t CFDE_TxtEdtField::NormalizeCaretPos(
|
| + int32_t nIndex,
|
| + FDE_FORMAT_CARET_DIRECTION eDirection) const {
|
| + nIndex -= FDE_FORMAT_EDIT_FIELD_HADERSIZE;
|
| + int32_t nLength = m_wsField.GetLength();
|
| + if (m_bReserveSpace) {
|
| + int32_t nFieldLength = m_wsField.GetLength();
|
| + if (m_bLeftAlignment) {
|
| + if (nIndex > nFieldLength) {
|
| + if (eDirection == FDE_FORMAT_CARET_FORWARD) {
|
| + return -1;
|
| + }
|
| + nIndex = nFieldLength;
|
| + }
|
| + } else {
|
| + int32_t nReserveLength = m_nLength - nFieldLength;
|
| + if (nIndex < nReserveLength) {
|
| + if (eDirection == FDE_FORMAT_CARET_BACKWARD) {
|
| + return -2;
|
| + }
|
| + nIndex = nReserveLength;
|
| + }
|
| + }
|
| + }
|
| + return nIndex + FDE_FORMAT_EDIT_FIELD_HADERSIZE;
|
| +}
|
| +FX_BOOL CFDE_TxtEdtField::GetEditableRange(int32_t& nBgn, int32_t& nEnd) const {
|
| + if (m_bReserveSpace && !m_bLeftAlignment) {
|
| + nEnd = FDE_FORMAT_EDIT_FIELD_HADERSIZE + m_nLength;
|
| + nBgn = nEnd - m_wsField.GetLength();
|
| + } else {
|
| + nBgn = FDE_FORMAT_EDIT_FIELD_HADERSIZE;
|
| + nEnd = nBgn + m_wsField.GetLength();
|
| + }
|
| + return TRUE;
|
| +}
|
| +void CFDE_TxtEdtField::Backup() {
|
| + m_wsBackup = m_wsField;
|
| +}
|
| +void CFDE_TxtEdtField::Restore() {
|
| + m_wsField = m_wsBackup;
|
| +}
|
| +int32_t CFDE_TxtEdtField::Validate(const CFX_WideString& wsText) const {
|
| + if (m_nLength < 0) {
|
| + return FDE_FORMAT_FIELD_DELETE_RET_S;
|
| + }
|
| + return wsText.GetLength() <= m_nLength ? FDE_FORMAT_FIELD_VALIDATE_S
|
| + : FDE_FORMAT_FIELD_VALIDATE_F_FULL;
|
| +}
|
| +void CFDE_TxtEdtField::GetNormalizedFieldText(CFX_WideString& wsField) const {
|
| + wsField = m_wsField;
|
| + if (m_nLength == -1) {
|
| + return;
|
| + }
|
| + if (m_bReserveSpace) {
|
| + int32_t nField = wsField.GetLength();
|
| + int32_t nFill = m_nLength - nField;
|
| + if (m_bLeftAlignment) {
|
| + while (nFill--) {
|
| + wsField.Insert(nField++, m_wcFill);
|
| + }
|
| + } else {
|
| + while (nFill--) {
|
| + wsField.Insert(0, m_wcFill);
|
| + }
|
| + }
|
| + }
|
| +}
|
| +CFDE_TxtEdtField_Integer::CFDE_TxtEdtField_Integer(
|
| + const CFX_WideString& wsField,
|
| + int32_t nIndex,
|
| + CFDE_TxtEdtBlock* pBlock)
|
| + : m_bSign(FALSE), CFDE_TxtEdtField(nIndex, pBlock) {
|
| + CFDE_TxtEdtFieldFormatParser FormatParser;
|
| + FormatParser.Parse(wsField);
|
| + int32_t nCount = FormatParser.CountItems();
|
| + CFX_WideString wskey;
|
| + CFX_WideString wsVal;
|
| + for (int32_t i = 0; i < nCount; i++) {
|
| + FormatParser.GetItem(i, wskey, wsVal);
|
| + if (wskey.Equal(L"Length")) {
|
| + m_nLength = wsVal.GetInteger();
|
| + } else if (wskey.Equal(L"Sign")) {
|
| + m_bSign = wsVal.GetInteger() != 0;
|
| + } else if (wskey.Equal(L"FillChar")) {
|
| + m_wcFill = wsVal[0];
|
| + } else {
|
| + FXSYS_assert(0);
|
| + }
|
| + wskey.Empty();
|
| + wsVal.Empty();
|
| + }
|
| + if (m_nLength == -1) {
|
| + m_bReserveSpace = FALSE;
|
| + }
|
| +}
|
| +int32_t CFDE_TxtEdtField_Integer::Validate(const CFX_WideString& wsText) const {
|
| + int32_t i = 0;
|
| + if (m_bSign) {
|
| + FX_WCHAR wcTemp = wsText[0];
|
| + if (FDE_TXTEDT_ISSIGN(wcTemp)) {
|
| + i++;
|
| + }
|
| + }
|
| + int32_t nLength = wsText.GetLength();
|
| + if (m_nLength > 0) {
|
| + if (nLength - i > (m_nLength - (m_bSign ? 1 : 0))) {
|
| + return FDE_FORMAT_FIELD_VALIDATE_F_FULL;
|
| + }
|
| + }
|
| + for (; i < nLength; i++) {
|
| + FX_WCHAR wcTemp = wsText[i];
|
| + if (!FDE_TXTEDT_ISINTEGER(wcTemp)) {
|
| + return FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE;
|
| + }
|
| + }
|
| + return FDE_FORMAT_FIELD_VALIDATE_S;
|
| +}
|
| +CFDE_TxtEdtField_Float::CFDE_TxtEdtField_Float(const CFX_WideString& wsField,
|
| + int32_t nIndex,
|
| + CFDE_TxtEdtBlock* pBlock)
|
| + : CFDE_TxtEdtField(nIndex, pBlock),
|
| + m_bSigned(FALSE),
|
| + m_nIntPartlength(-1),
|
| + m_nDecPartLength(-1) {
|
| + CFDE_TxtEdtFieldFormatParser FormatParser;
|
| + FormatParser.Parse(wsField);
|
| + int32_t nCount = FormatParser.CountItems();
|
| + CFX_WideString wskey;
|
| + CFX_WideString wsVal;
|
| + for (int32_t i = 0; i < nCount; i++) {
|
| + FormatParser.GetItem(i, wskey, wsVal);
|
| + if (wskey.Equal(L"DecLength")) {
|
| + m_nDecPartLength = wsVal.GetInteger();
|
| + } else if (wskey.Equal(L"IntLength")) {
|
| + m_nIntPartlength = wsVal.GetInteger();
|
| + } else if (wskey.Equal(L"Sign")) {
|
| + m_bSigned = wsVal.GetInteger() != 0;
|
| + } else if (wskey.Equal(L"FillChar")) {
|
| + m_wcFill = wsVal[0];
|
| + } else {
|
| + FXSYS_assert(0);
|
| + }
|
| + if (m_nIntPartlength == -1 || m_nDecPartLength == -1) {
|
| + m_nLength = -1;
|
| + } else {
|
| + m_nLength = m_nIntPartlength + m_nDecPartLength + 1 + (m_bSigned ? 1 : 0);
|
| + }
|
| + m_bReserveSpace = TRUE;
|
| + wskey.Empty();
|
| + wsVal.Empty();
|
| + }
|
| +}
|
| +int32_t CFDE_TxtEdtField_Float::Validate(const CFX_WideString& wsText) const {
|
| + int32_t nLength = wsText.GetLength();
|
| + if (m_nLength != -1 && (nLength > m_nLength)) {
|
| + return FDE_FORMAT_FIELD_VALIDATE_F_FULL;
|
| + }
|
| + const FX_WCHAR* lpBuf = const FX_WCHAR * (wsText);
|
| + int32_t i = 0;
|
| + if (m_bSigned) {
|
| + FX_WCHAR wcTemp = lpBuf[0];
|
| + if (FDE_TXTEDT_ISSIGN(wcTemp)) {
|
| + i++;
|
| + }
|
| + }
|
| + int32_t nIntPart = 0;
|
| + int32_t nPoint = 0;
|
| + for (; i < nLength; i++) {
|
| + FX_WCHAR wcTemp = lpBuf[i];
|
| + if (!FDE_TXTEDT_ISINTEGER(wcTemp)) {
|
| + if (wcTemp != L'.') {
|
| + return FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE;
|
| + }
|
| + nPoint = 1;
|
| + break;
|
| + }
|
| + nIntPart++;
|
| + }
|
| + if (m_nIntPartlength != -1 && (nIntPart > m_nIntPartlength)) {
|
| + return FDE_FORMAT_FIELD_VALIDATE_F_FULL;
|
| + }
|
| + if (m_nDecPartLength != -1 &&
|
| + (nLength - nIntPart - nPoint > m_nDecPartLength)) {
|
| + return FDE_FORMAT_FIELD_VALIDATE_F_FULL;
|
| + }
|
| + i++;
|
| + for (; i < nLength; i++) {
|
| + FX_WCHAR wcTemp = lpBuf[i];
|
| + if (!FDE_TXTEDT_ISINTEGER(wcTemp)) {
|
| + return FDE_FORMAT_FIELD_VALIDATE_F_FULL;
|
| + }
|
| + }
|
| + return FDE_FORMAT_FIELD_VALIDATE_S;
|
| +}
|
| +CFDE_TxtEdtField_Password::CFDE_TxtEdtField_Password(
|
| + const CFX_WideString& wsField,
|
| + int32_t nIndex,
|
| + CFDE_TxtEdtBlock* pBlock)
|
| + : CFDE_TxtEdtField(nIndex, pBlock), m_wcAlias(L'*') {
|
| + CFDE_TxtEdtFieldFormatParser FormatParser;
|
| + FormatParser.Parse(wsField);
|
| + int32_t nCount = FormatParser.CountItems();
|
| + CFX_WideString wskey;
|
| + CFX_WideString wsVal;
|
| + for (int32_t i = 0; i < nCount; i++) {
|
| + FormatParser.GetItem(i, wskey, wsVal);
|
| + if (wskey.Equal(L"Length")) {
|
| + m_nLength = wsVal.GetInteger();
|
| + } else if (wskey.Equal(L"AliasChar")) {
|
| + m_wcAlias = wsVal[0];
|
| + } else {
|
| + FXSYS_assert(0);
|
| + }
|
| + wskey.Empty();
|
| + wsVal.Empty();
|
| + }
|
| + if (m_nLength == -1) {
|
| + m_bReserveSpace = FALSE;
|
| + }
|
| +}
|
| +void CFDE_TxtEdtField_Password::GetNormalizedFieldText(
|
| + CFX_WideString& wsField) const {
|
| + int32_t nFiledLength = m_wsField.GetLength();
|
| + int32_t nLength = m_bReserveSpace ? m_nLength : nFiledLength;
|
| + FX_WCHAR* lpBuf = wsField.GetBuffer(nLength);
|
| + int32_t nSpaceLength = nLength - nFiledLength;
|
| + int32_t nFirstPart = m_bLeftAlignment ? nFiledLength : nSpaceLength;
|
| + FX_WCHAR wFirstChar = m_bLeftAlignment ? m_wcAlias : L' ';
|
| + FX_WCHAR wSecondChar = m_bLeftAlignment ? L' ' : m_wcAlias;
|
| + int32_t i = 0;
|
| + for (; i < nFirstPart; i++) {
|
| + lpBuf[i] = wFirstChar;
|
| + }
|
| + for (; i < nLength; i++) {
|
| + lpBuf[i] = wSecondChar;
|
| + }
|
| + wsField.ReleaseBuffer(nLength);
|
| +}
|
| +CFDE_TxtEdtField_String::CFDE_TxtEdtField_String(const CFX_WideString& wsField,
|
| + int32_t nIndex,
|
| + CFDE_TxtEdtBlock* pBlock)
|
| + : CFDE_TxtEdtField(nIndex, pBlock) {
|
| + CFDE_TxtEdtFieldFormatParser FormatParser;
|
| + FormatParser.Parse(wsField);
|
| + int32_t nCount = FormatParser.CountItems();
|
| + CFX_WideString wskey;
|
| + CFX_WideString wsVal;
|
| + for (int32_t i = 0; i < nCount; i++) {
|
| + FormatParser.GetItem(i, wskey, wsVal);
|
| + if (wskey.Equal(L"Length")) {
|
| + m_nLength = wsVal.GetInteger();
|
| + } else {
|
| + FXSYS_assert(0);
|
| + }
|
| + wskey.Empty();
|
| + wsVal.Empty();
|
| + }
|
| +}
|
| +CFDE_TxtEdtField_Fixed::CFDE_TxtEdtField_Fixed(const CFX_WideString& wsField,
|
| + int32_t nIndex,
|
| + CFDE_TxtEdtBlock* pBlock)
|
| + : CFDE_TxtEdtField(nIndex, pBlock) {
|
| + m_wsField = wsField;
|
| + m_nLength = wsField.GetLength();
|
| +}
|
| +void CFDE_TxtEdtField_Fixed::GetDisplayText(CFX_WideString& wsDisplay) {
|
| + int32_t nLength = m_wsField.GetLength() + FDE_FORMAT_EDIT_FIELD_HADERSIZE +
|
| + FDE_FORMAT_EDIT_FIELD_TAILSIZE;
|
| + FX_WCHAR* lpBuffer = wsDisplay.GetBuffer(nLength);
|
| + lpBuffer[0] = FDE_TXTEDT_FORMATBLOCK_BGN;
|
| + lpBuffer[nLength - 1] = FDE_TXTEDT_FORMATBLOCK_END;
|
| + FX_DWORD nAddress = (FX_DWORD) this;
|
| + FXSYS_memcpy(lpBuffer + 1, &nAddress, sizeof(FX_DWORD));
|
| + FXSYS_memcpy(lpBuffer + 3, const FX_WCHAR*(m_wsField),
|
| + (nLength - 4) * sizeof(FX_WCHAR));
|
| + wsDisplay.ReleaseBuffer(nLength);
|
| +}
|
| +int32_t CFDE_TxtEdtField_Fixed::NormalizeCaretPos(
|
| + int32_t nIndex,
|
| + FDE_FORMAT_CARET_DIRECTION eDirection) const {
|
| + FXSYS_assert(nIndex >= 0 && nIndex <= m_nLength);
|
| + if (eDirection == FDE_FORMAT_CARET_MIDDLE) {
|
| + return (nIndex > m_wsField.GetLength() / 2) ? -1 : -2;
|
| + }
|
| + return eDirection == FDE_FORMAT_CARET_BACKWARD ? -2 : -1;
|
| +}
|
| +#endif
|
|
|