CPVT_WordPlace CPDF_VariableText::GetNextWordPlace( const CPVT_WordPlace& place) const { if (place.nSecIndex < 0) return GetBeginWordPlace(); if (place.nSecIndex >= m_SectionArray.GetSize()) return GetEndWordPlace(); if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) { if (place.WordCmp(pSection->GetEndWordPlace()) >= 0) { if (CSection* pNextSection = m_SectionArray.GetAt(place.nSecIndex + 1)) return pNextSection->GetBeginWordPlace(); return GetEndWordPlace(); } return pSection->GetNextWordPlace(place); } return place; }
CPVT_WordPlace CPDF_VariableText::WordIndexToWordPlace(int32_t index) const { CPVT_WordPlace place = GetBeginWordPlace(); int32_t nOldIndex = 0, nIndex = 0; FX_BOOL bFind = FALSE; for (int32_t i = 0, sz = m_SectionArray.GetSize(); i < sz; i++) { if (CSection* pSection = m_SectionArray.GetAt(i)) { nIndex += pSection->m_WordArray.GetSize(); if (nIndex == index) { place = pSection->GetEndWordPlace(); bFind = TRUE; break; } else if (nIndex > index) { place.nSecIndex = i; place.nWordIndex = index - nOldIndex - 1; pSection->UpdateWordPlace(place); bFind = TRUE; break; } if (i != m_SectionArray.GetSize() - 1) nIndex += kReturnLength; nOldIndex = nIndex; } } if (!bFind) place = GetEndWordPlace(); return place; }
void CPDF_VariableText::SetText(const FX_WCHAR* text, int32_t charset, const CPVT_SecProps* pSecProps, const CPVT_WordProps* pWordProps) { DeleteWords(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace())); CFX_WideString swText = text; CPVT_WordPlace wp(0, 0, -1); CPVT_SectionInfo secinfo; if (m_bRichText) { if (pSecProps) secinfo.pSecProps = new CPVT_SecProps(*pSecProps); if (pWordProps) secinfo.pWordProps = new CPVT_WordProps(*pWordProps); } if (CSection* pSection = m_SectionArray.GetAt(0)) pSection->m_SecInfo = secinfo; int32_t nCharCount = 0; for (int32_t i = 0, sz = swText.GetLength(); i < sz; i++) { if (m_nLimitChar > 0 && nCharCount >= m_nLimitChar) break; if (m_nCharArray > 0 && nCharCount >= m_nCharArray) break; uint16_t word = swText.GetAt(i); switch (word) { case 0x0D: if (m_bMultiLine) { if (swText.GetAt(i + 1) == 0x0A) i += 1; wp.nSecIndex++; wp.nLineIndex = 0; wp.nWordIndex = -1; AddSection(wp, secinfo); } break; case 0x0A: if (m_bMultiLine) { if (swText.GetAt(i + 1) == 0x0D) i += 1; wp.nSecIndex++; wp.nLineIndex = 0; wp.nWordIndex = -1; AddSection(wp, secinfo); } break; case 0x09: word = 0x20; default: wp = InsertWord(wp, word, charset, pWordProps); break; } nCharCount++; } }
void CPDF_VariableText::UpdateWordPlace(CPVT_WordPlace& place) const { if (place.nSecIndex < 0) place = GetBeginWordPlace(); if (place.nSecIndex >= m_SectionArray.GetSize()) place = GetEndWordPlace(); place = AdjustLineHeader(place, TRUE); if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) pSection->UpdateWordPlace(place); }
CPVT_FloatRect CPDF_VariableText::Rearrange(const CPVT_WordRange& PlaceRange) { CPVT_FloatRect rcRet; if (IsValid()) { if (m_bAutoFontSize) { SetFontSize(GetAutoFontSize()); rcRet = RearrangeSections( CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace())); } else { rcRet = RearrangeSections(PlaceRange); } } SetContentRect(rcRet); return rcRet; }
void CSection::ClearWords(const CPVT_WordRange& PlaceRange) { CPVT_WordPlace SecBeginPos = GetBeginWordPlace(); CPVT_WordPlace SecEndPos = GetEndWordPlace(); if (PlaceRange.BeginPos.WordCmp(SecBeginPos) >= 0) { if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) { ClearMidWords(PlaceRange.BeginPos.nWordIndex, PlaceRange.EndPos.nWordIndex); } else { ClearRightWords(PlaceRange.BeginPos.nWordIndex); } } else if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) { ClearLeftWords(PlaceRange.EndPos.nWordIndex); } else { ResetWordArray(); } }
CPVT_WordPlace CSection::SearchWordPlace(const CFX_FloatPoint& point) const { ASSERT(m_pVT); CPVT_WordPlace place = GetBeginWordPlace(); bool bUp = true; bool bDown = true; int32_t nLeft = 0; int32_t nRight = m_LineArray.GetSize() - 1; int32_t nMid = m_LineArray.GetSize() / 2; FX_FLOAT fTop = 0; FX_FLOAT fBottom = 0; while (nLeft <= nRight) { if (CLine* pLine = m_LineArray.GetAt(nMid)) { fTop = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineAscent - m_pVT->GetLineLeading(m_SecInfo); fBottom = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineDescent; if (IsFloatBigger(point.y, fTop)) { bUp = false; } if (IsFloatSmaller(point.y, fBottom)) { bDown = false; } if (IsFloatSmaller(point.y, fTop)) { nRight = nMid - 1; nMid = (nLeft + nRight) / 2; continue; } else if (IsFloatBigger(point.y, fBottom)) { nLeft = nMid + 1; nMid = (nLeft + nRight) / 2; continue; } else { place = SearchWordPlace( point.x, CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), pLine->GetEndWordPlace())); place.nLineIndex = nMid; return place; } } } if (bUp) { place = GetBeginWordPlace(); } if (bDown) { place = GetEndWordPlace(); } return place; }
CPVT_WordPlace CSection::GetNextWordPlace(const CPVT_WordPlace& place) const { if (place.nLineIndex < 0) { return GetBeginWordPlace(); } if (place.nLineIndex >= m_LineArray.GetSize()) { return GetEndWordPlace(); } if (CLine* pLine = m_LineArray.GetAt(place.nLineIndex)) { if (place.nWordIndex >= pLine->m_LineInfo.nEndWordIndex) { if (CLine* pNextLine = m_LineArray.GetAt(place.nLineIndex + 1)) { return pNextLine->GetBeginWordPlace(); } } else { return pLine->GetNextWordPlace(place); } } return place; }
CPVT_WordPlace CPDF_VariableText::SearchWordPlace( const CFX_FloatPoint& point) const { CFX_FloatPoint pt = OutToIn(point); CPVT_WordPlace place = GetBeginWordPlace(); int32_t nLeft = 0; int32_t nRight = m_SectionArray.GetSize() - 1; int32_t nMid = m_SectionArray.GetSize() / 2; FX_BOOL bUp = TRUE; FX_BOOL bDown = TRUE; while (nLeft <= nRight) { if (CSection* pSection = m_SectionArray.GetAt(nMid)) { if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.top)) { bUp = FALSE; } if (IsFloatBigger(pSection->m_SecInfo.rcSection.bottom, pt.y)) { bDown = FALSE; } if (IsFloatSmaller(pt.y, pSection->m_SecInfo.rcSection.top)) { nRight = nMid - 1; nMid = (nLeft + nRight) / 2; continue; } else if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.bottom)) { nLeft = nMid + 1; nMid = (nLeft + nRight) / 2; continue; } else { place = pSection->SearchWordPlace( CFX_FloatPoint(pt.x - pSection->m_SecInfo.rcSection.left, pt.y - pSection->m_SecInfo.rcSection.top)); place.nSecIndex = nMid; return place; } } else { break; } } if (bUp) place = GetBeginWordPlace(); if (bDown) place = GetEndWordPlace(); return place; }
CPVT_WordPlace CSection::GetPrevWordPlace(const CPVT_WordPlace& place) const { if (place.nLineIndex < 0) { return GetBeginWordPlace(); } if (place.nLineIndex >= m_LineArray.GetSize()) { return GetEndWordPlace(); } if (CLine* pLine = m_LineArray.GetAt(place.nLineIndex)) { if (place.nWordIndex == pLine->m_LineInfo.nBeginWordIndex) { return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1); } if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) { if (CLine* pPrevLine = m_LineArray.GetAt(place.nLineIndex - 1)) { return pPrevLine->GetEndWordPlace(); } } else { return pLine->GetPrevWordPlace(place); } } return place; }
void CPDF_VariableText::RearrangeAll() { Rearrange(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace())); }