[PATCH] Character conversion: do not destroy sequence while iteratin...

Matteo Casalin (via Code Review) gerrit at gerrit.libreoffice.org
Fri Jan 11 00:08:01 PST 2013


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/1636

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/36/1636/1

Character conversion: do not destroy sequence while iterating on it

Change-Id: Ib77e15b776384cc75880a907a6425c6105bc3fab
---
M sw/source/core/txtnode/txtedt.cxx
1 file changed, 19 insertions(+), 3 deletions(-)



diff --git a/sw/source/core/txtnode/txtedt.cxx b/sw/source/core/txtnode/txtedt.cxx
index d5bc382..82c6cf8 100644
--- a/sw/source/core/txtnode/txtedt.cxx
+++ b/sw/source/core/txtnode/txtedt.cxx
@@ -74,6 +74,7 @@
 #include <com/sun/star/i18n/TransliterationModulesExtra.hpp>
 
 #include <vector>
+#include <utility>
 
 using rtl::OUString;
 using namespace ::com::sun::star;
@@ -1073,6 +1074,12 @@
     {
         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<xub_StrLen, xub_StrLen> ImplicitChangesRange;
+        std::vector<ImplicitChangesRange> aImplicitChanges;
+
         // find non zero length text portion of appropriate language
         do {
             nLangFound = aIter.GetLanguage();
@@ -1108,13 +1115,22 @@
 
                 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

-- 
To view, visit https://gerrit.libreoffice.org/1636
To unsubscribe, visit https://gerrit.libreoffice.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib77e15b776384cc75880a907a6425c6105bc3fab
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Matteo Casalin <matteo.casalin at gmx.com>



More information about the LibreOffice mailing list