[PATCH libreoffice-4-0-2] fdo#60769 implement odf export of multi-paragraph comment ra...

Miklos Vajna (via Code Review) gerrit at gerrit.libreoffice.org
Fri Mar 22 07:38:05 PDT 2013


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/2908

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/08/2908/1

fdo#60769 implement odf export of multi-paragraph comment ranges

(cherry picked from commits 287c254d5ebf9b58ca63a8c271e523adf0d34b82 and
1fba17854b2be4fdbe436f44da3ae57a1f75a27c)

Conflicts:
	sw/qa/extras/odfexport/odfexport.cxx

Reviewed-on: https://gerrit.libreoffice.org/2873
Reviewed-by: Noel Power <noel.power at suse.com>
Tested-by: Noel Power <noel.power at suse.com>

(cherry picked from commit 473cd59a71706ada01f8be68c7dfd008ca9bb716)

Change-Id: Ic4a5a1bc685917f2b26be4ab645203f706719c80
---
A sw/qa/extras/odfexport/data/fdo60769.odt
M sw/qa/extras/odfexport/odfexport.cxx
M sw/source/core/unocore/unoportenum.cxx
M xmloff/source/text/txtparae.cxx
4 files changed, 52 insertions(+), 8 deletions(-)



diff --git a/sw/qa/extras/odfexport/data/fdo60769.odt b/sw/qa/extras/odfexport/data/fdo60769.odt
new file mode 100644
index 0000000..b3c3937
--- /dev/null
+++ b/sw/qa/extras/odfexport/data/fdo60769.odt
Binary files differ
diff --git a/sw/qa/extras/odfexport/odfexport.cxx b/sw/qa/extras/odfexport/odfexport.cxx
index 7d93b3b..1252fe9 100644
--- a/sw/qa/extras/odfexport/odfexport.cxx
+++ b/sw/qa/extras/odfexport/odfexport.cxx
@@ -33,6 +33,7 @@
 public:
     void testFdo38244();
     void testFirstHeaderFooter();
+    void testFdo60769();
 
     CPPUNIT_TEST_SUITE(Test);
 #if !defined(MACOSX) && !defined(WNT)
@@ -49,6 +50,7 @@
     MethodEntry<Test> aMethods[] = {
         {"fdo38244.odt", &Test::testFdo38244},
         {"first-header-footer.odt", &Test::testFirstHeaderFooter},
+        {"fdo60769.odt", &Test::testFdo60769},
     };
     for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i)
     {
@@ -116,6 +118,32 @@
     CPPUNIT_ASSERT_EQUAL(OUString("Left footer2"),  parseDump("/root/page[6]/footer/txt/text()"));
 }
 
+void Test::testFdo60769()
+{
+    // Test multi-paragraph comment range feature.
+    uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
+    uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY);
+    uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration();
+    uno::Reference<container::XEnumerationAccess> xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY);
+    uno::Reference<container::XEnumeration> xRunEnum = xRunEnumAccess->createEnumeration();
+    while (xRunEnum->hasMoreElements())
+    {
+        uno::Reference<beans::XPropertySet> xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY);
+        OUString aType =  getProperty<OUString>(xPropertySet, "TextPortionType");
+        // First paragraph: no field end, no anchor
+        CPPUNIT_ASSERT(aType == "Text" || aType == "TextFieldStart");
+    }
+
+    xRunEnumAccess.set(xParaEnum->nextElement(), uno::UNO_QUERY);
+    while (xRunEnum->hasMoreElements())
+    {
+        uno::Reference<beans::XPropertySet> xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY);
+        OUString aType =  getProperty<OUString>(xPropertySet, "TextPortionType");
+        // Second paragraph: no field start
+        CPPUNIT_ASSERT(aType == "Text" || aType == "TextFieldEnd" || aType == "TextFieldEnd");
+    }
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(Test);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/core/unocore/unoportenum.cxx b/sw/source/core/unocore/unoportenum.cxx
index d05b8f5..2829d3f 100644
--- a/sw/source/core/unocore/unoportenum.cxx
+++ b/sw/source/core/unocore/unoportenum.cxx
@@ -754,6 +754,18 @@
                         Reference<XTextField> xField =
                             SwXTextField::CreateSwXTextField(*pDoc, pAttr->GetFld());
                         pPortion->SetTextField(xField);
+
+                        // If this is a postit field and it has a fieldmark
+                        // associated, set the fieldmark as a bookmark.
+                        const SwField* pField = pAttr->GetFld().GetFld();
+                        if (pField->Which() == RES_POSTITFLD)
+                        {
+                            const SwPostItField* pPostItField = dynamic_cast<const SwPostItField*>(pField);
+                            IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess();
+                            IDocumentMarkAccess::const_iterator_t it = pMarkAccess->findMark(pPostItField->GetName());
+                            if (it != pMarkAccess->getMarksEnd())
+                                pPortion->SetBookmark(SwXFieldmark::CreateXFieldmark(*pDoc, *it->get()));
+                        }
                     }
                 break;
                 case RES_TXTATR_FLYCNT   :
diff --git a/xmloff/source/text/txtparae.cxx b/xmloff/source/text/txtparae.cxx
index 96cb842..36f7f0c 100644
--- a/xmloff/source/text/txtparae.cxx
+++ b/xmloff/source/text/txtparae.cxx
@@ -2198,7 +2198,6 @@
     static const OUString sMeta("InContentMetadata");
     static const OUString sFieldMarkName("__FieldMark_");
     bool bPrevCharIsSpace = bPrvChrIsSpc;
-    bool bAnnotationStarted = false;
 
     /* This is  used for exporting to strict OpenDocument 1.2, in which case traditional
      * bookmarks are used instead of fieldmarks. */
@@ -2222,11 +2221,17 @@
             }
             else if( sType.equals(sTextField))
             {
-                if (bAnnotationStarted)
+                Reference< ::com::sun::star::text::XFormField > xFormField;
+                try
                 {
-                    bAnnotationStarted = false;
+                    xFormField.set(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
                 }
-                else
+                catch( const uno::Exception& )
+                {
+                    SAL_WARN("xmloff", "unexpected bookmark exception");
+                }
+
+                if (!xFormField.is() || xFormField->getFieldType() != ODF_COMMENTRANGE)
                 {
                     exportTextField( xTxtRange, bAutoStyles, bIsProgress );
                     bPrevCharIsSpace = false;
@@ -2291,10 +2296,9 @@
             else if (sType.equals(sTextFieldStart))
             {
                 Reference< ::com::sun::star::text::XFormField > xFormField(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
-                if (xFormField->getFieldType() == ODF_COMMENTRANGE)
+                if (xFormField.is() && xFormField->getFieldType() == ODF_COMMENTRANGE)
                 {
                     exportTextField( xTxtRange, bAutoStyles, bIsProgress );
-                    bAnnotationStarted = true;
                     continue;
                 }
 
@@ -2358,7 +2362,8 @@
             }
             else if (sType.equals(sTextFieldEnd))
             {
-                if (bAnnotationStarted)
+                Reference< ::com::sun::star::text::XFormField > xFormField(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
+                if (xFormField.is() && xFormField->getFieldType() == ODF_COMMENTRANGE)
                 {
                     Reference<XNamed> xBookmark(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
                     const OUString& rName = xBookmark->getName();
@@ -2378,7 +2383,6 @@
                 }
                 else
                 {
-                    Reference< ::com::sun::star::text::XFormField > xFormField(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
                     if (xFormField.is())
                     {
                         OUString sName;

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic4a5a1bc685917f2b26be4ab645203f706719c80
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: libreoffice-4-0-2
Gerrit-Owner: Miklos Vajna <vmiklos at suse.cz>



More information about the LibreOffice mailing list