editeng/qa/unit/core-test.cxx      |   39 +++++++++++++++++++++++++++++++++++++
 editeng/source/editeng/editobj.cxx |   15 +++++++++++++-
 2 files changed, 53 insertions(+), 1 deletion(-)

New commits:
commit eba15473d5cadca30edba6989512ee3e331ad197
Author: Michael Stahl <mst...@redhat.com>
Date:   Mon Dec 1 19:25:13 2014 +0100

    fdo#85496: editeng: avoid exporting duplicate attributes
    
    Since commit 0d57434180db6c8eda8c5b9b704f8a1c18b371df multiple 0-length
    attributes will be exported by the ODF filter as duplicate attributes.
    
    (cherry picked from commit 7a242b463132d67a4a2d6e69319e0da367145cc0)
    (cherry picked from commit 846b56b6b99e334dfa44f1a24640aa3158509854)
    
    This backport takes a different approach from the master fix and simply
    detects duplicates in EditTextObjectImpl::GetAllSections() which should
    be safe enough for 4.2.8.2.
    
    Change-Id: Iff787c8d2a71bc3082192cc98e3d916badee65dd
    Reviewed-on: https://gerrit.libreoffice.org/13260
    Reviewed-by: Caolán McNamara <caol...@redhat.com>
    Tested-by: Caolán McNamara <caol...@redhat.com>

diff --git a/editeng/qa/unit/core-test.cxx b/editeng/qa/unit/core-test.cxx
index 4e9b82b..0264f45 100644
--- a/editeng/qa/unit/core-test.cxx
+++ b/editeng/qa/unit/core-test.cxx
@@ -573,6 +573,45 @@ void Test::testSectionAttributes()
         CPPUNIT_ASSERT_EQUAL(0, (int)pSecAttr->mnEnd);
         CPPUNIT_ASSERT_MESSAGE("Attribute array should be empty.", 
pSecAttr->maAttributes.empty());
     }
+
+
+    {
+        aEngine.Clear();
+        aEngine.SetText("one\ntwo");
+        CPPUNIT_ASSERT_EQUAL(2, aEngine.GetParagraphCount());
+
+        // embolden 2nd paragraph
+        pSet.reset(new SfxItemSet(aEngine.GetEmptyItemSet()));
+        pSet->Put(aBold);
+        aEngine.QuickSetAttribs(*pSet, ESelection(1,0,1,3));
+        // disboldify 1st paragraph
+        SvxWeightItem aNotSoBold(WEIGHT_NORMAL, EE_CHAR_WEIGHT);
+        pSet->Put(aNotSoBold);
+        aEngine.QuickSetAttribs(*pSet, ESelection(0,0,0,3));
+
+        // now delete & join the paragraphs - this is fdo#85496 scenario
+        aEngine.QuickDelete(ESelection(0,0,1,3));
+        CPPUNIT_ASSERT_EQUAL(1, aEngine.GetParagraphCount());
+
+        boost::scoped_ptr<EditTextObject> 
pEditText(aEngine.CreateTextObject());
+        CPPUNIT_ASSERT_MESSAGE("Failed to create text object.", 
pEditText.get());
+        std::vector<editeng::Section> aAttrs;
+        pEditText->GetAllSections(aAttrs);
+
+        CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aAttrs.size());
+
+        const editeng::Section* pSecAttr = &aAttrs[0];
+        CPPUNIT_ASSERT_EQUAL(0, (int)pSecAttr->mnParagraph);
+        CPPUNIT_ASSERT_EQUAL(0, (int)pSecAttr->mnStart);
+        CPPUNIT_ASSERT_EQUAL(0, (int)pSecAttr->mnEnd);
+        std::set<sal_uInt16> whiches;
+        for (size_t i = 0; i < pSecAttr->maAttributes.size(); ++i)
+        {
+            sal_uInt16 const nWhich(pSecAttr->maAttributes[i]->Which());
+            CPPUNIT_ASSERT_MESSAGE("duplicate item in text portion attributes",
+                whiches.insert(nWhich).second);
+        }
+    }
 }
 
 CPPUNIT_TEST_SUITE_REGISTRATION(Test);
diff --git a/editeng/source/editeng/editobj.cxx 
b/editeng/source/editeng/editobj.cxx
index 41fddb0..7dfd06f 100644
--- a/editeng/source/editeng/editobj.cxx
+++ b/editeng/source/editeng/editobj.cxx
@@ -1000,7 +1000,20 @@ void EditTextObjectImpl::GetAllSections( 
std::vector<editeng::Section>& rAttrs )
             for (; itCurAttr != aAttrs.end() && itCurAttr->mnParagraph == 
nPara && itCurAttr->mnEnd <= nEnd; ++itCurAttr)
             {
                 editeng::Section& rSecAttr = *itCurAttr;
-                rSecAttr.maAttributes.push_back(pItem);
+                bool bInsert(true);
+                for (size_t j = 0; j < rSecAttr.maAttributes.size(); ++j)
+                {
+                    if (rSecAttr.maAttributes[j]->Which() == pItem->Which())
+                    {
+                        SAL_WARN("editeng", "GetAllSections(): duplicate 
attribute suppressed");
+                        bInsert = false;
+                        break;
+                    }
+                }
+                if (bInsert)
+                {
+                    rSecAttr.maAttributes.push_back(pItem);
+                }
             }
         }
     }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to