From a0477d991661de605aec4fec87ca52e32ec8f743 Mon Sep 17 00:00:00 2001 From: Matteo Casalin Date: Mon, 7 Jan 2013 22:20:59 +0100 Subject: [PATCH] Character conversion: do not destroy sequence while iterating on it Change-Id: Ib77e15b776384cc75880a907a6425c6105bc3fab Reviewed-on: https://gerrit.libreoffice.org/1636 Reviewed-by: Michael Stahl Tested-by: Michael Stahl --- sw/source/core/txtnode/txtedt.cxx | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/sw/source/core/txtnode/txtedt.cxx b/sw/source/core/txtnode/txtedt.cxx index d5bc382f574d..82c6cf8f66a8 100644 --- a/sw/source/core/txtnode/txtedt.cxx +++ b/sw/source/core/txtnode/txtedt.cxx @@ -74,6 +74,7 @@ #include #include +#include using rtl::OUString; using namespace ::com::sun::star; @@ -1073,6 +1074,12 @@ sal_uInt16 SwTxtNode::Convert( SwConversionArgs &rArgs ) { SwLanguageIterator aIter( *this, nBegin ); + // Implicit changes require setting new attributes, which in turn destroys + // the attribute sequence on which aIter iterates. We store the necessary + // coordinates and apply those changes after iterating through the text. + typedef std::pair ImplicitChangesRange; + std::vector aImplicitChanges; + // find non zero length text portion of appropriate language do { nLangFound = aIter.GetLanguage(); @@ -1108,13 +1115,22 @@ sal_uInt16 SwTxtNode::Convert( SwConversionArgs &rArgs ) if (!bIsAsianScript && rArgs.bAllowImplicitChangesForNotConvertibleText) { - SetLanguageAndFont( aCurPaM, - rArgs.nConvTargetLang, RES_CHRATR_CJK_LANGUAGE, - rArgs.pTargetFont, RES_CHRATR_CJK_FONT ); + // Store for later use + aImplicitChanges.push_back(ImplicitChangesRange(nBegin, nBegin+nLen)); } nBegin = nChPos; // start of next language portion } } while (!bFound && aIter.Next()); /* loop while nothing was found and still sth is left to be searched */ + + // Apply implicit changes, if any, now that aIter is no longer used + for (size_t i = 0; i < aImplicitChanges.size(); ++i) + { + SwPaM aPaM( *this, aImplicitChanges[i].first ); + aPaM.SetMark(); + aPaM.GetPoint()->nContent = aImplicitChanges[i].second; + SetLanguageAndFont( aPaM, rArgs.nConvTargetLang, RES_CHRATR_CJK_LANGUAGE, rArgs.pTargetFont, RES_CHRATR_CJK_FONT ); + } + } // keep resulting text within selection / range of text to be converted