sw/qa/extras/odfexport/data/fdo60769.odt |binary sw/qa/extras/odfexport/odfexport.cxx | 28 ++++++++++++++++++++++++++++ sw/source/core/unocore/unoportenum.cxx | 12 ++++++++++++ xmloff/source/text/txtparae.cxx | 20 ++++++++++++-------- 4 files changed, 52 insertions(+), 8 deletions(-)
New commits: commit 19802872052aaed9d3deff02b882b2043239a406 Author: Miklos Vajna <vmik...@suse.cz> Date: Wed Mar 20 10:43:57 2013 +0100 fdo#60769 implement odf export of multi-paragraph comment ranges Change-Id: Ifb850438586eb6589fde79d10ed9eef727368f42 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 Binary files /dev/null and b/sw/qa/extras/odfexport/data/fdo60769.odt differ diff --git a/sw/qa/extras/odfexport/odfexport.cxx b/sw/qa/extras/odfexport/odfexport.cxx index 4ed23f1..e121c2f 100644 --- a/sw/qa/extras/odfexport/odfexport.cxx +++ b/sw/qa/extras/odfexport/odfexport.cxx @@ -35,6 +35,7 @@ public: void testFdo38244(); void testFirstHeaderFooter(); void testTextframeGradient(); + void testFdo60769(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -52,6 +53,7 @@ void Test::run() {"fdo38244.odt", &Test::testFdo38244}, {"first-header-footer.odt", &Test::testFirstHeaderFooter}, {"textframe-gradient.odt", &Test::testTextframeGradient}, + {"fdo60769.odt", &Test::testFdo60769}, }; header(); for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i) @@ -133,6 +135,32 @@ void Test::testTextframeGradient() CPPUNIT_ASSERT_EQUAL(awt::GradientStyle_AXIAL, aGradient.Style); } +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/xmloff/source/text/txtparae.cxx b/xmloff/source/text/txtparae.cxx index 44f7e4d..cf8dcc8 100644 --- a/xmloff/source/text/txtparae.cxx +++ b/xmloff/source/text/txtparae.cxx @@ -2194,7 +2194,6 @@ void XMLTextParagraphExport::exportTextRangeEnumeration( 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. */ @@ -2218,11 +2217,17 @@ void XMLTextParagraphExport::exportTextRangeEnumeration( } 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; @@ -2287,10 +2292,9 @@ void XMLTextParagraphExport::exportTextRangeEnumeration( 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; } @@ -2354,7 +2358,8 @@ void XMLTextParagraphExport::exportTextRangeEnumeration( } 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(); @@ -2374,7 +2379,6 @@ void XMLTextParagraphExport::exportTextRangeEnumeration( } else { - Reference< ::com::sun::star::text::XFormField > xFormField(xPropSet->getPropertyValue(sBookmark), UNO_QUERY); if (xFormField.is()) { OUString sName; commit c426df5086785807972c1a8d2788567f2842a395 Author: Miklos Vajna <vmik...@suse.cz> Date: Wed Mar 20 10:39:08 2013 +0100 sw: export fieldmark of postit fields if possible This way the UNO export filters won't have to remind if the postit field had an associated fieldmark or not, but can just query the fieldmark type and ignore e.g. comment fieldmarks. Change-Id: I791b07fd371f57ec35d8309e666058237dadf190 diff --git a/sw/source/core/unocore/unoportenum.cxx b/sw/source/core/unocore/unoportenum.cxx index 9fcc536..78be123 100644 --- a/sw/source/core/unocore/unoportenum.cxx +++ b/sw/source/core/unocore/unoportenum.cxx @@ -756,6 +756,18 @@ lcl_ExportHints( 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 : _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits