diff options
Diffstat (limited to 'xfa/fde')
-rw-r--r-- | xfa/fde/cfde_txtedtengine.cpp | 269 | ||||
-rw-r--r-- | xfa/fde/cfde_txtedtengine.h | 7 |
2 files changed, 123 insertions, 153 deletions
diff --git a/xfa/fde/cfde_txtedtengine.cpp b/xfa/fde/cfde_txtedtengine.cpp index 7c2ba5c50f..76d26a7b74 100644 --- a/xfa/fde/cfde_txtedtengine.cpp +++ b/xfa/fde/cfde_txtedtengine.cpp @@ -7,6 +7,7 @@ #include "xfa/fde/cfde_txtedtengine.h" #include <algorithm> +#include <utility> #include "third_party/base/ptr_util.h" #include "xfa/fde/cfde_txtedtbuf.h" @@ -99,10 +100,9 @@ int32_t CFDE_TxtEdtEngine::CountPages() const { } CFDE_TxtEdtPage* CFDE_TxtEdtEngine::GetPage(int32_t nIndex) { - if (m_PagePtrArray.GetSize() <= nIndex) { + if (!pdfium::IndexInBounds(m_PagePtrArray, nIndex)) return nullptr; - } - return m_PagePtrArray[nIndex]; + return m_PagePtrArray[nIndex].get(); } void CFDE_TxtEdtEngine::SetTextByStream( @@ -180,20 +180,20 @@ int32_t CFDE_TxtEdtEngine::GetCaretRect(CFX_RectF& rtCaret) const { } int32_t CFDE_TxtEdtEngine::GetCaretPos() const { - if (IsLocked()) { + if (IsLocked()) return 0; - } + return m_nCaret + (m_bBefore ? 0 : 1); } int32_t CFDE_TxtEdtEngine::SetCaretPos(int32_t nIndex, bool bBefore) { - if (IsLocked()) { + if (IsLocked()) return 0; - } + ASSERT(nIndex >= 0 && nIndex <= GetTextBufLength()); - if (m_PagePtrArray.GetSize() <= m_nCaretPage) { + if (!pdfium::IndexInBounds(m_PagePtrArray, m_nCaretPage)) return 0; - } + m_bBefore = bBefore; m_nCaret = nIndex; MovePage2Char(m_nCaret); @@ -211,21 +211,17 @@ int32_t CFDE_TxtEdtEngine::SetCaretPos(int32_t nIndex, bool bBefore) { int32_t CFDE_TxtEdtEngine::MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret, bool bShift, bool bCtrl) { - if (IsLocked()) { + if (IsLocked() || !pdfium::IndexInBounds(m_PagePtrArray, m_nCaretPage)) return 0; - } - if (m_PagePtrArray.GetSize() <= m_nCaretPage) { - return 0; - } + bool bSelChange = false; if (IsSelect()) { ClearSelection(); bSelChange = true; } if (bShift) { - if (m_nAnchorPos == -1) { + if (m_nAnchorPos == -1) m_nAnchorPos = m_nCaret; - } } else { m_nAnchorPos = -1; } @@ -234,31 +230,27 @@ int32_t CFDE_TxtEdtEngine::MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret, case MC_Left: { bool bBefore = true; int32_t nIndex = MoveBackward(bBefore); - if (nIndex >= 0) { + if (nIndex >= 0) UpdateCaretRect(nIndex, bBefore); - } break; } case MC_Right: { bool bBefore = true; int32_t nIndex = MoveForward(bBefore); - if (nIndex >= 0) { + if (nIndex >= 0) UpdateCaretRect(nIndex, bBefore); - } break; } case MC_Up: { CFX_PointF ptCaret; - if (MoveUp(ptCaret)) { + if (MoveUp(ptCaret)) UpdateCaretIndex(ptCaret); - } break; } case MC_Down: { CFX_PointF ptCaret; - if (MoveDown(ptCaret)) { + if (MoveDown(ptCaret)) UpdateCaretIndex(ptCaret); - } break; } case MC_WordBackward: @@ -316,9 +308,9 @@ bool CFDE_TxtEdtEngine::IsLocked() const { int32_t CFDE_TxtEdtEngine::Insert(int32_t nStart, const wchar_t* lpText, int32_t nLength) { - if (IsLocked()) { + if (IsLocked()) return FDE_TXTEDT_MODIFY_RET_F_Locked; - } + CFX_WideString wsTemp; wchar_t* lpBuffer = wsTemp.GetBuffer(nLength); FXSYS_memcpy(lpBuffer, lpText, nLength * sizeof(wchar_t)); @@ -327,15 +319,13 @@ int32_t CFDE_TxtEdtEngine::Insert(int32_t nStart, 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_TXTEDTSELRANGE* lpSelRange = m_SelRangePtrArr.GetAt(i); + for (const auto& lpSelRange : m_SelRangePtrArr) nTotalLength -= lpSelRange->nCount; - } + int32_t nExpectLength = nTotalLength + nLength; - if (nTotalLength == m_nLimit) { + if (nTotalLength == m_nLimit) return FDE_TXTEDT_MODIFY_RET_F_Full; - } + if (nExpectLength > m_nLimit) { nLength -= (nExpectLength - m_nLimit); bPart = true; @@ -519,39 +509,34 @@ void CFDE_TxtEdtEngine::SetAliasChar(wchar_t wcAlias) { } void CFDE_TxtEdtEngine::RemoveSelRange(int32_t nStart, int32_t nCount) { - FDE_TXTEDTSELRANGE* lpTemp = nullptr; - int32_t nRangeCount = m_SelRangePtrArr.GetSize(); - int32_t i = 0; - for (i = 0; i < nRangeCount; i++) { - lpTemp = m_SelRangePtrArr[i]; + int32_t nRangeCount = pdfium::CollectionSize<int32_t>(m_SelRangePtrArr); + for (int32_t i = 0; i < nRangeCount; i++) { + FDE_TXTEDTSELRANGE* lpTemp = m_SelRangePtrArr[i].get(); if (lpTemp->nStart == nStart && lpTemp->nCount == nCount) { - delete lpTemp; - m_SelRangePtrArr.RemoveAt(i); + m_SelRangePtrArr.erase(m_SelRangePtrArr.begin() + i); return; } } } void CFDE_TxtEdtEngine::AddSelRange(int32_t nStart, int32_t nCount) { - if (nCount == -1) { + if (nCount == -1) nCount = GetTextLength() - nStart; - } - int32_t nSize = m_SelRangePtrArr.GetSize(); - if (nSize <= 0) { - FDE_TXTEDTSELRANGE* lpSelRange = new FDE_TXTEDTSELRANGE; + + if (m_SelRangePtrArr.empty()) { + auto lpSelRange = pdfium::MakeUnique<FDE_TXTEDTSELRANGE>(); lpSelRange->nStart = nStart; lpSelRange->nCount = nCount; - m_SelRangePtrArr.Add(lpSelRange); + m_SelRangePtrArr.push_back(std::move(lpSelRange)); m_Param.pEventSink->OnSelChanged(); return; } - FDE_TXTEDTSELRANGE* lpTemp = nullptr; - lpTemp = m_SelRangePtrArr[nSize - 1]; + auto* lpTemp = m_SelRangePtrArr.back().get(); if (nStart >= lpTemp->nStart + lpTemp->nCount) { - FDE_TXTEDTSELRANGE* lpSelRange = new FDE_TXTEDTSELRANGE; + auto lpSelRange = pdfium::MakeUnique<FDE_TXTEDTSELRANGE>(); lpSelRange->nStart = nStart; lpSelRange->nCount = nCount; - m_SelRangePtrArr.Add(lpSelRange); + m_SelRangePtrArr.push_back(std::move(lpSelRange)); m_Param.pEventSink->OnSelChanged(); return; } @@ -559,8 +544,9 @@ void CFDE_TxtEdtEngine::AddSelRange(int32_t nStart, int32_t nCount) { bool bBegin = false; int32_t nRangeBgn = 0; int32_t nRangeCnt = 0; - for (int32_t i = 0; i < nSize; i++) { - lpTemp = m_SelRangePtrArr[i]; + for (int32_t i = 0, nSize = pdfium::CollectionSize<int32_t>(m_SelRangePtrArr); + i < nSize; i++) { + lpTemp = m_SelRangePtrArr[i].get(); int32_t nTempBgn = lpTemp->nStart; int32_t nTempEnd = nTempBgn + lpTemp->nCount - 1; if (bBegin) { @@ -583,26 +569,25 @@ void CFDE_TxtEdtEngine::AddSelRange(int32_t nStart, int32_t nCount) { } } if (nRangeCnt == 0) { - FDE_TXTEDTSELRANGE* lpSelRange = new FDE_TXTEDTSELRANGE; + auto lpSelRange = pdfium::MakeUnique<FDE_TXTEDTSELRANGE>(); lpSelRange->nStart = nStart; lpSelRange->nCount = nCount; - m_SelRangePtrArr.InsertAt(nRangeBgn, lpSelRange); + m_SelRangePtrArr.insert(m_SelRangePtrArr.begin() + nRangeBgn, + std::move(lpSelRange)); } else { - lpTemp = m_SelRangePtrArr[nRangeBgn]; + lpTemp = m_SelRangePtrArr[nRangeBgn].get(); lpTemp->nStart = nStart; lpTemp->nCount = nCount; nRangeCnt--; nRangeBgn++; - while (nRangeCnt--) { - delete m_SelRangePtrArr[nRangeBgn]; - m_SelRangePtrArr.RemoveAt(nRangeBgn); - } + m_SelRangePtrArr.erase(m_SelRangePtrArr.begin() + nRangeBgn, + m_SelRangePtrArr.begin() + nRangeBgn + nRangeCnt); } m_Param.pEventSink->OnSelChanged(); } int32_t CFDE_TxtEdtEngine::CountSelRanges() const { - return m_SelRangePtrArr.GetSize(); + return pdfium::CollectionSize<int32_t>(m_SelRangePtrArr); } int32_t CFDE_TxtEdtEngine::GetSelRange(int32_t nIndex, int32_t* nStart) const { @@ -612,11 +597,10 @@ int32_t CFDE_TxtEdtEngine::GetSelRange(int32_t nIndex, int32_t* nStart) const { } void CFDE_TxtEdtEngine::ClearSelection() { - int32_t nCount = m_SelRangePtrArr.GetSize(); - for (int i = 0; i < nCount; ++i) - delete m_SelRangePtrArr[i]; - m_SelRangePtrArr.RemoveAll(); - if (nCount && m_Param.pEventSink) + if (m_SelRangePtrArr.empty()) + return; + m_SelRangePtrArr.clear(); + if (m_Param.pEventSink) m_Param.pEventSink->OnSelChanged(); } @@ -641,11 +625,11 @@ int32_t CFDE_TxtEdtEngine::StartLayout() { } int32_t CFDE_TxtEdtEngine::DoLayout(IFX_Pause* pPause) { - int32_t nCount = m_ParagPtrArray.GetSize(); + int32_t nCount = pdfium::CollectionSize<int32_t>(m_ParagPtrArray); CFDE_TxtEdtParag* pParag = nullptr; int32_t nLineCount = 0; for (; m_nLayoutPos < nCount; m_nLayoutPos++) { - pParag = m_ParagPtrArray[m_nLayoutPos]; + pParag = m_ParagPtrArray[m_nLayoutPos].get(); pParag->CalcLines(); nLineCount += pParag->GetLineCount(); if (nLineCount > m_nPageLineCount && pPause && pPause->NeedToPauseNow()) { @@ -692,11 +676,11 @@ int32_t CFDE_TxtEdtEngine::GetPageLineCount() const { } int32_t CFDE_TxtEdtEngine::CountParags() const { - return m_ParagPtrArray.GetSize(); + return pdfium::CollectionSize<int32_t>(m_ParagPtrArray); } CFDE_TxtEdtParag* CFDE_TxtEdtEngine::GetParag(int32_t nParagIndex) const { - return m_ParagPtrArray[nParagIndex]; + return m_ParagPtrArray[nParagIndex].get(); } IFX_CharIter* CFDE_TxtEdtEngine::CreateCharIter() { @@ -710,11 +694,11 @@ int32_t CFDE_TxtEdtEngine::Line2Parag(int32_t nStartParag, int32_t nLineIndex, int32_t& nStartLine) const { int32_t nLineTotal = nStartLineofParag; - int32_t nCount = m_ParagPtrArray.GetSize(); + int32_t nCount = pdfium::CollectionSize<int32_t>(m_ParagPtrArray); CFDE_TxtEdtParag* pParag = nullptr; int32_t i = nStartParag; for (; i < nCount; i++) { - pParag = m_ParagPtrArray[i]; + pParag = m_ParagPtrArray[i].get(); nLineTotal += pParag->GetLineCount(); if (nLineTotal > nLineIndex) { break; @@ -783,12 +767,11 @@ void CFDE_TxtEdtEngine::Inner_Insert(int32_t nStart, FDE_TXTEDTPARAGPOS ParagPos; TextPos2ParagPos(nStart, ParagPos); m_Param.pEventSink->OnPageUnload(m_nCaretPage); - int32_t nParagCount = m_ParagPtrArray.GetSize(); - int32_t i = 0; - for (i = ParagPos.nParagIndex + 1; i < nParagCount; i++) + int32_t nParagCount = pdfium::CollectionSize<int32_t>(m_ParagPtrArray); + for (int32_t i = ParagPos.nParagIndex + 1; i < nParagCount; i++) m_ParagPtrArray[i]->IncrementStartIndex(nLength); - CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex]; + CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex].get(); int32_t nReserveLineCount = pParag->GetLineCount(); int32_t nReserveCharStart = pParag->GetStartIndex(); int32_t nLeavePart = ParagPos.nCharIndex; @@ -798,7 +781,7 @@ void CFDE_TxtEdtEngine::Inner_Insert(int32_t nStart, const wchar_t* lpPos = lpText; bool bFirst = true; int32_t nParagIndex = ParagPos.nParagIndex; - for (i = 0; i < nLength; i++, lpPos++) { + for (int32_t i = 0; i < nLength; i++, lpPos++) { wCurChar = *lpPos; if (wCurChar == m_wLineEnd) { if (bFirst) { @@ -807,12 +790,13 @@ void CFDE_TxtEdtEngine::Inner_Insert(int32_t nStart, nReserveCharStart += pParag->GetTextLength(); bFirst = false; } else { - pParag = new CFDE_TxtEdtParag(this); - pParag->SetLineCount(-1); - pParag->SetTextLength(i - nTextStart + 1); - pParag->SetStartIndex(nReserveCharStart); - m_ParagPtrArray.InsertAt(++nParagIndex, pParag); - nReserveCharStart += pParag->GetTextLength(); + auto pParag2 = pdfium::MakeUnique<CFDE_TxtEdtParag>(this); + pParag2->SetLineCount(-1); + pParag2->SetTextLength(i - nTextStart + 1); + pParag2->SetStartIndex(nReserveCharStart); + nReserveCharStart += pParag2->GetTextLength(); + m_ParagPtrArray.insert(m_ParagPtrArray.begin() + ++nParagIndex, + std::move(pParag2)); } nTextStart = i + 1; } @@ -822,16 +806,17 @@ void CFDE_TxtEdtEngine::Inner_Insert(int32_t nStart, pParag->SetLineCount(-1); bFirst = false; } else { - pParag = new CFDE_TxtEdtParag(this); - pParag->SetLineCount(-1); - pParag->SetTextLength(nLength - nTextStart + nCutPart); - pParag->SetStartIndex(nReserveCharStart); - m_ParagPtrArray.InsertAt(++nParagIndex, pParag); + auto pParag2 = pdfium::MakeUnique<CFDE_TxtEdtParag>(this); + pParag2->SetLineCount(-1); + pParag2->SetTextLength(nLength - nTextStart + nCutPart); + pParag2->SetStartIndex(nReserveCharStart); + m_ParagPtrArray.insert(m_ParagPtrArray.begin() + ++nParagIndex, + std::move(pParag2)); } m_pTxtBuf->Insert(nStart, lpText, nLength); int32_t nTotalLineCount = 0; - for (i = ParagPos.nParagIndex; i <= nParagIndex; i++) { - pParag = m_ParagPtrArray[i]; + for (int32_t i = ParagPos.nParagIndex; i <= nParagIndex; i++) { + pParag = m_ParagPtrArray[i].get(); pParag->CalcLines(); nTotalLineCount += pParag->GetLineCount(); } @@ -850,10 +835,11 @@ void CFDE_TxtEdtEngine::Inner_DeleteRange(int32_t nStart, int32_t nCount) { FDE_TXTEDTPARAGPOS ParagPosBgn, ParagPosEnd; TextPos2ParagPos(nStart, ParagPosBgn); TextPos2ParagPos(nEnd, ParagPosEnd); - CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPosEnd.nParagIndex]; + CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPosEnd.nParagIndex].get(); bool bLastParag = false; if (ParagPosEnd.nCharIndex == pParag->GetTextLength() - 1) { - if (ParagPosEnd.nParagIndex < m_ParagPtrArray.GetSize() - 1) { + if (ParagPosEnd.nParagIndex < + pdfium::CollectionSize<int32_t>(m_ParagPtrArray) - 1) { ParagPosEnd.nParagIndex++; } else { bLastParag = true; @@ -863,7 +849,7 @@ void CFDE_TxtEdtEngine::Inner_DeleteRange(int32_t nStart, int32_t nCount) { int32_t nTotalCharCount = 0; int32_t i = 0; for (i = ParagPosBgn.nParagIndex; i <= ParagPosEnd.nParagIndex; i++) { - CFDE_TxtEdtParag* pTextParag = m_ParagPtrArray[i]; + CFDE_TxtEdtParag* pTextParag = m_ParagPtrArray[i].get(); pTextParag->CalcLines(); nTotalLineCount += pTextParag->GetLineCount(); nTotalCharCount += pTextParag->GetTextLength(); @@ -872,17 +858,16 @@ void CFDE_TxtEdtEngine::Inner_DeleteRange(int32_t nStart, int32_t nCount) { int32_t nNextParagIndex = (ParagPosBgn.nCharIndex == 0 && bLastParag) ? ParagPosBgn.nParagIndex : (ParagPosBgn.nParagIndex + 1); - for (i = nNextParagIndex; i <= ParagPosEnd.nParagIndex; i++) { - delete m_ParagPtrArray[nNextParagIndex]; - m_ParagPtrArray.RemoveAt(nNextParagIndex); - } + m_ParagPtrArray.erase(m_ParagPtrArray.begin() + nNextParagIndex, + m_ParagPtrArray.begin() + ParagPosEnd.nParagIndex + 1); + if (!(bLastParag && ParagPosBgn.nCharIndex == 0)) { - pParag = m_ParagPtrArray[ParagPosBgn.nParagIndex]; + pParag = m_ParagPtrArray[ParagPosBgn.nParagIndex].get(); pParag->SetTextLength(nTotalCharCount - nCount); pParag->CalcLines(); nTotalLineCount -= pParag->GetTextLength(); } - int32_t nParagCount = m_ParagPtrArray.GetSize(); + int32_t nParagCount = pdfium::CollectionSize<int32_t>(m_ParagPtrArray); for (i = nNextParagIndex; i < nParagCount; i++) m_ParagPtrArray[i]->DecrementStartIndex(nCount); @@ -934,41 +919,32 @@ void CFDE_TxtEdtEngine::RebuildParagraphs() { wChar = pIter->GetChar(); nIndex = pIter->GetAt(); if (wChar == m_wLineEnd) { - CFDE_TxtEdtParag* pParag = new CFDE_TxtEdtParag(this); + auto pParag = pdfium::MakeUnique<CFDE_TxtEdtParag>(this); pParag->SetStartIndex(nParagStart); pParag->SetTextLength(nIndex - nParagStart + 1); pParag->SetLineCount(-1); - m_ParagPtrArray.Add(pParag); + m_ParagPtrArray.push_back(std::move(pParag)); nParagStart = nIndex + 1; } } while (pIter->Next()); } void CFDE_TxtEdtEngine::RemoveAllParags() { - for (int32_t i = 0; i < m_ParagPtrArray.GetSize(); ++i) - delete m_ParagPtrArray[i]; - m_ParagPtrArray.RemoveAll(); + m_ParagPtrArray.clear(); } void CFDE_TxtEdtEngine::RemoveAllPages() { - for (int32_t i = 0; i < m_PagePtrArray.GetSize(); i++) - delete m_PagePtrArray[i]; - m_PagePtrArray.RemoveAll(); + m_PagePtrArray.clear(); } void CFDE_TxtEdtEngine::UpdateParags() { - int32_t nCount = m_ParagPtrArray.GetSize(); - if (nCount == 0) { + if (m_ParagPtrArray.empty()) return; - } - CFDE_TxtEdtParag* pParag = nullptr; + int32_t nLineCount = 0; - int32_t i = 0; - for (i = 0; i < nCount; i++) { - pParag = m_ParagPtrArray[i]; + for (auto& pParag : m_ParagPtrArray) { if (pParag->GetLineCount() == -1) pParag->CalcLines(); - nLineCount += pParag->GetLineCount(); } m_nLineCount = nLineCount; @@ -979,22 +955,17 @@ void CFDE_TxtEdtEngine::UpdatePages() { return; int32_t nPageCount = (m_nLineCount - 1) / (m_nPageLineCount) + 1; - int32_t nSize = m_PagePtrArray.GetSize(); + int32_t nSize = pdfium::CollectionSize<int32_t>(m_PagePtrArray); if (nSize == nPageCount) return; if (nSize > nPageCount) { - for (int32_t i = nSize - 1; i >= nPageCount; i--) { - delete m_PagePtrArray[i]; - m_PagePtrArray.RemoveAt(i); - } - return; - } - if (nSize < nPageCount) { - for (int32_t i = nSize; i < nPageCount; i++) - m_PagePtrArray.Add(new CFDE_TxtEdtPage(this, i)); + m_PagePtrArray.erase(m_PagePtrArray.begin() + nPageCount, + m_PagePtrArray.end()); return; } + for (int32_t i = nSize; i < nPageCount; i++) + m_PagePtrArray.push_back(pdfium::MakeUnique<CFDE_TxtEdtPage>(this, i)); } void CFDE_TxtEdtEngine::UpdateTxtBreak() { @@ -1137,7 +1108,7 @@ int32_t CFDE_TxtEdtEngine::MovePage2Char(int32_t nIndex) { ASSERT(nIndex >= 0); ASSERT(nIndex <= m_pTxtBuf->GetTextLength()); if (m_nCaretPage >= 0) { - CFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage]; + CFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage].get(); m_Param.pEventSink->OnPageLoad(m_nCaretPage); int32_t nPageCharStart = pPage->GetCharStart(); int32_t nPageCharCount = pPage->GetCharCount(); @@ -1149,10 +1120,10 @@ int32_t CFDE_TxtEdtEngine::MovePage2Char(int32_t nIndex) { } CFDE_TxtEdtParag* pParag = nullptr; int32_t nLineCount = 0; - int32_t nParagCount = m_ParagPtrArray.GetSize(); + int32_t nParagCount = pdfium::CollectionSize<int32_t>(m_ParagPtrArray); int32_t i = 0; for (i = 0; i < nParagCount; i++) { - pParag = m_ParagPtrArray[i]; + pParag = m_ParagPtrArray[i].get(); if (pParag->GetStartIndex() <= nIndex && nIndex < (pParag->GetStartIndex() + pParag->GetTextLength())) { break; @@ -1177,13 +1148,13 @@ int32_t CFDE_TxtEdtEngine::MovePage2Char(int32_t nIndex) { void CFDE_TxtEdtEngine::TextPos2ParagPos(int32_t nIndex, FDE_TXTEDTPARAGPOS& ParagPos) const { ASSERT(nIndex >= 0 && nIndex < m_pTxtBuf->GetTextLength()); - int32_t nCount = m_ParagPtrArray.GetSize(); + int32_t nCount = pdfium::CollectionSize<int32_t>(m_ParagPtrArray); 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]; + CFDE_TxtEdtParag* pParag = m_ParagPtrArray[nMid].get(); if (nIndex < pParag->GetStartIndex()) nEnd = nMid - 1; else if (nIndex >= (pParag->GetStartIndex() + pParag->GetTextLength())) @@ -1269,7 +1240,7 @@ 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]; + CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex].get(); pParag->LoadParag(); int32_t nLineCount = pParag->GetLineCount(); int32_t i = 0; @@ -1290,7 +1261,7 @@ 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]; + CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex].get(); pParag->LoadParag(); int32_t nLineCount = pParag->GetLineCount(); int32_t i = 0; @@ -1324,11 +1295,9 @@ bool CFDE_TxtEdtEngine::MoveLineEnd() { } 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->GetStartIndex(), true); + TextPos2ParagPos(m_bBefore ? m_nCaret : m_nCaret - 1, ParagPos); + UpdateCaretRect(m_ParagPtrArray[ParagPos.nParagIndex]->GetStartIndex(), true); return true; } @@ -1336,7 +1305,7 @@ 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]; + CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex].get(); nIndex = pParag->GetStartIndex() + pParag->GetTextLength() - 1; wchar_t wChar = m_pTxtBuf->GetCharByIndex(nIndex); if (wChar == L'\n' && nIndex > 0) { @@ -1408,8 +1377,9 @@ void CFDE_TxtEdtEngine::GetCaretRect(CFX_RectF& rtCaret, int32_t nPageIndex, int32_t nCaret, bool bBefore) { - CFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage]; + CFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage].get(); m_Param.pEventSink->OnPageLoad(m_nCaretPage); + bool bCombText = !!(m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText); int32_t nIndexInpage = nCaret - pPage->GetCharStart(); if (bBefore && bCombText && nIndexInpage > 0) { @@ -1430,7 +1400,7 @@ void CFDE_TxtEdtEngine::GetCaretRect(CFX_RectF& rtCaret, } void CFDE_TxtEdtEngine::UpdateCaretIndex(const CFX_PointF& ptCaret) { - CFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage]; + CFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage].get(); m_Param.pEventSink->OnPageLoad(m_nCaretPage); m_nCaret = pPage->GetCharIndex(ptCaret, m_bBefore); GetCaretRect(m_rtCaret, m_nCaretPage, m_nCaret, m_bBefore); @@ -1443,23 +1413,22 @@ void CFDE_TxtEdtEngine::UpdateCaretIndex(const CFX_PointF& ptCaret) { } bool CFDE_TxtEdtEngine::IsSelect() { - return m_SelRangePtrArr.GetSize() > 0; + return !m_SelRangePtrArr.empty(); } void CFDE_TxtEdtEngine::DeleteSelect() { int32_t nCountRange = CountSelRanges(); - if (nCountRange > 0) { - int32_t nSelStart = 0; - while (nCountRange > 0) { - int32_t nSelCount = GetSelRange(--nCountRange, &nSelStart); - delete m_SelRangePtrArr[nCountRange]; - m_SelRangePtrArr.RemoveAt(nCountRange); - DeleteRange_DoRecord(nSelStart, nSelCount, true); - } - ClearSelection(); - m_Param.pEventSink->OnTextChanged(m_ChangeInfo); - m_Param.pEventSink->OnSelChanged(); - SetCaretPos(nSelStart, true); + if (nCountRange <= 0) return; + + int32_t nSelStart = 0; + while (nCountRange > 0) { + int32_t nSelCount = GetSelRange(--nCountRange, &nSelStart); + m_SelRangePtrArr.erase(m_SelRangePtrArr.begin() + nCountRange); + DeleteRange_DoRecord(nSelStart, nSelCount, true); } + ClearSelection(); + m_Param.pEventSink->OnTextChanged(m_ChangeInfo); + m_Param.pEventSink->OnSelChanged(); + SetCaretPos(nSelStart, true); } diff --git a/xfa/fde/cfde_txtedtengine.h b/xfa/fde/cfde_txtedtengine.h index 5499189295..020b8c93df 100644 --- a/xfa/fde/cfde_txtedtengine.h +++ b/xfa/fde/cfde_txtedtengine.h @@ -8,6 +8,7 @@ #define XFA_FDE_CFDE_TXTEDTENGINE_H_ #include <memory> +#include <vector> #include "core/fxcrt/cfx_retain_ptr.h" #include "xfa/fde/ifde_txtedtengine.h" @@ -150,9 +151,9 @@ class CFDE_TxtEdtEngine { std::unique_ptr<CFDE_TxtEdtBuf> m_pTxtBuf; std::unique_ptr<CFX_TxtBreak> m_pTextBreak; FDE_TXTEDTPARAMS m_Param; - CFX_ArrayTemplate<CFDE_TxtEdtPage*> m_PagePtrArray; - CFX_ArrayTemplate<CFDE_TxtEdtParag*> m_ParagPtrArray; - CFX_ArrayTemplate<FDE_TXTEDTSELRANGE*> m_SelRangePtrArr; + std::vector<std::unique_ptr<CFDE_TxtEdtPage>> m_PagePtrArray; + std::vector<std::unique_ptr<CFDE_TxtEdtParag>> m_ParagPtrArray; + std::vector<std::unique_ptr<FDE_TXTEDTSELRANGE>> m_SelRangePtrArr; int32_t m_nPageLineCount; int32_t m_nLineCount; int32_t m_nAnchorPos; |