// Copyright 2016 PDFium Authors. All rights reserved.
|
// Use of this source code is governed by a BSD-style license that can be
|
// found in the LICENSE file.
|
|
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
|
#include "xfa/fde/cfde_txtedtbufiter.h"
|
|
#include "xfa/fde/cfde_txtedtbuf.h"
|
|
CFDE_TxtEdtBufIter::CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf* pBuf, FX_WCHAR wcAlias)
|
: m_pBuf(pBuf),
|
m_nCurChunk(0),
|
m_nCurIndex(0),
|
m_nIndex(0),
|
m_Alias(wcAlias) {
|
ASSERT(m_pBuf);
|
}
|
|
CFDE_TxtEdtBufIter::~CFDE_TxtEdtBufIter() {}
|
|
FX_BOOL CFDE_TxtEdtBufIter::Next(FX_BOOL bPrev) {
|
if (bPrev) {
|
if (m_nIndex == 0) {
|
return FALSE;
|
}
|
ASSERT(m_nCurChunk < m_pBuf->m_Chunks.GetSize());
|
CFDE_TxtEdtBuf::FDE_CHUNKHEADER* lpChunk = nullptr;
|
if (m_nCurIndex > 0) {
|
m_nCurIndex--;
|
} else {
|
while (m_nCurChunk > 0) {
|
--m_nCurChunk;
|
lpChunk = m_pBuf->m_Chunks[m_nCurChunk];
|
if (lpChunk->nUsed > 0) {
|
m_nCurIndex = lpChunk->nUsed - 1;
|
break;
|
}
|
}
|
}
|
ASSERT(m_nCurChunk >= 0);
|
m_nIndex--;
|
return TRUE;
|
} else {
|
if (m_nIndex >= (m_pBuf->m_nTotal - 1)) {
|
return FALSE;
|
}
|
ASSERT(m_nCurChunk < m_pBuf->m_Chunks.GetSize());
|
CFDE_TxtEdtBuf::FDE_CHUNKHEADER* lpChunk = m_pBuf->m_Chunks[m_nCurChunk];
|
if (lpChunk->nUsed != (m_nCurIndex + 1)) {
|
m_nCurIndex++;
|
} else {
|
int32_t nEnd = m_pBuf->m_Chunks.GetSize() - 1;
|
while (m_nCurChunk < nEnd) {
|
m_nCurChunk++;
|
CFDE_TxtEdtBuf::FDE_CHUNKHEADER* lpChunkTemp =
|
m_pBuf->m_Chunks[m_nCurChunk];
|
if (lpChunkTemp->nUsed > 0) {
|
m_nCurIndex = 0;
|
break;
|
}
|
}
|
}
|
m_nIndex++;
|
return TRUE;
|
}
|
}
|
|
void CFDE_TxtEdtBufIter::SetAt(int32_t nIndex) {
|
ASSERT(nIndex >= 0 && nIndex < m_pBuf->m_nTotal);
|
CFDE_TxtEdtBuf::FDE_CHUNKPLACE cp;
|
m_pBuf->Index2CP(nIndex, cp);
|
m_nIndex = nIndex;
|
m_nCurChunk = cp.nChunkIndex;
|
m_nCurIndex = cp.nCharIndex;
|
}
|
|
int32_t CFDE_TxtEdtBufIter::GetAt() const {
|
return m_nIndex;
|
}
|
|
FX_WCHAR CFDE_TxtEdtBufIter::GetChar() {
|
ASSERT(m_nIndex >= 0 && m_nIndex < m_pBuf->m_nTotal);
|
if (m_Alias == 0 || m_nIndex == (m_pBuf->m_nTotal - 1))
|
return m_pBuf->m_Chunks[m_nCurChunk]->wChars[m_nCurIndex];
|
return m_Alias;
|
}
|
|
FX_BOOL CFDE_TxtEdtBufIter::IsEOF(FX_BOOL bTail) const {
|
return bTail ? m_nIndex == (m_pBuf->GetTextLength() - 2) : m_nIndex == 0;
|
}
|
|
IFX_CharIter* CFDE_TxtEdtBufIter::Clone() {
|
CFDE_TxtEdtBufIter* pIter = new CFDE_TxtEdtBufIter(m_pBuf);
|
pIter->m_nCurChunk = m_nCurChunk;
|
pIter->m_nCurIndex = m_nCurIndex;
|
pIter->m_nIndex = m_nIndex;
|
pIter->m_Alias = m_Alias;
|
return pIter;
|
}
|