[Libreoffice-commits] core.git: sw/qa writerfilter/source

Bjoern Michaelsen bjoern.michaelsen at canonical.com
Mon Nov 17 09:13:36 PST 2014


 sw/qa/extras/ooxmlimport/data/fdo85542.docx       |binary
 sw/qa/extras/ooxmlimport/ooxmlimport.cxx          |   31 ++++++++++++++++++++++
 writerfilter/source/dmapper/DomainMapper.cxx      |   14 ++++-----
 writerfilter/source/dmapper/DomainMapper_Impl.cxx |   24 ++++++++++++-----
 writerfilter/source/dmapper/DomainMapper_Impl.hxx |    5 ++-
 5 files changed, 60 insertions(+), 14 deletions(-)

New commits:
commit b1bd96e70230e498ea1c76388a684e5a5c3cbff4
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Sun Nov 16 16:47:08 2014 +0100

    fdo#85542: fix DOCX import of overlapping bookmarks
    
    This was broken by 345a3a394e082595924bf219796627f6c00ae2dd.
    Kill the static variable and instead have some more state in the
    implementation. Still not ideal, but at least fixes the regression.
    
    Change-Id: I562f7d88a1983bd0ec2e01d6bb1e4a53551d0953
    Reviewed-on: https://gerrit.libreoffice.org/12491
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/sw/qa/extras/ooxmlimport/data/fdo85542.docx b/sw/qa/extras/ooxmlimport/data/fdo85542.docx
new file mode 100644
index 0000000..db49408
Binary files /dev/null and b/sw/qa/extras/ooxmlimport/data/fdo85542.docx differ
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index 57ae735..3f2dd6b 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -32,6 +32,7 @@
 #include <com/sun/star/text/VertOrientation.hpp>
 #include <com/sun/star/text/WrapTextMode.hpp>
 #include <com/sun/star/text/WritingMode2.hpp>
+#include <com/sun/star/text/XBookmarksSupplier.hpp>
 #include <com/sun/star/text/XDependentTextField.hpp>
 #include <com/sun/star/text/XFormField.hpp>
 #include <com/sun/star/text/XPageCursor.hpp>
@@ -2501,6 +2502,36 @@ DECLARE_OOXMLIMPORT_TEST(testBnc821804, "bnc821804.docx")
     CPPUNIT_ASSERT_EQUAL(false,getProperty<bool>(getRun(getParagraph(10), 3), "IsStart"));
 }
 
+DECLARE_OOXMLIMPORT_TEST(testFdo85542, "fdo85542.docx")
+{
+    //CPPUNIT_ASSERT_EQUAL(false,true);
+    uno::Reference<text::XBookmarksSupplier> xBookmarksSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(xBookmarksByIdx->getCount(), 3);
+    uno::Reference<container::XNameAccess> xBookmarksByName(xBookmarksSupplier->getBookmarks(), uno::UNO_QUERY);
+    CPPUNIT_ASSERT(xBookmarksByName->hasByName("B1"));
+    CPPUNIT_ASSERT(xBookmarksByName->hasByName("B2"));
+    CPPUNIT_ASSERT(xBookmarksByName->hasByName("B3"));
+    // B1
+    uno::Reference<text::XTextContent> xContent1(xBookmarksByName->getByName("B1"), uno::UNO_QUERY);
+    uno::Reference<text::XTextRange> xRange1(xContent1->getAnchor(), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(xRange1->getString(), OUString("ABB"));
+    // B2
+    uno::Reference<text::XTextContent> xContent2(xBookmarksByName->getByName("B2"), uno::UNO_QUERY);
+    uno::Reference<text::XTextRange> xRange2(xContent2->getAnchor(), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(xRange2->getString(), OUString("BBC"));
+    // B3 -- testing a collapsed bookmark
+    uno::Reference<text::XTextContent> xContent3(xBookmarksByName->getByName("B3"), uno::UNO_QUERY);
+    uno::Reference<text::XTextRange> xRange3(xContent3->getAnchor(), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(xRange3->getString(), OUString(""));
+    uno::Reference<text::XText> xText(xRange3->getText( ), uno::UNO_QUERY);
+    uno::Reference<text::XTextCursor> xNeighborhoodCursor(xText->createTextCursor( ), uno::UNO_QUERY);
+    xNeighborhoodCursor->gotoRange(xRange3, false);
+    xNeighborhoodCursor->goLeft(1, false);
+    xNeighborhoodCursor->goRight(2, true);
+    uno::Reference<text::XTextRange> xTextNeighborhood(xNeighborhoodCursor, uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(xTextNeighborhood->getString(), OUString("AB"));
+}
 #endif
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 5b00fd6..8d4f548 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -183,7 +183,6 @@ void DomainMapper::lcl_attribute(Id nName, Value & val)
     if (m_pImpl->getTableManager().attribute(nName, val))
         return;
 
-    static OUString sLocalBookmarkName;
     static const int nSingleLineSpacing = 240;
     sal_Int32 nIntValue = val.getInt();
     OUString sStringValue = val.getString();
@@ -220,14 +219,15 @@ void DomainMapper::lcl_attribute(Id nName, Value & val)
         case NS_ooxml::LN_endnote:
             break;
         case NS_ooxml::LN_CT_Bookmark_name:
-            // sStringValue contains the bookmark name
-            sLocalBookmarkName = sStringValue;
+            // SAL_DEBUG("LN_CT_Bookmark_name " << sStringValue);
+            m_pImpl->SetBookmarkName( sStringValue );
         break;
         case NS_ooxml::LN_CT_MarkupRangeBookmark_id:
-            //contains the bookmark identifier - has to be added to the bookmark name imported before
-            //if it is already available then the bookmark should be inserted
-            m_pImpl->AddBookmark( sLocalBookmarkName, sStringValue );
-            sLocalBookmarkName.clear();
+            // SAL_DEBUG("LN_CT_MarkupRangeBookmark_id " << sStringValue);
+            // add a bookmark range -- this remembers a bookmark starting here
+            // or, if the bookmark was already started or, if the bookmark was
+            // already started before, writes out the bookmark
+            m_pImpl->StartOrEndBookmark( sStringValue );
         break;
         case NS_ooxml::LN_CT_MarkupRange_displacedByCustomXml:
             break;
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index c6b8565..b4fa15b 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -4341,8 +4341,19 @@ void DomainMapper_Impl::PopFieldContext()
 }
 
 
-void DomainMapper_Impl::AddBookmark( const OUString& rBookmarkName, const OUString& rId )
+void DomainMapper_Impl::SetBookmarkName( const OUString& rBookmarkName )
 {
+    // SAL_DEBUG("DomainMapper_Impl::SetBookmarkName for id " << m_sCurrentBkmkId << " to " << rBookmarkName);
+    BookmarkMap_t::iterator aBookmarkIter = m_aBookmarkMap.find( m_sCurrentBkmkId );
+    if( aBookmarkIter != m_aBookmarkMap.end() )
+        aBookmarkIter->second.m_sBookmarkName = rBookmarkName;
+    else
+        m_sCurrentBkmkName = rBookmarkName;
+}
+
+void DomainMapper_Impl::StartOrEndBookmark( const OUString& rId )
+{
+    // SAL_DEBUG("DomainMapper_Impl::AddBookmark " << rId);
     /*
      * Add the dummy paragraph to handle section properties
      * iff the first element in the section is a table. If the dummy para is not added yet, then add it;
@@ -4388,14 +4399,13 @@ void DomainMapper_Impl::AddBookmark( const OUString& rBookmarkName, const OUStri
                     xCursor->goLeft( 1, false );
                 }
                 uno::Reference< container::XNamed > xBkmNamed( xBookmark, uno::UNO_QUERY_THROW );
+                assert(!aBookmarkIter->second.m_sBookmarkName.isEmpty());
                 //todo: make sure the name is not used already!
-                if ( !aBookmarkIter->second.m_sBookmarkName.isEmpty() )
-                    xBkmNamed->setName( aBookmarkIter->second.m_sBookmarkName );
-                else
-                    xBkmNamed->setName( rBookmarkName );
+                xBkmNamed->setName( aBookmarkIter->second.m_sBookmarkName );
                 xTextAppend->insertTextContent( uno::Reference< text::XTextRange >( xCursor, uno::UNO_QUERY_THROW), xBookmark, !xCursor->isCollapsed() );
             }
             m_aBookmarkMap.erase( aBookmarkIter );
+            m_sCurrentBkmkId.clear();
         }
         else
         {
@@ -4410,7 +4420,9 @@ void DomainMapper_Impl::AddBookmark( const OUString& rBookmarkName, const OUStri
                     bIsStart = !xCursor->goLeft(1, false);
                 xCurrent = xCursor->getStart();
             }
-            m_aBookmarkMap.insert(BookmarkMap_t::value_type( rId, BookmarkInsertPosition( bIsStart, rBookmarkName, xCurrent ) ));
+            m_sCurrentBkmkId = rId;
+            m_aBookmarkMap.insert(BookmarkMap_t::value_type( rId, BookmarkInsertPosition( bIsStart, m_sCurrentBkmkName, xCurrent ) ));
+            m_sCurrentBkmkName.clear();
         }
     }
     catch( const uno::Exception& )
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index 69137f2..8daf26e 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -351,6 +351,8 @@ private:
     LineNumberSettings                                                              m_aLineNumberSettings;
 
     BookmarkMap_t                                                                   m_aBookmarkMap;
+    OUString                                                                        m_sCurrentBkmkId;
+    OUString                                                                        m_sCurrentBkmkName;
 
     _PageMar                                                                        m_aPageMargins;
     sal_Int32                                                                       m_nSymboldata;
@@ -667,7 +669,8 @@ public:
     //the end of field is reached (0x15 appeared) - the command might still be open
     void PopFieldContext();
 
-    void AddBookmark( const OUString& rBookmarkName, const OUString& rId );
+    void SetBookmarkName( const OUString& rBookmarkName );
+    void StartOrEndBookmark( const OUString& rId );
 
     void AddAnnotationPosition(
         const bool bStart,


More information about the Libreoffice-commits mailing list