diff options
Diffstat (limited to 'xfa/src/fee/src/fee/fde_txtedtengine.cpp')
-rw-r--r-- | xfa/src/fee/src/fee/fde_txtedtengine.cpp | 5732 |
1 files changed, 2866 insertions, 2866 deletions
diff --git a/xfa/src/fee/src/fee/fde_txtedtengine.cpp b/xfa/src/fee/src/fee/fde_txtedtengine.cpp index 72965bd20c..6a289a61db 100644 --- a/xfa/src/fee/src/fee/fde_txtedtengine.cpp +++ b/xfa/src/fee/src/fee/fde_txtedtengine.cpp @@ -1,2866 +1,2866 @@ -// 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 <algorithm>
-
-#include "xfa/src/foxitlib.h"
-#include "xfa/src/fee/include/ifde_txtedtengine.h"
-#include "xfa/src/fee/include/ifde_txtedtbuf.h"
-#include "xfa/src/fee/include/ifde_txtedtpage.h"
-#include "fde_txtedtengine.h"
-#include "fde_txtedtparag.h"
-#include "fde_txtedtbuf.h"
-#ifdef FDE_USEFORMATBLOCK
-#include "fde_txtedtblock.h"
-#endif
-#define FDE_PAGEWIDTH_MAX 0xFFFF
-#define FDE_TXTPLATESIZE (1024 * 12)
-#define FDE_UNICODE_PARAGRAPH_SPERATOR (0x2029)
-#define FDE_TXTEDT_DORECORD_INS 0
-#define FDE_TXTEDT_DORECORD_DEL 1
-#ifdef FDE_USEFORMATBLOCK
-#define FDE_TXTEDT_DORECORD_FORMATINS 3
-#define FDE_TXTEDT_DORECORD_FORMATDEL 4
-#define FDE_TXTEDT_DORECORD_FORMATREP 5
-#define FDE_TXTEDT_FORMATBLOCK_BGN 0xFFF9
-#define FDE_TXTEDT_FORMATBLOCK_END 0xFFFB
-#endif
-IFDE_TxtEdtEngine* IFDE_TxtEdtEngine::Create() {
- return new CFDE_TxtEdtEngine();
-}
-CFDE_TxtEdtEngine::CFDE_TxtEdtEngine()
- : m_pTextBreak(nullptr),
- m_nPageLineCount(20),
- m_nLineCount(0),
- m_nAnchorPos(-1),
- m_nLayoutPos(0),
- m_fCaretPosReserve(0.0),
- m_nCaret(0),
- m_bBefore(TRUE),
- m_nCaretPage(0),
- m_dwFindFlags(0),
- m_bLock(FALSE),
- m_nLimit(0),
- m_wcAliasChar(L'*'),
-#ifdef FDE_USEFORMATBLOCK
- m_nFixLength(-1), // FIXME: no such member => USEFORMATBLOCK can't work.
-#endif
- m_nFirstLineEnd(FDE_TXTEDIT_LINEEND_Auto),
- m_bAutoLineEnd(TRUE),
- m_wLineEnd(FDE_UNICODE_PARAGRAPH_SPERATOR) {
- FXSYS_memset(&m_rtCaret, 0, sizeof(CFX_RectF));
- m_pTxtBuf = new CFDE_TxtEdtBuf();
- m_bAutoLineEnd = (m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto);
-}
-CFDE_TxtEdtEngine::~CFDE_TxtEdtEngine() {
- if (m_pTxtBuf) {
- m_pTxtBuf->Release();
- m_pTxtBuf = NULL;
- }
- if (m_pTextBreak) {
- m_pTextBreak->Release();
- m_pTextBreak = NULL;
- }
-#ifdef FDE_USEFORMATBLOCK
- int32_t nBlockCount = m_BlockArray.GetSize();
- if (nBlockCount > 0) {
- int32_t i = 0;
- for (; i < nBlockCount; i++) {
- CFDE_TxtEdtBlock* pBlock = m_BlockArray[i];
- delete pBlock;
- }
- m_BlockArray.RemoveAll();
- }
-#endif
- RemoveAllParags();
- RemoveAllPages();
- m_Param.pEventSink = NULL;
- ClearSelection();
-}
-void CFDE_TxtEdtEngine::Release() {
- delete this;
-}
-void CFDE_TxtEdtEngine::SetEditParams(const FDE_TXTEDTPARAMS& params) {
- if (m_pTextBreak == NULL) {
- m_pTextBreak = IFX_TxtBreak::Create(FX_TXTBREAKPOLICY_None);
- }
- FXSYS_memcpy(&m_Param, ¶ms, sizeof(FDE_TXTEDTPARAMS));
- m_wLineEnd = params.wLineBreakChar;
- m_bAutoLineEnd = (m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto);
- UpdateTxtBreak();
-}
-const FDE_TXTEDTPARAMS* CFDE_TxtEdtEngine::GetEditParams() const {
- return &m_Param;
-}
-int32_t CFDE_TxtEdtEngine::CountPages() const {
- if (m_nLineCount == 0) {
- return 0;
- }
- return ((m_nLineCount - 1) / m_nPageLineCount) + 1;
-}
-IFDE_TxtEdtPage* CFDE_TxtEdtEngine::GetPage(int32_t nIndex) {
- if (m_PagePtrArray.GetSize() <= nIndex) {
- return NULL;
- }
- return (IFDE_TxtEdtPage*)m_PagePtrArray[nIndex];
-}
-FX_BOOL CFDE_TxtEdtEngine::SetBufChunkSize(int32_t nChunkSize) {
- return m_pTxtBuf->SetChunkSize(nChunkSize);
-}
-void CFDE_TxtEdtEngine::SetTextByStream(IFX_Stream* pStream) {
- ResetEngine();
- int32_t nIndex = 0;
- if (pStream != NULL && pStream->GetLength()) {
- int32_t nStreamLength = pStream->GetLength();
- FX_BOOL bValid = TRUE;
- if (m_nLimit > 0 && nStreamLength > m_nLimit) {
- bValid = FALSE;
- }
- FX_BOOL bPreIsCR = FALSE;
- if (bValid) {
- uint8_t bom[4];
- int32_t nPos = pStream->GetBOM(bom);
- pStream->Seek(FX_STREAMSEEK_Begin, nPos);
- int32_t nPlateSize = std::min(nStreamLength, m_pTxtBuf->GetChunkSize());
- FX_WCHAR* lpwstr = FX_Alloc(FX_WCHAR, nPlateSize);
- FX_BOOL bEos = false;
- while (!bEos) {
- int32_t nRead = pStream->ReadString(lpwstr, nPlateSize, bEos);
- bPreIsCR = ReplaceParagEnd(lpwstr, nRead, bPreIsCR);
- m_pTxtBuf->Insert(nIndex, lpwstr, nRead);
- nIndex += nRead;
- }
- FX_Free(lpwstr);
- }
- }
- m_pTxtBuf->Insert(nIndex, &m_wLineEnd, 1);
- RebuildParagraphs();
-}
-void CFDE_TxtEdtEngine::SetText(const CFX_WideString& wsText) {
- ResetEngine();
- int32_t nLength = wsText.GetLength();
- if (nLength > 0) {
- CFX_WideString wsTemp;
- FX_WCHAR* lpBuffer = wsTemp.GetBuffer(nLength);
- FXSYS_memcpy(lpBuffer, wsText.c_str(), nLength * sizeof(FX_WCHAR));
- ReplaceParagEnd(lpBuffer, nLength, FALSE);
- wsTemp.ReleaseBuffer(nLength);
- if (m_nLimit > 0 && nLength > m_nLimit) {
- wsTemp.Delete(m_nLimit, nLength - m_nLimit);
- nLength = m_nLimit;
- }
- m_pTxtBuf->SetText(wsTemp);
- }
- m_pTxtBuf->Insert(nLength, &m_wLineEnd, 1);
- RebuildParagraphs();
-}
-int32_t CFDE_TxtEdtEngine::GetTextLength() const {
- return GetTextBufLength();
-}
-void CFDE_TxtEdtEngine::GetText(CFX_WideString& wsText,
- int32_t nStart,
- int32_t nCount) {
- int32_t nTextBufLength = GetTextBufLength();
- if (nCount == -1) {
- nCount = nTextBufLength - nStart;
- }
-#ifdef FDE_USEFORMATBLOCK
- int32_t nBlockCount = m_BlockArray.GetSize();
- if (nBlockCount == 0 || m_wsFixText.IsEmpty()) {
- m_pTxtBuf->GetRange(wsText, nStart, nCount);
- return;
- }
- CFX_WideString wsTemp;
- const FX_WCHAR* lpFixBuffer = const FX_WCHAR * (m_wsFixText);
- FX_WCHAR* lpBuffer = wsTemp.GetBuffer(nTextBufLength);
- int32_t nRealLength = 0;
- int32_t nPrePos = 0;
- for (int32_t i = 0; i < nBlockCount; i++) {
- CFDE_TxtEdtBlock* pBlock = m_BlockArray[i];
- int32_t nPos = pBlock->GetPos();
- int32_t nCopyLength = nPos - nPrePos;
- FXSYS_memcpy(lpBuffer + nRealLength, lpFixBuffer + nPrePos,
- nCopyLength * sizeof(FX_WCHAR));
- nRealLength += nCopyLength;
- nPrePos = nPos;
- CFX_WideString wsBlock;
- pBlock->GetRealText(wsBlock);
- nCopyLength = wsBlock.GetLength();
- FXSYS_memcpy(lpBuffer + nRealLength, const FX_WCHAR*(wsBlock),
- nCopyLength * sizeof(FX_WCHAR));
- nRealLength += nCopyLength;
- }
- int32_t nLeftLength = m_wsFixText.GetLength() - nPrePos;
- if (nLeftLength > 0) {
- FXSYS_memcpy(lpBuffer + nRealLength, lpFixBuffer + nPrePos,
- nLeftLength * sizeof(FX_WCHAR));
- nRealLength += nLeftLength;
- }
- wsTemp.ReleaseBuffer(nRealLength);
- int32_t nRealBgn = GetRealIndex(nStart);
- int32_t nRealEnd = GetRealIndex(nStart + nCount - 1);
- int32_t nRealCount = nRealEnd - nRealBgn;
- FX_WCHAR* lpDestBuf = wsText.GetBuffer(nRealCount);
- FXSYS_memcpy(lpDestBuf, const FX_WCHAR*(wsTemp) + nRealBgn,
- nRealCount * sizeof(FX_WCHAR));
- wsText.ReleaseBuffer();
-#else
- m_pTxtBuf->GetRange(wsText, nStart, nCount);
- RecoverParagEnd(wsText);
-#endif
-}
-
-void CFDE_TxtEdtEngine::ClearText() {
- DeleteRange(0, -1);
-}
-int32_t CFDE_TxtEdtEngine::GetCaretRect(CFX_RectF& rtCaret) const {
- rtCaret = m_rtCaret;
- return m_nCaret;
-}
-int32_t CFDE_TxtEdtEngine::GetCaretPos() const {
- if (IsLocked()) {
- return 0;
- }
- return m_nCaret + (m_bBefore ? 0 : 1);
-}
-int32_t CFDE_TxtEdtEngine::SetCaretPos(int32_t nIndex, FX_BOOL bBefore) {
- if (IsLocked()) {
- return 0;
- }
- FXSYS_assert(nIndex >= 0 && nIndex <= GetTextBufLength());
- if (m_PagePtrArray.GetSize() <= m_nCaretPage) {
- return 0;
- }
-#ifdef FDE_USEFORMATBLOCK
- if (m_BlockArray.GetSize() > 0) {
- nIndex = NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_MIDDLE, bBefore);
- }
-#endif
- m_bBefore = bBefore;
- m_nCaret = nIndex;
- MovePage2Char(m_nCaret);
- GetCaretRect(m_rtCaret, m_nCaretPage, m_nCaret, m_bBefore);
- if (!m_bBefore) {
- m_nCaret++;
- m_bBefore = TRUE;
- }
- m_fCaretPosReserve = (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical)
- ? m_rtCaret.top
- : m_rtCaret.left;
- m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage, 0);
- m_nAnchorPos = -1;
- return m_nCaret;
-}
-int32_t CFDE_TxtEdtEngine::MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret,
- FX_BOOL bShift,
- FX_BOOL bCtrl) {
- if (IsLocked()) {
- return 0;
- }
- if (m_PagePtrArray.GetSize() <= m_nCaretPage) {
- return 0;
- }
- FX_BOOL bSelChange = FALSE;
- if (IsSelect()) {
- ClearSelection();
- bSelChange = TRUE;
- }
- if (bShift) {
- if (m_nAnchorPos == -1) {
- m_nAnchorPos = m_nCaret;
- }
- } else {
- m_nAnchorPos = -1;
- }
- FX_BOOL bVertical = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical;
- switch (eMoveCaret) {
- case MC_Left: {
- if (bVertical) {
- CFX_PointF ptCaret;
- if (MoveUp(ptCaret)) {
- UpdateCaretIndex(ptCaret);
- }
- } else {
- FX_BOOL bBefore = TRUE;
- int32_t nIndex = MoveBackward(bBefore);
-#ifdef FDE_USEFORMATBLOCK
- if (m_BlockArray.GetSize()) {
- nIndex =
- NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_BACKWARD, bBefore);
- if (nIndex < 0) {
- return m_nCaret;
- }
- }
-#endif
- if (nIndex >= 0) {
- UpdateCaretRect(nIndex, bBefore);
- }
- }
- } break;
- case MC_Right: {
- if (bVertical) {
- CFX_PointF ptCaret;
- if (MoveDown(ptCaret)) {
- UpdateCaretIndex(ptCaret);
- }
- } else {
- FX_BOOL bBefore = TRUE;
- int32_t nIndex = MoveForward(bBefore);
-#ifdef FDE_USEFORMATBLOCK
- if (m_BlockArray.GetSize()) {
- if (nIndex == -1) {
- nIndex = GetTextBufLength();
- }
- nIndex = NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_FORWARD, bBefore);
- }
-#endif
- if (nIndex >= 0) {
- UpdateCaretRect(nIndex, bBefore);
- }
- }
- } break;
- case MC_Up: {
- if (bVertical) {
- FX_BOOL bBefore = TRUE;
- int32_t nIndex = MoveBackward(bBefore);
-#ifdef FDE_USEFORMATBLOCK
- if (m_BlockArray.GetSize()) {
- nIndex =
- NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_BACKWARD, bBefore);
- }
-#endif
- if (nIndex >= 0) {
- UpdateCaretRect(nIndex, bBefore);
- }
- } else {
- CFX_PointF ptCaret;
- if (MoveUp(ptCaret)) {
- UpdateCaretIndex(ptCaret);
- }
- }
- } break;
- case MC_Down: {
- if (bVertical) {
- FX_BOOL bBefore = TRUE;
- int32_t nIndex = MoveForward(bBefore);
-#ifdef FDE_USEFORMATBLOCK
- if (m_BlockArray.GetSize()) {
- nIndex = NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_FORWARD, bBefore);
- }
-#endif
- if (nIndex >= 0) {
- UpdateCaretRect(nIndex, bBefore);
- }
- } else {
- CFX_PointF ptCaret;
- if (MoveDown(ptCaret)) {
- UpdateCaretIndex(ptCaret);
- }
- }
- } break;
- case MC_WordBackward:
- break;
- case MC_WordForward:
- break;
- case MC_LineStart:
- MoveLineStart();
- break;
- case MC_LineEnd:
- MoveLineEnd();
- break;
- case MC_ParagStart:
- MoveParagStart();
- break;
- case MC_ParagEnd:
- MoveParagEnd();
- break;
- case MC_PageDown:
- break;
- case MC_PageUp:
- break;
- case MC_Home:
- MoveHome();
- break;
- case MC_End:
- MoveEnd();
- break;
- default:
- break;
- }
- if (bShift && m_nAnchorPos != -1 && (m_nAnchorPos != m_nCaret)) {
- AddSelRange(std::min(m_nAnchorPos, m_nCaret),
- FXSYS_abs(m_nAnchorPos - m_nCaret));
- m_Param.pEventSink->On_SelChanged(this);
- }
- if (bSelChange) {
- m_Param.pEventSink->On_SelChanged(this);
- }
- return m_nCaret;
-}
-void CFDE_TxtEdtEngine::Lock() {
- m_bLock = TRUE;
-}
-void CFDE_TxtEdtEngine::Unlock() {
- m_bLock = FALSE;
-}
-FX_BOOL CFDE_TxtEdtEngine::IsLocked() const {
- return m_bLock;
-}
-int32_t CFDE_TxtEdtEngine::Insert(int32_t nStart,
- const FX_WCHAR* lpText,
- int32_t nLength) {
- if (IsLocked()) {
- return FDE_TXTEDT_MODIFY_RET_F_Locked;
- }
-#ifdef FDE_USEFORMATBLOCK
- int32_t nBlockCount = m_BlockArray.GetSize();
- if (nBlockCount) {
- if (m_Param.dwMode & FDE_TEXTEDITMODE_FIELD_TAB && nLength == 1 &&
- lpText[0] == L'\t') {
- return Move2NextEditableField(nStart) ? FDE_TXTEDT_MODIFY_RET_T_Tab
- : FDE_TXTEDT_MODIFY_RET_F_Tab;
- }
- int32_t nSelRangeCount = CountSelRanges();
- if (nSelRangeCount > 0) {
- if (nSelRangeCount > 1) {
- return FDE_TXTEDT_MODIFY_RET_F_Boundary;
- }
- int32_t nSelStart;
- int32_t nSelCount;
- nSelCount = GetSelRange(0, nSelStart);
- int32_t nSelEnd = nSelStart + nSelCount;
- int32_t nBgn = 0;
- int32_t nEnd = 0;
- CFDE_TxtEdtField* pField = NULL;
- FX_BOOL bInField = GetFieldBoundary(nSelStart, nBgn, nEnd, pField);
- if (nSelEnd > nEnd) {
- return FDE_TXTEDT_MODIFY_RET_F_Boundary;
- }
- if (bInField) {
- pField->Backup();
- FX_BOOL bBefore = FALSE;
- CFX_WideString wsDel;
- int32_t nCaret;
- int32_t nIndexInField = nSelStart - nBgn;
- int32_t nRet = pField->Replace(nSelStart - nBgn, nSelCount,
- CFX_WideStringC(lpText, nLength), wsDel,
- nCaret, bBefore);
- switch (nRet) {
- case FDE_FORMAT_FIELD_INSERT_RET_F_FULL:
- pField->Restore();
- return FDE_TXTEDT_MODIFY_RET_F_Full;
- case FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE:
- pField->Restore();
- return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
- default:
- break;
- }
- CFX_WideString wsField;
- pField->GetFieldText(wsField);
- if (!m_Param.pEventSink->On_ValidateField(this, pField->GetBlockIndex(),
- pField->GetIndex(), wsField,
- 0)) {
- pField->Restore();
- return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
- }
- CFX_WideString wsDisplay;
- pField->GetDisplayText(wsDisplay);
- if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) ||
- (m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz)) {
- CFX_WideString wsText;
- GetPreReplaceText(wsText, nBgn, nEnd - nBgn + 1,
- const FX_WCHAR*(wsDisplay), wsDisplay.GetLength());
- if (!IsFitArea(wsText)) {
- pField->Restore();
- return FDE_TXTEDT_MODIFY_RET_F_Full;
- }
- }
- Replace(nBgn, nEnd - nBgn + 1, wsDisplay);
- int32_t nNewCaret = nBgn + nCaret;
- if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
- IFDE_TxtEdtDoRecord* pRecord = new CFDE_TxtEdtDoRecord_FieldReplace(
- this, m_nCaret, nNewCaret, pField, nIndexInField, nBgn,
- wsDisplay.GetLength(), wsDel, CFX_WideStringC(lpText, nLength),
- TRUE);
- CFX_ByteString bsDoRecord;
- pRecord->Serialize(bsDoRecord);
- m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
- pRecord->Release();
- }
- SetCaretPos(nBgn + nCaret, bBefore);
- return FDE_TXTEDT_MODIFY_RET_S_Normal;
- }
- }
- int32_t nBgn = 0;
- int32_t nEnd = 0;
- CFDE_TxtEdtField* pField = NULL;
- FX_BOOL bInField = GetFieldBoundary(m_nCaret, nBgn, nEnd, pField);
- int32_t nCaretInField = m_nCaret - nBgn;
- FX_BOOL bBefore = FALSE;
- if (bInField) {
- pField->Backup();
- CFX_WideStringC wsIns(lpText, nLength);
- int32_t nRet =
- pField->Insert(nCaretInField, wsIns, nCaretInField, bBefore);
- FX_BOOL bFull = FALSE;
- switch (nRet) {
- case FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL:
- break;
- case FDE_FORMAT_FIELD_INSERT_RET_S_FULL:
- bFull = TRUE;
- break;
- case FDE_FORMAT_FIELD_INSERT_RET_F_FULL:
- return FDE_TXTEDT_MODIFY_RET_F_Full;
- case FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE:
- return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
- default:
- return FDE_TXTEDT_MODIFY_RET_F_Normal;
- }
- CFX_WideString wsField;
- pField->GetFieldText(wsField);
- if (!m_Param.pEventSink->On_ValidateField(
- this, pField->GetBlockIndex(), pField->GetIndex(), wsField, 0)) {
- pField->Restore();
- return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
- }
- CFX_WideString wsDisplay;
- pField->GetDisplayText(wsDisplay);
- if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) ||
- (m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz)) {
- CFX_WideString wsText;
- GetPreReplaceText(wsText, nBgn, nEnd - nBgn + 1,
- const FX_WCHAR*(wsDisplay), wsDisplay.GetLength());
- if (!IsFitArea(wsText)) {
- pField->Restore();
- return FDE_TXTEDT_MODIFY_RET_F_Full;
- }
- }
- Replace(nBgn, nEnd - nBgn + 1, wsDisplay);
- if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
- IFDE_TxtEdtDoRecord* pRecord = new CFDE_TxtEdtDoRecord_FieldInsert(
- this, m_nCaret, pField, m_nCaret - nBgn, nBgn, nEnd - nBgn + 1,
- wsDisplay.GetLength(), CFX_WideStringC(lpText, nLength), FALSE);
- CFX_ByteString bsDoRecord;
- pRecord->Serialize(bsDoRecord);
- m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
- pRecord->Release();
- }
- int32_t nCaretPos = nBgn + nCaretInField;
- if (m_Param.dwMode & FDE_TEXTEDITMODE_FIELD_AUTO && bFull &&
- nCaretPos == nEnd) {
- if (Move2NextEditableField(nEnd, TRUE, FALSE)) {
- return TRUE;
- }
- }
- SetCaretPos(nCaretPos, bBefore);
- return bFull ? FDE_TXTEDT_MODIFY_RET_S_Full
- : FDE_TXTEDT_MODIFY_RET_S_Normal;
- }
- FXSYS_assert(0);
- return FDE_TXTEDT_MODIFY_RET_F_Normal;
- }
-#endif
- CFX_WideString wsTemp;
- FX_WCHAR* lpBuffer = wsTemp.GetBuffer(nLength);
- FXSYS_memcpy(lpBuffer, lpText, nLength * sizeof(FX_WCHAR));
- ReplaceParagEnd(lpBuffer, nLength, FALSE);
- wsTemp.ReleaseBuffer(nLength);
- FX_BOOL bPart = FALSE;
- if (m_nLimit > 0) {
- int32_t nTotalLength = GetTextBufLength();
- int32_t nCount = m_SelRangePtrArr.GetSize();
- for (int32_t i = 0; i < nCount; i++) {
- FDE_LPTXTEDTSELRANGE lpSelRange = m_SelRangePtrArr.GetAt(i);
- nTotalLength -= lpSelRange->nCount;
- }
- int32_t nExpectLength = nTotalLength + nLength;
- if (nTotalLength == m_nLimit) {
- return FDE_TXTEDT_MODIFY_RET_F_Full;
- }
- if (nExpectLength > m_nLimit) {
- nLength -= (nExpectLength - m_nLimit);
- bPart = TRUE;
- }
- }
- if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) ||
- (m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz)) {
- int32_t nTemp = nLength;
- if (m_Param.dwMode & FDE_TEXTEDITMODE_Password) {
- CFX_WideString wsText;
- while (nLength > 0) {
- GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength);
- int32_t nTotal = wsText.GetLength();
- FX_WCHAR* lpBuf = wsText.GetBuffer(nTotal);
- for (int32_t i = 0; i < nTotal; i++) {
- lpBuf[i] = m_wcAliasChar;
- }
- wsText.ReleaseBuffer(nTotal);
- if (IsFitArea(wsText)) {
- break;
- }
- nLength--;
- }
- } else {
- CFX_WideString wsText;
- while (nLength > 0) {
- GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength);
- if (IsFitArea(wsText)) {
- break;
- }
- nLength--;
- }
- }
- if (nLength == 0) {
- return FDE_TXTEDT_MODIFY_RET_F_Full;
- }
- if (nLength < nTemp) {
- bPart = TRUE;
- }
- }
- if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
- CFX_WideString wsText;
- GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength);
- if (!m_Param.pEventSink->On_Validate(this, wsText)) {
- return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
- }
- }
- if (IsSelect()) {
- DeleteSelect();
- }
- if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
- IFDE_TxtEdtDoRecord* pRecord =
- new CFDE_TxtEdtDoRecord_Insert(this, m_nCaret, lpBuffer, nLength);
- CFX_ByteString bsDoRecord;
- pRecord->Serialize(bsDoRecord);
- m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
- pRecord->Release();
- }
- GetText(m_ChangeInfo.wsPrevText, 0);
- Inner_Insert(m_nCaret, lpBuffer, nLength);
- m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert;
- m_ChangeInfo.wsInsert = CFX_WideString(lpBuffer, nLength);
- nStart = m_nCaret;
- nStart += nLength;
- FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1);
- FX_BOOL bBefore = TRUE;
- if (wChar != L'\n' && wChar != L'\r') {
- nStart--;
- bBefore = FALSE;
- }
- SetCaretPos(nStart, bBefore);
- m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
- return bPart ? FDE_TXTEDT_MODIFY_RET_S_Part : FDE_TXTEDT_MODIFY_RET_S_Normal;
-}
-int32_t CFDE_TxtEdtEngine::Delete(int32_t nStart, FX_BOOL bBackspace) {
- if (IsLocked()) {
- return FDE_TXTEDT_MODIFY_RET_F_Locked;
- }
- if (IsSelect()) {
- DeleteSelect();
- return FDE_TXTEDT_MODIFY_RET_S_Normal;
- }
-#ifdef FDE_USEFORMATBLOCK
- int32_t nBlockCount = m_BlockArray.GetSize();
- if (nBlockCount > 0) {
- if (bBackspace) {
- nStart--;
- }
- int32_t nCount = 1;
- int32_t nBgn = 0;
- int32_t nEnd = 0;
- CFDE_TxtEdtField* pField = NULL;
- FX_BOOL bInField = GetFieldBoundary(nStart, nBgn, nEnd, pField);
- int32_t nCaretInField = nStart - nBgn;
- FX_BOOL bBefore = FALSE;
- if (bInField && !pField->IsFix()) {
- pField->Backup();
- CFX_WideString wsDel;
- int32_t nCaret = 0;
- int32_t nRet =
- pField->Delete(nCaretInField, nCount, wsDel, nCaret, bBefore);
- nCaret += nBgn;
- switch (nRet) {
- case FDE_FORMAT_FIELD_DELETE_RET_S:
- break;
- case FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE:
- return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
- case FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY:
- return FDE_TXTEDT_MODIFY_RET_F_Boundary;
- default:
- FXSYS_assert(0);
- break;
- }
- CFX_WideString wsField;
- pField->GetFieldText(wsField);
- if (!m_Param.pEventSink->On_ValidateField(
- this, pField->GetBlockIndex(), pField->GetIndex(), wsField, 0)) {
- pField->Restore();
- return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
- }
- CFX_WideString wsDisplay;
- pField->GetDisplayText(wsDisplay);
- Replace(nBgn, nEnd - nBgn + 1, wsDisplay);
- if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
- IFDE_TxtEdtDoRecord* pRecord = new CFDE_TxtEdtDoRecord_FieldDelete(
- this, nStart, pField, nCaretInField, nBgn, nEnd - nBgn + 1,
- wsDisplay.GetLength(), wsDel, FALSE);
- CFX_ByteString bsDoRecord;
- pRecord->Serialize(bsDoRecord);
- m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
- pRecord->Release();
- }
- SetCaretPos(nStart, bBefore);
- return FDE_TXTEDT_MODIFY_RET_S_Normal;
- }
- return FDE_TXTEDT_MODIFY_RET_F_Boundary;
- }
-#endif
- int32_t nCount = 1;
- if (bBackspace) {
- if (nStart == 0) {
- return FDE_TXTEDT_MODIFY_RET_F_Boundary;
- }
- if (nStart > 2 && m_pTxtBuf->GetCharByIndex(nStart - 1) == L'\n' &&
- m_pTxtBuf->GetCharByIndex(nStart - 2) == L'\r') {
- nStart--;
- nCount++;
- }
- nStart--;
- } else {
- if (nStart == GetTextBufLength()) {
- return FDE_TXTEDT_MODIFY_RET_F_Full;
- }
- if ((nStart + 1 < GetTextBufLength()) &&
- (m_pTxtBuf->GetCharByIndex(nStart) == L'\r') &&
- (m_pTxtBuf->GetCharByIndex(nStart + 1) == L'\n')) {
- nCount++;
- }
- }
- if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
- CFX_WideString wsText;
- GetPreDeleteText(wsText, nStart, nCount);
- if (!m_Param.pEventSink->On_Validate(this, wsText)) {
- return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
- }
- }
- if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
- CFX_WideString wsRange;
- m_pTxtBuf->GetRange(wsRange, nStart, nCount);
- IFDE_TxtEdtDoRecord* pRecord =
- new CFDE_TxtEdtDoRecord_DeleteRange(this, nStart, m_nCaret, wsRange);
- CFX_ByteString bsDoRecord;
- pRecord->Serialize(bsDoRecord);
- m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
- pRecord->Release();
- }
- m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete;
- GetText(m_ChangeInfo.wsDelete, nStart, nCount);
- Inner_DeleteRange(nStart, nCount);
- SetCaretPos(nStart + ((!bBackspace && nStart > 0) ? -1 : 0),
- (bBackspace || nStart == 0));
- m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
- return FDE_TXTEDT_MODIFY_RET_S_Normal;
-}
-int32_t CFDE_TxtEdtEngine::DeleteRange(int32_t nStart, int32_t nCount) {
- if (IsLocked()) {
- return FDE_TXTEDT_MODIFY_RET_F_Locked;
- }
- if (nCount == -1) {
- nCount = GetTextBufLength();
- }
- if (nCount == 0) {
- return FDE_TXTEDT_MODIFY_RET_S_Normal;
- }
- if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
- CFX_WideString wsText;
- GetPreDeleteText(wsText, nStart, nCount);
- if (!m_Param.pEventSink->On_Validate(this, wsText)) {
- return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
- }
- }
- DeleteRange_DoRecord(nStart, nCount);
- m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
- SetCaretPos(nStart, TRUE);
- return FDE_TXTEDT_MODIFY_RET_S_Normal;
-}
-int32_t CFDE_TxtEdtEngine::Replace(int32_t nStart,
- int32_t nLength,
- const CFX_WideString& wsReplace) {
- if (IsLocked()) {
- return FDE_TXTEDT_MODIFY_RET_F_Locked;
- }
- if (nStart < 0 || (nStart + nLength > GetTextBufLength())) {
- return FDE_TXTEDT_MODIFY_RET_F_Boundary;
- }
- if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
- CFX_WideString wsText;
- GetPreReplaceText(wsText, nStart, nLength, wsReplace.c_str(),
- wsReplace.GetLength());
- if (!m_Param.pEventSink->On_Validate(this, wsText)) {
- return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
- }
- }
- if (IsSelect()) {
- ClearSelection();
- }
- m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Replace;
- GetText(m_ChangeInfo.wsDelete, nStart, nLength);
- if (nLength > 0) {
- Inner_DeleteRange(nStart, nLength);
- }
- int32_t nTextLength = wsReplace.GetLength();
- if (nTextLength > 0) {
- Inner_Insert(nStart, wsReplace.c_str(), nTextLength);
- }
- m_ChangeInfo.wsInsert = CFX_WideString(wsReplace.c_str(), nTextLength);
- nStart += nTextLength;
- FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1);
- FX_BOOL bBefore = TRUE;
- if (wChar != L'\n' && wChar != L'\r') {
- nStart--;
- bBefore = FALSE;
- }
- SetCaretPos(nStart, bBefore);
- m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
- m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
- m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
- return FDE_TXTEDT_MODIFY_RET_S_Normal;
-}
-void CFDE_TxtEdtEngine::SetLimit(int32_t nLimit) {
- m_nLimit = nLimit;
-}
-void CFDE_TxtEdtEngine::SetAliasChar(FX_WCHAR wcAlias) {
- m_wcAliasChar = wcAlias;
-}
-void CFDE_TxtEdtEngine::SetFormatBlock(int32_t nIndex,
- const CFX_WideString& wsBlockFormat) {
-#ifdef FDE_USEFORMATBLOCK
- if (m_nFixLength == -1) {
- m_nFixLength = GetTextLength();
- FXSYS_assert(m_wsFixText.IsEmpty());
- GetText(m_wsFixText, 0, -1);
- }
- FX_BOOL bInBlock = FALSE;
- int32_t nCharIndex = 0;
- int32_t nBlockIndex = 0;
- int32_t nBlockPos = -1;
- FX_WCHAR wc;
- CFDE_TxtEdtBufIter* pIter =
- new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf, FALSE);
- pIter->SetAt(0);
- do {
- wc = pIter->GetChar();
- if (bInBlock) {
- if (wc == FDE_TXTEDT_FORMATBLOCK_END) {
- nBlockIndex++;
- bInBlock = FALSE;
- }
- } else {
- if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) {
- bInBlock = TRUE;
- } else {
- if (nCharIndex++ == nIndex) {
- nBlockPos = pIter->GetAt();
- break;
- }
- }
- }
- } while (pIter->Next());
- pIter->Release();
- if (nBlockPos == -1) {
- nBlockPos = GetTextBufLength();
- }
- CFDE_TxtEdtBlock* pEditBlock =
- new CFDE_TxtEdtBlock(this, wsBlockFormat, nIndex);
- m_BlockArray.InsertAt(m_BlockArray.GetSize(), pEditBlock);
- CFX_WideString wsDisplay;
- pEditBlock->GetDisplayText(wsDisplay);
- m_nCaret = nBlockPos;
- if (wsDisplay.GetLength() > 0) {
- RawInsert(nBlockPos, const FX_WCHAR*(wsDisplay), wsDisplay.GetLength());
- }
-#endif
-}
-int32_t CFDE_TxtEdtEngine::CountEditBlocks() const {
-#ifdef FDE_USEFORMATBLOCK
- return m_BlockArray.GetSize();
-#else
- return 0;
-#endif
-}
-void CFDE_TxtEdtEngine::GetEditBlockText(int32_t nIndex,
- CFX_WideString& wsBlockText) const {
-#ifdef FDE_USEFORMATBLOCK
- CFDE_TxtEdtBlock* pBlock = m_BlockArray[nIndex];
- pBlock->GetBlockText(wsBlockText);
-#endif
-}
-int32_t CFDE_TxtEdtEngine::CountEditFields(int32_t nBlockIndex) const {
-#ifdef FDE_USEFORMATBLOCK
- CFDE_TxtEdtBlock* pBlock = m_BlockArray[nBlockIndex];
- return pBlock->CountField();
-#else
- return 0;
-#endif
-}
-void CFDE_TxtEdtEngine::GetEditFieldText(int32_t nBlockIndex,
- int32_t nFieldIndex,
- CFX_WideString& wsFieldText) const {
-#ifdef FDE_USEFORMATBLOCK
- CFDE_TxtEdtBlock* pBlock = m_BlockArray[nBlockIndex];
- pBlock->GetFieldText(nFieldIndex, wsFieldText);
-#endif
-}
-void CFDE_TxtEdtEngine::StartEdit() {
-#ifdef FDE_USEFORMATBLOCK
-#endif
-}
-void CFDE_TxtEdtEngine::EndEdit() {
-#ifdef FDE_USEFORMATBLOCK
-#endif
-}
-void CFDE_TxtEdtEngine::RemoveSelRange(int32_t nStart, int32_t nCount) {
- FDE_LPTXTEDTSELRANGE lpTemp = NULL;
- int32_t nRangeCount = m_SelRangePtrArr.GetSize();
- int32_t i = 0;
- for (i = 0; i < nRangeCount; i++) {
- lpTemp = m_SelRangePtrArr[i];
- if (lpTemp->nStart == nStart && lpTemp->nCount == nCount) {
- delete lpTemp;
- m_SelRangePtrArr.RemoveAt(i);
- return;
- }
- }
-}
-
-void CFDE_TxtEdtEngine::AddSelRange(int32_t nStart, int32_t nCount) {
- if (nCount == -1) {
- nCount = GetTextLength() - nStart;
- }
- int32_t nSize = m_SelRangePtrArr.GetSize();
- if (nSize <= 0) {
- FDE_LPTXTEDTSELRANGE lpSelRange = new FDE_TXTEDTSELRANGE;
- lpSelRange->nStart = nStart;
- lpSelRange->nCount = nCount;
- m_SelRangePtrArr.Add(lpSelRange);
- m_Param.pEventSink->On_SelChanged(this);
- return;
- }
- FDE_LPTXTEDTSELRANGE lpTemp = NULL;
- lpTemp = m_SelRangePtrArr[nSize - 1];
- if (nStart >= lpTemp->nStart + lpTemp->nCount) {
- FDE_LPTXTEDTSELRANGE lpSelRange = new FDE_TXTEDTSELRANGE;
- lpSelRange->nStart = nStart;
- lpSelRange->nCount = nCount;
- m_SelRangePtrArr.Add(lpSelRange);
- m_Param.pEventSink->On_SelChanged(this);
- return;
- }
- int32_t nEnd = nStart + nCount - 1;
- FX_BOOL bBegin = FALSE;
- int32_t nRangeBgn = 0;
- int32_t nRangeCnt = 0;
- for (int32_t i = 0; i < nSize; i++) {
- lpTemp = m_SelRangePtrArr[i];
- int32_t nTempBgn = lpTemp->nStart;
- int32_t nTempEnd = nTempBgn + lpTemp->nCount - 1;
- if (bBegin) {
- if (nEnd < nTempBgn) {
- break;
- } else if (nStart >= nTempBgn && nStart <= nTempEnd) {
- nRangeCnt++;
- break;
- }
- nRangeCnt++;
- } else {
- if (nStart <= nTempEnd) {
- nRangeBgn = i;
- if (nEnd < nTempBgn) {
- break;
- }
- nRangeCnt = 1;
- bBegin = TRUE;
- }
- }
- }
- if (nRangeCnt == 0) {
- FDE_LPTXTEDTSELRANGE lpSelRange = new FDE_TXTEDTSELRANGE;
- lpSelRange->nStart = nStart;
- lpSelRange->nCount = nCount;
- m_SelRangePtrArr.InsertAt(nRangeBgn, lpSelRange);
- } else {
- lpTemp = m_SelRangePtrArr[nRangeBgn];
- lpTemp->nStart = nStart;
- lpTemp->nCount = nCount;
- nRangeCnt--;
- nRangeBgn++;
- while (nRangeCnt--) {
- delete m_SelRangePtrArr[nRangeBgn];
- m_SelRangePtrArr.RemoveAt(nRangeBgn);
- }
- }
- m_Param.pEventSink->On_SelChanged(this);
-}
-
-int32_t CFDE_TxtEdtEngine::CountSelRanges() {
- return m_SelRangePtrArr.GetSize();
-}
-int32_t CFDE_TxtEdtEngine::GetSelRange(int32_t nIndex, int32_t& nStart) {
- nStart = m_SelRangePtrArr[nIndex]->nStart;
- return m_SelRangePtrArr[nIndex]->nCount;
-}
-void CFDE_TxtEdtEngine::ClearSelection() {
- int32_t nCount = m_SelRangePtrArr.GetSize();
- FDE_LPTXTEDTSELRANGE lpRange = NULL;
- int32_t i = 0;
- for (i = 0; i < nCount; i++) {
- lpRange = m_SelRangePtrArr[i];
- if (lpRange != NULL) {
- delete lpRange;
- lpRange = NULL;
- }
- }
- m_SelRangePtrArr.RemoveAll();
- if (nCount && m_Param.pEventSink) {
- m_Param.pEventSink->On_SelChanged(this);
- }
-}
-FX_BOOL CFDE_TxtEdtEngine::Redo(const CFX_ByteStringC& bsRedo) {
- if (IsLocked()) {
- return FALSE;
- }
- if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) {
- return FALSE;
- }
- IFDE_TxtEdtDoRecord* pDoRecord = IFDE_TxtEdtDoRecord::Create(bsRedo);
- FXSYS_assert(pDoRecord);
- if (pDoRecord == NULL) {
- return FALSE;
- }
- FX_BOOL bOK = pDoRecord->Redo();
- pDoRecord->Release();
- return bOK;
-}
-FX_BOOL CFDE_TxtEdtEngine::Undo(const CFX_ByteStringC& bsUndo) {
- if (IsLocked()) {
- return FALSE;
- }
- if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) {
- return FALSE;
- }
- IFDE_TxtEdtDoRecord* pDoRecord = IFDE_TxtEdtDoRecord::Create(bsUndo);
- FXSYS_assert(pDoRecord);
- if (pDoRecord == NULL) {
- return FALSE;
- }
- FX_BOOL bOK = pDoRecord->Undo();
- pDoRecord->Release();
- return bOK;
-}
-int32_t CFDE_TxtEdtEngine::StartLayout() {
- Lock();
- RemoveAllPages();
- m_nLayoutPos = 0;
- m_nLineCount = 0;
- return 0;
-}
-int32_t CFDE_TxtEdtEngine::DoLayout(IFX_Pause* pPause) {
- int32_t nCount = m_ParagPtrArray.GetSize();
- CFDE_TxtEdtParag* pParag = NULL;
- int32_t nLineCount = 0;
- for (; m_nLayoutPos < nCount; m_nLayoutPos++) {
- pParag = m_ParagPtrArray[m_nLayoutPos];
- pParag->CalcLines();
- nLineCount += pParag->m_nLineCount;
- if ((pPause != NULL) && (nLineCount > m_nPageLineCount) &&
- pPause->NeedToPauseNow()) {
- m_nLineCount += nLineCount;
- return (++m_nLayoutPos * 100) / nCount;
- }
- }
- m_nLineCount += nLineCount;
- return 100;
-}
-void CFDE_TxtEdtEngine::EndLayout() {
- UpdatePages();
- int32_t nLength = GetTextLength();
- if (m_nCaret > nLength) {
- m_nCaret = nLength;
- }
- int32_t nIndex = m_nCaret;
- if (!m_bBefore) {
- nIndex--;
- }
- m_rtCaret.Set(0, 0, 1, m_Param.fFontSize);
- Unlock();
-}
-FX_BOOL CFDE_TxtEdtEngine::Optimize(IFX_Pause* pPause) {
- return m_pTxtBuf->Optimize(pPause);
-}
-IFDE_TxtEdtBuf* CFDE_TxtEdtEngine::GetTextBuf() const {
- return (IFDE_TxtEdtBuf*)m_pTxtBuf;
-}
-int32_t CFDE_TxtEdtEngine::GetTextBufLength() const {
- return m_pTxtBuf->GetTextLength() - 1;
-}
-IFX_TxtBreak* CFDE_TxtEdtEngine::GetTextBreak() const {
- return m_pTextBreak;
-}
-int32_t CFDE_TxtEdtEngine::GetLineCount() const {
- return m_nLineCount;
-}
-int32_t CFDE_TxtEdtEngine::GetPageLineCount() const {
- return m_nPageLineCount;
-}
-int32_t CFDE_TxtEdtEngine::CountParags() const {
- return m_ParagPtrArray.GetSize();
-}
-IFDE_TxtEdtParag* CFDE_TxtEdtEngine::GetParag(int32_t nParagIndex) const {
- return m_ParagPtrArray[nParagIndex];
-}
-IFX_CharIter* CFDE_TxtEdtEngine::CreateCharIter() {
- if (!m_pTxtBuf) {
- return NULL;
- }
- return new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf);
-}
-int32_t CFDE_TxtEdtEngine::Line2Parag(int32_t nStartParag,
- int32_t nStartLineofParag,
- int32_t nLineIndex,
- int32_t& nStartLine) const {
- int32_t nLineTotal = nStartLineofParag;
- int32_t nCount = m_ParagPtrArray.GetSize();
- CFDE_TxtEdtParag* pParag = NULL;
- int32_t i = nStartParag;
- for (; i < nCount; i++) {
- pParag = m_ParagPtrArray[i];
- nLineTotal += pParag->m_nLineCount;
- if (nLineTotal > nLineIndex) {
- break;
- }
- }
- nStartLine = nLineTotal - pParag->m_nLineCount;
- return i;
-}
-void CFDE_TxtEdtEngine::GetPreDeleteText(CFX_WideString& wsText,
- int32_t nIndex,
- int32_t nLength) {
- GetText(wsText, 0, GetTextBufLength());
- wsText.Delete(nIndex, nLength);
-}
-void CFDE_TxtEdtEngine::GetPreInsertText(CFX_WideString& wsText,
- int32_t nIndex,
- const FX_WCHAR* lpText,
- int32_t nLength) {
- GetText(wsText, 0, GetTextBufLength());
- int32_t nSelIndex = 0;
- int32_t nSelLength = 0;
- int32_t nSelCount = CountSelRanges();
- while (nSelCount--) {
- nSelLength = GetSelRange(nSelCount, nSelIndex);
- wsText.Delete(nSelIndex, nSelLength);
- nIndex = nSelIndex;
- }
- CFX_WideString wsTemp;
- int32_t nOldLength = wsText.GetLength();
- const FX_WCHAR* pOldBuffer = wsText.c_str();
- FX_WCHAR* lpBuffer = wsTemp.GetBuffer(nOldLength + nLength);
- FXSYS_memcpy(lpBuffer, pOldBuffer, (nIndex) * sizeof(FX_WCHAR));
- FXSYS_memcpy(lpBuffer + nIndex, lpText, nLength * sizeof(FX_WCHAR));
- FXSYS_memcpy(lpBuffer + nIndex + nLength, pOldBuffer + nIndex,
- (nOldLength - nIndex) * sizeof(FX_WCHAR));
- wsTemp.ReleaseBuffer(nOldLength + nLength);
- wsText = wsTemp;
-}
-void CFDE_TxtEdtEngine::GetPreReplaceText(CFX_WideString& wsText,
- int32_t nIndex,
- int32_t nOriginLength,
- const FX_WCHAR* lpText,
- int32_t nLength) {
- GetText(wsText, 0, GetTextBufLength());
- int32_t nSelIndex = 0;
- int32_t nSelLength = 0;
- int32_t nSelCount = CountSelRanges();
- while (nSelCount--) {
- nSelLength = GetSelRange(nSelCount, nSelIndex);
- wsText.Delete(nSelIndex, nSelLength);
- }
- wsText.Delete(nIndex, nOriginLength);
- int32_t i = 0;
- for (i = 0; i < nLength; i++) {
- wsText.Insert(nIndex++, lpText[i]);
- }
-}
-void CFDE_TxtEdtEngine::Inner_Insert(int32_t nStart,
- const FX_WCHAR* lpText,
- int32_t nLength) {
- FXSYS_assert(nLength > 0);
- FDE_TXTEDTPARAGPOS ParagPos;
- TextPos2ParagPos(nStart, ParagPos);
- m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
- int32_t nParagCount = m_ParagPtrArray.GetSize();
- int32_t i = 0;
- for (i = ParagPos.nParagIndex + 1; i < nParagCount; i++) {
- m_ParagPtrArray[i]->m_nCharStart += nLength;
- }
- CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex];
- int32_t nReserveLineCount = pParag->m_nLineCount;
- int32_t nReserveCharStart = pParag->m_nCharStart;
- int32_t nLeavePart = ParagPos.nCharIndex;
- int32_t nCutPart = pParag->m_nCharCount - ParagPos.nCharIndex;
- int32_t nTextStart = 0;
- FX_WCHAR wCurChar = L' ';
- const FX_WCHAR* lpPos = lpText;
- FX_BOOL bFirst = TRUE;
- int32_t nParagIndex = ParagPos.nParagIndex;
- for (i = 0; i < nLength; i++, lpPos++) {
- wCurChar = *lpPos;
- if (wCurChar == m_wLineEnd) {
- if (bFirst) {
- pParag->m_nCharCount = nLeavePart + (i - nTextStart + 1);
- pParag->m_nLineCount = -1;
- nReserveCharStart += pParag->m_nCharCount;
- bFirst = FALSE;
- } else {
- pParag = new CFDE_TxtEdtParag(this);
- pParag->m_nLineCount = -1;
- pParag->m_nCharCount = i - nTextStart + 1;
- pParag->m_nCharStart = nReserveCharStart;
- m_ParagPtrArray.InsertAt(++nParagIndex, pParag);
- nReserveCharStart += pParag->m_nCharCount;
- }
- nTextStart = i + 1;
- }
- }
- if (bFirst) {
- pParag->m_nCharCount += nLength;
- pParag->m_nLineCount = -1;
- bFirst = FALSE;
- } else {
- pParag = new CFDE_TxtEdtParag(this);
- pParag->m_nLineCount = -1;
- pParag->m_nCharCount = nLength - nTextStart + nCutPart;
- pParag->m_nCharStart = nReserveCharStart;
- m_ParagPtrArray.InsertAt(++nParagIndex, pParag);
- }
- m_pTxtBuf->Insert(nStart, lpText, nLength);
- int32_t nTotalLineCount = 0;
- for (i = ParagPos.nParagIndex; i <= nParagIndex; i++) {
- pParag = m_ParagPtrArray[i];
- pParag->CalcLines();
- nTotalLineCount += pParag->m_nLineCount;
- }
- m_nLineCount += nTotalLineCount - nReserveLineCount;
- m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
- UpdatePages();
-}
-#ifdef FDE_USEFORMATBLOCK
-void CFDE_TxtEdtEngine::RawInsert(int32_t nStart,
- const FX_WCHAR* lpText,
- int32_t nLength) {
- FXSYS_assert(nLength > 0);
- FDE_TXTEDTPARAGPOS ParagPos;
- TextPos2ParagPos(nStart, ParagPos);
- int32_t nParagCount = m_ParagPtrArray.GetSize();
- int32_t i = 0;
- for (i = ParagPos.nParagIndex + 1; i < nParagCount; i++) {
- m_ParagPtrArray[i]->m_nCharStart += nLength;
- }
- CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex];
- int32_t nReserveLineCount = pParag->m_nLineCount;
- int32_t nReserveCharStart = pParag->m_nCharStart;
- int32_t nLeavePart = ParagPos.nCharIndex;
- int32_t nCutPart = pParag->m_nCharCount - ParagPos.nCharIndex;
- int32_t nTextStart = 0;
- FX_WCHAR wCurChar = L' ';
- const FX_WCHAR* lpPos = lpText;
- FX_BOOL bFirst = TRUE;
- int32_t nParagIndex = ParagPos.nParagIndex;
- for (i = 0; i < nLength; i++, lpPos++) {
- wCurChar = *lpPos;
- if (wCurChar == m_wLineEnd) {
- if (bFirst) {
- pParag->m_nCharCount = nLeavePart + (i - nTextStart + 1);
- pParag->m_nLineCount = -1;
- nReserveCharStart += pParag->m_nCharCount;
- bFirst = FALSE;
- } else {
- pParag = new CFDE_TxtEdtParag(this);
- pParag->m_nLineCount = -1;
- pParag->m_nCharCount = i - nTextStart + 1;
- pParag->m_nCharStart = nReserveCharStart;
- m_ParagPtrArray.InsertAt(++nParagIndex, pParag);
- nReserveCharStart += pParag->m_nCharCount;
- }
- nTextStart = i + 1;
- }
- }
- if (bFirst) {
- pParag->m_nCharCount += nLength;
- pParag->m_nLineCount = -1;
- bFirst = FALSE;
- } else {
- pParag = new CFDE_TxtEdtParag(this);
- pParag->m_nLineCount = -1;
- pParag->m_nCharCount = nLength - nTextStart + nCutPart;
- pParag->m_nCharStart = nReserveCharStart;
- m_ParagPtrArray.InsertAt(++nParagIndex, pParag);
- }
- m_pTxtBuf->Insert(nStart, lpText, nLength);
-}
-#endif
-void CFDE_TxtEdtEngine::Inner_DeleteRange(int32_t nStart, int32_t nCount) {
- if (nCount == -1) {
- nCount = m_pTxtBuf->GetTextLength() - nStart;
- }
- int32_t nEnd = nStart + nCount - 1;
- FXSYS_assert(nStart >= 0 && nEnd < m_pTxtBuf->GetTextLength());
- m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
- FDE_TXTEDTPARAGPOS ParagPosBgn, ParagPosEnd;
- TextPos2ParagPos(nStart, ParagPosBgn);
- TextPos2ParagPos(nEnd, ParagPosEnd);
- CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPosEnd.nParagIndex];
- FX_BOOL bLastParag = FALSE;
- if (ParagPosEnd.nCharIndex == pParag->m_nCharCount - 1) {
- if (ParagPosEnd.nParagIndex < m_ParagPtrArray.GetSize() - 1) {
- ParagPosEnd.nParagIndex++;
- } else {
- bLastParag = TRUE;
- }
- }
- int32_t nTotalLineCount = 0;
- int32_t nTotalCharCount = 0;
- int32_t i = 0;
- for (i = ParagPosBgn.nParagIndex; i <= ParagPosEnd.nParagIndex; i++) {
- CFDE_TxtEdtParag* pParag = m_ParagPtrArray[i];
- pParag->CalcLines();
- nTotalLineCount += pParag->m_nLineCount;
- nTotalCharCount += pParag->m_nCharCount;
- }
- m_pTxtBuf->Delete(nStart, nCount);
- int32_t nNextParagIndex = (ParagPosBgn.nCharIndex == 0 && bLastParag)
- ? ParagPosBgn.nParagIndex
- : (ParagPosBgn.nParagIndex + 1);
- for (i = nNextParagIndex; i <= ParagPosEnd.nParagIndex; i++) {
- CFDE_TxtEdtParag* pParag = m_ParagPtrArray[nNextParagIndex];
- delete pParag;
- m_ParagPtrArray.RemoveAt(nNextParagIndex);
- }
- if (!(bLastParag && ParagPosBgn.nCharIndex == 0)) {
- pParag = m_ParagPtrArray[ParagPosBgn.nParagIndex];
- pParag->m_nCharCount = nTotalCharCount - nCount;
- pParag->CalcLines();
- nTotalLineCount -= pParag->m_nLineCount;
- }
- int32_t nParagCount = m_ParagPtrArray.GetSize();
- for (i = nNextParagIndex; i < nParagCount; i++) {
- m_ParagPtrArray[i]->m_nCharStart -= nCount;
- }
- m_nLineCount -= nTotalLineCount;
- UpdatePages();
- int32_t nPageCount = CountPages();
- if (m_nCaretPage >= nPageCount) {
- m_nCaretPage = nPageCount - 1;
- }
- m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
-}
-void CFDE_TxtEdtEngine::DeleteRange_DoRecord(int32_t nStart,
- int32_t nCount,
- FX_BOOL bSel) {
- FXSYS_assert(nStart >= 0);
- if (nCount == -1) {
- nCount = GetTextLength() - nStart;
- }
- FXSYS_assert((nStart + nCount) <= m_pTxtBuf->GetTextLength());
-#ifdef FDE_USEFORMATBLOCK
- int32_t nBlockCount = m_BlockArray.GetSize();
- if (nBlockCount > 0) {
- }
-#endif
- if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
- CFX_WideString wsRange;
- m_pTxtBuf->GetRange(wsRange, nStart, nCount);
- IFDE_TxtEdtDoRecord* pRecord = new CFDE_TxtEdtDoRecord_DeleteRange(
- this, nStart, m_nCaret, wsRange, bSel);
- CFX_ByteString bsDoRecord;
- pRecord->Serialize(bsDoRecord);
- m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
- pRecord->Release();
- }
- m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete;
- GetText(m_ChangeInfo.wsDelete, nStart, nCount);
- Inner_DeleteRange(nStart, nCount);
-}
-void CFDE_TxtEdtEngine::ResetEngine() {
- RemoveAllPages();
- RemoveAllParags();
- ClearSelection();
- m_nCaret = 0;
- m_pTxtBuf->Clear(FALSE);
- m_nCaret = 0;
-}
-void CFDE_TxtEdtEngine::RebuildParagraphs() {
- RemoveAllParags();
- FX_WCHAR wChar = L' ';
- int32_t nParagStart = 0;
- int32_t nIndex = 0;
- IFX_CharIter* pIter = new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf);
- pIter->SetAt(0);
- do {
- wChar = pIter->GetChar();
- nIndex = pIter->GetAt();
- if (wChar == m_wLineEnd) {
- CFDE_TxtEdtParag* pParag = new CFDE_TxtEdtParag(this);
- pParag->m_nCharStart = nParagStart;
- pParag->m_nCharCount = nIndex - nParagStart + 1;
- pParag->m_nLineCount = -1;
- m_ParagPtrArray.Add(pParag);
- nParagStart = nIndex + 1;
- }
- } while (pIter->Next());
- pIter->Release();
-}
-void CFDE_TxtEdtEngine::RemoveAllParags() {
- int32_t nCount = m_ParagPtrArray.GetSize();
- int32_t i = 0;
- for (i = 0; i < nCount; i++) {
- CFDE_TxtEdtParag* pParag = m_ParagPtrArray[i];
- if (pParag) {
- delete pParag;
- }
- }
- m_ParagPtrArray.RemoveAll();
-}
-void CFDE_TxtEdtEngine::RemoveAllPages() {
- int32_t nCount = m_PagePtrArray.GetSize();
- int32_t i = 0;
- for (i = 0; i < nCount; i++) {
- IFDE_TxtEdtPage* pPage = m_PagePtrArray[i];
- if (pPage) {
- pPage->Release();
- }
- }
- m_PagePtrArray.RemoveAll();
-}
-void CFDE_TxtEdtEngine::UpdateParags() {
- int32_t nCount = m_ParagPtrArray.GetSize();
- if (nCount == 0) {
- return;
- }
- CFDE_TxtEdtParag* pParag = NULL;
- int32_t nLineCount = 0;
- int32_t i = 0;
- for (i = 0; i < nCount; i++) {
- pParag = m_ParagPtrArray[i];
- if (pParag->m_nLineCount == -1) {
- pParag->CalcLines();
- }
- nLineCount += pParag->m_nLineCount;
- }
- m_nLineCount = nLineCount;
-}
-void CFDE_TxtEdtEngine::UpdatePages() {
- if (m_nLineCount == 0) {
- return;
- }
- int32_t nPageCount = (m_nLineCount - 1) / (m_nPageLineCount) + 1;
- int32_t nSize = m_PagePtrArray.GetSize();
- if (nSize == nPageCount) {
- return;
- }
- if (nSize > nPageCount) {
- IFDE_TxtEdtPage* pPage = NULL;
- int32_t i = 0;
- for (i = nSize - 1; i >= nPageCount; i--) {
- pPage = m_PagePtrArray[i];
- if (pPage) {
- pPage->Release();
- }
- m_PagePtrArray.RemoveAt(i);
- }
- m_Param.pEventSink->On_PageCountChanged(this);
- return;
- }
- if (nSize < nPageCount) {
- IFDE_TxtEdtPage* pPage = NULL;
- int32_t i = 0;
- for (i = nSize; i < nPageCount; i++) {
- pPage = IFDE_TxtEdtPage::Create(this, i);
- m_PagePtrArray.Add(pPage);
- }
- m_Param.pEventSink->On_PageCountChanged(this);
- return;
- }
-}
-void CFDE_TxtEdtEngine::UpdateTxtBreak() {
- FX_DWORD dwStyle = m_pTextBreak->GetLayoutStyles();
- if (m_Param.dwMode & FDE_TEXTEDITMODE_MultiLines) {
- dwStyle &= ~FX_TXTLAYOUTSTYLE_SingleLine;
- } else {
- dwStyle |= FX_TXTLAYOUTSTYLE_SingleLine;
- }
- if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
- dwStyle |= FX_TXTLAYOUTSTYLE_VerticalLayout;
- } else {
- dwStyle &= ~FX_TXTLAYOUTSTYLE_VerticalLayout;
- }
- if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve) {
- dwStyle |= FX_TXTLAYOUTSTYLE_ReverseLine;
- } else {
- dwStyle &= ~FX_TXTLAYOUTSTYLE_ReverseLine;
- }
- if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_RTL) {
- dwStyle |= FX_TXTLAYOUTSTYLE_RTLReadingOrder;
- } else {
- dwStyle &= ~FX_TXTLAYOUTSTYLE_RTLReadingOrder;
- }
- if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText) {
- dwStyle |= FX_TXTLAYOUTSTYLE_CombText;
- } else {
- dwStyle &= ~FX_TXTLAYOUTSTYLE_CombText;
- }
- if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CharVertial) {
- dwStyle |= FX_TXTLAYOUTSTYLE_VerticalChars;
- } else {
- dwStyle &= ~FX_TXTLAYOUTSTYLE_VerticalChars;
- }
- if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ExpandTab) {
- dwStyle |= FX_TXTLAYOUTSTYLE_ExpandTab;
- } else {
- dwStyle &= ~FX_TXTLAYOUTSTYLE_ExpandTab;
- }
- if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ArabicContext) {
- dwStyle |= FX_TXTLAYOUTSTYLE_ArabicContext;
- } else {
- dwStyle &= ~FX_TXTLAYOUTSTYLE_ArabicContext;
- }
- if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ArabicShapes) {
- dwStyle |= FX_TXTLAYOUTSTYLE_ArabicShapes;
- } else {
- dwStyle &= ~FX_TXTLAYOUTSTYLE_ArabicShapes;
- }
- m_pTextBreak->SetLayoutStyles(dwStyle);
- FX_DWORD dwAligment = 0;
- if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Justified) {
- dwAligment |= FX_TXTLINEALIGNMENT_Justified;
- } else if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Distributed) {
- dwAligment |= FX_TXTLINEALIGNMENT_Distributed;
- }
- if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Center) {
- dwAligment |= FX_TXTLINEALIGNMENT_Center;
- } else if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Right) {
- dwAligment |= FX_TXTLINEALIGNMENT_Right;
- }
- m_pTextBreak->SetAlignment(dwAligment);
- if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
- if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) {
- m_pTextBreak->SetLineWidth(m_Param.fPlateHeight);
- } else {
- m_pTextBreak->SetLineWidth(FDE_PAGEWIDTH_MAX);
- }
- } else {
- if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) {
- m_pTextBreak->SetLineWidth(m_Param.fPlateWidth);
- } else {
- m_pTextBreak->SetLineWidth(FDE_PAGEWIDTH_MAX);
- }
- }
- m_nPageLineCount = m_Param.nLineCount;
- if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText) {
- FX_FLOAT fCombWidth =
- m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical
- ? m_Param.fPlateHeight
- : m_Param.fPlateWidth;
- if (m_nLimit > 0) {
- fCombWidth /= m_nLimit;
- }
- m_pTextBreak->SetCombWidth(fCombWidth);
- }
- m_pTextBreak->SetFont(m_Param.pFont);
- m_pTextBreak->SetFontSize(m_Param.fFontSize);
- m_pTextBreak->SetTabWidth(m_Param.fTabWidth, m_Param.bTabEquidistant);
- m_pTextBreak->SetDefaultChar(m_Param.wDefChar);
- m_pTextBreak->SetParagraphBreakChar(m_Param.wLineBreakChar);
- m_pTextBreak->SetCharRotation(m_Param.nCharRotation);
- m_pTextBreak->SetLineBreakTolerance(m_Param.fFontSize * 0.2f);
- m_pTextBreak->SetHorizontalScale(m_Param.nHorzScale);
- m_pTextBreak->SetCharSpace(m_Param.fCharSpace);
-}
-FX_BOOL CFDE_TxtEdtEngine::ReplaceParagEnd(FX_WCHAR*& lpText,
- int32_t& nLength,
- FX_BOOL bPreIsCR) {
- for (int32_t i = 0; i < nLength; i++) {
- FX_WCHAR wc = lpText[i];
- switch (wc) {
- case L'\r': {
- lpText[i] = m_wLineEnd;
- bPreIsCR = TRUE;
- } break;
- case L'\n': {
- if (bPreIsCR == TRUE) {
- int32_t nNext = i + 1;
- if (nNext < nLength) {
- FXSYS_memmove(lpText + i, lpText + nNext,
- (nLength - nNext) * sizeof(FX_WCHAR));
- }
- i--;
- nLength--;
- bPreIsCR = FALSE;
- if (m_bAutoLineEnd) {
- m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_CRLF;
- m_bAutoLineEnd = FALSE;
- }
- } else {
- lpText[i] = m_wLineEnd;
- if (m_bAutoLineEnd) {
- m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_LF;
- m_bAutoLineEnd = FALSE;
- }
- }
- } break;
- default: {
- if (bPreIsCR && m_bAutoLineEnd) {
- m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_CR;
- m_bAutoLineEnd = FALSE;
- }
- bPreIsCR = FALSE;
- } break;
- }
- }
- return bPreIsCR;
-}
-void CFDE_TxtEdtEngine::RecoverParagEnd(CFX_WideString& wsText) {
- FX_WCHAR wc = (m_nFirstLineEnd == FDE_TXTEDIT_LINEEND_CR) ? L'\n' : L'\r';
- if (m_nFirstLineEnd == FDE_TXTEDIT_LINEEND_CRLF) {
- CFX_ArrayTemplate<int32_t> PosArr;
- int32_t nLength = wsText.GetLength();
- int32_t i = 0;
- FX_WCHAR* lpPos = (FX_WCHAR*)(const FX_WCHAR*)wsText;
- for (i = 0; i < nLength; i++, lpPos++) {
- if (*lpPos == m_wLineEnd) {
- *lpPos = wc;
- PosArr.Add(i);
- }
- }
- const FX_WCHAR* lpSrcBuf = wsText.c_str();
- CFX_WideString wsTemp;
- int32_t nCount = PosArr.GetSize();
- FX_WCHAR* lpDstBuf = wsTemp.GetBuffer(nLength + nCount);
- int32_t nDstPos = 0;
- int32_t nSrcPos = 0;
- for (i = 0; i < nCount; i++) {
- int32_t nPos = PosArr[i];
- int32_t nCopyLen = nPos - nSrcPos + 1;
- FXSYS_memcpy(lpDstBuf + nDstPos, lpSrcBuf + nSrcPos,
- nCopyLen * sizeof(FX_WCHAR));
- nDstPos += nCopyLen;
- nSrcPos += nCopyLen;
- lpDstBuf[nDstPos] = L'\n';
- nDstPos++;
- }
- if (nSrcPos < nLength) {
- FXSYS_memcpy(lpDstBuf + nDstPos, lpSrcBuf + nSrcPos,
- (nLength - nSrcPos) * sizeof(FX_WCHAR));
- }
- wsTemp.ReleaseBuffer(nLength + nCount);
- wsText = wsTemp;
- } else {
- int32_t nLength = wsText.GetLength();
- FX_WCHAR* lpBuf = (FX_WCHAR*)(const FX_WCHAR*)wsText;
- for (int32_t i = 0; i < nLength; i++, lpBuf++) {
- if (*lpBuf == m_wLineEnd) {
- *lpBuf = wc;
- }
- }
- }
-}
-int32_t CFDE_TxtEdtEngine::MovePage2Char(int32_t nIndex) {
- FXSYS_assert(nIndex >= 0);
- FXSYS_assert(nIndex <= m_pTxtBuf->GetTextLength());
- if (m_nCaretPage >= 0) {
- IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage];
- m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
- int32_t nPageCharStart = pPage->GetCharStart();
- int32_t nPageCharCount = pPage->GetCharCount();
- if (nIndex >= nPageCharStart && nIndex < nPageCharStart + nPageCharCount) {
- m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
- return m_nCaretPage;
- }
- m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
- }
- CFDE_TxtEdtParag* pParag = NULL;
- int32_t nLineCount = 0;
- int32_t nParagCount = m_ParagPtrArray.GetSize();
- int32_t i = 0;
- for (i = 0; i < nParagCount; i++) {
- pParag = m_ParagPtrArray[i];
- if (pParag->m_nCharStart <= nIndex &&
- nIndex < (pParag->m_nCharStart + pParag->m_nCharCount)) {
- break;
- }
- nLineCount += pParag->m_nLineCount;
- }
- pParag->LoadParag();
- int32_t nLineStart = -1;
- int32_t nLineCharCount = -1;
- for (i = 0; i < pParag->m_nLineCount; i++) {
- pParag->GetLineRange(i, nLineStart, nLineCharCount);
- if (nLineStart <= nIndex && nIndex < (nLineStart + nLineCharCount)) {
- break;
- }
- }
- FXSYS_assert(i < pParag->m_nLineCount);
- nLineCount += (i + 1);
- m_nCaretPage = (nLineCount - 1) / m_nPageLineCount + 1 - 1;
- m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
- pParag->UnloadParag();
- return m_nCaretPage;
-}
-void CFDE_TxtEdtEngine::TextPos2ParagPos(int32_t nIndex,
- FDE_TXTEDTPARAGPOS& ParagPos) const {
- FXSYS_assert(nIndex >= 0 && nIndex < m_pTxtBuf->GetTextLength());
- int32_t nCount = m_ParagPtrArray.GetSize();
- int32_t nBgn = 0;
- int32_t nMid = 0;
- int32_t nEnd = nCount - 1;
- while (nEnd > nBgn) {
- nMid = (nBgn + nEnd) / 2;
- CFDE_TxtEdtParag* pParag = m_ParagPtrArray[nMid];
- if (nIndex < pParag->m_nCharStart) {
- nEnd = nMid - 1;
- } else if (nIndex >= (pParag->m_nCharStart + pParag->m_nCharCount)) {
- nBgn = nMid + 1;
- } else {
- break;
- }
- }
- if (nBgn == nEnd) {
- nMid = nBgn;
- }
- FXSYS_assert(nIndex >= m_ParagPtrArray[nMid]->m_nCharStart &&
- (nIndex < m_ParagPtrArray[nMid]->m_nCharStart +
- m_ParagPtrArray[nMid]->m_nCharCount));
- ParagPos.nParagIndex = nMid;
- ParagPos.nCharIndex = nIndex - m_ParagPtrArray[nMid]->m_nCharStart;
-}
-int32_t CFDE_TxtEdtEngine::MoveForward(FX_BOOL& bBefore) {
- if (m_nCaret == m_pTxtBuf->GetTextLength() - 1) {
- return -1;
- }
- int32_t nCaret = m_nCaret;
- if ((nCaret + 1 < m_pTxtBuf->GetTextLength()) &&
- (m_pTxtBuf->GetCharByIndex(nCaret) == L'\r') &&
- (m_pTxtBuf->GetCharByIndex(nCaret + 1) == L'\n')) {
- nCaret++;
- }
- nCaret++;
- bBefore = TRUE;
- return nCaret;
-}
-int32_t CFDE_TxtEdtEngine::MoveBackward(FX_BOOL& bBefore) {
- if (m_nCaret == 0) {
- return FALSE;
- }
- int32_t nCaret = m_nCaret;
- if (nCaret > 2 && m_pTxtBuf->GetCharByIndex(nCaret - 1) == L'\n' &&
- m_pTxtBuf->GetCharByIndex(nCaret - 2) == L'\r') {
- nCaret--;
- }
- nCaret--;
- bBefore = TRUE;
- return nCaret;
-}
-FX_BOOL CFDE_TxtEdtEngine::MoveUp(CFX_PointF& ptCaret) {
- IFDE_TxtEdtPage* pPage = GetPage(m_nCaretPage);
- const CFX_RectF& rtContent = pPage->GetContentsBox();
- if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
- ptCaret.x = m_rtCaret.left + m_rtCaret.width / 2 - m_Param.fLineSpace;
- ptCaret.y = m_fCaretPosReserve;
- FX_BOOL bLineReserve =
- m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve;
- if (ptCaret.x < rtContent.left) {
- if (bLineReserve) {
- if (m_nCaretPage == CountPages() - 1) {
- return FALSE;
- }
- } else {
- if (m_nCaretPage == 0) {
- return FALSE;
- }
- }
- if (bLineReserve) {
- m_nCaretPage++;
- } else {
- m_nCaretPage--;
- }
- m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
- ptCaret.x -= rtContent.left;
- IFDE_TxtEdtPage* pCurPage = GetPage(m_nCaretPage);
- ptCaret.x += pCurPage->GetContentsBox().right();
- }
- } else {
- ptCaret.x = m_fCaretPosReserve;
- ptCaret.y = m_rtCaret.top + m_rtCaret.height / 2 - m_Param.fLineSpace;
- if (ptCaret.y < rtContent.top) {
- if (m_nCaretPage == 0) {
- return FALSE;
- }
- ptCaret.y -= rtContent.top;
- m_nCaretPage--;
- m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
- IFDE_TxtEdtPage* pCurPage = GetPage(m_nCaretPage);
- ptCaret.y += pCurPage->GetContentsBox().bottom();
- }
- }
- return TRUE;
-}
-FX_BOOL CFDE_TxtEdtEngine::MoveDown(CFX_PointF& ptCaret) {
- IFDE_TxtEdtPage* pPage = GetPage(m_nCaretPage);
- const CFX_RectF& rtContent = pPage->GetContentsBox();
- if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
- ptCaret.x = m_rtCaret.left + m_rtCaret.width / 2 + m_Param.fLineSpace;
- ptCaret.y = m_fCaretPosReserve;
- if (ptCaret.x >= rtContent.right()) {
- FX_BOOL bLineReserve =
- m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve;
- if (bLineReserve) {
- if (m_nCaretPage == 0) {
- return FALSE;
- }
- } else {
- if (m_nCaretPage == CountPages() - 1) {
- return FALSE;
- }
- }
- if (bLineReserve) {
- m_nCaretPage--;
- } else {
- m_nCaretPage++;
- }
- m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
- ptCaret.x -= rtContent.right();
- IFDE_TxtEdtPage* pCurPage = GetPage(m_nCaretPage);
- ptCaret.x += pCurPage->GetContentsBox().left;
- }
- } else {
- ptCaret.x = m_fCaretPosReserve;
- ptCaret.y = m_rtCaret.top + m_rtCaret.height / 2 + m_Param.fLineSpace;
- if (ptCaret.y >= rtContent.bottom()) {
- if (m_nCaretPage == CountPages() - 1) {
- return FALSE;
- }
- ptCaret.y -= rtContent.bottom();
- m_nCaretPage++;
- m_Param.pEventSink->On_PageChange(this, m_nCaretPage);
- IFDE_TxtEdtPage* pCurPage = GetPage(m_nCaretPage);
- ptCaret.y += pCurPage->GetContentsBox().top;
- }
- }
- return TRUE;
-}
-FX_BOOL CFDE_TxtEdtEngine::MoveLineStart() {
- int32_t nIndex = m_bBefore ? m_nCaret : m_nCaret - 1;
- FDE_TXTEDTPARAGPOS ParagPos;
- TextPos2ParagPos(nIndex, ParagPos);
- CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex];
- pParag->LoadParag();
- int32_t nLineCount = pParag->m_nLineCount;
- int32_t i = 0;
- int32_t nStart = 0;
- int32_t nCount = 0;
- for (; i < nLineCount; i++) {
- pParag->GetLineRange(i, nStart, nCount);
- if (nIndex >= nStart && nIndex < nStart + nCount) {
- break;
- }
- }
- UpdateCaretRect(nStart, TRUE);
- pParag->UnloadParag();
- return TRUE;
-}
-FX_BOOL CFDE_TxtEdtEngine::MoveLineEnd() {
- int32_t nIndex = m_bBefore ? m_nCaret : m_nCaret - 1;
- FDE_TXTEDTPARAGPOS ParagPos;
- TextPos2ParagPos(nIndex, ParagPos);
- CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex];
- pParag->LoadParag();
- int32_t nLineCount = pParag->m_nLineCount;
- int32_t i = 0;
- int32_t nStart = 0;
- int32_t nCount = 0;
- for (; i < nLineCount; i++) {
- pParag->GetLineRange(i, nStart, nCount);
- if (nIndex >= nStart && nIndex < nStart + nCount) {
- break;
- }
- }
- nIndex = nStart + nCount - 1;
- FXSYS_assert(nIndex <= GetTextBufLength());
- FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nIndex);
- FX_BOOL bBefore = FALSE;
- if (nIndex <= GetTextBufLength()) {
- if (wChar == L'\r') {
- bBefore = TRUE;
- } else if (wChar == L'\n' && nIndex > nStart) {
- bBefore = TRUE;
- nIndex--;
- wChar = m_pTxtBuf->GetCharByIndex(nIndex);
- if (wChar != L'\r') {
- nIndex++;
- }
- }
- }
- UpdateCaretRect(nIndex, bBefore);
- pParag->UnloadParag();
- return TRUE;
-}
-FX_BOOL CFDE_TxtEdtEngine::MoveParagStart() {
- int32_t nIndex = m_bBefore ? m_nCaret : m_nCaret - 1;
- FDE_TXTEDTPARAGPOS ParagPos;
- TextPos2ParagPos(nIndex, ParagPos);
- CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex];
- UpdateCaretRect(pParag->m_nCharStart, TRUE);
- return TRUE;
-}
-FX_BOOL CFDE_TxtEdtEngine::MoveParagEnd() {
- int32_t nIndex = m_bBefore ? m_nCaret : m_nCaret - 1;
- FDE_TXTEDTPARAGPOS ParagPos;
- TextPos2ParagPos(nIndex, ParagPos);
- CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex];
- nIndex = pParag->m_nCharStart + pParag->m_nCharCount - 1;
- FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nIndex);
- if (wChar == L'\n' && nIndex > 0) {
- nIndex--;
- wChar = m_pTxtBuf->GetCharByIndex(nIndex);
- if (wChar != L'\r') {
- nIndex++;
- }
- }
- UpdateCaretRect(nIndex, TRUE);
- return TRUE;
-}
-FX_BOOL CFDE_TxtEdtEngine::MoveHome() {
- UpdateCaretRect(0, TRUE);
- return TRUE;
-}
-FX_BOOL CFDE_TxtEdtEngine::MoveEnd() {
- UpdateCaretRect(GetTextBufLength(), TRUE);
- return TRUE;
-}
-#ifdef FDE_USEFORMATBLOCK
-int32_t CFDE_TxtEdtEngine::NormalizeCaretPos(int32_t nIndex,
- int32_t nFlags,
- FX_BOOL& bBefore) {
- bBefore = TRUE;
- int32_t nBgn = 0, nEnd = 0;
- int32_t nRecord = -1;
- CFDE_TxtEdtField* pField = NULL;
- FX_BOOL bRet = GetFieldBoundary(nIndex, nBgn, nEnd, pField);
- int32_t nDelta = 0;
- if (bRet && !pField->IsFix()) {
- if (nIndex - nBgn < FDE_FORMAT_EDIT_FIELD_HADERSIZE) {
- if (nFlags == FDE_FORMAT_CARET_BACKWARD) {
- CFDE_TxtEdtField* pEditableField = NULL;
- if (FindEditableField(nIndex, nBgn, nEnd, pEditableField, FALSE)) {
- return pEditableField->NormalizeCaretPos(nEnd - nBgn,
- FDE_FORMAT_CARET_BACKWARD) +
- nBgn;
- }
- }
- nIndex = nBgn + FDE_FORMAT_EDIT_FIELD_HADERSIZE;
- }
- int32_t nRet = pField->NormalizeCaretPos(
- nIndex - nBgn, (FDE_FORMAT_CARET_DIRECTION)nFlags);
- if (nRet >= 0) {
- return nRet + nBgn;
- }
- if (nRet == -2) {
- int32_t nEditablePosBgn = 0, nEditablePosEnd = 0;
- pField->GetEditableRange(nEditablePosBgn, nEditablePosEnd);
- nRecord = nBgn + nEditablePosBgn;
- nFlags = FDE_FORMAT_CARET_BACKWARD;
- } else {
- FXSYS_assert(nRet == -1);
- int32_t nEditablePosBgn = 0, nEditablePosEnd = 0;
- pField->GetEditableRange(nEditablePosBgn, nEditablePosEnd);
- nRecord = nBgn + nEditablePosEnd;
- nFlags = FDE_FORMAT_CARET_FORWARD;
- }
- } else if (!bRet) {
- nDelta = FDE_FORMAT_EDIT_FIELD_HADERSIZE - FDE_FORMAT_EDIT_FIELD_TAILSIZE;
- }
- switch (nFlags) {
- case FDE_FORMAT_CARET_FORWARD: {
- if (FindEditableField(nIndex, nBgn, nEnd, pField)) {
- return pField->NormalizeCaretPos(FDE_FORMAT_EDIT_FIELD_HADERSIZE,
- FDE_FORMAT_CARET_FORWARD) +
- nBgn;
- } else {
- if (nRecord != -1) {
- return nRecord;
- }
- bRet = FindEditableField(nIndex, nBgn, nEnd, pField, FALSE);
- FXSYS_assert(bRet);
- return pField->NormalizeCaretPos(nEnd - nBgn,
- FDE_FORMAT_CARET_BACKWARD) +
- nBgn;
- }
- } break;
- case FDE_FORMAT_CARET_MIDDLE: {
- int32_t nBgn1 = 0, nEnd1 = 0, nBgn2 = 0, nEnd2 = 0;
- CFDE_TxtEdtField* pEditableField1 = NULL;
- CFDE_TxtEdtField* pEditableField2 = NULL;
- FX_BOOL bRet1 =
- FindEditableField(nIndex, nBgn1, nEnd1, pEditableField1, FALSE);
- FX_BOOL bRet2 = FindEditableField(nIndex, nBgn2, nEnd2, pEditableField2);
- if (bRet1 == FALSE) {
- FXSYS_assert(bRet2);
- return pEditableField2->NormalizeCaretPos(
- FDE_FORMAT_EDIT_FIELD_HADERSIZE, FDE_FORMAT_CARET_FORWARD) +
- nBgn2;
- } else if (bRet2 == FALSE) {
- FXSYS_assert(bRet1);
- return pEditableField1->NormalizeCaretPos(nEnd1 - nBgn1,
- FDE_FORMAT_CARET_BACKWARD) +
- nBgn1;
- } else {
- int32_t nEditablePosBgn = 0, nEditablePosEnd = 0;
- if (nIndex - nEnd1 < nBgn2 + nDelta - nIndex) {
- pEditableField1->GetEditableRange(nEditablePosBgn, nEditablePosEnd);
- return nEditablePosEnd + nBgn1;
- } else {
- pEditableField2->GetEditableRange(nEditablePosBgn, nEditablePosEnd);
- return nEditablePosBgn + nBgn2;
- }
- }
- } break;
- case FDE_FORMAT_CARET_BACKWARD: {
- if (FindEditableField(nIndex, nBgn, nEnd, pField, FALSE)) {
- return pField->NormalizeCaretPos(nEnd - nBgn,
- FDE_FORMAT_CARET_BACKWARD) +
- nBgn;
- } else {
- if (nRecord != -1) {
- return nRecord;
- }
- bRet = FindEditableField(nIndex, nBgn, nEnd, pField);
- FXSYS_assert(bRet);
- return pField->NormalizeCaretPos(FDE_FORMAT_EDIT_FIELD_HADERSIZE,
- FDE_FORMAT_CARET_FORWARD) +
- nBgn;
- }
- } break;
- default:
- FXSYS_assert(0);
- return nIndex;
- }
-}
-FX_BOOL CFDE_TxtEdtEngine::GetFieldBoundary(int32_t nIndex,
- int32_t& nBgn,
- int32_t& nEnd,
- CFDE_TxtEdtField*& pField) {
- CFDE_TxtEdtBufIter* pIter =
- new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf, FALSE);
- pIter->SetAt(nIndex);
- FX_BOOL bFind = FALSE;
- do {
- FX_WCHAR wc = pIter->GetChar();
- if (wc == FDE_TXTEDT_FORMATBLOCK_END) {
- nEnd = pIter->GetAt();
- bFind = TRUE;
- nIndex--;
- break;
- }
- if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) {
- pIter->Release();
- return FALSE;
- }
- } while (pIter->Next());
- if (!bFind) {
- pIter->Release();
- return FALSE;
- }
- pIter->SetAt(nIndex);
- do {
- FX_WCHAR wc = pIter->GetChar();
- if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) {
- nBgn = pIter->GetAt();
- pIter->Next();
- FX_DWORD dwPre = (FX_DWORD)pIter->GetChar();
- pIter->Next();
- FX_DWORD dwCur = (FX_DWORD)pIter->GetChar();
- pField = (CFDE_TxtEdtField*)((dwCur << 16) | dwPre);
- pIter->Release();
- return TRUE;
- }
- if (wc == FDE_TXTEDT_FORMATBLOCK_END) {
- pIter->Release();
- return FALSE;
- }
- } while (pIter->Next(TRUE));
- pIter->Release();
- return FALSE;
-}
-FX_BOOL CFDE_TxtEdtEngine::FindEditableField(int32_t nIndex,
- int32_t& nBgn,
- int32_t& nEnd,
- CFDE_TxtEdtField*& pField,
- FX_BOOL bForward) {
- FX_WCHAR wcFirst = FDE_TXTEDT_FORMATBLOCK_BGN;
- FX_WCHAR wcSecond = FDE_TXTEDT_FORMATBLOCK_END;
- if (!bForward) {
- wcFirst = FDE_TXTEDT_FORMATBLOCK_END;
- wcSecond = FDE_TXTEDT_FORMATBLOCK_BGN;
- }
- CFDE_TxtEdtBufIter* pIter =
- new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf, FALSE);
- pIter->SetAt(nIndex);
- int32_t bFind = FALSE;
- do {
- FX_WCHAR wc = pIter->GetChar();
- if (wc == wcFirst) {
- nBgn = pIter->GetAt();
- bFind = TRUE;
- break;
- }
- } while (pIter->Next(!bForward));
- if (!bFind) {
- pIter->Release();
- return FALSE;
- }
- bFind = FALSE;
- do {
- FX_WCHAR wc = pIter->GetChar();
- if (wc == wcSecond) {
- nEnd = pIter->GetAt();
- bFind = TRUE;
- break;
- }
- } while (pIter->Next(!bForward));
- FXSYS_assert(bFind);
- if (!bForward) {
- int32_t nTemp = nBgn;
- nBgn = nEnd;
- nEnd = nTemp;
- }
- pIter->SetAt(nBgn + 1);
- FX_DWORD dwPre = (FX_DWORD)pIter->GetChar();
- pIter->Next();
- FX_DWORD dwCur = (FX_DWORD)pIter->GetChar();
- pField = (CFDE_TxtEdtField*)((dwCur << 16) | dwPre);
- pIter->Release();
- if (!pField->IsFix()) {
- return TRUE;
- }
- return FindEditableField((bForward ? nEnd : nBgn), nBgn, nEnd, pField,
- bForward);
-}
-FX_BOOL CFDE_TxtEdtEngine::Move2NextEditableField(int32_t nIndex,
- FX_BOOL bForward,
- FX_BOOL bSelect) {
- if (m_SelRangePtrArr.GetSize() > 0) {
- ClearSelection();
- m_Param.pEventSink->On_SelChanged(this);
- }
- int32_t nBgn = 0, nEnd = 0;
- CFDE_TxtEdtField* pField = NULL;
- FX_BOOL bRet = FindEditableField(nIndex, nBgn, nEnd, pField, bForward);
- if (!bRet) {
- return FALSE;
- }
- int32_t nEditableBgn = 0, nEditableEnd = 0;
- pField->GetEditableRange(nEditableBgn, nEditableEnd);
- nEditableBgn += nBgn;
- nEditableEnd += nBgn;
- if (bSelect) {
- int32_t nRangeCount = nEditableEnd - nEditableBgn;
- if (nRangeCount > 0) {
- AddSelRange(nEditableBgn, nEditableEnd - nEditableBgn);
- }
- }
- SetCaretPos(nEditableEnd, TRUE);
- return TRUE;
-}
-int32_t CFDE_TxtEdtEngine::GetRealIndex(int32_t nIndex) const {
- CFDE_TxtEdtBufIter* pIter =
- new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf, FALSE);
- pIter->SetAt(0);
- FX_BOOL bInField = FALSE;
- int32_t nFieldBgn = 0;
- int32_t nRealIndex = 0;
- for (int32_t i = 0; i <= nIndex; i++) {
- FX_WCHAR wc = pIter->GetChar();
- if (bInField) {
- if (wc == FDE_TXTEDT_FORMATBLOCK_END) {
- FX_DWORD dwPre = (FX_DWORD)m_pTxtBuf->GetCharByIndex(nFieldBgn + 1);
- FX_DWORD dwCur = (FX_DWORD)m_pTxtBuf->GetCharByIndex(nFieldBgn + 2);
- CFDE_TxtEdtField* pField = (CFDE_TxtEdtField*)((dwCur << 16) | dwPre);
- nRealIndex += pField->GetFieldTextLength();
- bInField = FALSE;
- }
- } else {
- if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) {
- bInField = TRUE;
- nFieldBgn = pIter->GetAt();
- } else {
- nRealIndex++;
- }
- }
- pIter->Next();
- }
- if (!bInField) {
- pIter->Release();
- return nRealIndex;
- }
- pIter->SetAt(nFieldBgn + 1);
- FX_DWORD dwPre = (FX_DWORD)pIter->GetChar();
- pIter->Next();
- FX_DWORD dwCur = (FX_DWORD)pIter->GetChar();
- CFDE_TxtEdtField* pField = (CFDE_TxtEdtField*)((dwCur << 16) | dwPre);
- pIter->Release();
- if (pField->IsFix()) {
- int32_t nDelta = nIndex - nFieldBgn - FDE_FORMAT_EDIT_FIELD_HADERSIZE + 1;
- return nRealIndex + (nDelta > 0 ? nDelta : 0);
- } else {
- return nRealIndex + pField->GetRealIndex(nIndex - nFieldBgn);
- }
-}
-#endif
-FX_BOOL CFDE_TxtEdtEngine::IsFitArea(CFX_WideString& wsText) {
- IFDE_TextOut* pTextOut = IFDE_TextOut::Create();
- pTextOut->SetLineSpace(m_Param.fLineSpace);
- pTextOut->SetFont(m_Param.pFont);
- pTextOut->SetFontSize(m_Param.fFontSize);
- CFX_RectF rcText;
- FXSYS_memset(&rcText, 0, sizeof(rcText));
- FX_DWORD dwStyle = 0;
- if (!(m_Param.dwMode & FDE_TEXTEDITMODE_MultiLines)) {
- dwStyle |= FDE_TTOSTYLE_SingleLine;
- }
- if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) {
- dwStyle |= FDE_TTOSTYLE_LineWrap;
- rcText.width = m_Param.fPlateWidth;
- } else {
- rcText.width = 65535;
- }
- pTextOut->SetStyles(dwStyle);
- wsText += L"\n";
- pTextOut->CalcLogicSize(wsText, wsText.GetLength(), rcText);
- pTextOut->Release();
- wsText.Delete(wsText.GetLength() - 1);
- if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz) &&
- (rcText.width > m_Param.fPlateWidth)) {
- return FALSE;
- }
- if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) &&
- (rcText.height > m_Param.fLineSpace * m_Param.nLineCount)) {
- return FALSE;
- }
- return TRUE;
-}
-void CFDE_TxtEdtEngine::UpdateCaretRect(int32_t nIndex, FX_BOOL bBefore) {
- MovePage2Char(nIndex);
- GetCaretRect(m_rtCaret, m_nCaretPage, nIndex, bBefore);
- m_nCaret = nIndex;
- m_bBefore = bBefore;
- if (!m_bBefore) {
- m_nCaret++;
- m_bBefore = TRUE;
- }
- m_fCaretPosReserve = (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical)
- ? m_rtCaret.top
- : m_rtCaret.left;
- m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage, 0);
-}
-void CFDE_TxtEdtEngine::GetCaretRect(CFX_RectF& rtCaret,
- int32_t nPageIndex,
- int32_t nCaret,
- FX_BOOL bBefore) {
- IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage];
- m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
- FX_BOOL bCombText = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText;
- int32_t nIndexInpage = nCaret - pPage->GetCharStart();
- if (bBefore && bCombText && nIndexInpage > 0) {
- nIndexInpage--;
- bBefore = FALSE;
- }
- int32_t nBIDILevel = pPage->GetCharRect(nIndexInpage, rtCaret, bCombText);
- if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
- if ((!FX_IsOdd(nBIDILevel) && !bBefore) ||
- (FX_IsOdd(nBIDILevel) && bBefore)) {
- rtCaret.Offset(0, rtCaret.height - 1.0f);
- }
- if (rtCaret.height == 0 && rtCaret.top > 1.0f) {
- rtCaret.top -= 1.0f;
- }
- rtCaret.height = 1.0f;
- } else {
- if ((!FX_IsOdd(nBIDILevel) && !bBefore) ||
- (FX_IsOdd(nBIDILevel) && bBefore)) {
- rtCaret.Offset(rtCaret.width - 1.0f, 0);
- }
- if (rtCaret.width == 0 && rtCaret.left > 1.0f) {
- rtCaret.left -= 1.0f;
- }
- rtCaret.width = 1.0f;
- }
- m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
-}
-void CFDE_TxtEdtEngine::UpdateCaretIndex(const CFX_PointF& ptCaret) {
- IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage];
- m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0);
- m_nCaret = pPage->GetCharIndex(ptCaret, m_bBefore);
- GetCaretRect(m_rtCaret, m_nCaretPage, m_nCaret, m_bBefore);
- if (!m_bBefore) {
- m_nCaret++;
- m_bBefore = TRUE;
- }
- m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage);
- m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0);
-}
-FX_BOOL CFDE_TxtEdtEngine::IsSelect() {
- return m_SelRangePtrArr.GetSize() > 0;
-}
-void CFDE_TxtEdtEngine::DeleteSelect() {
- int32_t nCountRange = CountSelRanges();
- if (nCountRange > 0) {
-#ifdef FDE_USEFORMATBLOCK
- int32_t nBlockCount = m_BlockArray.GetSize();
- if (nBlockCount > 0) {
- if (nCountRange > 1) {
- return;
- }
- int32_t nSelStart;
- int32_t nSelCount;
- nSelCount = GetSelRange(0, nSelStart);
- int32_t nSelEnd = nSelStart + nSelCount;
- int32_t nBgn = 0;
- int32_t nEnd = 0;
- CFDE_TxtEdtField* pField = NULL;
- FX_BOOL bInField = GetFieldBoundary(nSelStart, nBgn, nEnd, pField);
- int32_t nCaretInField = nSelStart - nBgn;
- FX_BOOL bBefore = FALSE;
- if (!bInField || pField->IsFix() || nSelEnd > nEnd) {
- return;
- }
- pField->Backup();
- CFX_WideString wsDel;
- int32_t nCaret = 0;
- int32_t nRet =
- pField->Delete(nCaretInField, nSelCount, wsDel, nCaret, bBefore);
- nCaret += nBgn;
- switch (nRet) {
- case FDE_FORMAT_FIELD_DELETE_RET_S:
- break;
- case FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE:
- case FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY:
- return;
- default:
- FXSYS_assert(0);
- break;
- }
- CFX_WideString wsField;
- pField->GetFieldText(wsField);
- if (!m_Param.pEventSink->On_ValidateField(
- this, pField->GetBlockIndex(), pField->GetIndex(), wsField, 0)) {
- pField->Restore();
- return;
- }
- CFX_WideString wsDisplay;
- pField->GetDisplayText(wsDisplay);
- Replace(nBgn, nEnd - nBgn + 1, wsDisplay);
- if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
- IFDE_TxtEdtDoRecord* pRecord = new CFDE_TxtEdtDoRecord_FieldDelete(
- this, nSelStart, pField, nCaretInField, nBgn, nEnd - nBgn + 1,
- wsDisplay.GetLength(), wsDel, FALSE);
- CFX_ByteString bsDoRecord;
- pRecord->Serialize(bsDoRecord);
- m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord);
- pRecord->Release();
- }
- SetCaretPos(nSelStart, bBefore);
- return;
- }
-#endif
- int32_t nSelStart;
- int32_t nSelCount;
- while (nCountRange > 0) {
- nSelCount = GetSelRange(--nCountRange, nSelStart);
- FDE_LPTXTEDTSELRANGE lpTemp = m_SelRangePtrArr[nCountRange];
- delete lpTemp;
- m_SelRangePtrArr.RemoveAt(nCountRange);
- DeleteRange_DoRecord(nSelStart, nSelCount, TRUE);
- }
- ClearSelection();
- m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo);
- m_Param.pEventSink->On_SelChanged(this);
- SetCaretPos(nSelStart, TRUE);
- return;
- }
-}
-IFDE_TxtEdtDoRecord* IFDE_TxtEdtDoRecord::Create(
- const CFX_ByteStringC& bsDoRecord) {
- const FX_CHAR* lpBuf = bsDoRecord.GetCStr();
- int32_t nType = *((int32_t*)lpBuf);
- switch (nType) {
- case FDE_TXTEDT_DORECORD_INS:
- return new CFDE_TxtEdtDoRecord_Insert(bsDoRecord);
- case FDE_TXTEDT_DORECORD_DEL:
- return new CFDE_TxtEdtDoRecord_DeleteRange(bsDoRecord);
-#ifdef FDE_USEFORMATBLOCK
- case FDE_TXTEDT_DORECORD_FORMATINS:
- return new CFDE_TxtEdtDoRecord_FieldInsert(bsDoRecord);
- case FDE_TXTEDT_DORECORD_FORMATDEL:
- return new CFDE_TxtEdtDoRecord_FieldDelete(bsDoRecord);
- case FDE_TXTEDT_DORECORD_FORMATREP:
- return new CFDE_TxtEdtDoRecord_FieldReplace(bsDoRecord);
-#endif
- default:
- break;
- }
- return NULL;
-}
-CFDE_TxtEdtDoRecord_Insert::CFDE_TxtEdtDoRecord_Insert(
- const CFX_ByteStringC& bsDoRecord) {
- Deserialize(bsDoRecord);
-}
-CFDE_TxtEdtDoRecord_Insert::CFDE_TxtEdtDoRecord_Insert(
- CFDE_TxtEdtEngine* pEngine,
- int32_t nCaret,
- const FX_WCHAR* lpText,
- int32_t nLength)
- : m_pEngine(pEngine), m_nCaret(nCaret) {
- FXSYS_assert(pEngine);
- FX_WCHAR* lpBuffer = m_wsInsert.GetBuffer(nLength);
- FXSYS_memcpy(lpBuffer, lpText, nLength * sizeof(FX_WCHAR));
- m_wsInsert.ReleaseBuffer();
-}
-CFDE_TxtEdtDoRecord_Insert::~CFDE_TxtEdtDoRecord_Insert() {}
-void CFDE_TxtEdtDoRecord_Insert::Release() {
- delete this;
-}
-FX_BOOL CFDE_TxtEdtDoRecord_Insert::Undo() {
- if (m_pEngine->IsSelect()) {
- m_pEngine->ClearSelection();
- }
- m_pEngine->Inner_DeleteRange(m_nCaret, m_wsInsert.GetLength());
- FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param;
- m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete;
- m_pEngine->m_ChangeInfo.wsDelete = m_wsInsert;
- Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo);
- m_pEngine->SetCaretPos(m_nCaret, TRUE);
- return TRUE;
-}
-FX_BOOL CFDE_TxtEdtDoRecord_Insert::Redo() {
- m_pEngine->Inner_Insert(m_nCaret, m_wsInsert.c_str(), m_wsInsert.GetLength());
- FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param;
- m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert;
- m_pEngine->m_ChangeInfo.wsDelete = m_wsInsert;
- Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo);
- m_pEngine->SetCaretPos(m_nCaret, FALSE);
- return TRUE;
-}
-void CFDE_TxtEdtDoRecord_Insert::Serialize(CFX_ByteString& bsDoRecord) const {
- CFX_ArchiveSaver ArchiveSaver;
- ArchiveSaver << int32_t(FDE_TXTEDT_DORECORD_INS);
- ArchiveSaver << (int32_t)(uintptr_t)m_pEngine;
- ArchiveSaver << m_nCaret;
- ArchiveSaver << m_wsInsert;
- int32_t nLength = ArchiveSaver.GetLength();
- const uint8_t* lpSrcBuf = ArchiveSaver.GetBuffer();
- FX_CHAR* lpDstBuf = bsDoRecord.GetBuffer(nLength);
- FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength);
- bsDoRecord.ReleaseBuffer(nLength);
-}
-void CFDE_TxtEdtDoRecord_Insert::Deserialize(
- const CFX_ByteStringC& bsDoRecord) {
- CFX_ArchiveLoader ArchiveLoader((const uint8_t*)bsDoRecord.GetCStr(),
- bsDoRecord.GetLength());
- int32_t nType = 0;
- ArchiveLoader >> nType;
- FXSYS_assert(nType == FDE_TXTEDT_DORECORD_INS);
- int32_t nEngine = 0;
- ArchiveLoader >> nEngine;
- m_pEngine = (CFDE_TxtEdtEngine*)(uintptr_t)nEngine;
- ArchiveLoader >> m_nCaret;
- ArchiveLoader >> m_wsInsert;
-}
-CFDE_TxtEdtDoRecord_DeleteRange::CFDE_TxtEdtDoRecord_DeleteRange(
- const CFX_ByteStringC& bsDoRecord) {
- Deserialize(bsDoRecord);
-}
-CFDE_TxtEdtDoRecord_DeleteRange::CFDE_TxtEdtDoRecord_DeleteRange(
- CFDE_TxtEdtEngine* pEngine,
- int32_t nIndex,
- int32_t nCaret,
- const CFX_WideString& wsRange,
- FX_BOOL bSel)
- : m_pEngine(pEngine),
- m_bSel(bSel),
- m_nIndex(nIndex),
- m_nCaret(nCaret),
- m_wsRange(wsRange) {
- FXSYS_assert(pEngine);
-}
-CFDE_TxtEdtDoRecord_DeleteRange::~CFDE_TxtEdtDoRecord_DeleteRange() {}
-void CFDE_TxtEdtDoRecord_DeleteRange::Release() {
- delete this;
-}
-FX_BOOL CFDE_TxtEdtDoRecord_DeleteRange::Undo() {
- if (m_pEngine->IsSelect()) {
- m_pEngine->ClearSelection();
- }
- m_pEngine->Inner_Insert(m_nIndex, m_wsRange.c_str(), m_wsRange.GetLength());
- if (m_bSel) {
- m_pEngine->AddSelRange(m_nIndex, m_wsRange.GetLength());
- }
- FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param;
- m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert;
- m_pEngine->m_ChangeInfo.wsDelete = m_wsRange;
- Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo);
- m_pEngine->SetCaretPos(m_nCaret, TRUE);
- return TRUE;
-}
-FX_BOOL CFDE_TxtEdtDoRecord_DeleteRange::Redo() {
- m_pEngine->Inner_DeleteRange(m_nIndex, m_wsRange.GetLength());
- if (m_bSel) {
- m_pEngine->RemoveSelRange(m_nIndex, m_wsRange.GetLength());
- }
- FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param;
- m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert;
- m_pEngine->m_ChangeInfo.wsDelete = m_wsRange;
- Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo);
- m_pEngine->SetCaretPos(m_nIndex, TRUE);
- return TRUE;
-}
-void CFDE_TxtEdtDoRecord_DeleteRange::Serialize(
- CFX_ByteString& bsDoRecord) const {
- CFX_ArchiveSaver ArchiveSaver;
- ArchiveSaver << int32_t(FDE_TXTEDT_DORECORD_DEL);
- ArchiveSaver << (int32_t)(uintptr_t)m_pEngine;
- ArchiveSaver << (int32_t)m_bSel;
- ArchiveSaver << m_nIndex;
- ArchiveSaver << m_nCaret;
- ArchiveSaver << m_wsRange;
- int32_t nLength = ArchiveSaver.GetLength();
- const uint8_t* lpSrcBuf = ArchiveSaver.GetBuffer();
- FX_CHAR* lpDstBuf = bsDoRecord.GetBuffer(nLength);
- FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength);
- bsDoRecord.ReleaseBuffer(nLength);
-}
-void CFDE_TxtEdtDoRecord_DeleteRange::Deserialize(
- const CFX_ByteStringC& bsDoRecord) {
- CFX_ArchiveLoader ArchiveLoader((const uint8_t*)bsDoRecord.GetCStr(),
- bsDoRecord.GetLength());
- int32_t nType = 0;
- ArchiveLoader >> nType;
- FXSYS_assert(nType == FDE_TXTEDT_DORECORD_DEL);
- int32_t nEngine = 0;
- ArchiveLoader >> nEngine;
- m_pEngine = (CFDE_TxtEdtEngine*)(uintptr_t)nEngine;
- int32_t iSel = 0;
- ArchiveLoader >> iSel;
- m_bSel = !!iSel;
- ArchiveLoader >> m_nIndex;
- ArchiveLoader >> m_nCaret;
- ArchiveLoader >> m_wsRange;
-}
-#ifdef FDE_USEFORMATBLOCK
-CFDE_TxtEdtDoRecord_FieldInsert::CFDE_TxtEdtDoRecord_FieldInsert(
- const CFX_ByteStringC& bsDoRecord) {
- Deserialize(bsDoRecord);
-}
-CFDE_TxtEdtDoRecord_FieldInsert::CFDE_TxtEdtDoRecord_FieldInsert(
- CFDE_TxtEdtEngine* pEngine,
- int32_t nCaret,
- CFDE_TxtEdtField* pField,
- int32_t nIndexInField,
- int32_t nFieldBgn,
- int32_t nOldFieldLength,
- int32_t nNewFieldLength,
- const CFX_WideString& wsIns,
- FX_BOOL bSel)
- : m_pEngine(pEngine),
- m_nCaret(nCaret),
- m_pField(pField),
- m_nIndexInField(nIndexInField),
- m_nFieldBgn(nFieldBgn),
- m_nOldFieldLength(nOldFieldLength),
- m_nNewFieldLength(nNewFieldLength),
- m_wsIns(wsIns),
- m_bSel(bSel) {
- FXSYS_assert(pEngine);
- FXSYS_assert(pField);
-}
-CFDE_TxtEdtDoRecord_FieldInsert::~CFDE_TxtEdtDoRecord_FieldInsert() {}
-void CFDE_TxtEdtDoRecord_FieldInsert::Release() {
- delete this;
-}
-FX_BOOL CFDE_TxtEdtDoRecord_FieldInsert::Undo() {
- CFX_WideString wsDel;
- int32_t nCaret = 0;
- FX_BOOL bBefore = FALSE;
- int32_t nRet = m_pField->Delete(m_nIndexInField, m_wsIns.GetLength(), wsDel,
- nCaret, bBefore);
- FXSYS_assert(nRet != FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE &&
- nRet != FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY);
- CFX_WideString wsDisplay;
- m_pField->GetDisplayText(wsDisplay);
- m_pEngine->Replace(m_nFieldBgn, m_nNewFieldLength, wsDisplay);
- m_pEngine->SetCaretPos(m_nCaret, TRUE);
- return TRUE;
-}
-FX_BOOL CFDE_TxtEdtDoRecord_FieldInsert::Redo() {
- int32_t nCaret = 0;
- FX_BOOL bBefore = FALSE;
- int32_t nRet = m_pField->Insert(m_nIndexInField, m_wsIns, nCaret, bBefore);
- FXSYS_assert(nRet != FDE_FORMAT_FIELD_INSERT_RET_F_FULL &&
- nRet != FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE);
- CFX_WideString wsDisplay;
- m_pField->GetDisplayText(wsDisplay);
- m_pEngine->Replace(m_nFieldBgn, m_nOldFieldLength, wsDisplay);
- m_pEngine->SetCaretPos(m_nCaret + m_wsIns.GetLength(), TRUE);
- return TRUE;
-}
-void CFDE_TxtEdtDoRecord_FieldInsert::Serialize(
- CFX_ByteString& bsDoRecord) const {
- CFX_ArchiveSaver ArchiveSaver;
- ArchiveSaver << int32_t(FDE_TXTEDT_DORECORD_FORMATINS);
- ArchiveSaver << int32_t(m_pEngine);
- ArchiveSaver << m_nCaret;
- ArchiveSaver << int32_t(m_pField);
- ArchiveSaver << m_nIndexInField;
- ArchiveSaver << m_nFieldBgn;
- ArchiveSaver << m_nOldFieldLength;
- ArchiveSaver << m_nNewFieldLength;
- ArchiveSaver << m_wsIns;
- ArchiveSaver << m_bSel;
- int32_t nLength = ArchiveSaver.GetLength();
- const uint8_t* lpSrcBuf = ArchiveSaver.GetBuffer();
- FX_CHAR* lpDstBuf = bsDoRecord.GetBuffer(nLength);
- FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength);
- bsDoRecord.ReleaseBuffer(nLength);
-}
-void CFDE_TxtEdtDoRecord_FieldInsert::Deserialize(
- const CFX_ByteStringC& bsDoRecord) {
- CFX_ArchiveLoader ArchiveLoader((const uint8_t*)bsDoRecord.GetCStr(),
- bsDoRecord.GetLength());
- int32_t nType = 0;
- ArchiveLoader >> nType;
- FXSYS_assert(nType == FDE_TXTEDT_DORECORD_FORMATINS);
- int32_t nEngine = 0;
- ArchiveLoader >> nEngine;
- m_pEngine = (CFDE_TxtEdtEngine*)(uintptr_t)nEngine;
- ArchiveLoader >> m_nCaret;
- int32_t nField = 0;
- ArchiveLoader >> nField;
- m_pField = (CFDE_TxtEdtField*)nField;
- ArchiveLoader >> m_nIndexInField;
- ArchiveLoader >> m_nFieldBgn;
- ArchiveLoader >> m_nOldFieldLength;
- ArchiveLoader >> m_nNewFieldLength;
- ArchiveLoader >> m_wsIns;
- ArchiveLoader >> m_bSel;
-}
-CFDE_TxtEdtDoRecord_FieldDelete::CFDE_TxtEdtDoRecord_FieldDelete(
- const CFX_ByteStringC& bsDoRecord) {
- Deserialize(bsDoRecord);
-}
-CFDE_TxtEdtDoRecord_FieldDelete::CFDE_TxtEdtDoRecord_FieldDelete(
- CFDE_TxtEdtEngine* pEngine,
- int32_t nCaret,
- CFDE_TxtEdtField* pField,
- int32_t nIndexInField,
- int32_t nFieldBgn,
- int32_t nOldLength,
- int32_t nNewLength,
- const CFX_WideString& wsDel,
- FX_BOOL bSel)
- : m_pEngine(pEngine),
- m_nCaret(nCaret),
- m_pField(pField),
- m_nIndexInField(nIndexInField),
- m_nFieldBgn(nFieldBgn),
- m_nOldFieldLength(nOldLength),
- m_nNewFieldLength(nNewLength),
- m_wsDel(wsDel),
- m_bSel(bSel) {
- FXSYS_assert(m_pEngine);
- FXSYS_assert(m_pField);
-}
-CFDE_TxtEdtDoRecord_FieldDelete::~CFDE_TxtEdtDoRecord_FieldDelete() {}
-void CFDE_TxtEdtDoRecord_FieldDelete::Release() {
- delete this;
-}
-FX_BOOL CFDE_TxtEdtDoRecord_FieldDelete::Undo() {
- int32_t nCaret = 0;
- FX_BOOL bBefore = FALSE;
- int32_t nRet = m_pField->Insert(m_nIndexInField, m_wsDel, nCaret, bBefore);
- FXSYS_assert(nRet != FDE_FORMAT_FIELD_INSERT_RET_F_FULL &&
- nRet != FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE);
- CFX_WideString wsDisplay;
- m_pField->GetDisplayText(wsDisplay);
- m_pEngine->Replace(m_nFieldBgn, m_nNewFieldLength, wsDisplay);
- m_pEngine->SetCaretPos(m_nCaret, TRUE);
- return TRUE;
-}
-FX_BOOL CFDE_TxtEdtDoRecord_FieldDelete::Redo() {
- int32_t nCaret = 0;
- FX_BOOL bBefore = 0;
- CFX_WideString wsDel;
- int32_t nRet = m_pField->Delete(m_nIndexInField, m_wsDel.GetLength(), wsDel,
- nCaret, bBefore);
- FXSYS_assert(nRet != FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE &&
- nRet != FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY);
- CFX_WideString wsDisplay;
- m_pField->GetDisplayText(wsDisplay);
- m_pEngine->Replace(m_nFieldBgn, m_nOldFieldLength, wsDisplay);
- m_pEngine->SetCaretPos(m_nCaret - m_wsDel.GetLength(), TRUE);
- return TRUE;
-}
-void CFDE_TxtEdtDoRecord_FieldDelete::Serialize(
- CFX_ByteString& bsDoRecord) const {
- CFX_ArchiveSaver ArchiveSaver;
- ArchiveSaver << int32_t(FDE_TXTEDT_DORECORD_FORMATDEL);
- ArchiveSaver << int32_t(m_pEngine);
- ArchiveSaver << m_nCaret;
- ArchiveSaver << int32_t(m_pField);
- ArchiveSaver << m_nIndexInField;
- ArchiveSaver << m_nFieldBgn;
- ArchiveSaver << m_nOldFieldLength;
- ArchiveSaver << m_nNewFieldLength;
- ArchiveSaver << m_wsDel;
- ArchiveSaver << m_bSel;
- int32_t nLength = ArchiveSaver.GetLength();
- const uint8_t* lpSrcBuf = ArchiveSaver.GetBuffer();
- FX_CHAR* lpDstBuf = bsDoRecord.GetBuffer(nLength);
- FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength);
- bsDoRecord.ReleaseBuffer(nLength);
-}
-void CFDE_TxtEdtDoRecord_FieldDelete::Deserialize(
- const CFX_ByteStringC& bsDoRecord) {
- CFX_ArchiveLoader ArchiveLoader((const uint8_t*)bsDoRecord.GetCStr(),
- bsDoRecord.GetLength());
- int32_t nType = 0;
- ArchiveLoader >> nType;
- FXSYS_assert(nType == FDE_TXTEDT_DORECORD_FORMATDEL);
- int32_t nEngine = 0;
- ArchiveLoader >> nEngine;
- m_pEngine = (CFDE_TxtEdtEngine*)(uintptr_t)nEngine;
- ArchiveLoader >> m_nCaret;
- int32_t nField = 0;
- ArchiveLoader >> nField;
- m_pField = (CFDE_TxtEdtField*)nField;
- ArchiveLoader >> m_nIndexInField;
- ArchiveLoader >> m_nFieldBgn;
- ArchiveLoader >> m_nOldFieldLength;
- ArchiveLoader >> m_nNewFieldLength;
- ArchiveLoader >> m_wsDel;
- ArchiveLoader >> m_bSel;
-}
-CFDE_TxtEdtDoRecord_FieldReplace::CFDE_TxtEdtDoRecord_FieldReplace(
- const CFX_ByteStringC& bsDoRecord) {
- Deserialize(bsDoRecord);
-}
-CFDE_TxtEdtDoRecord_FieldReplace::CFDE_TxtEdtDoRecord_FieldReplace(
- CFDE_TxtEdtEngine* pEngine,
- int32_t nCaret,
- int32_t nNewCaret,
- CFDE_TxtEdtField* pField,
- int32_t nIndexInField,
- int32_t nFieldBgn,
- int32_t nFieldNewLength,
- const CFX_WideString& wsDel,
- const CFX_WideString& wsIns,
- FX_BOOL bSel)
- : m_pEngine(pEngine),
- m_nCaret(nCaret),
- m_nNewCaret(nNewCaret),
- m_pField(pField),
- m_nIndexInField(nIndexInField),
- m_nFieldBgn(nFieldBgn),
- m_nFieldNewLength(nFieldNewLength),
- m_wsDel(wsDel),
- m_wsIns(wsIns),
- m_bSel(bSel) {
- FXSYS_assert(m_pEngine);
- FXSYS_assert(m_pField);
-}
-CFDE_TxtEdtDoRecord_FieldReplace::~CFDE_TxtEdtDoRecord_FieldReplace() {}
-void CFDE_TxtEdtDoRecord_FieldReplace::Release() {
- delete this;
-}
-FX_BOOL CFDE_TxtEdtDoRecord_FieldReplace::Undo() {
- CFX_WideString wsDel;
- int32_t nCaret = 0;
- FX_BOOL bBefore = FALSE;
- int32_t nRet = m_pField->Replace(m_nIndexInField, m_wsIns.GetLength(),
- m_wsDel, wsDel, nCaret, bBefore);
- FXSYS_assert(nRet != FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE &&
- nRet != FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY);
- CFX_WideString wsDisplay;
- m_pField->GetDisplayText(wsDisplay);
- m_pEngine->Replace(m_nFieldBgn, m_nFieldNewLength, wsDisplay);
- m_pEngine->SetCaretPos(m_nCaret, TRUE);
- return TRUE;
-}
-FX_BOOL CFDE_TxtEdtDoRecord_FieldReplace::Redo() {
- CFX_WideString wsDel;
- int32_t nCaret = 0;
- FX_BOOL bBefore = FALSE;
- int32_t nRet = m_pField->Replace(m_nIndexInField, m_wsDel.GetLength(),
- m_wsIns, wsDel, nCaret, bBefore);
- FXSYS_assert(nRet != FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE &&
- nRet != FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY);
- CFX_WideString wsDisplay;
- m_pField->GetDisplayText(wsDisplay);
- m_pEngine->Replace(m_nFieldBgn, m_nFieldNewLength, wsDisplay);
- m_pEngine->SetCaretPos(m_nNewCaret, TRUE);
- return TRUE;
-}
-void CFDE_TxtEdtDoRecord_FieldReplace::Serialize(
- CFX_ByteString& bsDoRecord) const {
- CFX_ArchiveSaver ArchiveSaver;
- ArchiveSaver << int32_t(FDE_TXTEDT_DORECORD_FORMATREP);
- ArchiveSaver << int32_t(m_pEngine);
- ArchiveSaver << m_nCaret;
- ArchiveSaver << m_nNewCaret;
- ArchiveSaver << int32_t(m_pField);
- ArchiveSaver << m_nIndexInField;
- ArchiveSaver << m_nFieldBgn;
- ArchiveSaver << m_nFieldNewLength;
- ArchiveSaver << m_wsDel;
- ArchiveSaver << m_wsIns;
- ArchiveSaver << m_bSel;
- int32_t nLength = ArchiveSaver.GetLength();
- const uint8_t* lpSrcBuf = ArchiveSaver.GetBuffer();
- FX_CHAR* lpDstBuf = bsDoRecord.GetBuffer(nLength);
- FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength);
- bsDoRecord.ReleaseBuffer(nLength);
-}
-void CFDE_TxtEdtDoRecord_FieldReplace::Deserialize(
- const CFX_ByteStringC& bsDoRecord) {
- CFX_ArchiveLoader ArchiveLoader((const uint8_t*)bsDoRecord.GetCStr(),
- bsDoRecord.GetLength());
- int32_t nType = 0;
- ArchiveLoader >> nType;
- FXSYS_assert(nType == FDE_TXTEDT_DORECORD_FORMATREP);
- int32_t nEngine = 0;
- ArchiveLoader >> nEngine;
- m_pEngine = (CFDE_TxtEdtEngine*)(uintptr_t)nEngine;
- ArchiveLoader >> m_nCaret;
- ArchiveLoader >> m_nNewCaret;
- int32_t nField = 0;
- ArchiveLoader >> nField;
- m_pField = (CFDE_TxtEdtField*)nField;
- ArchiveLoader >> m_nIndexInField;
- ArchiveLoader >> m_nFieldBgn;
- ArchiveLoader >> m_nFieldNewLength;
- ArchiveLoader >> m_wsDel;
- ArchiveLoader >> m_wsIns;
- ArchiveLoader >> m_bSel;
-}
-#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 <algorithm> + +#include "xfa/src/foxitlib.h" +#include "xfa/src/fee/include/ifde_txtedtengine.h" +#include "xfa/src/fee/include/ifde_txtedtbuf.h" +#include "xfa/src/fee/include/ifde_txtedtpage.h" +#include "fde_txtedtengine.h" +#include "fde_txtedtparag.h" +#include "fde_txtedtbuf.h" +#ifdef FDE_USEFORMATBLOCK +#include "fde_txtedtblock.h" +#endif +#define FDE_PAGEWIDTH_MAX 0xFFFF +#define FDE_TXTPLATESIZE (1024 * 12) +#define FDE_UNICODE_PARAGRAPH_SPERATOR (0x2029) +#define FDE_TXTEDT_DORECORD_INS 0 +#define FDE_TXTEDT_DORECORD_DEL 1 +#ifdef FDE_USEFORMATBLOCK +#define FDE_TXTEDT_DORECORD_FORMATINS 3 +#define FDE_TXTEDT_DORECORD_FORMATDEL 4 +#define FDE_TXTEDT_DORECORD_FORMATREP 5 +#define FDE_TXTEDT_FORMATBLOCK_BGN 0xFFF9 +#define FDE_TXTEDT_FORMATBLOCK_END 0xFFFB +#endif +IFDE_TxtEdtEngine* IFDE_TxtEdtEngine::Create() { + return new CFDE_TxtEdtEngine(); +} +CFDE_TxtEdtEngine::CFDE_TxtEdtEngine() + : m_pTextBreak(nullptr), + m_nPageLineCount(20), + m_nLineCount(0), + m_nAnchorPos(-1), + m_nLayoutPos(0), + m_fCaretPosReserve(0.0), + m_nCaret(0), + m_bBefore(TRUE), + m_nCaretPage(0), + m_dwFindFlags(0), + m_bLock(FALSE), + m_nLimit(0), + m_wcAliasChar(L'*'), +#ifdef FDE_USEFORMATBLOCK + m_nFixLength(-1), // FIXME: no such member => USEFORMATBLOCK can't work. +#endif + m_nFirstLineEnd(FDE_TXTEDIT_LINEEND_Auto), + m_bAutoLineEnd(TRUE), + m_wLineEnd(FDE_UNICODE_PARAGRAPH_SPERATOR) { + FXSYS_memset(&m_rtCaret, 0, sizeof(CFX_RectF)); + m_pTxtBuf = new CFDE_TxtEdtBuf(); + m_bAutoLineEnd = (m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto); +} +CFDE_TxtEdtEngine::~CFDE_TxtEdtEngine() { + if (m_pTxtBuf) { + m_pTxtBuf->Release(); + m_pTxtBuf = NULL; + } + if (m_pTextBreak) { + m_pTextBreak->Release(); + m_pTextBreak = NULL; + } +#ifdef FDE_USEFORMATBLOCK + int32_t nBlockCount = m_BlockArray.GetSize(); + if (nBlockCount > 0) { + int32_t i = 0; + for (; i < nBlockCount; i++) { + CFDE_TxtEdtBlock* pBlock = m_BlockArray[i]; + delete pBlock; + } + m_BlockArray.RemoveAll(); + } +#endif + RemoveAllParags(); + RemoveAllPages(); + m_Param.pEventSink = NULL; + ClearSelection(); +} +void CFDE_TxtEdtEngine::Release() { + delete this; +} +void CFDE_TxtEdtEngine::SetEditParams(const FDE_TXTEDTPARAMS& params) { + if (m_pTextBreak == NULL) { + m_pTextBreak = IFX_TxtBreak::Create(FX_TXTBREAKPOLICY_None); + } + FXSYS_memcpy(&m_Param, ¶ms, sizeof(FDE_TXTEDTPARAMS)); + m_wLineEnd = params.wLineBreakChar; + m_bAutoLineEnd = (m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto); + UpdateTxtBreak(); +} +const FDE_TXTEDTPARAMS* CFDE_TxtEdtEngine::GetEditParams() const { + return &m_Param; +} +int32_t CFDE_TxtEdtEngine::CountPages() const { + if (m_nLineCount == 0) { + return 0; + } + return ((m_nLineCount - 1) / m_nPageLineCount) + 1; +} +IFDE_TxtEdtPage* CFDE_TxtEdtEngine::GetPage(int32_t nIndex) { + if (m_PagePtrArray.GetSize() <= nIndex) { + return NULL; + } + return (IFDE_TxtEdtPage*)m_PagePtrArray[nIndex]; +} +FX_BOOL CFDE_TxtEdtEngine::SetBufChunkSize(int32_t nChunkSize) { + return m_pTxtBuf->SetChunkSize(nChunkSize); +} +void CFDE_TxtEdtEngine::SetTextByStream(IFX_Stream* pStream) { + ResetEngine(); + int32_t nIndex = 0; + if (pStream != NULL && pStream->GetLength()) { + int32_t nStreamLength = pStream->GetLength(); + FX_BOOL bValid = TRUE; + if (m_nLimit > 0 && nStreamLength > m_nLimit) { + bValid = FALSE; + } + FX_BOOL bPreIsCR = FALSE; + if (bValid) { + uint8_t bom[4]; + int32_t nPos = pStream->GetBOM(bom); + pStream->Seek(FX_STREAMSEEK_Begin, nPos); + int32_t nPlateSize = std::min(nStreamLength, m_pTxtBuf->GetChunkSize()); + FX_WCHAR* lpwstr = FX_Alloc(FX_WCHAR, nPlateSize); + FX_BOOL bEos = false; + while (!bEos) { + int32_t nRead = pStream->ReadString(lpwstr, nPlateSize, bEos); + bPreIsCR = ReplaceParagEnd(lpwstr, nRead, bPreIsCR); + m_pTxtBuf->Insert(nIndex, lpwstr, nRead); + nIndex += nRead; + } + FX_Free(lpwstr); + } + } + m_pTxtBuf->Insert(nIndex, &m_wLineEnd, 1); + RebuildParagraphs(); +} +void CFDE_TxtEdtEngine::SetText(const CFX_WideString& wsText) { + ResetEngine(); + int32_t nLength = wsText.GetLength(); + if (nLength > 0) { + CFX_WideString wsTemp; + FX_WCHAR* lpBuffer = wsTemp.GetBuffer(nLength); + FXSYS_memcpy(lpBuffer, wsText.c_str(), nLength * sizeof(FX_WCHAR)); + ReplaceParagEnd(lpBuffer, nLength, FALSE); + wsTemp.ReleaseBuffer(nLength); + if (m_nLimit > 0 && nLength > m_nLimit) { + wsTemp.Delete(m_nLimit, nLength - m_nLimit); + nLength = m_nLimit; + } + m_pTxtBuf->SetText(wsTemp); + } + m_pTxtBuf->Insert(nLength, &m_wLineEnd, 1); + RebuildParagraphs(); +} +int32_t CFDE_TxtEdtEngine::GetTextLength() const { + return GetTextBufLength(); +} +void CFDE_TxtEdtEngine::GetText(CFX_WideString& wsText, + int32_t nStart, + int32_t nCount) { + int32_t nTextBufLength = GetTextBufLength(); + if (nCount == -1) { + nCount = nTextBufLength - nStart; + } +#ifdef FDE_USEFORMATBLOCK + int32_t nBlockCount = m_BlockArray.GetSize(); + if (nBlockCount == 0 || m_wsFixText.IsEmpty()) { + m_pTxtBuf->GetRange(wsText, nStart, nCount); + return; + } + CFX_WideString wsTemp; + const FX_WCHAR* lpFixBuffer = const FX_WCHAR * (m_wsFixText); + FX_WCHAR* lpBuffer = wsTemp.GetBuffer(nTextBufLength); + int32_t nRealLength = 0; + int32_t nPrePos = 0; + for (int32_t i = 0; i < nBlockCount; i++) { + CFDE_TxtEdtBlock* pBlock = m_BlockArray[i]; + int32_t nPos = pBlock->GetPos(); + int32_t nCopyLength = nPos - nPrePos; + FXSYS_memcpy(lpBuffer + nRealLength, lpFixBuffer + nPrePos, + nCopyLength * sizeof(FX_WCHAR)); + nRealLength += nCopyLength; + nPrePos = nPos; + CFX_WideString wsBlock; + pBlock->GetRealText(wsBlock); + nCopyLength = wsBlock.GetLength(); + FXSYS_memcpy(lpBuffer + nRealLength, const FX_WCHAR*(wsBlock), + nCopyLength * sizeof(FX_WCHAR)); + nRealLength += nCopyLength; + } + int32_t nLeftLength = m_wsFixText.GetLength() - nPrePos; + if (nLeftLength > 0) { + FXSYS_memcpy(lpBuffer + nRealLength, lpFixBuffer + nPrePos, + nLeftLength * sizeof(FX_WCHAR)); + nRealLength += nLeftLength; + } + wsTemp.ReleaseBuffer(nRealLength); + int32_t nRealBgn = GetRealIndex(nStart); + int32_t nRealEnd = GetRealIndex(nStart + nCount - 1); + int32_t nRealCount = nRealEnd - nRealBgn; + FX_WCHAR* lpDestBuf = wsText.GetBuffer(nRealCount); + FXSYS_memcpy(lpDestBuf, const FX_WCHAR*(wsTemp) + nRealBgn, + nRealCount * sizeof(FX_WCHAR)); + wsText.ReleaseBuffer(); +#else + m_pTxtBuf->GetRange(wsText, nStart, nCount); + RecoverParagEnd(wsText); +#endif +} + +void CFDE_TxtEdtEngine::ClearText() { + DeleteRange(0, -1); +} +int32_t CFDE_TxtEdtEngine::GetCaretRect(CFX_RectF& rtCaret) const { + rtCaret = m_rtCaret; + return m_nCaret; +} +int32_t CFDE_TxtEdtEngine::GetCaretPos() const { + if (IsLocked()) { + return 0; + } + return m_nCaret + (m_bBefore ? 0 : 1); +} +int32_t CFDE_TxtEdtEngine::SetCaretPos(int32_t nIndex, FX_BOOL bBefore) { + if (IsLocked()) { + return 0; + } + FXSYS_assert(nIndex >= 0 && nIndex <= GetTextBufLength()); + if (m_PagePtrArray.GetSize() <= m_nCaretPage) { + return 0; + } +#ifdef FDE_USEFORMATBLOCK + if (m_BlockArray.GetSize() > 0) { + nIndex = NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_MIDDLE, bBefore); + } +#endif + m_bBefore = bBefore; + m_nCaret = nIndex; + MovePage2Char(m_nCaret); + GetCaretRect(m_rtCaret, m_nCaretPage, m_nCaret, m_bBefore); + if (!m_bBefore) { + m_nCaret++; + m_bBefore = TRUE; + } + m_fCaretPosReserve = (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) + ? m_rtCaret.top + : m_rtCaret.left; + m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage, 0); + m_nAnchorPos = -1; + return m_nCaret; +} +int32_t CFDE_TxtEdtEngine::MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret, + FX_BOOL bShift, + FX_BOOL bCtrl) { + if (IsLocked()) { + return 0; + } + if (m_PagePtrArray.GetSize() <= m_nCaretPage) { + return 0; + } + FX_BOOL bSelChange = FALSE; + if (IsSelect()) { + ClearSelection(); + bSelChange = TRUE; + } + if (bShift) { + if (m_nAnchorPos == -1) { + m_nAnchorPos = m_nCaret; + } + } else { + m_nAnchorPos = -1; + } + FX_BOOL bVertical = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical; + switch (eMoveCaret) { + case MC_Left: { + if (bVertical) { + CFX_PointF ptCaret; + if (MoveUp(ptCaret)) { + UpdateCaretIndex(ptCaret); + } + } else { + FX_BOOL bBefore = TRUE; + int32_t nIndex = MoveBackward(bBefore); +#ifdef FDE_USEFORMATBLOCK + if (m_BlockArray.GetSize()) { + nIndex = + NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_BACKWARD, bBefore); + if (nIndex < 0) { + return m_nCaret; + } + } +#endif + if (nIndex >= 0) { + UpdateCaretRect(nIndex, bBefore); + } + } + } break; + case MC_Right: { + if (bVertical) { + CFX_PointF ptCaret; + if (MoveDown(ptCaret)) { + UpdateCaretIndex(ptCaret); + } + } else { + FX_BOOL bBefore = TRUE; + int32_t nIndex = MoveForward(bBefore); +#ifdef FDE_USEFORMATBLOCK + if (m_BlockArray.GetSize()) { + if (nIndex == -1) { + nIndex = GetTextBufLength(); + } + nIndex = NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_FORWARD, bBefore); + } +#endif + if (nIndex >= 0) { + UpdateCaretRect(nIndex, bBefore); + } + } + } break; + case MC_Up: { + if (bVertical) { + FX_BOOL bBefore = TRUE; + int32_t nIndex = MoveBackward(bBefore); +#ifdef FDE_USEFORMATBLOCK + if (m_BlockArray.GetSize()) { + nIndex = + NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_BACKWARD, bBefore); + } +#endif + if (nIndex >= 0) { + UpdateCaretRect(nIndex, bBefore); + } + } else { + CFX_PointF ptCaret; + if (MoveUp(ptCaret)) { + UpdateCaretIndex(ptCaret); + } + } + } break; + case MC_Down: { + if (bVertical) { + FX_BOOL bBefore = TRUE; + int32_t nIndex = MoveForward(bBefore); +#ifdef FDE_USEFORMATBLOCK + if (m_BlockArray.GetSize()) { + nIndex = NormalizeCaretPos(nIndex, FDE_FORMAT_CARET_FORWARD, bBefore); + } +#endif + if (nIndex >= 0) { + UpdateCaretRect(nIndex, bBefore); + } + } else { + CFX_PointF ptCaret; + if (MoveDown(ptCaret)) { + UpdateCaretIndex(ptCaret); + } + } + } break; + case MC_WordBackward: + break; + case MC_WordForward: + break; + case MC_LineStart: + MoveLineStart(); + break; + case MC_LineEnd: + MoveLineEnd(); + break; + case MC_ParagStart: + MoveParagStart(); + break; + case MC_ParagEnd: + MoveParagEnd(); + break; + case MC_PageDown: + break; + case MC_PageUp: + break; + case MC_Home: + MoveHome(); + break; + case MC_End: + MoveEnd(); + break; + default: + break; + } + if (bShift && m_nAnchorPos != -1 && (m_nAnchorPos != m_nCaret)) { + AddSelRange(std::min(m_nAnchorPos, m_nCaret), + FXSYS_abs(m_nAnchorPos - m_nCaret)); + m_Param.pEventSink->On_SelChanged(this); + } + if (bSelChange) { + m_Param.pEventSink->On_SelChanged(this); + } + return m_nCaret; +} +void CFDE_TxtEdtEngine::Lock() { + m_bLock = TRUE; +} +void CFDE_TxtEdtEngine::Unlock() { + m_bLock = FALSE; +} +FX_BOOL CFDE_TxtEdtEngine::IsLocked() const { + return m_bLock; +} +int32_t CFDE_TxtEdtEngine::Insert(int32_t nStart, + const FX_WCHAR* lpText, + int32_t nLength) { + if (IsLocked()) { + return FDE_TXTEDT_MODIFY_RET_F_Locked; + } +#ifdef FDE_USEFORMATBLOCK + int32_t nBlockCount = m_BlockArray.GetSize(); + if (nBlockCount) { + if (m_Param.dwMode & FDE_TEXTEDITMODE_FIELD_TAB && nLength == 1 && + lpText[0] == L'\t') { + return Move2NextEditableField(nStart) ? FDE_TXTEDT_MODIFY_RET_T_Tab + : FDE_TXTEDT_MODIFY_RET_F_Tab; + } + int32_t nSelRangeCount = CountSelRanges(); + if (nSelRangeCount > 0) { + if (nSelRangeCount > 1) { + return FDE_TXTEDT_MODIFY_RET_F_Boundary; + } + int32_t nSelStart; + int32_t nSelCount; + nSelCount = GetSelRange(0, nSelStart); + int32_t nSelEnd = nSelStart + nSelCount; + int32_t nBgn = 0; + int32_t nEnd = 0; + CFDE_TxtEdtField* pField = NULL; + FX_BOOL bInField = GetFieldBoundary(nSelStart, nBgn, nEnd, pField); + if (nSelEnd > nEnd) { + return FDE_TXTEDT_MODIFY_RET_F_Boundary; + } + if (bInField) { + pField->Backup(); + FX_BOOL bBefore = FALSE; + CFX_WideString wsDel; + int32_t nCaret; + int32_t nIndexInField = nSelStart - nBgn; + int32_t nRet = pField->Replace(nSelStart - nBgn, nSelCount, + CFX_WideStringC(lpText, nLength), wsDel, + nCaret, bBefore); + switch (nRet) { + case FDE_FORMAT_FIELD_INSERT_RET_F_FULL: + pField->Restore(); + return FDE_TXTEDT_MODIFY_RET_F_Full; + case FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE: + pField->Restore(); + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + default: + break; + } + CFX_WideString wsField; + pField->GetFieldText(wsField); + if (!m_Param.pEventSink->On_ValidateField(this, pField->GetBlockIndex(), + pField->GetIndex(), wsField, + 0)) { + pField->Restore(); + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + } + CFX_WideString wsDisplay; + pField->GetDisplayText(wsDisplay); + if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) || + (m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz)) { + CFX_WideString wsText; + GetPreReplaceText(wsText, nBgn, nEnd - nBgn + 1, + const FX_WCHAR*(wsDisplay), wsDisplay.GetLength()); + if (!IsFitArea(wsText)) { + pField->Restore(); + return FDE_TXTEDT_MODIFY_RET_F_Full; + } + } + Replace(nBgn, nEnd - nBgn + 1, wsDisplay); + int32_t nNewCaret = nBgn + nCaret; + if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { + IFDE_TxtEdtDoRecord* pRecord = new CFDE_TxtEdtDoRecord_FieldReplace( + this, m_nCaret, nNewCaret, pField, nIndexInField, nBgn, + wsDisplay.GetLength(), wsDel, CFX_WideStringC(lpText, nLength), + TRUE); + CFX_ByteString bsDoRecord; + pRecord->Serialize(bsDoRecord); + m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord); + pRecord->Release(); + } + SetCaretPos(nBgn + nCaret, bBefore); + return FDE_TXTEDT_MODIFY_RET_S_Normal; + } + } + int32_t nBgn = 0; + int32_t nEnd = 0; + CFDE_TxtEdtField* pField = NULL; + FX_BOOL bInField = GetFieldBoundary(m_nCaret, nBgn, nEnd, pField); + int32_t nCaretInField = m_nCaret - nBgn; + FX_BOOL bBefore = FALSE; + if (bInField) { + pField->Backup(); + CFX_WideStringC wsIns(lpText, nLength); + int32_t nRet = + pField->Insert(nCaretInField, wsIns, nCaretInField, bBefore); + FX_BOOL bFull = FALSE; + switch (nRet) { + case FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL: + break; + case FDE_FORMAT_FIELD_INSERT_RET_S_FULL: + bFull = TRUE; + break; + case FDE_FORMAT_FIELD_INSERT_RET_F_FULL: + return FDE_TXTEDT_MODIFY_RET_F_Full; + case FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE: + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + default: + return FDE_TXTEDT_MODIFY_RET_F_Normal; + } + CFX_WideString wsField; + pField->GetFieldText(wsField); + if (!m_Param.pEventSink->On_ValidateField( + this, pField->GetBlockIndex(), pField->GetIndex(), wsField, 0)) { + pField->Restore(); + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + } + CFX_WideString wsDisplay; + pField->GetDisplayText(wsDisplay); + if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) || + (m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz)) { + CFX_WideString wsText; + GetPreReplaceText(wsText, nBgn, nEnd - nBgn + 1, + const FX_WCHAR*(wsDisplay), wsDisplay.GetLength()); + if (!IsFitArea(wsText)) { + pField->Restore(); + return FDE_TXTEDT_MODIFY_RET_F_Full; + } + } + Replace(nBgn, nEnd - nBgn + 1, wsDisplay); + if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { + IFDE_TxtEdtDoRecord* pRecord = new CFDE_TxtEdtDoRecord_FieldInsert( + this, m_nCaret, pField, m_nCaret - nBgn, nBgn, nEnd - nBgn + 1, + wsDisplay.GetLength(), CFX_WideStringC(lpText, nLength), FALSE); + CFX_ByteString bsDoRecord; + pRecord->Serialize(bsDoRecord); + m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord); + pRecord->Release(); + } + int32_t nCaretPos = nBgn + nCaretInField; + if (m_Param.dwMode & FDE_TEXTEDITMODE_FIELD_AUTO && bFull && + nCaretPos == nEnd) { + if (Move2NextEditableField(nEnd, TRUE, FALSE)) { + return TRUE; + } + } + SetCaretPos(nCaretPos, bBefore); + return bFull ? FDE_TXTEDT_MODIFY_RET_S_Full + : FDE_TXTEDT_MODIFY_RET_S_Normal; + } + FXSYS_assert(0); + return FDE_TXTEDT_MODIFY_RET_F_Normal; + } +#endif + CFX_WideString wsTemp; + FX_WCHAR* lpBuffer = wsTemp.GetBuffer(nLength); + FXSYS_memcpy(lpBuffer, lpText, nLength * sizeof(FX_WCHAR)); + ReplaceParagEnd(lpBuffer, nLength, FALSE); + wsTemp.ReleaseBuffer(nLength); + FX_BOOL bPart = FALSE; + if (m_nLimit > 0) { + int32_t nTotalLength = GetTextBufLength(); + int32_t nCount = m_SelRangePtrArr.GetSize(); + for (int32_t i = 0; i < nCount; i++) { + FDE_LPTXTEDTSELRANGE lpSelRange = m_SelRangePtrArr.GetAt(i); + nTotalLength -= lpSelRange->nCount; + } + int32_t nExpectLength = nTotalLength + nLength; + if (nTotalLength == m_nLimit) { + return FDE_TXTEDT_MODIFY_RET_F_Full; + } + if (nExpectLength > m_nLimit) { + nLength -= (nExpectLength - m_nLimit); + bPart = TRUE; + } + } + if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) || + (m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz)) { + int32_t nTemp = nLength; + if (m_Param.dwMode & FDE_TEXTEDITMODE_Password) { + CFX_WideString wsText; + while (nLength > 0) { + GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength); + int32_t nTotal = wsText.GetLength(); + FX_WCHAR* lpBuf = wsText.GetBuffer(nTotal); + for (int32_t i = 0; i < nTotal; i++) { + lpBuf[i] = m_wcAliasChar; + } + wsText.ReleaseBuffer(nTotal); + if (IsFitArea(wsText)) { + break; + } + nLength--; + } + } else { + CFX_WideString wsText; + while (nLength > 0) { + GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength); + if (IsFitArea(wsText)) { + break; + } + nLength--; + } + } + if (nLength == 0) { + return FDE_TXTEDT_MODIFY_RET_F_Full; + } + if (nLength < nTemp) { + bPart = TRUE; + } + } + if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { + CFX_WideString wsText; + GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength); + if (!m_Param.pEventSink->On_Validate(this, wsText)) { + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + } + } + if (IsSelect()) { + DeleteSelect(); + } + if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { + IFDE_TxtEdtDoRecord* pRecord = + new CFDE_TxtEdtDoRecord_Insert(this, m_nCaret, lpBuffer, nLength); + CFX_ByteString bsDoRecord; + pRecord->Serialize(bsDoRecord); + m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord); + pRecord->Release(); + } + GetText(m_ChangeInfo.wsPrevText, 0); + Inner_Insert(m_nCaret, lpBuffer, nLength); + m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; + m_ChangeInfo.wsInsert = CFX_WideString(lpBuffer, nLength); + nStart = m_nCaret; + nStart += nLength; + FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1); + FX_BOOL bBefore = TRUE; + if (wChar != L'\n' && wChar != L'\r') { + nStart--; + bBefore = FALSE; + } + SetCaretPos(nStart, bBefore); + m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); + return bPart ? FDE_TXTEDT_MODIFY_RET_S_Part : FDE_TXTEDT_MODIFY_RET_S_Normal; +} +int32_t CFDE_TxtEdtEngine::Delete(int32_t nStart, FX_BOOL bBackspace) { + if (IsLocked()) { + return FDE_TXTEDT_MODIFY_RET_F_Locked; + } + if (IsSelect()) { + DeleteSelect(); + return FDE_TXTEDT_MODIFY_RET_S_Normal; + } +#ifdef FDE_USEFORMATBLOCK + int32_t nBlockCount = m_BlockArray.GetSize(); + if (nBlockCount > 0) { + if (bBackspace) { + nStart--; + } + int32_t nCount = 1; + int32_t nBgn = 0; + int32_t nEnd = 0; + CFDE_TxtEdtField* pField = NULL; + FX_BOOL bInField = GetFieldBoundary(nStart, nBgn, nEnd, pField); + int32_t nCaretInField = nStart - nBgn; + FX_BOOL bBefore = FALSE; + if (bInField && !pField->IsFix()) { + pField->Backup(); + CFX_WideString wsDel; + int32_t nCaret = 0; + int32_t nRet = + pField->Delete(nCaretInField, nCount, wsDel, nCaret, bBefore); + nCaret += nBgn; + switch (nRet) { + case FDE_FORMAT_FIELD_DELETE_RET_S: + break; + case FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE: + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + case FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY: + return FDE_TXTEDT_MODIFY_RET_F_Boundary; + default: + FXSYS_assert(0); + break; + } + CFX_WideString wsField; + pField->GetFieldText(wsField); + if (!m_Param.pEventSink->On_ValidateField( + this, pField->GetBlockIndex(), pField->GetIndex(), wsField, 0)) { + pField->Restore(); + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + } + CFX_WideString wsDisplay; + pField->GetDisplayText(wsDisplay); + Replace(nBgn, nEnd - nBgn + 1, wsDisplay); + if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { + IFDE_TxtEdtDoRecord* pRecord = new CFDE_TxtEdtDoRecord_FieldDelete( + this, nStart, pField, nCaretInField, nBgn, nEnd - nBgn + 1, + wsDisplay.GetLength(), wsDel, FALSE); + CFX_ByteString bsDoRecord; + pRecord->Serialize(bsDoRecord); + m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord); + pRecord->Release(); + } + SetCaretPos(nStart, bBefore); + return FDE_TXTEDT_MODIFY_RET_S_Normal; + } + return FDE_TXTEDT_MODIFY_RET_F_Boundary; + } +#endif + int32_t nCount = 1; + if (bBackspace) { + if (nStart == 0) { + return FDE_TXTEDT_MODIFY_RET_F_Boundary; + } + if (nStart > 2 && m_pTxtBuf->GetCharByIndex(nStart - 1) == L'\n' && + m_pTxtBuf->GetCharByIndex(nStart - 2) == L'\r') { + nStart--; + nCount++; + } + nStart--; + } else { + if (nStart == GetTextBufLength()) { + return FDE_TXTEDT_MODIFY_RET_F_Full; + } + if ((nStart + 1 < GetTextBufLength()) && + (m_pTxtBuf->GetCharByIndex(nStart) == L'\r') && + (m_pTxtBuf->GetCharByIndex(nStart + 1) == L'\n')) { + nCount++; + } + } + if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { + CFX_WideString wsText; + GetPreDeleteText(wsText, nStart, nCount); + if (!m_Param.pEventSink->On_Validate(this, wsText)) { + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + } + } + if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { + CFX_WideString wsRange; + m_pTxtBuf->GetRange(wsRange, nStart, nCount); + IFDE_TxtEdtDoRecord* pRecord = + new CFDE_TxtEdtDoRecord_DeleteRange(this, nStart, m_nCaret, wsRange); + CFX_ByteString bsDoRecord; + pRecord->Serialize(bsDoRecord); + m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord); + pRecord->Release(); + } + m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete; + GetText(m_ChangeInfo.wsDelete, nStart, nCount); + Inner_DeleteRange(nStart, nCount); + SetCaretPos(nStart + ((!bBackspace && nStart > 0) ? -1 : 0), + (bBackspace || nStart == 0)); + m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); + return FDE_TXTEDT_MODIFY_RET_S_Normal; +} +int32_t CFDE_TxtEdtEngine::DeleteRange(int32_t nStart, int32_t nCount) { + if (IsLocked()) { + return FDE_TXTEDT_MODIFY_RET_F_Locked; + } + if (nCount == -1) { + nCount = GetTextBufLength(); + } + if (nCount == 0) { + return FDE_TXTEDT_MODIFY_RET_S_Normal; + } + if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { + CFX_WideString wsText; + GetPreDeleteText(wsText, nStart, nCount); + if (!m_Param.pEventSink->On_Validate(this, wsText)) { + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + } + } + DeleteRange_DoRecord(nStart, nCount); + m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); + SetCaretPos(nStart, TRUE); + return FDE_TXTEDT_MODIFY_RET_S_Normal; +} +int32_t CFDE_TxtEdtEngine::Replace(int32_t nStart, + int32_t nLength, + const CFX_WideString& wsReplace) { + if (IsLocked()) { + return FDE_TXTEDT_MODIFY_RET_F_Locked; + } + if (nStart < 0 || (nStart + nLength > GetTextBufLength())) { + return FDE_TXTEDT_MODIFY_RET_F_Boundary; + } + if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { + CFX_WideString wsText; + GetPreReplaceText(wsText, nStart, nLength, wsReplace.c_str(), + wsReplace.GetLength()); + if (!m_Param.pEventSink->On_Validate(this, wsText)) { + return FDE_TXTEDT_MODIFY_RET_F_Invalidate; + } + } + if (IsSelect()) { + ClearSelection(); + } + m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Replace; + GetText(m_ChangeInfo.wsDelete, nStart, nLength); + if (nLength > 0) { + Inner_DeleteRange(nStart, nLength); + } + int32_t nTextLength = wsReplace.GetLength(); + if (nTextLength > 0) { + Inner_Insert(nStart, wsReplace.c_str(), nTextLength); + } + m_ChangeInfo.wsInsert = CFX_WideString(wsReplace.c_str(), nTextLength); + nStart += nTextLength; + FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1); + FX_BOOL bBefore = TRUE; + if (wChar != L'\n' && wChar != L'\r') { + nStart--; + bBefore = FALSE; + } + SetCaretPos(nStart, bBefore); + m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); + m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); + m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); + return FDE_TXTEDT_MODIFY_RET_S_Normal; +} +void CFDE_TxtEdtEngine::SetLimit(int32_t nLimit) { + m_nLimit = nLimit; +} +void CFDE_TxtEdtEngine::SetAliasChar(FX_WCHAR wcAlias) { + m_wcAliasChar = wcAlias; +} +void CFDE_TxtEdtEngine::SetFormatBlock(int32_t nIndex, + const CFX_WideString& wsBlockFormat) { +#ifdef FDE_USEFORMATBLOCK + if (m_nFixLength == -1) { + m_nFixLength = GetTextLength(); + FXSYS_assert(m_wsFixText.IsEmpty()); + GetText(m_wsFixText, 0, -1); + } + FX_BOOL bInBlock = FALSE; + int32_t nCharIndex = 0; + int32_t nBlockIndex = 0; + int32_t nBlockPos = -1; + FX_WCHAR wc; + CFDE_TxtEdtBufIter* pIter = + new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf, FALSE); + pIter->SetAt(0); + do { + wc = pIter->GetChar(); + if (bInBlock) { + if (wc == FDE_TXTEDT_FORMATBLOCK_END) { + nBlockIndex++; + bInBlock = FALSE; + } + } else { + if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) { + bInBlock = TRUE; + } else { + if (nCharIndex++ == nIndex) { + nBlockPos = pIter->GetAt(); + break; + } + } + } + } while (pIter->Next()); + pIter->Release(); + if (nBlockPos == -1) { + nBlockPos = GetTextBufLength(); + } + CFDE_TxtEdtBlock* pEditBlock = + new CFDE_TxtEdtBlock(this, wsBlockFormat, nIndex); + m_BlockArray.InsertAt(m_BlockArray.GetSize(), pEditBlock); + CFX_WideString wsDisplay; + pEditBlock->GetDisplayText(wsDisplay); + m_nCaret = nBlockPos; + if (wsDisplay.GetLength() > 0) { + RawInsert(nBlockPos, const FX_WCHAR*(wsDisplay), wsDisplay.GetLength()); + } +#endif +} +int32_t CFDE_TxtEdtEngine::CountEditBlocks() const { +#ifdef FDE_USEFORMATBLOCK + return m_BlockArray.GetSize(); +#else + return 0; +#endif +} +void CFDE_TxtEdtEngine::GetEditBlockText(int32_t nIndex, + CFX_WideString& wsBlockText) const { +#ifdef FDE_USEFORMATBLOCK + CFDE_TxtEdtBlock* pBlock = m_BlockArray[nIndex]; + pBlock->GetBlockText(wsBlockText); +#endif +} +int32_t CFDE_TxtEdtEngine::CountEditFields(int32_t nBlockIndex) const { +#ifdef FDE_USEFORMATBLOCK + CFDE_TxtEdtBlock* pBlock = m_BlockArray[nBlockIndex]; + return pBlock->CountField(); +#else + return 0; +#endif +} +void CFDE_TxtEdtEngine::GetEditFieldText(int32_t nBlockIndex, + int32_t nFieldIndex, + CFX_WideString& wsFieldText) const { +#ifdef FDE_USEFORMATBLOCK + CFDE_TxtEdtBlock* pBlock = m_BlockArray[nBlockIndex]; + pBlock->GetFieldText(nFieldIndex, wsFieldText); +#endif +} +void CFDE_TxtEdtEngine::StartEdit() { +#ifdef FDE_USEFORMATBLOCK +#endif +} +void CFDE_TxtEdtEngine::EndEdit() { +#ifdef FDE_USEFORMATBLOCK +#endif +} +void CFDE_TxtEdtEngine::RemoveSelRange(int32_t nStart, int32_t nCount) { + FDE_LPTXTEDTSELRANGE lpTemp = NULL; + int32_t nRangeCount = m_SelRangePtrArr.GetSize(); + int32_t i = 0; + for (i = 0; i < nRangeCount; i++) { + lpTemp = m_SelRangePtrArr[i]; + if (lpTemp->nStart == nStart && lpTemp->nCount == nCount) { + delete lpTemp; + m_SelRangePtrArr.RemoveAt(i); + return; + } + } +} + +void CFDE_TxtEdtEngine::AddSelRange(int32_t nStart, int32_t nCount) { + if (nCount == -1) { + nCount = GetTextLength() - nStart; + } + int32_t nSize = m_SelRangePtrArr.GetSize(); + if (nSize <= 0) { + FDE_LPTXTEDTSELRANGE lpSelRange = new FDE_TXTEDTSELRANGE; + lpSelRange->nStart = nStart; + lpSelRange->nCount = nCount; + m_SelRangePtrArr.Add(lpSelRange); + m_Param.pEventSink->On_SelChanged(this); + return; + } + FDE_LPTXTEDTSELRANGE lpTemp = NULL; + lpTemp = m_SelRangePtrArr[nSize - 1]; + if (nStart >= lpTemp->nStart + lpTemp->nCount) { + FDE_LPTXTEDTSELRANGE lpSelRange = new FDE_TXTEDTSELRANGE; + lpSelRange->nStart = nStart; + lpSelRange->nCount = nCount; + m_SelRangePtrArr.Add(lpSelRange); + m_Param.pEventSink->On_SelChanged(this); + return; + } + int32_t nEnd = nStart + nCount - 1; + FX_BOOL bBegin = FALSE; + int32_t nRangeBgn = 0; + int32_t nRangeCnt = 0; + for (int32_t i = 0; i < nSize; i++) { + lpTemp = m_SelRangePtrArr[i]; + int32_t nTempBgn = lpTemp->nStart; + int32_t nTempEnd = nTempBgn + lpTemp->nCount - 1; + if (bBegin) { + if (nEnd < nTempBgn) { + break; + } else if (nStart >= nTempBgn && nStart <= nTempEnd) { + nRangeCnt++; + break; + } + nRangeCnt++; + } else { + if (nStart <= nTempEnd) { + nRangeBgn = i; + if (nEnd < nTempBgn) { + break; + } + nRangeCnt = 1; + bBegin = TRUE; + } + } + } + if (nRangeCnt == 0) { + FDE_LPTXTEDTSELRANGE lpSelRange = new FDE_TXTEDTSELRANGE; + lpSelRange->nStart = nStart; + lpSelRange->nCount = nCount; + m_SelRangePtrArr.InsertAt(nRangeBgn, lpSelRange); + } else { + lpTemp = m_SelRangePtrArr[nRangeBgn]; + lpTemp->nStart = nStart; + lpTemp->nCount = nCount; + nRangeCnt--; + nRangeBgn++; + while (nRangeCnt--) { + delete m_SelRangePtrArr[nRangeBgn]; + m_SelRangePtrArr.RemoveAt(nRangeBgn); + } + } + m_Param.pEventSink->On_SelChanged(this); +} + +int32_t CFDE_TxtEdtEngine::CountSelRanges() { + return m_SelRangePtrArr.GetSize(); +} +int32_t CFDE_TxtEdtEngine::GetSelRange(int32_t nIndex, int32_t& nStart) { + nStart = m_SelRangePtrArr[nIndex]->nStart; + return m_SelRangePtrArr[nIndex]->nCount; +} +void CFDE_TxtEdtEngine::ClearSelection() { + int32_t nCount = m_SelRangePtrArr.GetSize(); + FDE_LPTXTEDTSELRANGE lpRange = NULL; + int32_t i = 0; + for (i = 0; i < nCount; i++) { + lpRange = m_SelRangePtrArr[i]; + if (lpRange != NULL) { + delete lpRange; + lpRange = NULL; + } + } + m_SelRangePtrArr.RemoveAll(); + if (nCount && m_Param.pEventSink) { + m_Param.pEventSink->On_SelChanged(this); + } +} +FX_BOOL CFDE_TxtEdtEngine::Redo(const CFX_ByteStringC& bsRedo) { + if (IsLocked()) { + return FALSE; + } + if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) { + return FALSE; + } + IFDE_TxtEdtDoRecord* pDoRecord = IFDE_TxtEdtDoRecord::Create(bsRedo); + FXSYS_assert(pDoRecord); + if (pDoRecord == NULL) { + return FALSE; + } + FX_BOOL bOK = pDoRecord->Redo(); + pDoRecord->Release(); + return bOK; +} +FX_BOOL CFDE_TxtEdtEngine::Undo(const CFX_ByteStringC& bsUndo) { + if (IsLocked()) { + return FALSE; + } + if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) { + return FALSE; + } + IFDE_TxtEdtDoRecord* pDoRecord = IFDE_TxtEdtDoRecord::Create(bsUndo); + FXSYS_assert(pDoRecord); + if (pDoRecord == NULL) { + return FALSE; + } + FX_BOOL bOK = pDoRecord->Undo(); + pDoRecord->Release(); + return bOK; +} +int32_t CFDE_TxtEdtEngine::StartLayout() { + Lock(); + RemoveAllPages(); + m_nLayoutPos = 0; + m_nLineCount = 0; + return 0; +} +int32_t CFDE_TxtEdtEngine::DoLayout(IFX_Pause* pPause) { + int32_t nCount = m_ParagPtrArray.GetSize(); + CFDE_TxtEdtParag* pParag = NULL; + int32_t nLineCount = 0; + for (; m_nLayoutPos < nCount; m_nLayoutPos++) { + pParag = m_ParagPtrArray[m_nLayoutPos]; + pParag->CalcLines(); + nLineCount += pParag->m_nLineCount; + if ((pPause != NULL) && (nLineCount > m_nPageLineCount) && + pPause->NeedToPauseNow()) { + m_nLineCount += nLineCount; + return (++m_nLayoutPos * 100) / nCount; + } + } + m_nLineCount += nLineCount; + return 100; +} +void CFDE_TxtEdtEngine::EndLayout() { + UpdatePages(); + int32_t nLength = GetTextLength(); + if (m_nCaret > nLength) { + m_nCaret = nLength; + } + int32_t nIndex = m_nCaret; + if (!m_bBefore) { + nIndex--; + } + m_rtCaret.Set(0, 0, 1, m_Param.fFontSize); + Unlock(); +} +FX_BOOL CFDE_TxtEdtEngine::Optimize(IFX_Pause* pPause) { + return m_pTxtBuf->Optimize(pPause); +} +IFDE_TxtEdtBuf* CFDE_TxtEdtEngine::GetTextBuf() const { + return (IFDE_TxtEdtBuf*)m_pTxtBuf; +} +int32_t CFDE_TxtEdtEngine::GetTextBufLength() const { + return m_pTxtBuf->GetTextLength() - 1; +} +IFX_TxtBreak* CFDE_TxtEdtEngine::GetTextBreak() const { + return m_pTextBreak; +} +int32_t CFDE_TxtEdtEngine::GetLineCount() const { + return m_nLineCount; +} +int32_t CFDE_TxtEdtEngine::GetPageLineCount() const { + return m_nPageLineCount; +} +int32_t CFDE_TxtEdtEngine::CountParags() const { + return m_ParagPtrArray.GetSize(); +} +IFDE_TxtEdtParag* CFDE_TxtEdtEngine::GetParag(int32_t nParagIndex) const { + return m_ParagPtrArray[nParagIndex]; +} +IFX_CharIter* CFDE_TxtEdtEngine::CreateCharIter() { + if (!m_pTxtBuf) { + return NULL; + } + return new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf); +} +int32_t CFDE_TxtEdtEngine::Line2Parag(int32_t nStartParag, + int32_t nStartLineofParag, + int32_t nLineIndex, + int32_t& nStartLine) const { + int32_t nLineTotal = nStartLineofParag; + int32_t nCount = m_ParagPtrArray.GetSize(); + CFDE_TxtEdtParag* pParag = NULL; + int32_t i = nStartParag; + for (; i < nCount; i++) { + pParag = m_ParagPtrArray[i]; + nLineTotal += pParag->m_nLineCount; + if (nLineTotal > nLineIndex) { + break; + } + } + nStartLine = nLineTotal - pParag->m_nLineCount; + return i; +} +void CFDE_TxtEdtEngine::GetPreDeleteText(CFX_WideString& wsText, + int32_t nIndex, + int32_t nLength) { + GetText(wsText, 0, GetTextBufLength()); + wsText.Delete(nIndex, nLength); +} +void CFDE_TxtEdtEngine::GetPreInsertText(CFX_WideString& wsText, + int32_t nIndex, + const FX_WCHAR* lpText, + int32_t nLength) { + GetText(wsText, 0, GetTextBufLength()); + int32_t nSelIndex = 0; + int32_t nSelLength = 0; + int32_t nSelCount = CountSelRanges(); + while (nSelCount--) { + nSelLength = GetSelRange(nSelCount, nSelIndex); + wsText.Delete(nSelIndex, nSelLength); + nIndex = nSelIndex; + } + CFX_WideString wsTemp; + int32_t nOldLength = wsText.GetLength(); + const FX_WCHAR* pOldBuffer = wsText.c_str(); + FX_WCHAR* lpBuffer = wsTemp.GetBuffer(nOldLength + nLength); + FXSYS_memcpy(lpBuffer, pOldBuffer, (nIndex) * sizeof(FX_WCHAR)); + FXSYS_memcpy(lpBuffer + nIndex, lpText, nLength * sizeof(FX_WCHAR)); + FXSYS_memcpy(lpBuffer + nIndex + nLength, pOldBuffer + nIndex, + (nOldLength - nIndex) * sizeof(FX_WCHAR)); + wsTemp.ReleaseBuffer(nOldLength + nLength); + wsText = wsTemp; +} +void CFDE_TxtEdtEngine::GetPreReplaceText(CFX_WideString& wsText, + int32_t nIndex, + int32_t nOriginLength, + const FX_WCHAR* lpText, + int32_t nLength) { + GetText(wsText, 0, GetTextBufLength()); + int32_t nSelIndex = 0; + int32_t nSelLength = 0; + int32_t nSelCount = CountSelRanges(); + while (nSelCount--) { + nSelLength = GetSelRange(nSelCount, nSelIndex); + wsText.Delete(nSelIndex, nSelLength); + } + wsText.Delete(nIndex, nOriginLength); + int32_t i = 0; + for (i = 0; i < nLength; i++) { + wsText.Insert(nIndex++, lpText[i]); + } +} +void CFDE_TxtEdtEngine::Inner_Insert(int32_t nStart, + const FX_WCHAR* lpText, + int32_t nLength) { + FXSYS_assert(nLength > 0); + FDE_TXTEDTPARAGPOS ParagPos; + TextPos2ParagPos(nStart, ParagPos); + m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); + int32_t nParagCount = m_ParagPtrArray.GetSize(); + int32_t i = 0; + for (i = ParagPos.nParagIndex + 1; i < nParagCount; i++) { + m_ParagPtrArray[i]->m_nCharStart += nLength; + } + CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex]; + int32_t nReserveLineCount = pParag->m_nLineCount; + int32_t nReserveCharStart = pParag->m_nCharStart; + int32_t nLeavePart = ParagPos.nCharIndex; + int32_t nCutPart = pParag->m_nCharCount - ParagPos.nCharIndex; + int32_t nTextStart = 0; + FX_WCHAR wCurChar = L' '; + const FX_WCHAR* lpPos = lpText; + FX_BOOL bFirst = TRUE; + int32_t nParagIndex = ParagPos.nParagIndex; + for (i = 0; i < nLength; i++, lpPos++) { + wCurChar = *lpPos; + if (wCurChar == m_wLineEnd) { + if (bFirst) { + pParag->m_nCharCount = nLeavePart + (i - nTextStart + 1); + pParag->m_nLineCount = -1; + nReserveCharStart += pParag->m_nCharCount; + bFirst = FALSE; + } else { + pParag = new CFDE_TxtEdtParag(this); + pParag->m_nLineCount = -1; + pParag->m_nCharCount = i - nTextStart + 1; + pParag->m_nCharStart = nReserveCharStart; + m_ParagPtrArray.InsertAt(++nParagIndex, pParag); + nReserveCharStart += pParag->m_nCharCount; + } + nTextStart = i + 1; + } + } + if (bFirst) { + pParag->m_nCharCount += nLength; + pParag->m_nLineCount = -1; + bFirst = FALSE; + } else { + pParag = new CFDE_TxtEdtParag(this); + pParag->m_nLineCount = -1; + pParag->m_nCharCount = nLength - nTextStart + nCutPart; + pParag->m_nCharStart = nReserveCharStart; + m_ParagPtrArray.InsertAt(++nParagIndex, pParag); + } + m_pTxtBuf->Insert(nStart, lpText, nLength); + int32_t nTotalLineCount = 0; + for (i = ParagPos.nParagIndex; i <= nParagIndex; i++) { + pParag = m_ParagPtrArray[i]; + pParag->CalcLines(); + nTotalLineCount += pParag->m_nLineCount; + } + m_nLineCount += nTotalLineCount - nReserveLineCount; + m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); + UpdatePages(); +} +#ifdef FDE_USEFORMATBLOCK +void CFDE_TxtEdtEngine::RawInsert(int32_t nStart, + const FX_WCHAR* lpText, + int32_t nLength) { + FXSYS_assert(nLength > 0); + FDE_TXTEDTPARAGPOS ParagPos; + TextPos2ParagPos(nStart, ParagPos); + int32_t nParagCount = m_ParagPtrArray.GetSize(); + int32_t i = 0; + for (i = ParagPos.nParagIndex + 1; i < nParagCount; i++) { + m_ParagPtrArray[i]->m_nCharStart += nLength; + } + CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex]; + int32_t nReserveLineCount = pParag->m_nLineCount; + int32_t nReserveCharStart = pParag->m_nCharStart; + int32_t nLeavePart = ParagPos.nCharIndex; + int32_t nCutPart = pParag->m_nCharCount - ParagPos.nCharIndex; + int32_t nTextStart = 0; + FX_WCHAR wCurChar = L' '; + const FX_WCHAR* lpPos = lpText; + FX_BOOL bFirst = TRUE; + int32_t nParagIndex = ParagPos.nParagIndex; + for (i = 0; i < nLength; i++, lpPos++) { + wCurChar = *lpPos; + if (wCurChar == m_wLineEnd) { + if (bFirst) { + pParag->m_nCharCount = nLeavePart + (i - nTextStart + 1); + pParag->m_nLineCount = -1; + nReserveCharStart += pParag->m_nCharCount; + bFirst = FALSE; + } else { + pParag = new CFDE_TxtEdtParag(this); + pParag->m_nLineCount = -1; + pParag->m_nCharCount = i - nTextStart + 1; + pParag->m_nCharStart = nReserveCharStart; + m_ParagPtrArray.InsertAt(++nParagIndex, pParag); + nReserveCharStart += pParag->m_nCharCount; + } + nTextStart = i + 1; + } + } + if (bFirst) { + pParag->m_nCharCount += nLength; + pParag->m_nLineCount = -1; + bFirst = FALSE; + } else { + pParag = new CFDE_TxtEdtParag(this); + pParag->m_nLineCount = -1; + pParag->m_nCharCount = nLength - nTextStart + nCutPart; + pParag->m_nCharStart = nReserveCharStart; + m_ParagPtrArray.InsertAt(++nParagIndex, pParag); + } + m_pTxtBuf->Insert(nStart, lpText, nLength); +} +#endif +void CFDE_TxtEdtEngine::Inner_DeleteRange(int32_t nStart, int32_t nCount) { + if (nCount == -1) { + nCount = m_pTxtBuf->GetTextLength() - nStart; + } + int32_t nEnd = nStart + nCount - 1; + FXSYS_assert(nStart >= 0 && nEnd < m_pTxtBuf->GetTextLength()); + m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); + FDE_TXTEDTPARAGPOS ParagPosBgn, ParagPosEnd; + TextPos2ParagPos(nStart, ParagPosBgn); + TextPos2ParagPos(nEnd, ParagPosEnd); + CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPosEnd.nParagIndex]; + FX_BOOL bLastParag = FALSE; + if (ParagPosEnd.nCharIndex == pParag->m_nCharCount - 1) { + if (ParagPosEnd.nParagIndex < m_ParagPtrArray.GetSize() - 1) { + ParagPosEnd.nParagIndex++; + } else { + bLastParag = TRUE; + } + } + int32_t nTotalLineCount = 0; + int32_t nTotalCharCount = 0; + int32_t i = 0; + for (i = ParagPosBgn.nParagIndex; i <= ParagPosEnd.nParagIndex; i++) { + CFDE_TxtEdtParag* pParag = m_ParagPtrArray[i]; + pParag->CalcLines(); + nTotalLineCount += pParag->m_nLineCount; + nTotalCharCount += pParag->m_nCharCount; + } + m_pTxtBuf->Delete(nStart, nCount); + int32_t nNextParagIndex = (ParagPosBgn.nCharIndex == 0 && bLastParag) + ? ParagPosBgn.nParagIndex + : (ParagPosBgn.nParagIndex + 1); + for (i = nNextParagIndex; i <= ParagPosEnd.nParagIndex; i++) { + CFDE_TxtEdtParag* pParag = m_ParagPtrArray[nNextParagIndex]; + delete pParag; + m_ParagPtrArray.RemoveAt(nNextParagIndex); + } + if (!(bLastParag && ParagPosBgn.nCharIndex == 0)) { + pParag = m_ParagPtrArray[ParagPosBgn.nParagIndex]; + pParag->m_nCharCount = nTotalCharCount - nCount; + pParag->CalcLines(); + nTotalLineCount -= pParag->m_nLineCount; + } + int32_t nParagCount = m_ParagPtrArray.GetSize(); + for (i = nNextParagIndex; i < nParagCount; i++) { + m_ParagPtrArray[i]->m_nCharStart -= nCount; + } + m_nLineCount -= nTotalLineCount; + UpdatePages(); + int32_t nPageCount = CountPages(); + if (m_nCaretPage >= nPageCount) { + m_nCaretPage = nPageCount - 1; + } + m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); +} +void CFDE_TxtEdtEngine::DeleteRange_DoRecord(int32_t nStart, + int32_t nCount, + FX_BOOL bSel) { + FXSYS_assert(nStart >= 0); + if (nCount == -1) { + nCount = GetTextLength() - nStart; + } + FXSYS_assert((nStart + nCount) <= m_pTxtBuf->GetTextLength()); +#ifdef FDE_USEFORMATBLOCK + int32_t nBlockCount = m_BlockArray.GetSize(); + if (nBlockCount > 0) { + } +#endif + if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { + CFX_WideString wsRange; + m_pTxtBuf->GetRange(wsRange, nStart, nCount); + IFDE_TxtEdtDoRecord* pRecord = new CFDE_TxtEdtDoRecord_DeleteRange( + this, nStart, m_nCaret, wsRange, bSel); + CFX_ByteString bsDoRecord; + pRecord->Serialize(bsDoRecord); + m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord); + pRecord->Release(); + } + m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete; + GetText(m_ChangeInfo.wsDelete, nStart, nCount); + Inner_DeleteRange(nStart, nCount); +} +void CFDE_TxtEdtEngine::ResetEngine() { + RemoveAllPages(); + RemoveAllParags(); + ClearSelection(); + m_nCaret = 0; + m_pTxtBuf->Clear(FALSE); + m_nCaret = 0; +} +void CFDE_TxtEdtEngine::RebuildParagraphs() { + RemoveAllParags(); + FX_WCHAR wChar = L' '; + int32_t nParagStart = 0; + int32_t nIndex = 0; + IFX_CharIter* pIter = new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf); + pIter->SetAt(0); + do { + wChar = pIter->GetChar(); + nIndex = pIter->GetAt(); + if (wChar == m_wLineEnd) { + CFDE_TxtEdtParag* pParag = new CFDE_TxtEdtParag(this); + pParag->m_nCharStart = nParagStart; + pParag->m_nCharCount = nIndex - nParagStart + 1; + pParag->m_nLineCount = -1; + m_ParagPtrArray.Add(pParag); + nParagStart = nIndex + 1; + } + } while (pIter->Next()); + pIter->Release(); +} +void CFDE_TxtEdtEngine::RemoveAllParags() { + int32_t nCount = m_ParagPtrArray.GetSize(); + int32_t i = 0; + for (i = 0; i < nCount; i++) { + CFDE_TxtEdtParag* pParag = m_ParagPtrArray[i]; + if (pParag) { + delete pParag; + } + } + m_ParagPtrArray.RemoveAll(); +} +void CFDE_TxtEdtEngine::RemoveAllPages() { + int32_t nCount = m_PagePtrArray.GetSize(); + int32_t i = 0; + for (i = 0; i < nCount; i++) { + IFDE_TxtEdtPage* pPage = m_PagePtrArray[i]; + if (pPage) { + pPage->Release(); + } + } + m_PagePtrArray.RemoveAll(); +} +void CFDE_TxtEdtEngine::UpdateParags() { + int32_t nCount = m_ParagPtrArray.GetSize(); + if (nCount == 0) { + return; + } + CFDE_TxtEdtParag* pParag = NULL; + int32_t nLineCount = 0; + int32_t i = 0; + for (i = 0; i < nCount; i++) { + pParag = m_ParagPtrArray[i]; + if (pParag->m_nLineCount == -1) { + pParag->CalcLines(); + } + nLineCount += pParag->m_nLineCount; + } + m_nLineCount = nLineCount; +} +void CFDE_TxtEdtEngine::UpdatePages() { + if (m_nLineCount == 0) { + return; + } + int32_t nPageCount = (m_nLineCount - 1) / (m_nPageLineCount) + 1; + int32_t nSize = m_PagePtrArray.GetSize(); + if (nSize == nPageCount) { + return; + } + if (nSize > nPageCount) { + IFDE_TxtEdtPage* pPage = NULL; + int32_t i = 0; + for (i = nSize - 1; i >= nPageCount; i--) { + pPage = m_PagePtrArray[i]; + if (pPage) { + pPage->Release(); + } + m_PagePtrArray.RemoveAt(i); + } + m_Param.pEventSink->On_PageCountChanged(this); + return; + } + if (nSize < nPageCount) { + IFDE_TxtEdtPage* pPage = NULL; + int32_t i = 0; + for (i = nSize; i < nPageCount; i++) { + pPage = IFDE_TxtEdtPage::Create(this, i); + m_PagePtrArray.Add(pPage); + } + m_Param.pEventSink->On_PageCountChanged(this); + return; + } +} +void CFDE_TxtEdtEngine::UpdateTxtBreak() { + FX_DWORD dwStyle = m_pTextBreak->GetLayoutStyles(); + if (m_Param.dwMode & FDE_TEXTEDITMODE_MultiLines) { + dwStyle &= ~FX_TXTLAYOUTSTYLE_SingleLine; + } else { + dwStyle |= FX_TXTLAYOUTSTYLE_SingleLine; + } + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) { + dwStyle |= FX_TXTLAYOUTSTYLE_VerticalLayout; + } else { + dwStyle &= ~FX_TXTLAYOUTSTYLE_VerticalLayout; + } + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve) { + dwStyle |= FX_TXTLAYOUTSTYLE_ReverseLine; + } else { + dwStyle &= ~FX_TXTLAYOUTSTYLE_ReverseLine; + } + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_RTL) { + dwStyle |= FX_TXTLAYOUTSTYLE_RTLReadingOrder; + } else { + dwStyle &= ~FX_TXTLAYOUTSTYLE_RTLReadingOrder; + } + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText) { + dwStyle |= FX_TXTLAYOUTSTYLE_CombText; + } else { + dwStyle &= ~FX_TXTLAYOUTSTYLE_CombText; + } + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CharVertial) { + dwStyle |= FX_TXTLAYOUTSTYLE_VerticalChars; + } else { + dwStyle &= ~FX_TXTLAYOUTSTYLE_VerticalChars; + } + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ExpandTab) { + dwStyle |= FX_TXTLAYOUTSTYLE_ExpandTab; + } else { + dwStyle &= ~FX_TXTLAYOUTSTYLE_ExpandTab; + } + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ArabicContext) { + dwStyle |= FX_TXTLAYOUTSTYLE_ArabicContext; + } else { + dwStyle &= ~FX_TXTLAYOUTSTYLE_ArabicContext; + } + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_ArabicShapes) { + dwStyle |= FX_TXTLAYOUTSTYLE_ArabicShapes; + } else { + dwStyle &= ~FX_TXTLAYOUTSTYLE_ArabicShapes; + } + m_pTextBreak->SetLayoutStyles(dwStyle); + FX_DWORD dwAligment = 0; + if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Justified) { + dwAligment |= FX_TXTLINEALIGNMENT_Justified; + } else if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Distributed) { + dwAligment |= FX_TXTLINEALIGNMENT_Distributed; + } + if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Center) { + dwAligment |= FX_TXTLINEALIGNMENT_Center; + } else if (m_Param.dwAlignment & FDE_TEXTEDITALIGN_Right) { + dwAligment |= FX_TXTLINEALIGNMENT_Right; + } + m_pTextBreak->SetAlignment(dwAligment); + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) { + if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) { + m_pTextBreak->SetLineWidth(m_Param.fPlateHeight); + } else { + m_pTextBreak->SetLineWidth(FDE_PAGEWIDTH_MAX); + } + } else { + if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) { + m_pTextBreak->SetLineWidth(m_Param.fPlateWidth); + } else { + m_pTextBreak->SetLineWidth(FDE_PAGEWIDTH_MAX); + } + } + m_nPageLineCount = m_Param.nLineCount; + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText) { + FX_FLOAT fCombWidth = + m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical + ? m_Param.fPlateHeight + : m_Param.fPlateWidth; + if (m_nLimit > 0) { + fCombWidth /= m_nLimit; + } + m_pTextBreak->SetCombWidth(fCombWidth); + } + m_pTextBreak->SetFont(m_Param.pFont); + m_pTextBreak->SetFontSize(m_Param.fFontSize); + m_pTextBreak->SetTabWidth(m_Param.fTabWidth, m_Param.bTabEquidistant); + m_pTextBreak->SetDefaultChar(m_Param.wDefChar); + m_pTextBreak->SetParagraphBreakChar(m_Param.wLineBreakChar); + m_pTextBreak->SetCharRotation(m_Param.nCharRotation); + m_pTextBreak->SetLineBreakTolerance(m_Param.fFontSize * 0.2f); + m_pTextBreak->SetHorizontalScale(m_Param.nHorzScale); + m_pTextBreak->SetCharSpace(m_Param.fCharSpace); +} +FX_BOOL CFDE_TxtEdtEngine::ReplaceParagEnd(FX_WCHAR*& lpText, + int32_t& nLength, + FX_BOOL bPreIsCR) { + for (int32_t i = 0; i < nLength; i++) { + FX_WCHAR wc = lpText[i]; + switch (wc) { + case L'\r': { + lpText[i] = m_wLineEnd; + bPreIsCR = TRUE; + } break; + case L'\n': { + if (bPreIsCR == TRUE) { + int32_t nNext = i + 1; + if (nNext < nLength) { + FXSYS_memmove(lpText + i, lpText + nNext, + (nLength - nNext) * sizeof(FX_WCHAR)); + } + i--; + nLength--; + bPreIsCR = FALSE; + if (m_bAutoLineEnd) { + m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_CRLF; + m_bAutoLineEnd = FALSE; + } + } else { + lpText[i] = m_wLineEnd; + if (m_bAutoLineEnd) { + m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_LF; + m_bAutoLineEnd = FALSE; + } + } + } break; + default: { + if (bPreIsCR && m_bAutoLineEnd) { + m_nFirstLineEnd = FDE_TXTEDIT_LINEEND_CR; + m_bAutoLineEnd = FALSE; + } + bPreIsCR = FALSE; + } break; + } + } + return bPreIsCR; +} +void CFDE_TxtEdtEngine::RecoverParagEnd(CFX_WideString& wsText) { + FX_WCHAR wc = (m_nFirstLineEnd == FDE_TXTEDIT_LINEEND_CR) ? L'\n' : L'\r'; + if (m_nFirstLineEnd == FDE_TXTEDIT_LINEEND_CRLF) { + CFX_ArrayTemplate<int32_t> PosArr; + int32_t nLength = wsText.GetLength(); + int32_t i = 0; + FX_WCHAR* lpPos = (FX_WCHAR*)(const FX_WCHAR*)wsText; + for (i = 0; i < nLength; i++, lpPos++) { + if (*lpPos == m_wLineEnd) { + *lpPos = wc; + PosArr.Add(i); + } + } + const FX_WCHAR* lpSrcBuf = wsText.c_str(); + CFX_WideString wsTemp; + int32_t nCount = PosArr.GetSize(); + FX_WCHAR* lpDstBuf = wsTemp.GetBuffer(nLength + nCount); + int32_t nDstPos = 0; + int32_t nSrcPos = 0; + for (i = 0; i < nCount; i++) { + int32_t nPos = PosArr[i]; + int32_t nCopyLen = nPos - nSrcPos + 1; + FXSYS_memcpy(lpDstBuf + nDstPos, lpSrcBuf + nSrcPos, + nCopyLen * sizeof(FX_WCHAR)); + nDstPos += nCopyLen; + nSrcPos += nCopyLen; + lpDstBuf[nDstPos] = L'\n'; + nDstPos++; + } + if (nSrcPos < nLength) { + FXSYS_memcpy(lpDstBuf + nDstPos, lpSrcBuf + nSrcPos, + (nLength - nSrcPos) * sizeof(FX_WCHAR)); + } + wsTemp.ReleaseBuffer(nLength + nCount); + wsText = wsTemp; + } else { + int32_t nLength = wsText.GetLength(); + FX_WCHAR* lpBuf = (FX_WCHAR*)(const FX_WCHAR*)wsText; + for (int32_t i = 0; i < nLength; i++, lpBuf++) { + if (*lpBuf == m_wLineEnd) { + *lpBuf = wc; + } + } + } +} +int32_t CFDE_TxtEdtEngine::MovePage2Char(int32_t nIndex) { + FXSYS_assert(nIndex >= 0); + FXSYS_assert(nIndex <= m_pTxtBuf->GetTextLength()); + if (m_nCaretPage >= 0) { + IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage]; + m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); + int32_t nPageCharStart = pPage->GetCharStart(); + int32_t nPageCharCount = pPage->GetCharCount(); + if (nIndex >= nPageCharStart && nIndex < nPageCharStart + nPageCharCount) { + m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); + return m_nCaretPage; + } + m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); + } + CFDE_TxtEdtParag* pParag = NULL; + int32_t nLineCount = 0; + int32_t nParagCount = m_ParagPtrArray.GetSize(); + int32_t i = 0; + for (i = 0; i < nParagCount; i++) { + pParag = m_ParagPtrArray[i]; + if (pParag->m_nCharStart <= nIndex && + nIndex < (pParag->m_nCharStart + pParag->m_nCharCount)) { + break; + } + nLineCount += pParag->m_nLineCount; + } + pParag->LoadParag(); + int32_t nLineStart = -1; + int32_t nLineCharCount = -1; + for (i = 0; i < pParag->m_nLineCount; i++) { + pParag->GetLineRange(i, nLineStart, nLineCharCount); + if (nLineStart <= nIndex && nIndex < (nLineStart + nLineCharCount)) { + break; + } + } + FXSYS_assert(i < pParag->m_nLineCount); + nLineCount += (i + 1); + m_nCaretPage = (nLineCount - 1) / m_nPageLineCount + 1 - 1; + m_Param.pEventSink->On_PageChange(this, m_nCaretPage); + pParag->UnloadParag(); + return m_nCaretPage; +} +void CFDE_TxtEdtEngine::TextPos2ParagPos(int32_t nIndex, + FDE_TXTEDTPARAGPOS& ParagPos) const { + FXSYS_assert(nIndex >= 0 && nIndex < m_pTxtBuf->GetTextLength()); + int32_t nCount = m_ParagPtrArray.GetSize(); + int32_t nBgn = 0; + int32_t nMid = 0; + int32_t nEnd = nCount - 1; + while (nEnd > nBgn) { + nMid = (nBgn + nEnd) / 2; + CFDE_TxtEdtParag* pParag = m_ParagPtrArray[nMid]; + if (nIndex < pParag->m_nCharStart) { + nEnd = nMid - 1; + } else if (nIndex >= (pParag->m_nCharStart + pParag->m_nCharCount)) { + nBgn = nMid + 1; + } else { + break; + } + } + if (nBgn == nEnd) { + nMid = nBgn; + } + FXSYS_assert(nIndex >= m_ParagPtrArray[nMid]->m_nCharStart && + (nIndex < m_ParagPtrArray[nMid]->m_nCharStart + + m_ParagPtrArray[nMid]->m_nCharCount)); + ParagPos.nParagIndex = nMid; + ParagPos.nCharIndex = nIndex - m_ParagPtrArray[nMid]->m_nCharStart; +} +int32_t CFDE_TxtEdtEngine::MoveForward(FX_BOOL& bBefore) { + if (m_nCaret == m_pTxtBuf->GetTextLength() - 1) { + return -1; + } + int32_t nCaret = m_nCaret; + if ((nCaret + 1 < m_pTxtBuf->GetTextLength()) && + (m_pTxtBuf->GetCharByIndex(nCaret) == L'\r') && + (m_pTxtBuf->GetCharByIndex(nCaret + 1) == L'\n')) { + nCaret++; + } + nCaret++; + bBefore = TRUE; + return nCaret; +} +int32_t CFDE_TxtEdtEngine::MoveBackward(FX_BOOL& bBefore) { + if (m_nCaret == 0) { + return FALSE; + } + int32_t nCaret = m_nCaret; + if (nCaret > 2 && m_pTxtBuf->GetCharByIndex(nCaret - 1) == L'\n' && + m_pTxtBuf->GetCharByIndex(nCaret - 2) == L'\r') { + nCaret--; + } + nCaret--; + bBefore = TRUE; + return nCaret; +} +FX_BOOL CFDE_TxtEdtEngine::MoveUp(CFX_PointF& ptCaret) { + IFDE_TxtEdtPage* pPage = GetPage(m_nCaretPage); + const CFX_RectF& rtContent = pPage->GetContentsBox(); + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) { + ptCaret.x = m_rtCaret.left + m_rtCaret.width / 2 - m_Param.fLineSpace; + ptCaret.y = m_fCaretPosReserve; + FX_BOOL bLineReserve = + m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve; + if (ptCaret.x < rtContent.left) { + if (bLineReserve) { + if (m_nCaretPage == CountPages() - 1) { + return FALSE; + } + } else { + if (m_nCaretPage == 0) { + return FALSE; + } + } + if (bLineReserve) { + m_nCaretPage++; + } else { + m_nCaretPage--; + } + m_Param.pEventSink->On_PageChange(this, m_nCaretPage); + ptCaret.x -= rtContent.left; + IFDE_TxtEdtPage* pCurPage = GetPage(m_nCaretPage); + ptCaret.x += pCurPage->GetContentsBox().right(); + } + } else { + ptCaret.x = m_fCaretPosReserve; + ptCaret.y = m_rtCaret.top + m_rtCaret.height / 2 - m_Param.fLineSpace; + if (ptCaret.y < rtContent.top) { + if (m_nCaretPage == 0) { + return FALSE; + } + ptCaret.y -= rtContent.top; + m_nCaretPage--; + m_Param.pEventSink->On_PageChange(this, m_nCaretPage); + IFDE_TxtEdtPage* pCurPage = GetPage(m_nCaretPage); + ptCaret.y += pCurPage->GetContentsBox().bottom(); + } + } + return TRUE; +} +FX_BOOL CFDE_TxtEdtEngine::MoveDown(CFX_PointF& ptCaret) { + IFDE_TxtEdtPage* pPage = GetPage(m_nCaretPage); + const CFX_RectF& rtContent = pPage->GetContentsBox(); + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) { + ptCaret.x = m_rtCaret.left + m_rtCaret.width / 2 + m_Param.fLineSpace; + ptCaret.y = m_fCaretPosReserve; + if (ptCaret.x >= rtContent.right()) { + FX_BOOL bLineReserve = + m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve; + if (bLineReserve) { + if (m_nCaretPage == 0) { + return FALSE; + } + } else { + if (m_nCaretPage == CountPages() - 1) { + return FALSE; + } + } + if (bLineReserve) { + m_nCaretPage--; + } else { + m_nCaretPage++; + } + m_Param.pEventSink->On_PageChange(this, m_nCaretPage); + ptCaret.x -= rtContent.right(); + IFDE_TxtEdtPage* pCurPage = GetPage(m_nCaretPage); + ptCaret.x += pCurPage->GetContentsBox().left; + } + } else { + ptCaret.x = m_fCaretPosReserve; + ptCaret.y = m_rtCaret.top + m_rtCaret.height / 2 + m_Param.fLineSpace; + if (ptCaret.y >= rtContent.bottom()) { + if (m_nCaretPage == CountPages() - 1) { + return FALSE; + } + ptCaret.y -= rtContent.bottom(); + m_nCaretPage++; + m_Param.pEventSink->On_PageChange(this, m_nCaretPage); + IFDE_TxtEdtPage* pCurPage = GetPage(m_nCaretPage); + ptCaret.y += pCurPage->GetContentsBox().top; + } + } + return TRUE; +} +FX_BOOL CFDE_TxtEdtEngine::MoveLineStart() { + int32_t nIndex = m_bBefore ? m_nCaret : m_nCaret - 1; + FDE_TXTEDTPARAGPOS ParagPos; + TextPos2ParagPos(nIndex, ParagPos); + CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex]; + pParag->LoadParag(); + int32_t nLineCount = pParag->m_nLineCount; + int32_t i = 0; + int32_t nStart = 0; + int32_t nCount = 0; + for (; i < nLineCount; i++) { + pParag->GetLineRange(i, nStart, nCount); + if (nIndex >= nStart && nIndex < nStart + nCount) { + break; + } + } + UpdateCaretRect(nStart, TRUE); + pParag->UnloadParag(); + return TRUE; +} +FX_BOOL CFDE_TxtEdtEngine::MoveLineEnd() { + int32_t nIndex = m_bBefore ? m_nCaret : m_nCaret - 1; + FDE_TXTEDTPARAGPOS ParagPos; + TextPos2ParagPos(nIndex, ParagPos); + CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex]; + pParag->LoadParag(); + int32_t nLineCount = pParag->m_nLineCount; + int32_t i = 0; + int32_t nStart = 0; + int32_t nCount = 0; + for (; i < nLineCount; i++) { + pParag->GetLineRange(i, nStart, nCount); + if (nIndex >= nStart && nIndex < nStart + nCount) { + break; + } + } + nIndex = nStart + nCount - 1; + FXSYS_assert(nIndex <= GetTextBufLength()); + FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nIndex); + FX_BOOL bBefore = FALSE; + if (nIndex <= GetTextBufLength()) { + if (wChar == L'\r') { + bBefore = TRUE; + } else if (wChar == L'\n' && nIndex > nStart) { + bBefore = TRUE; + nIndex--; + wChar = m_pTxtBuf->GetCharByIndex(nIndex); + if (wChar != L'\r') { + nIndex++; + } + } + } + UpdateCaretRect(nIndex, bBefore); + pParag->UnloadParag(); + return TRUE; +} +FX_BOOL CFDE_TxtEdtEngine::MoveParagStart() { + int32_t nIndex = m_bBefore ? m_nCaret : m_nCaret - 1; + FDE_TXTEDTPARAGPOS ParagPos; + TextPos2ParagPos(nIndex, ParagPos); + CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex]; + UpdateCaretRect(pParag->m_nCharStart, TRUE); + return TRUE; +} +FX_BOOL CFDE_TxtEdtEngine::MoveParagEnd() { + int32_t nIndex = m_bBefore ? m_nCaret : m_nCaret - 1; + FDE_TXTEDTPARAGPOS ParagPos; + TextPos2ParagPos(nIndex, ParagPos); + CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex]; + nIndex = pParag->m_nCharStart + pParag->m_nCharCount - 1; + FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nIndex); + if (wChar == L'\n' && nIndex > 0) { + nIndex--; + wChar = m_pTxtBuf->GetCharByIndex(nIndex); + if (wChar != L'\r') { + nIndex++; + } + } + UpdateCaretRect(nIndex, TRUE); + return TRUE; +} +FX_BOOL CFDE_TxtEdtEngine::MoveHome() { + UpdateCaretRect(0, TRUE); + return TRUE; +} +FX_BOOL CFDE_TxtEdtEngine::MoveEnd() { + UpdateCaretRect(GetTextBufLength(), TRUE); + return TRUE; +} +#ifdef FDE_USEFORMATBLOCK +int32_t CFDE_TxtEdtEngine::NormalizeCaretPos(int32_t nIndex, + int32_t nFlags, + FX_BOOL& bBefore) { + bBefore = TRUE; + int32_t nBgn = 0, nEnd = 0; + int32_t nRecord = -1; + CFDE_TxtEdtField* pField = NULL; + FX_BOOL bRet = GetFieldBoundary(nIndex, nBgn, nEnd, pField); + int32_t nDelta = 0; + if (bRet && !pField->IsFix()) { + if (nIndex - nBgn < FDE_FORMAT_EDIT_FIELD_HADERSIZE) { + if (nFlags == FDE_FORMAT_CARET_BACKWARD) { + CFDE_TxtEdtField* pEditableField = NULL; + if (FindEditableField(nIndex, nBgn, nEnd, pEditableField, FALSE)) { + return pEditableField->NormalizeCaretPos(nEnd - nBgn, + FDE_FORMAT_CARET_BACKWARD) + + nBgn; + } + } + nIndex = nBgn + FDE_FORMAT_EDIT_FIELD_HADERSIZE; + } + int32_t nRet = pField->NormalizeCaretPos( + nIndex - nBgn, (FDE_FORMAT_CARET_DIRECTION)nFlags); + if (nRet >= 0) { + return nRet + nBgn; + } + if (nRet == -2) { + int32_t nEditablePosBgn = 0, nEditablePosEnd = 0; + pField->GetEditableRange(nEditablePosBgn, nEditablePosEnd); + nRecord = nBgn + nEditablePosBgn; + nFlags = FDE_FORMAT_CARET_BACKWARD; + } else { + FXSYS_assert(nRet == -1); + int32_t nEditablePosBgn = 0, nEditablePosEnd = 0; + pField->GetEditableRange(nEditablePosBgn, nEditablePosEnd); + nRecord = nBgn + nEditablePosEnd; + nFlags = FDE_FORMAT_CARET_FORWARD; + } + } else if (!bRet) { + nDelta = FDE_FORMAT_EDIT_FIELD_HADERSIZE - FDE_FORMAT_EDIT_FIELD_TAILSIZE; + } + switch (nFlags) { + case FDE_FORMAT_CARET_FORWARD: { + if (FindEditableField(nIndex, nBgn, nEnd, pField)) { + return pField->NormalizeCaretPos(FDE_FORMAT_EDIT_FIELD_HADERSIZE, + FDE_FORMAT_CARET_FORWARD) + + nBgn; + } else { + if (nRecord != -1) { + return nRecord; + } + bRet = FindEditableField(nIndex, nBgn, nEnd, pField, FALSE); + FXSYS_assert(bRet); + return pField->NormalizeCaretPos(nEnd - nBgn, + FDE_FORMAT_CARET_BACKWARD) + + nBgn; + } + } break; + case FDE_FORMAT_CARET_MIDDLE: { + int32_t nBgn1 = 0, nEnd1 = 0, nBgn2 = 0, nEnd2 = 0; + CFDE_TxtEdtField* pEditableField1 = NULL; + CFDE_TxtEdtField* pEditableField2 = NULL; + FX_BOOL bRet1 = + FindEditableField(nIndex, nBgn1, nEnd1, pEditableField1, FALSE); + FX_BOOL bRet2 = FindEditableField(nIndex, nBgn2, nEnd2, pEditableField2); + if (bRet1 == FALSE) { + FXSYS_assert(bRet2); + return pEditableField2->NormalizeCaretPos( + FDE_FORMAT_EDIT_FIELD_HADERSIZE, FDE_FORMAT_CARET_FORWARD) + + nBgn2; + } else if (bRet2 == FALSE) { + FXSYS_assert(bRet1); + return pEditableField1->NormalizeCaretPos(nEnd1 - nBgn1, + FDE_FORMAT_CARET_BACKWARD) + + nBgn1; + } else { + int32_t nEditablePosBgn = 0, nEditablePosEnd = 0; + if (nIndex - nEnd1 < nBgn2 + nDelta - nIndex) { + pEditableField1->GetEditableRange(nEditablePosBgn, nEditablePosEnd); + return nEditablePosEnd + nBgn1; + } else { + pEditableField2->GetEditableRange(nEditablePosBgn, nEditablePosEnd); + return nEditablePosBgn + nBgn2; + } + } + } break; + case FDE_FORMAT_CARET_BACKWARD: { + if (FindEditableField(nIndex, nBgn, nEnd, pField, FALSE)) { + return pField->NormalizeCaretPos(nEnd - nBgn, + FDE_FORMAT_CARET_BACKWARD) + + nBgn; + } else { + if (nRecord != -1) { + return nRecord; + } + bRet = FindEditableField(nIndex, nBgn, nEnd, pField); + FXSYS_assert(bRet); + return pField->NormalizeCaretPos(FDE_FORMAT_EDIT_FIELD_HADERSIZE, + FDE_FORMAT_CARET_FORWARD) + + nBgn; + } + } break; + default: + FXSYS_assert(0); + return nIndex; + } +} +FX_BOOL CFDE_TxtEdtEngine::GetFieldBoundary(int32_t nIndex, + int32_t& nBgn, + int32_t& nEnd, + CFDE_TxtEdtField*& pField) { + CFDE_TxtEdtBufIter* pIter = + new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf, FALSE); + pIter->SetAt(nIndex); + FX_BOOL bFind = FALSE; + do { + FX_WCHAR wc = pIter->GetChar(); + if (wc == FDE_TXTEDT_FORMATBLOCK_END) { + nEnd = pIter->GetAt(); + bFind = TRUE; + nIndex--; + break; + } + if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) { + pIter->Release(); + return FALSE; + } + } while (pIter->Next()); + if (!bFind) { + pIter->Release(); + return FALSE; + } + pIter->SetAt(nIndex); + do { + FX_WCHAR wc = pIter->GetChar(); + if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) { + nBgn = pIter->GetAt(); + pIter->Next(); + FX_DWORD dwPre = (FX_DWORD)pIter->GetChar(); + pIter->Next(); + FX_DWORD dwCur = (FX_DWORD)pIter->GetChar(); + pField = (CFDE_TxtEdtField*)((dwCur << 16) | dwPre); + pIter->Release(); + return TRUE; + } + if (wc == FDE_TXTEDT_FORMATBLOCK_END) { + pIter->Release(); + return FALSE; + } + } while (pIter->Next(TRUE)); + pIter->Release(); + return FALSE; +} +FX_BOOL CFDE_TxtEdtEngine::FindEditableField(int32_t nIndex, + int32_t& nBgn, + int32_t& nEnd, + CFDE_TxtEdtField*& pField, + FX_BOOL bForward) { + FX_WCHAR wcFirst = FDE_TXTEDT_FORMATBLOCK_BGN; + FX_WCHAR wcSecond = FDE_TXTEDT_FORMATBLOCK_END; + if (!bForward) { + wcFirst = FDE_TXTEDT_FORMATBLOCK_END; + wcSecond = FDE_TXTEDT_FORMATBLOCK_BGN; + } + CFDE_TxtEdtBufIter* pIter = + new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf, FALSE); + pIter->SetAt(nIndex); + int32_t bFind = FALSE; + do { + FX_WCHAR wc = pIter->GetChar(); + if (wc == wcFirst) { + nBgn = pIter->GetAt(); + bFind = TRUE; + break; + } + } while (pIter->Next(!bForward)); + if (!bFind) { + pIter->Release(); + return FALSE; + } + bFind = FALSE; + do { + FX_WCHAR wc = pIter->GetChar(); + if (wc == wcSecond) { + nEnd = pIter->GetAt(); + bFind = TRUE; + break; + } + } while (pIter->Next(!bForward)); + FXSYS_assert(bFind); + if (!bForward) { + int32_t nTemp = nBgn; + nBgn = nEnd; + nEnd = nTemp; + } + pIter->SetAt(nBgn + 1); + FX_DWORD dwPre = (FX_DWORD)pIter->GetChar(); + pIter->Next(); + FX_DWORD dwCur = (FX_DWORD)pIter->GetChar(); + pField = (CFDE_TxtEdtField*)((dwCur << 16) | dwPre); + pIter->Release(); + if (!pField->IsFix()) { + return TRUE; + } + return FindEditableField((bForward ? nEnd : nBgn), nBgn, nEnd, pField, + bForward); +} +FX_BOOL CFDE_TxtEdtEngine::Move2NextEditableField(int32_t nIndex, + FX_BOOL bForward, + FX_BOOL bSelect) { + if (m_SelRangePtrArr.GetSize() > 0) { + ClearSelection(); + m_Param.pEventSink->On_SelChanged(this); + } + int32_t nBgn = 0, nEnd = 0; + CFDE_TxtEdtField* pField = NULL; + FX_BOOL bRet = FindEditableField(nIndex, nBgn, nEnd, pField, bForward); + if (!bRet) { + return FALSE; + } + int32_t nEditableBgn = 0, nEditableEnd = 0; + pField->GetEditableRange(nEditableBgn, nEditableEnd); + nEditableBgn += nBgn; + nEditableEnd += nBgn; + if (bSelect) { + int32_t nRangeCount = nEditableEnd - nEditableBgn; + if (nRangeCount > 0) { + AddSelRange(nEditableBgn, nEditableEnd - nEditableBgn); + } + } + SetCaretPos(nEditableEnd, TRUE); + return TRUE; +} +int32_t CFDE_TxtEdtEngine::GetRealIndex(int32_t nIndex) const { + CFDE_TxtEdtBufIter* pIter = + new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf, FALSE); + pIter->SetAt(0); + FX_BOOL bInField = FALSE; + int32_t nFieldBgn = 0; + int32_t nRealIndex = 0; + for (int32_t i = 0; i <= nIndex; i++) { + FX_WCHAR wc = pIter->GetChar(); + if (bInField) { + if (wc == FDE_TXTEDT_FORMATBLOCK_END) { + FX_DWORD dwPre = (FX_DWORD)m_pTxtBuf->GetCharByIndex(nFieldBgn + 1); + FX_DWORD dwCur = (FX_DWORD)m_pTxtBuf->GetCharByIndex(nFieldBgn + 2); + CFDE_TxtEdtField* pField = (CFDE_TxtEdtField*)((dwCur << 16) | dwPre); + nRealIndex += pField->GetFieldTextLength(); + bInField = FALSE; + } + } else { + if (wc == FDE_TXTEDT_FORMATBLOCK_BGN) { + bInField = TRUE; + nFieldBgn = pIter->GetAt(); + } else { + nRealIndex++; + } + } + pIter->Next(); + } + if (!bInField) { + pIter->Release(); + return nRealIndex; + } + pIter->SetAt(nFieldBgn + 1); + FX_DWORD dwPre = (FX_DWORD)pIter->GetChar(); + pIter->Next(); + FX_DWORD dwCur = (FX_DWORD)pIter->GetChar(); + CFDE_TxtEdtField* pField = (CFDE_TxtEdtField*)((dwCur << 16) | dwPre); + pIter->Release(); + if (pField->IsFix()) { + int32_t nDelta = nIndex - nFieldBgn - FDE_FORMAT_EDIT_FIELD_HADERSIZE + 1; + return nRealIndex + (nDelta > 0 ? nDelta : 0); + } else { + return nRealIndex + pField->GetRealIndex(nIndex - nFieldBgn); + } +} +#endif +FX_BOOL CFDE_TxtEdtEngine::IsFitArea(CFX_WideString& wsText) { + IFDE_TextOut* pTextOut = IFDE_TextOut::Create(); + pTextOut->SetLineSpace(m_Param.fLineSpace); + pTextOut->SetFont(m_Param.pFont); + pTextOut->SetFontSize(m_Param.fFontSize); + CFX_RectF rcText; + FXSYS_memset(&rcText, 0, sizeof(rcText)); + FX_DWORD dwStyle = 0; + if (!(m_Param.dwMode & FDE_TEXTEDITMODE_MultiLines)) { + dwStyle |= FDE_TTOSTYLE_SingleLine; + } + if (m_Param.dwMode & FDE_TEXTEDITMODE_AutoLineWrap) { + dwStyle |= FDE_TTOSTYLE_LineWrap; + rcText.width = m_Param.fPlateWidth; + } else { + rcText.width = 65535; + } + pTextOut->SetStyles(dwStyle); + wsText += L"\n"; + pTextOut->CalcLogicSize(wsText, wsText.GetLength(), rcText); + pTextOut->Release(); + wsText.Delete(wsText.GetLength() - 1); + if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz) && + (rcText.width > m_Param.fPlateWidth)) { + return FALSE; + } + if ((m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Vert) && + (rcText.height > m_Param.fLineSpace * m_Param.nLineCount)) { + return FALSE; + } + return TRUE; +} +void CFDE_TxtEdtEngine::UpdateCaretRect(int32_t nIndex, FX_BOOL bBefore) { + MovePage2Char(nIndex); + GetCaretRect(m_rtCaret, m_nCaretPage, nIndex, bBefore); + m_nCaret = nIndex; + m_bBefore = bBefore; + if (!m_bBefore) { + m_nCaret++; + m_bBefore = TRUE; + } + m_fCaretPosReserve = (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) + ? m_rtCaret.top + : m_rtCaret.left; + m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage, 0); +} +void CFDE_TxtEdtEngine::GetCaretRect(CFX_RectF& rtCaret, + int32_t nPageIndex, + int32_t nCaret, + FX_BOOL bBefore) { + IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage]; + m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); + FX_BOOL bCombText = m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText; + int32_t nIndexInpage = nCaret - pPage->GetCharStart(); + if (bBefore && bCombText && nIndexInpage > 0) { + nIndexInpage--; + bBefore = FALSE; + } + int32_t nBIDILevel = pPage->GetCharRect(nIndexInpage, rtCaret, bCombText); + if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) { + if ((!FX_IsOdd(nBIDILevel) && !bBefore) || + (FX_IsOdd(nBIDILevel) && bBefore)) { + rtCaret.Offset(0, rtCaret.height - 1.0f); + } + if (rtCaret.height == 0 && rtCaret.top > 1.0f) { + rtCaret.top -= 1.0f; + } + rtCaret.height = 1.0f; + } else { + if ((!FX_IsOdd(nBIDILevel) && !bBefore) || + (FX_IsOdd(nBIDILevel) && bBefore)) { + rtCaret.Offset(rtCaret.width - 1.0f, 0); + } + if (rtCaret.width == 0 && rtCaret.left > 1.0f) { + rtCaret.left -= 1.0f; + } + rtCaret.width = 1.0f; + } + m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); +} +void CFDE_TxtEdtEngine::UpdateCaretIndex(const CFX_PointF& ptCaret) { + IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage]; + m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); + m_nCaret = pPage->GetCharIndex(ptCaret, m_bBefore); + GetCaretRect(m_rtCaret, m_nCaretPage, m_nCaret, m_bBefore); + if (!m_bBefore) { + m_nCaret++; + m_bBefore = TRUE; + } + m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage); + m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); +} +FX_BOOL CFDE_TxtEdtEngine::IsSelect() { + return m_SelRangePtrArr.GetSize() > 0; +} +void CFDE_TxtEdtEngine::DeleteSelect() { + int32_t nCountRange = CountSelRanges(); + if (nCountRange > 0) { +#ifdef FDE_USEFORMATBLOCK + int32_t nBlockCount = m_BlockArray.GetSize(); + if (nBlockCount > 0) { + if (nCountRange > 1) { + return; + } + int32_t nSelStart; + int32_t nSelCount; + nSelCount = GetSelRange(0, nSelStart); + int32_t nSelEnd = nSelStart + nSelCount; + int32_t nBgn = 0; + int32_t nEnd = 0; + CFDE_TxtEdtField* pField = NULL; + FX_BOOL bInField = GetFieldBoundary(nSelStart, nBgn, nEnd, pField); + int32_t nCaretInField = nSelStart - nBgn; + FX_BOOL bBefore = FALSE; + if (!bInField || pField->IsFix() || nSelEnd > nEnd) { + return; + } + pField->Backup(); + CFX_WideString wsDel; + int32_t nCaret = 0; + int32_t nRet = + pField->Delete(nCaretInField, nSelCount, wsDel, nCaret, bBefore); + nCaret += nBgn; + switch (nRet) { + case FDE_FORMAT_FIELD_DELETE_RET_S: + break; + case FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE: + case FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY: + return; + default: + FXSYS_assert(0); + break; + } + CFX_WideString wsField; + pField->GetFieldText(wsField); + if (!m_Param.pEventSink->On_ValidateField( + this, pField->GetBlockIndex(), pField->GetIndex(), wsField, 0)) { + pField->Restore(); + return; + } + CFX_WideString wsDisplay; + pField->GetDisplayText(wsDisplay); + Replace(nBgn, nEnd - nBgn + 1, wsDisplay); + if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { + IFDE_TxtEdtDoRecord* pRecord = new CFDE_TxtEdtDoRecord_FieldDelete( + this, nSelStart, pField, nCaretInField, nBgn, nEnd - nBgn + 1, + wsDisplay.GetLength(), wsDel, FALSE); + CFX_ByteString bsDoRecord; + pRecord->Serialize(bsDoRecord); + m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord); + pRecord->Release(); + } + SetCaretPos(nSelStart, bBefore); + return; + } +#endif + int32_t nSelStart; + int32_t nSelCount; + while (nCountRange > 0) { + nSelCount = GetSelRange(--nCountRange, nSelStart); + FDE_LPTXTEDTSELRANGE lpTemp = m_SelRangePtrArr[nCountRange]; + delete lpTemp; + m_SelRangePtrArr.RemoveAt(nCountRange); + DeleteRange_DoRecord(nSelStart, nSelCount, TRUE); + } + ClearSelection(); + m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); + m_Param.pEventSink->On_SelChanged(this); + SetCaretPos(nSelStart, TRUE); + return; + } +} +IFDE_TxtEdtDoRecord* IFDE_TxtEdtDoRecord::Create( + const CFX_ByteStringC& bsDoRecord) { + const FX_CHAR* lpBuf = bsDoRecord.GetCStr(); + int32_t nType = *((int32_t*)lpBuf); + switch (nType) { + case FDE_TXTEDT_DORECORD_INS: + return new CFDE_TxtEdtDoRecord_Insert(bsDoRecord); + case FDE_TXTEDT_DORECORD_DEL: + return new CFDE_TxtEdtDoRecord_DeleteRange(bsDoRecord); +#ifdef FDE_USEFORMATBLOCK + case FDE_TXTEDT_DORECORD_FORMATINS: + return new CFDE_TxtEdtDoRecord_FieldInsert(bsDoRecord); + case FDE_TXTEDT_DORECORD_FORMATDEL: + return new CFDE_TxtEdtDoRecord_FieldDelete(bsDoRecord); + case FDE_TXTEDT_DORECORD_FORMATREP: + return new CFDE_TxtEdtDoRecord_FieldReplace(bsDoRecord); +#endif + default: + break; + } + return NULL; +} +CFDE_TxtEdtDoRecord_Insert::CFDE_TxtEdtDoRecord_Insert( + const CFX_ByteStringC& bsDoRecord) { + Deserialize(bsDoRecord); +} +CFDE_TxtEdtDoRecord_Insert::CFDE_TxtEdtDoRecord_Insert( + CFDE_TxtEdtEngine* pEngine, + int32_t nCaret, + const FX_WCHAR* lpText, + int32_t nLength) + : m_pEngine(pEngine), m_nCaret(nCaret) { + FXSYS_assert(pEngine); + FX_WCHAR* lpBuffer = m_wsInsert.GetBuffer(nLength); + FXSYS_memcpy(lpBuffer, lpText, nLength * sizeof(FX_WCHAR)); + m_wsInsert.ReleaseBuffer(); +} +CFDE_TxtEdtDoRecord_Insert::~CFDE_TxtEdtDoRecord_Insert() {} +void CFDE_TxtEdtDoRecord_Insert::Release() { + delete this; +} +FX_BOOL CFDE_TxtEdtDoRecord_Insert::Undo() { + if (m_pEngine->IsSelect()) { + m_pEngine->ClearSelection(); + } + m_pEngine->Inner_DeleteRange(m_nCaret, m_wsInsert.GetLength()); + FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param; + m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete; + m_pEngine->m_ChangeInfo.wsDelete = m_wsInsert; + Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo); + m_pEngine->SetCaretPos(m_nCaret, TRUE); + return TRUE; +} +FX_BOOL CFDE_TxtEdtDoRecord_Insert::Redo() { + m_pEngine->Inner_Insert(m_nCaret, m_wsInsert.c_str(), m_wsInsert.GetLength()); + FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param; + m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; + m_pEngine->m_ChangeInfo.wsDelete = m_wsInsert; + Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo); + m_pEngine->SetCaretPos(m_nCaret, FALSE); + return TRUE; +} +void CFDE_TxtEdtDoRecord_Insert::Serialize(CFX_ByteString& bsDoRecord) const { + CFX_ArchiveSaver ArchiveSaver; + ArchiveSaver << int32_t(FDE_TXTEDT_DORECORD_INS); + ArchiveSaver << (int32_t)(uintptr_t)m_pEngine; + ArchiveSaver << m_nCaret; + ArchiveSaver << m_wsInsert; + int32_t nLength = ArchiveSaver.GetLength(); + const uint8_t* lpSrcBuf = ArchiveSaver.GetBuffer(); + FX_CHAR* lpDstBuf = bsDoRecord.GetBuffer(nLength); + FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength); + bsDoRecord.ReleaseBuffer(nLength); +} +void CFDE_TxtEdtDoRecord_Insert::Deserialize( + const CFX_ByteStringC& bsDoRecord) { + CFX_ArchiveLoader ArchiveLoader((const uint8_t*)bsDoRecord.GetCStr(), + bsDoRecord.GetLength()); + int32_t nType = 0; + ArchiveLoader >> nType; + FXSYS_assert(nType == FDE_TXTEDT_DORECORD_INS); + int32_t nEngine = 0; + ArchiveLoader >> nEngine; + m_pEngine = (CFDE_TxtEdtEngine*)(uintptr_t)nEngine; + ArchiveLoader >> m_nCaret; + ArchiveLoader >> m_wsInsert; +} +CFDE_TxtEdtDoRecord_DeleteRange::CFDE_TxtEdtDoRecord_DeleteRange( + const CFX_ByteStringC& bsDoRecord) { + Deserialize(bsDoRecord); +} +CFDE_TxtEdtDoRecord_DeleteRange::CFDE_TxtEdtDoRecord_DeleteRange( + CFDE_TxtEdtEngine* pEngine, + int32_t nIndex, + int32_t nCaret, + const CFX_WideString& wsRange, + FX_BOOL bSel) + : m_pEngine(pEngine), + m_bSel(bSel), + m_nIndex(nIndex), + m_nCaret(nCaret), + m_wsRange(wsRange) { + FXSYS_assert(pEngine); +} +CFDE_TxtEdtDoRecord_DeleteRange::~CFDE_TxtEdtDoRecord_DeleteRange() {} +void CFDE_TxtEdtDoRecord_DeleteRange::Release() { + delete this; +} +FX_BOOL CFDE_TxtEdtDoRecord_DeleteRange::Undo() { + if (m_pEngine->IsSelect()) { + m_pEngine->ClearSelection(); + } + m_pEngine->Inner_Insert(m_nIndex, m_wsRange.c_str(), m_wsRange.GetLength()); + if (m_bSel) { + m_pEngine->AddSelRange(m_nIndex, m_wsRange.GetLength()); + } + FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param; + m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; + m_pEngine->m_ChangeInfo.wsDelete = m_wsRange; + Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo); + m_pEngine->SetCaretPos(m_nCaret, TRUE); + return TRUE; +} +FX_BOOL CFDE_TxtEdtDoRecord_DeleteRange::Redo() { + m_pEngine->Inner_DeleteRange(m_nIndex, m_wsRange.GetLength()); + if (m_bSel) { + m_pEngine->RemoveSelRange(m_nIndex, m_wsRange.GetLength()); + } + FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param; + m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; + m_pEngine->m_ChangeInfo.wsDelete = m_wsRange; + Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo); + m_pEngine->SetCaretPos(m_nIndex, TRUE); + return TRUE; +} +void CFDE_TxtEdtDoRecord_DeleteRange::Serialize( + CFX_ByteString& bsDoRecord) const { + CFX_ArchiveSaver ArchiveSaver; + ArchiveSaver << int32_t(FDE_TXTEDT_DORECORD_DEL); + ArchiveSaver << (int32_t)(uintptr_t)m_pEngine; + ArchiveSaver << (int32_t)m_bSel; + ArchiveSaver << m_nIndex; + ArchiveSaver << m_nCaret; + ArchiveSaver << m_wsRange; + int32_t nLength = ArchiveSaver.GetLength(); + const uint8_t* lpSrcBuf = ArchiveSaver.GetBuffer(); + FX_CHAR* lpDstBuf = bsDoRecord.GetBuffer(nLength); + FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength); + bsDoRecord.ReleaseBuffer(nLength); +} +void CFDE_TxtEdtDoRecord_DeleteRange::Deserialize( + const CFX_ByteStringC& bsDoRecord) { + CFX_ArchiveLoader ArchiveLoader((const uint8_t*)bsDoRecord.GetCStr(), + bsDoRecord.GetLength()); + int32_t nType = 0; + ArchiveLoader >> nType; + FXSYS_assert(nType == FDE_TXTEDT_DORECORD_DEL); + int32_t nEngine = 0; + ArchiveLoader >> nEngine; + m_pEngine = (CFDE_TxtEdtEngine*)(uintptr_t)nEngine; + int32_t iSel = 0; + ArchiveLoader >> iSel; + m_bSel = !!iSel; + ArchiveLoader >> m_nIndex; + ArchiveLoader >> m_nCaret; + ArchiveLoader >> m_wsRange; +} +#ifdef FDE_USEFORMATBLOCK +CFDE_TxtEdtDoRecord_FieldInsert::CFDE_TxtEdtDoRecord_FieldInsert( + const CFX_ByteStringC& bsDoRecord) { + Deserialize(bsDoRecord); +} +CFDE_TxtEdtDoRecord_FieldInsert::CFDE_TxtEdtDoRecord_FieldInsert( + CFDE_TxtEdtEngine* pEngine, + int32_t nCaret, + CFDE_TxtEdtField* pField, + int32_t nIndexInField, + int32_t nFieldBgn, + int32_t nOldFieldLength, + int32_t nNewFieldLength, + const CFX_WideString& wsIns, + FX_BOOL bSel) + : m_pEngine(pEngine), + m_nCaret(nCaret), + m_pField(pField), + m_nIndexInField(nIndexInField), + m_nFieldBgn(nFieldBgn), + m_nOldFieldLength(nOldFieldLength), + m_nNewFieldLength(nNewFieldLength), + m_wsIns(wsIns), + m_bSel(bSel) { + FXSYS_assert(pEngine); + FXSYS_assert(pField); +} +CFDE_TxtEdtDoRecord_FieldInsert::~CFDE_TxtEdtDoRecord_FieldInsert() {} +void CFDE_TxtEdtDoRecord_FieldInsert::Release() { + delete this; +} +FX_BOOL CFDE_TxtEdtDoRecord_FieldInsert::Undo() { + CFX_WideString wsDel; + int32_t nCaret = 0; + FX_BOOL bBefore = FALSE; + int32_t nRet = m_pField->Delete(m_nIndexInField, m_wsIns.GetLength(), wsDel, + nCaret, bBefore); + FXSYS_assert(nRet != FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE && + nRet != FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY); + CFX_WideString wsDisplay; + m_pField->GetDisplayText(wsDisplay); + m_pEngine->Replace(m_nFieldBgn, m_nNewFieldLength, wsDisplay); + m_pEngine->SetCaretPos(m_nCaret, TRUE); + return TRUE; +} +FX_BOOL CFDE_TxtEdtDoRecord_FieldInsert::Redo() { + int32_t nCaret = 0; + FX_BOOL bBefore = FALSE; + int32_t nRet = m_pField->Insert(m_nIndexInField, m_wsIns, nCaret, bBefore); + FXSYS_assert(nRet != FDE_FORMAT_FIELD_INSERT_RET_F_FULL && + nRet != FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE); + CFX_WideString wsDisplay; + m_pField->GetDisplayText(wsDisplay); + m_pEngine->Replace(m_nFieldBgn, m_nOldFieldLength, wsDisplay); + m_pEngine->SetCaretPos(m_nCaret + m_wsIns.GetLength(), TRUE); + return TRUE; +} +void CFDE_TxtEdtDoRecord_FieldInsert::Serialize( + CFX_ByteString& bsDoRecord) const { + CFX_ArchiveSaver ArchiveSaver; + ArchiveSaver << int32_t(FDE_TXTEDT_DORECORD_FORMATINS); + ArchiveSaver << int32_t(m_pEngine); + ArchiveSaver << m_nCaret; + ArchiveSaver << int32_t(m_pField); + ArchiveSaver << m_nIndexInField; + ArchiveSaver << m_nFieldBgn; + ArchiveSaver << m_nOldFieldLength; + ArchiveSaver << m_nNewFieldLength; + ArchiveSaver << m_wsIns; + ArchiveSaver << m_bSel; + int32_t nLength = ArchiveSaver.GetLength(); + const uint8_t* lpSrcBuf = ArchiveSaver.GetBuffer(); + FX_CHAR* lpDstBuf = bsDoRecord.GetBuffer(nLength); + FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength); + bsDoRecord.ReleaseBuffer(nLength); +} +void CFDE_TxtEdtDoRecord_FieldInsert::Deserialize( + const CFX_ByteStringC& bsDoRecord) { + CFX_ArchiveLoader ArchiveLoader((const uint8_t*)bsDoRecord.GetCStr(), + bsDoRecord.GetLength()); + int32_t nType = 0; + ArchiveLoader >> nType; + FXSYS_assert(nType == FDE_TXTEDT_DORECORD_FORMATINS); + int32_t nEngine = 0; + ArchiveLoader >> nEngine; + m_pEngine = (CFDE_TxtEdtEngine*)(uintptr_t)nEngine; + ArchiveLoader >> m_nCaret; + int32_t nField = 0; + ArchiveLoader >> nField; + m_pField = (CFDE_TxtEdtField*)nField; + ArchiveLoader >> m_nIndexInField; + ArchiveLoader >> m_nFieldBgn; + ArchiveLoader >> m_nOldFieldLength; + ArchiveLoader >> m_nNewFieldLength; + ArchiveLoader >> m_wsIns; + ArchiveLoader >> m_bSel; +} +CFDE_TxtEdtDoRecord_FieldDelete::CFDE_TxtEdtDoRecord_FieldDelete( + const CFX_ByteStringC& bsDoRecord) { + Deserialize(bsDoRecord); +} +CFDE_TxtEdtDoRecord_FieldDelete::CFDE_TxtEdtDoRecord_FieldDelete( + CFDE_TxtEdtEngine* pEngine, + int32_t nCaret, + CFDE_TxtEdtField* pField, + int32_t nIndexInField, + int32_t nFieldBgn, + int32_t nOldLength, + int32_t nNewLength, + const CFX_WideString& wsDel, + FX_BOOL bSel) + : m_pEngine(pEngine), + m_nCaret(nCaret), + m_pField(pField), + m_nIndexInField(nIndexInField), + m_nFieldBgn(nFieldBgn), + m_nOldFieldLength(nOldLength), + m_nNewFieldLength(nNewLength), + m_wsDel(wsDel), + m_bSel(bSel) { + FXSYS_assert(m_pEngine); + FXSYS_assert(m_pField); +} +CFDE_TxtEdtDoRecord_FieldDelete::~CFDE_TxtEdtDoRecord_FieldDelete() {} +void CFDE_TxtEdtDoRecord_FieldDelete::Release() { + delete this; +} +FX_BOOL CFDE_TxtEdtDoRecord_FieldDelete::Undo() { + int32_t nCaret = 0; + FX_BOOL bBefore = FALSE; + int32_t nRet = m_pField->Insert(m_nIndexInField, m_wsDel, nCaret, bBefore); + FXSYS_assert(nRet != FDE_FORMAT_FIELD_INSERT_RET_F_FULL && + nRet != FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE); + CFX_WideString wsDisplay; + m_pField->GetDisplayText(wsDisplay); + m_pEngine->Replace(m_nFieldBgn, m_nNewFieldLength, wsDisplay); + m_pEngine->SetCaretPos(m_nCaret, TRUE); + return TRUE; +} +FX_BOOL CFDE_TxtEdtDoRecord_FieldDelete::Redo() { + int32_t nCaret = 0; + FX_BOOL bBefore = 0; + CFX_WideString wsDel; + int32_t nRet = m_pField->Delete(m_nIndexInField, m_wsDel.GetLength(), wsDel, + nCaret, bBefore); + FXSYS_assert(nRet != FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE && + nRet != FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY); + CFX_WideString wsDisplay; + m_pField->GetDisplayText(wsDisplay); + m_pEngine->Replace(m_nFieldBgn, m_nOldFieldLength, wsDisplay); + m_pEngine->SetCaretPos(m_nCaret - m_wsDel.GetLength(), TRUE); + return TRUE; +} +void CFDE_TxtEdtDoRecord_FieldDelete::Serialize( + CFX_ByteString& bsDoRecord) const { + CFX_ArchiveSaver ArchiveSaver; + ArchiveSaver << int32_t(FDE_TXTEDT_DORECORD_FORMATDEL); + ArchiveSaver << int32_t(m_pEngine); + ArchiveSaver << m_nCaret; + ArchiveSaver << int32_t(m_pField); + ArchiveSaver << m_nIndexInField; + ArchiveSaver << m_nFieldBgn; + ArchiveSaver << m_nOldFieldLength; + ArchiveSaver << m_nNewFieldLength; + ArchiveSaver << m_wsDel; + ArchiveSaver << m_bSel; + int32_t nLength = ArchiveSaver.GetLength(); + const uint8_t* lpSrcBuf = ArchiveSaver.GetBuffer(); + FX_CHAR* lpDstBuf = bsDoRecord.GetBuffer(nLength); + FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength); + bsDoRecord.ReleaseBuffer(nLength); +} +void CFDE_TxtEdtDoRecord_FieldDelete::Deserialize( + const CFX_ByteStringC& bsDoRecord) { + CFX_ArchiveLoader ArchiveLoader((const uint8_t*)bsDoRecord.GetCStr(), + bsDoRecord.GetLength()); + int32_t nType = 0; + ArchiveLoader >> nType; + FXSYS_assert(nType == FDE_TXTEDT_DORECORD_FORMATDEL); + int32_t nEngine = 0; + ArchiveLoader >> nEngine; + m_pEngine = (CFDE_TxtEdtEngine*)(uintptr_t)nEngine; + ArchiveLoader >> m_nCaret; + int32_t nField = 0; + ArchiveLoader >> nField; + m_pField = (CFDE_TxtEdtField*)nField; + ArchiveLoader >> m_nIndexInField; + ArchiveLoader >> m_nFieldBgn; + ArchiveLoader >> m_nOldFieldLength; + ArchiveLoader >> m_nNewFieldLength; + ArchiveLoader >> m_wsDel; + ArchiveLoader >> m_bSel; +} +CFDE_TxtEdtDoRecord_FieldReplace::CFDE_TxtEdtDoRecord_FieldReplace( + const CFX_ByteStringC& bsDoRecord) { + Deserialize(bsDoRecord); +} +CFDE_TxtEdtDoRecord_FieldReplace::CFDE_TxtEdtDoRecord_FieldReplace( + CFDE_TxtEdtEngine* pEngine, + int32_t nCaret, + int32_t nNewCaret, + CFDE_TxtEdtField* pField, + int32_t nIndexInField, + int32_t nFieldBgn, + int32_t nFieldNewLength, + const CFX_WideString& wsDel, + const CFX_WideString& wsIns, + FX_BOOL bSel) + : m_pEngine(pEngine), + m_nCaret(nCaret), + m_nNewCaret(nNewCaret), + m_pField(pField), + m_nIndexInField(nIndexInField), + m_nFieldBgn(nFieldBgn), + m_nFieldNewLength(nFieldNewLength), + m_wsDel(wsDel), + m_wsIns(wsIns), + m_bSel(bSel) { + FXSYS_assert(m_pEngine); + FXSYS_assert(m_pField); +} +CFDE_TxtEdtDoRecord_FieldReplace::~CFDE_TxtEdtDoRecord_FieldReplace() {} +void CFDE_TxtEdtDoRecord_FieldReplace::Release() { + delete this; +} +FX_BOOL CFDE_TxtEdtDoRecord_FieldReplace::Undo() { + CFX_WideString wsDel; + int32_t nCaret = 0; + FX_BOOL bBefore = FALSE; + int32_t nRet = m_pField->Replace(m_nIndexInField, m_wsIns.GetLength(), + m_wsDel, wsDel, nCaret, bBefore); + FXSYS_assert(nRet != FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE && + nRet != FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY); + CFX_WideString wsDisplay; + m_pField->GetDisplayText(wsDisplay); + m_pEngine->Replace(m_nFieldBgn, m_nFieldNewLength, wsDisplay); + m_pEngine->SetCaretPos(m_nCaret, TRUE); + return TRUE; +} +FX_BOOL CFDE_TxtEdtDoRecord_FieldReplace::Redo() { + CFX_WideString wsDel; + int32_t nCaret = 0; + FX_BOOL bBefore = FALSE; + int32_t nRet = m_pField->Replace(m_nIndexInField, m_wsDel.GetLength(), + m_wsIns, wsDel, nCaret, bBefore); + FXSYS_assert(nRet != FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE && + nRet != FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY); + CFX_WideString wsDisplay; + m_pField->GetDisplayText(wsDisplay); + m_pEngine->Replace(m_nFieldBgn, m_nFieldNewLength, wsDisplay); + m_pEngine->SetCaretPos(m_nNewCaret, TRUE); + return TRUE; +} +void CFDE_TxtEdtDoRecord_FieldReplace::Serialize( + CFX_ByteString& bsDoRecord) const { + CFX_ArchiveSaver ArchiveSaver; + ArchiveSaver << int32_t(FDE_TXTEDT_DORECORD_FORMATREP); + ArchiveSaver << int32_t(m_pEngine); + ArchiveSaver << m_nCaret; + ArchiveSaver << m_nNewCaret; + ArchiveSaver << int32_t(m_pField); + ArchiveSaver << m_nIndexInField; + ArchiveSaver << m_nFieldBgn; + ArchiveSaver << m_nFieldNewLength; + ArchiveSaver << m_wsDel; + ArchiveSaver << m_wsIns; + ArchiveSaver << m_bSel; + int32_t nLength = ArchiveSaver.GetLength(); + const uint8_t* lpSrcBuf = ArchiveSaver.GetBuffer(); + FX_CHAR* lpDstBuf = bsDoRecord.GetBuffer(nLength); + FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength); + bsDoRecord.ReleaseBuffer(nLength); +} +void CFDE_TxtEdtDoRecord_FieldReplace::Deserialize( + const CFX_ByteStringC& bsDoRecord) { + CFX_ArchiveLoader ArchiveLoader((const uint8_t*)bsDoRecord.GetCStr(), + bsDoRecord.GetLength()); + int32_t nType = 0; + ArchiveLoader >> nType; + FXSYS_assert(nType == FDE_TXTEDT_DORECORD_FORMATREP); + int32_t nEngine = 0; + ArchiveLoader >> nEngine; + m_pEngine = (CFDE_TxtEdtEngine*)(uintptr_t)nEngine; + ArchiveLoader >> m_nCaret; + ArchiveLoader >> m_nNewCaret; + int32_t nField = 0; + ArchiveLoader >> nField; + m_pField = (CFDE_TxtEdtField*)nField; + ArchiveLoader >> m_nIndexInField; + ArchiveLoader >> m_nFieldBgn; + ArchiveLoader >> m_nFieldNewLength; + ArchiveLoader >> m_wsDel; + ArchiveLoader >> m_wsIns; + ArchiveLoader >> m_bSel; +} +#endif |