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 |