| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "xfa/fee/fde_txtedtengine.h" | 7 #include "xfa/fee/fde_txtedtengine.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { | 376 if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { |
| 377 CFX_WideString wsText; | 377 CFX_WideString wsText; |
| 378 GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength); | 378 GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength); |
| 379 if (!m_Param.pEventSink->On_Validate(this, wsText)) { | 379 if (!m_Param.pEventSink->On_Validate(this, wsText)) { |
| 380 return FDE_TXTEDT_MODIFY_RET_F_Invalidate; | 380 return FDE_TXTEDT_MODIFY_RET_F_Invalidate; |
| 381 } | 381 } |
| 382 } | 382 } |
| 383 if (IsSelect()) { | 383 if (IsSelect()) { |
| 384 DeleteSelect(); | 384 DeleteSelect(); |
| 385 } | 385 } |
| 386 if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { | 386 if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) |
| 387 IFDE_TxtEdtDoRecord* pRecord = | 387 m_Param.pEventSink->On_AddDoRecord( |
| 388 new CFDE_TxtEdtDoRecord_Insert(this, m_nCaret, lpBuffer, nLength); | 388 this, |
| 389 CFX_ByteString bsDoRecord; | 389 new CFDE_TxtEdtDoRecord_Insert(this, m_nCaret, lpBuffer, nLength)); |
| 390 pRecord->Serialize(bsDoRecord); | 390 |
| 391 m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord.AsStringC()); | |
| 392 pRecord->Release(); | |
| 393 } | |
| 394 GetText(m_ChangeInfo.wsPrevText, 0); | 391 GetText(m_ChangeInfo.wsPrevText, 0); |
| 395 Inner_Insert(m_nCaret, lpBuffer, nLength); | 392 Inner_Insert(m_nCaret, lpBuffer, nLength); |
| 396 m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; | 393 m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; |
| 397 m_ChangeInfo.wsInsert = CFX_WideString(lpBuffer, nLength); | 394 m_ChangeInfo.wsInsert = CFX_WideString(lpBuffer, nLength); |
| 398 nStart = m_nCaret; | 395 nStart = m_nCaret; |
| 399 nStart += nLength; | 396 nStart += nLength; |
| 400 FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1); | 397 FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1); |
| 401 FX_BOOL bBefore = TRUE; | 398 FX_BOOL bBefore = TRUE; |
| 402 if (wChar != L'\n' && wChar != L'\r') { | 399 if (wChar != L'\n' && wChar != L'\r') { |
| 403 nStart--; | 400 nStart--; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { | 437 if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { |
| 441 CFX_WideString wsText; | 438 CFX_WideString wsText; |
| 442 GetPreDeleteText(wsText, nStart, nCount); | 439 GetPreDeleteText(wsText, nStart, nCount); |
| 443 if (!m_Param.pEventSink->On_Validate(this, wsText)) { | 440 if (!m_Param.pEventSink->On_Validate(this, wsText)) { |
| 444 return FDE_TXTEDT_MODIFY_RET_F_Invalidate; | 441 return FDE_TXTEDT_MODIFY_RET_F_Invalidate; |
| 445 } | 442 } |
| 446 } | 443 } |
| 447 if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { | 444 if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { |
| 448 CFX_WideString wsRange; | 445 CFX_WideString wsRange; |
| 449 m_pTxtBuf->GetRange(wsRange, nStart, nCount); | 446 m_pTxtBuf->GetRange(wsRange, nStart, nCount); |
| 450 IFDE_TxtEdtDoRecord* pRecord = | 447 m_Param.pEventSink->On_AddDoRecord( |
| 451 new CFDE_TxtEdtDoRecord_DeleteRange(this, nStart, m_nCaret, wsRange); | 448 this, |
| 452 CFX_ByteString bsDoRecord; | 449 new CFDE_TxtEdtDoRecord_DeleteRange(this, nStart, m_nCaret, wsRange)); |
| 453 pRecord->Serialize(bsDoRecord); | |
| 454 m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord.AsStringC()); | |
| 455 pRecord->Release(); | |
| 456 } | 450 } |
| 457 m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete; | 451 m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete; |
| 458 GetText(m_ChangeInfo.wsDelete, nStart, nCount); | 452 GetText(m_ChangeInfo.wsDelete, nStart, nCount); |
| 459 Inner_DeleteRange(nStart, nCount); | 453 Inner_DeleteRange(nStart, nCount); |
| 460 SetCaretPos(nStart + ((!bBackspace && nStart > 0) ? -1 : 0), | 454 SetCaretPos(nStart + ((!bBackspace && nStart > 0) ? -1 : 0), |
| 461 (bBackspace || nStart == 0)); | 455 (bBackspace || nStart == 0)); |
| 462 m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); | 456 m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); |
| 463 return FDE_TXTEDT_MODIFY_RET_S_Normal; | 457 return FDE_TXTEDT_MODIFY_RET_S_Normal; |
| 464 } | 458 } |
| 465 int32_t CFDE_TxtEdtEngine::DeleteRange(int32_t nStart, int32_t nCount) { | 459 int32_t CFDE_TxtEdtEngine::DeleteRange(int32_t nStart, int32_t nCount) { |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 627 | 621 |
| 628 void CFDE_TxtEdtEngine::ClearSelection() { | 622 void CFDE_TxtEdtEngine::ClearSelection() { |
| 629 int32_t nCount = m_SelRangePtrArr.GetSize(); | 623 int32_t nCount = m_SelRangePtrArr.GetSize(); |
| 630 for (int i = 0; i < nCount; ++i) | 624 for (int i = 0; i < nCount; ++i) |
| 631 delete m_SelRangePtrArr[i]; | 625 delete m_SelRangePtrArr[i]; |
| 632 m_SelRangePtrArr.RemoveAll(); | 626 m_SelRangePtrArr.RemoveAll(); |
| 633 if (nCount && m_Param.pEventSink) | 627 if (nCount && m_Param.pEventSink) |
| 634 m_Param.pEventSink->On_SelChanged(this); | 628 m_Param.pEventSink->On_SelChanged(this); |
| 635 } | 629 } |
| 636 | 630 |
| 637 FX_BOOL CFDE_TxtEdtEngine::Redo(const CFX_ByteStringC& bsRedo) { | 631 FX_BOOL CFDE_TxtEdtEngine::Redo(const IFDE_TxtEdtDoRecord* pDoRecord) { |
| 638 if (IsLocked()) { | 632 if (IsLocked()) |
| 639 return FALSE; | 633 return FALSE; |
| 640 } | 634 if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) |
| 641 if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) { | |
| 642 return FALSE; | 635 return FALSE; |
| 643 } | 636 return pDoRecord->Redo(); |
| 644 IFDE_TxtEdtDoRecord* pDoRecord = IFDE_TxtEdtDoRecord::Create(bsRedo); | 637 } |
| 645 ASSERT(pDoRecord); | 638 |
| 646 if (pDoRecord == NULL) { | 639 FX_BOOL CFDE_TxtEdtEngine::Undo(const IFDE_TxtEdtDoRecord* pDoRecord) { |
| 640 if (IsLocked()) |
| 647 return FALSE; | 641 return FALSE; |
| 648 } | 642 if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) |
| 649 FX_BOOL bOK = pDoRecord->Redo(); | 643 return FALSE; |
| 650 pDoRecord->Release(); | 644 return pDoRecord->Undo(); |
| 651 return bOK; | |
| 652 } | 645 } |
| 653 FX_BOOL CFDE_TxtEdtEngine::Undo(const CFX_ByteStringC& bsUndo) { | 646 |
| 654 if (IsLocked()) { | |
| 655 return FALSE; | |
| 656 } | |
| 657 if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) { | |
| 658 return FALSE; | |
| 659 } | |
| 660 IFDE_TxtEdtDoRecord* pDoRecord = IFDE_TxtEdtDoRecord::Create(bsUndo); | |
| 661 ASSERT(pDoRecord); | |
| 662 if (pDoRecord == NULL) { | |
| 663 return FALSE; | |
| 664 } | |
| 665 FX_BOOL bOK = pDoRecord->Undo(); | |
| 666 pDoRecord->Release(); | |
| 667 return bOK; | |
| 668 } | |
| 669 int32_t CFDE_TxtEdtEngine::StartLayout() { | 647 int32_t CFDE_TxtEdtEngine::StartLayout() { |
| 670 Lock(); | 648 Lock(); |
| 671 RemoveAllPages(); | 649 RemoveAllPages(); |
| 672 m_nLayoutPos = 0; | 650 m_nLayoutPos = 0; |
| 673 m_nLineCount = 0; | 651 m_nLineCount = 0; |
| 674 return 0; | 652 return 0; |
| 675 } | 653 } |
| 676 int32_t CFDE_TxtEdtEngine::DoLayout(IFX_Pause* pPause) { | 654 int32_t CFDE_TxtEdtEngine::DoLayout(IFX_Pause* pPause) { |
| 677 int32_t nCount = m_ParagPtrArray.GetSize(); | 655 int32_t nCount = m_ParagPtrArray.GetSize(); |
| 678 CFDE_TxtEdtParag* pParag = NULL; | 656 CFDE_TxtEdtParag* pParag = NULL; |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 923 FX_BOOL bSel) { | 901 FX_BOOL bSel) { |
| 924 ASSERT(nStart >= 0); | 902 ASSERT(nStart >= 0); |
| 925 if (nCount == -1) { | 903 if (nCount == -1) { |
| 926 nCount = GetTextLength() - nStart; | 904 nCount = GetTextLength() - nStart; |
| 927 } | 905 } |
| 928 ASSERT((nStart + nCount) <= m_pTxtBuf->GetTextLength()); | 906 ASSERT((nStart + nCount) <= m_pTxtBuf->GetTextLength()); |
| 929 | 907 |
| 930 if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { | 908 if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { |
| 931 CFX_WideString wsRange; | 909 CFX_WideString wsRange; |
| 932 m_pTxtBuf->GetRange(wsRange, nStart, nCount); | 910 m_pTxtBuf->GetRange(wsRange, nStart, nCount); |
| 933 IFDE_TxtEdtDoRecord* pRecord = new CFDE_TxtEdtDoRecord_DeleteRange( | 911 m_Param.pEventSink->On_AddDoRecord( |
| 934 this, nStart, m_nCaret, wsRange, bSel); | 912 this, new CFDE_TxtEdtDoRecord_DeleteRange(this, nStart, m_nCaret, |
| 935 CFX_ByteString bsDoRecord; | 913 wsRange, bSel)); |
| 936 pRecord->Serialize(bsDoRecord); | |
| 937 m_Param.pEventSink->On_AddDoRecord(this, bsDoRecord.AsStringC()); | |
| 938 pRecord->Release(); | |
| 939 } | 914 } |
| 940 m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete; | 915 m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete; |
| 941 GetText(m_ChangeInfo.wsDelete, nStart, nCount); | 916 GetText(m_ChangeInfo.wsDelete, nStart, nCount); |
| 942 Inner_DeleteRange(nStart, nCount); | 917 Inner_DeleteRange(nStart, nCount); |
| 943 } | 918 } |
| 944 void CFDE_TxtEdtEngine::ResetEngine() { | 919 void CFDE_TxtEdtEngine::ResetEngine() { |
| 945 RemoveAllPages(); | 920 RemoveAllPages(); |
| 946 RemoveAllParags(); | 921 RemoveAllParags(); |
| 947 ClearSelection(); | 922 ClearSelection(); |
| 948 m_nCaret = 0; | 923 m_nCaret = 0; |
| (...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1594 DeleteRange_DoRecord(nSelStart, nSelCount, TRUE); | 1569 DeleteRange_DoRecord(nSelStart, nSelCount, TRUE); |
| 1595 } | 1570 } |
| 1596 ClearSelection(); | 1571 ClearSelection(); |
| 1597 m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); | 1572 m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); |
| 1598 m_Param.pEventSink->On_SelChanged(this); | 1573 m_Param.pEventSink->On_SelChanged(this); |
| 1599 SetCaretPos(nSelStart, TRUE); | 1574 SetCaretPos(nSelStart, TRUE); |
| 1600 return; | 1575 return; |
| 1601 } | 1576 } |
| 1602 } | 1577 } |
| 1603 | 1578 |
| 1604 IFDE_TxtEdtDoRecord* IFDE_TxtEdtDoRecord::Create( | |
| 1605 const CFX_ByteStringC& bsDoRecord) { | |
| 1606 const uint32_t* lpBuf = | |
| 1607 reinterpret_cast<const uint32_t*>(bsDoRecord.raw_str()); | |
| 1608 switch (*lpBuf) { | |
| 1609 case FDE_TXTEDT_DORECORD_INS: | |
| 1610 return new CFDE_TxtEdtDoRecord_Insert(bsDoRecord); | |
| 1611 case FDE_TXTEDT_DORECORD_DEL: | |
| 1612 return new CFDE_TxtEdtDoRecord_DeleteRange(bsDoRecord); | |
| 1613 default: | |
| 1614 return nullptr; | |
| 1615 } | |
| 1616 } | |
| 1617 | |
| 1618 CFDE_TxtEdtDoRecord_Insert::CFDE_TxtEdtDoRecord_Insert( | 1579 CFDE_TxtEdtDoRecord_Insert::CFDE_TxtEdtDoRecord_Insert( |
| 1619 const CFX_ByteStringC& bsDoRecord) { | |
| 1620 Deserialize(bsDoRecord); | |
| 1621 } | |
| 1622 CFDE_TxtEdtDoRecord_Insert::CFDE_TxtEdtDoRecord_Insert( | |
| 1623 CFDE_TxtEdtEngine* pEngine, | 1580 CFDE_TxtEdtEngine* pEngine, |
| 1624 int32_t nCaret, | 1581 int32_t nCaret, |
| 1625 const FX_WCHAR* lpText, | 1582 const FX_WCHAR* lpText, |
| 1626 int32_t nLength) | 1583 int32_t nLength) |
| 1627 : m_pEngine(pEngine), m_nCaret(nCaret) { | 1584 : m_pEngine(pEngine), m_nCaret(nCaret) { |
| 1628 ASSERT(pEngine); | 1585 ASSERT(pEngine); |
| 1629 FX_WCHAR* lpBuffer = m_wsInsert.GetBuffer(nLength); | 1586 FX_WCHAR* lpBuffer = m_wsInsert.GetBuffer(nLength); |
| 1630 FXSYS_memcpy(lpBuffer, lpText, nLength * sizeof(FX_WCHAR)); | 1587 FXSYS_memcpy(lpBuffer, lpText, nLength * sizeof(FX_WCHAR)); |
| 1631 m_wsInsert.ReleaseBuffer(); | 1588 m_wsInsert.ReleaseBuffer(); |
| 1632 } | 1589 } |
| 1590 |
| 1633 CFDE_TxtEdtDoRecord_Insert::~CFDE_TxtEdtDoRecord_Insert() {} | 1591 CFDE_TxtEdtDoRecord_Insert::~CFDE_TxtEdtDoRecord_Insert() {} |
| 1634 void CFDE_TxtEdtDoRecord_Insert::Release() { | 1592 |
| 1635 delete this; | 1593 FX_BOOL CFDE_TxtEdtDoRecord_Insert::Undo() const { |
| 1636 } | |
| 1637 FX_BOOL CFDE_TxtEdtDoRecord_Insert::Undo() { | |
| 1638 if (m_pEngine->IsSelect()) { | 1594 if (m_pEngine->IsSelect()) { |
| 1639 m_pEngine->ClearSelection(); | 1595 m_pEngine->ClearSelection(); |
| 1640 } | 1596 } |
| 1641 m_pEngine->Inner_DeleteRange(m_nCaret, m_wsInsert.GetLength()); | 1597 m_pEngine->Inner_DeleteRange(m_nCaret, m_wsInsert.GetLength()); |
| 1642 FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param; | 1598 FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param; |
| 1643 m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete; | 1599 m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete; |
| 1644 m_pEngine->m_ChangeInfo.wsDelete = m_wsInsert; | 1600 m_pEngine->m_ChangeInfo.wsDelete = m_wsInsert; |
| 1645 Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo); | 1601 Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo); |
| 1646 m_pEngine->SetCaretPos(m_nCaret, TRUE); | 1602 m_pEngine->SetCaretPos(m_nCaret, TRUE); |
| 1647 return TRUE; | 1603 return TRUE; |
| 1648 } | 1604 } |
| 1649 FX_BOOL CFDE_TxtEdtDoRecord_Insert::Redo() { | 1605 |
| 1606 FX_BOOL CFDE_TxtEdtDoRecord_Insert::Redo() const { |
| 1650 m_pEngine->Inner_Insert(m_nCaret, m_wsInsert.c_str(), m_wsInsert.GetLength()); | 1607 m_pEngine->Inner_Insert(m_nCaret, m_wsInsert.c_str(), m_wsInsert.GetLength()); |
| 1651 FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param; | 1608 FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param; |
| 1652 m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; | 1609 m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; |
| 1653 m_pEngine->m_ChangeInfo.wsDelete = m_wsInsert; | 1610 m_pEngine->m_ChangeInfo.wsDelete = m_wsInsert; |
| 1654 Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo); | 1611 Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo); |
| 1655 m_pEngine->SetCaretPos(m_nCaret, FALSE); | 1612 m_pEngine->SetCaretPos(m_nCaret, FALSE); |
| 1656 return TRUE; | 1613 return TRUE; |
| 1657 } | 1614 } |
| 1658 void CFDE_TxtEdtDoRecord_Insert::Serialize(CFX_ByteString& bsDoRecord) const { | 1615 |
| 1659 CFX_ArchiveSaver ArchiveSaver; | |
| 1660 ArchiveSaver << int32_t(FDE_TXTEDT_DORECORD_INS); | |
| 1661 ArchiveSaver << (int32_t)(uintptr_t)m_pEngine; | |
| 1662 ArchiveSaver << m_nCaret; | |
| 1663 ArchiveSaver << m_wsInsert; | |
| 1664 int32_t nLength = ArchiveSaver.GetLength(); | |
| 1665 const uint8_t* lpSrcBuf = ArchiveSaver.GetBuffer(); | |
| 1666 FX_CHAR* lpDstBuf = bsDoRecord.GetBuffer(nLength); | |
| 1667 FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength); | |
| 1668 bsDoRecord.ReleaseBuffer(nLength); | |
| 1669 } | |
| 1670 void CFDE_TxtEdtDoRecord_Insert::Deserialize( | |
| 1671 const CFX_ByteStringC& bsDoRecord) { | |
| 1672 CFX_ArchiveLoader ArchiveLoader(bsDoRecord.raw_str(), bsDoRecord.GetLength()); | |
| 1673 int32_t nType = 0; | |
| 1674 ArchiveLoader >> nType; | |
| 1675 ASSERT(nType == FDE_TXTEDT_DORECORD_INS); | |
| 1676 int32_t nEngine = 0; | |
| 1677 ArchiveLoader >> nEngine; | |
| 1678 m_pEngine = (CFDE_TxtEdtEngine*)(uintptr_t)nEngine; | |
| 1679 ArchiveLoader >> m_nCaret; | |
| 1680 ArchiveLoader >> m_wsInsert; | |
| 1681 } | |
| 1682 CFDE_TxtEdtDoRecord_DeleteRange::CFDE_TxtEdtDoRecord_DeleteRange( | |
| 1683 const CFX_ByteStringC& bsDoRecord) { | |
| 1684 Deserialize(bsDoRecord); | |
| 1685 } | |
| 1686 CFDE_TxtEdtDoRecord_DeleteRange::CFDE_TxtEdtDoRecord_DeleteRange( | 1616 CFDE_TxtEdtDoRecord_DeleteRange::CFDE_TxtEdtDoRecord_DeleteRange( |
| 1687 CFDE_TxtEdtEngine* pEngine, | 1617 CFDE_TxtEdtEngine* pEngine, |
| 1688 int32_t nIndex, | 1618 int32_t nIndex, |
| 1689 int32_t nCaret, | 1619 int32_t nCaret, |
| 1690 const CFX_WideString& wsRange, | 1620 const CFX_WideString& wsRange, |
| 1691 FX_BOOL bSel) | 1621 FX_BOOL bSel) |
| 1692 : m_pEngine(pEngine), | 1622 : m_pEngine(pEngine), |
| 1693 m_bSel(bSel), | 1623 m_bSel(bSel), |
| 1694 m_nIndex(nIndex), | 1624 m_nIndex(nIndex), |
| 1695 m_nCaret(nCaret), | 1625 m_nCaret(nCaret), |
| 1696 m_wsRange(wsRange) { | 1626 m_wsRange(wsRange) { |
| 1697 ASSERT(pEngine); | 1627 ASSERT(pEngine); |
| 1698 } | 1628 } |
| 1629 |
| 1699 CFDE_TxtEdtDoRecord_DeleteRange::~CFDE_TxtEdtDoRecord_DeleteRange() {} | 1630 CFDE_TxtEdtDoRecord_DeleteRange::~CFDE_TxtEdtDoRecord_DeleteRange() {} |
| 1700 void CFDE_TxtEdtDoRecord_DeleteRange::Release() { | 1631 |
| 1701 delete this; | 1632 FX_BOOL CFDE_TxtEdtDoRecord_DeleteRange::Undo() const { |
| 1702 } | |
| 1703 FX_BOOL CFDE_TxtEdtDoRecord_DeleteRange::Undo() { | |
| 1704 if (m_pEngine->IsSelect()) { | 1633 if (m_pEngine->IsSelect()) { |
| 1705 m_pEngine->ClearSelection(); | 1634 m_pEngine->ClearSelection(); |
| 1706 } | 1635 } |
| 1707 m_pEngine->Inner_Insert(m_nIndex, m_wsRange.c_str(), m_wsRange.GetLength()); | 1636 m_pEngine->Inner_Insert(m_nIndex, m_wsRange.c_str(), m_wsRange.GetLength()); |
| 1708 if (m_bSel) { | 1637 if (m_bSel) { |
| 1709 m_pEngine->AddSelRange(m_nIndex, m_wsRange.GetLength()); | 1638 m_pEngine->AddSelRange(m_nIndex, m_wsRange.GetLength()); |
| 1710 } | 1639 } |
| 1711 FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param; | 1640 FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param; |
| 1712 m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; | 1641 m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; |
| 1713 m_pEngine->m_ChangeInfo.wsDelete = m_wsRange; | 1642 m_pEngine->m_ChangeInfo.wsDelete = m_wsRange; |
| 1714 Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo); | 1643 Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo); |
| 1715 m_pEngine->SetCaretPos(m_nCaret, TRUE); | 1644 m_pEngine->SetCaretPos(m_nCaret, TRUE); |
| 1716 return TRUE; | 1645 return TRUE; |
| 1717 } | 1646 } |
| 1718 FX_BOOL CFDE_TxtEdtDoRecord_DeleteRange::Redo() { | 1647 |
| 1648 FX_BOOL CFDE_TxtEdtDoRecord_DeleteRange::Redo() const { |
| 1719 m_pEngine->Inner_DeleteRange(m_nIndex, m_wsRange.GetLength()); | 1649 m_pEngine->Inner_DeleteRange(m_nIndex, m_wsRange.GetLength()); |
| 1720 if (m_bSel) { | 1650 if (m_bSel) { |
| 1721 m_pEngine->RemoveSelRange(m_nIndex, m_wsRange.GetLength()); | 1651 m_pEngine->RemoveSelRange(m_nIndex, m_wsRange.GetLength()); |
| 1722 } | 1652 } |
| 1723 FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param; | 1653 FDE_TXTEDTPARAMS& Param = m_pEngine->m_Param; |
| 1724 m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; | 1654 m_pEngine->m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; |
| 1725 m_pEngine->m_ChangeInfo.wsDelete = m_wsRange; | 1655 m_pEngine->m_ChangeInfo.wsDelete = m_wsRange; |
| 1726 Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo); | 1656 Param.pEventSink->On_TextChanged(m_pEngine, m_pEngine->m_ChangeInfo); |
| 1727 m_pEngine->SetCaretPos(m_nIndex, TRUE); | 1657 m_pEngine->SetCaretPos(m_nIndex, TRUE); |
| 1728 return TRUE; | 1658 return TRUE; |
| 1729 } | 1659 } |
| 1730 void CFDE_TxtEdtDoRecord_DeleteRange::Serialize( | |
| 1731 CFX_ByteString& bsDoRecord) const { | |
| 1732 CFX_ArchiveSaver ArchiveSaver; | |
| 1733 ArchiveSaver << int32_t(FDE_TXTEDT_DORECORD_DEL); | |
| 1734 ArchiveSaver << (int32_t)(uintptr_t)m_pEngine; | |
| 1735 ArchiveSaver << (int32_t)m_bSel; | |
| 1736 ArchiveSaver << m_nIndex; | |
| 1737 ArchiveSaver << m_nCaret; | |
| 1738 ArchiveSaver << m_wsRange; | |
| 1739 int32_t nLength = ArchiveSaver.GetLength(); | |
| 1740 const uint8_t* lpSrcBuf = ArchiveSaver.GetBuffer(); | |
| 1741 FX_CHAR* lpDstBuf = bsDoRecord.GetBuffer(nLength); | |
| 1742 FXSYS_memcpy(lpDstBuf, lpSrcBuf, nLength); | |
| 1743 bsDoRecord.ReleaseBuffer(nLength); | |
| 1744 } | |
| 1745 void CFDE_TxtEdtDoRecord_DeleteRange::Deserialize( | |
| 1746 const CFX_ByteStringC& bsDoRecord) { | |
| 1747 CFX_ArchiveLoader ArchiveLoader(bsDoRecord.raw_str(), bsDoRecord.GetLength()); | |
| 1748 int32_t nType = 0; | |
| 1749 ArchiveLoader >> nType; | |
| 1750 ASSERT(nType == FDE_TXTEDT_DORECORD_DEL); | |
| 1751 int32_t nEngine = 0; | |
| 1752 ArchiveLoader >> nEngine; | |
| 1753 m_pEngine = (CFDE_TxtEdtEngine*)(uintptr_t)nEngine; | |
| 1754 int32_t iSel = 0; | |
| 1755 ArchiveLoader >> iSel; | |
| 1756 m_bSel = !!iSel; | |
| 1757 ArchiveLoader >> m_nIndex; | |
| 1758 ArchiveLoader >> m_nCaret; | |
| 1759 ArchiveLoader >> m_wsRange; | |
| 1760 } | |
| OLD | NEW |