sw/qa/extras/ooxmlexport/data/date_field_at_end_of_paragraph.docx |binary sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx | 42 ++++++++++ writerfilter/source/dmapper/DomainMapper.cxx | 25 ++--- writerfilter/source/dmapper/DomainMapper.hxx | 2 writerfilter/source/dmapper/SdtHelper.cxx | 7 + writerfilter/source/dmapper/SdtHelper.hxx | 2 6 files changed, 62 insertions(+), 16 deletions(-)
New commits: commit e4680c2b746dd8607a92a8470cefd1109caae66f Author: Tamás Zolnai <[email protected]> AuthorDate: Mon Aug 5 03:37:34 2019 +0200 Commit: Tamás Zolnai <[email protected]> CommitDate: Mon Aug 5 15:13:41 2019 +0200 tdf126701: MSForms: Fix import of date field at the end of the paragraph. We need to create date field before the paragraph is finished (line break is inserted). A date field can not span between paragraphs. Extend other related unit tests too. In other use cases, the field content changes to an invalid data. Reviewed-on: https://gerrit.libreoffice.org/76971 Tested-by: Jenkins Reviewed-by: Tamás Zolnai <[email protected]> (cherry picked from commit b36ef83ea59eeaca239e58b95aa0b1acdcb99efc) Change-Id: Id274649e0aaaf6e3c31e042afd126cefc368c858 Reviewed-on: https://gerrit.libreoffice.org/76977 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Tamás Zolnai <[email protected]> diff --git a/sw/qa/extras/ooxmlexport/data/date_field_at_end_of_paragraph.docx b/sw/qa/extras/ooxmlexport/data/date_field_at_end_of_paragraph.docx new file mode 100644 index 000000000000..6514b2a53089 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/date_field_at_end_of_paragraph.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx index dc59f5a384eb..a4c811695412 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx @@ -8,6 +8,9 @@ */ #include <swmodeltestbase.hxx> +#include <xmloff/odffields.hxx> +#include <IDocumentMarkAccess.hxx> +#include <IMark.hxx> #include <com/sun/star/awt/XBitmap.hpp> #include <com/sun/star/graphic/XGraphic.hpp> @@ -557,6 +560,18 @@ DECLARE_OOXMLEXPORT_TEST(testSdtDateDuplicate, "sdt-date-duplicate.docx") // Single <w:sdt> was exported as 2 <w:sdt> elements. assertXPath(pXmlDoc, "//w:sdt", 1); } + + SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount()); + + ::sw::mark::IDateFieldmark* pFieldmark + = dynamic_cast<::sw::mark::IDateFieldmark*>(pMarkAccess->getAllMarksBegin()->get()); + CPPUNIT_ASSERT(pFieldmark); + CPPUNIT_ASSERT_EQUAL(OUString(ODF_FORMDATE), pFieldmark->GetFieldname()); + CPPUNIT_ASSERT_EQUAL(OUString("4/26/2012"), pFieldmark->GetContent()); } DECLARE_OOXMLEXPORT_TEST(testFdo81492, "fdo81492.docx") @@ -707,6 +722,33 @@ DECLARE_OOXMLEXPORT_TEST( testTdf66401, "tdf66401.docx") DECLARE_OOXMLEXPORT_TEST( testDateFieldInShape, "date_field_in_shape.docx" ) { // This was crashed on export. + SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount()); + + ::sw::mark::IDateFieldmark* pFieldmark + = dynamic_cast<::sw::mark::IDateFieldmark*>(pMarkAccess->getAllMarksBegin()->get()); + CPPUNIT_ASSERT(pFieldmark); + CPPUNIT_ASSERT_EQUAL(OUString(ODF_FORMDATE), pFieldmark->GetFieldname()); + CPPUNIT_ASSERT_EQUAL(OUString("Click here to enter a date."), pFieldmark->GetContent()); +} + +DECLARE_OOXMLEXPORT_TEST( testDateFieldAtEndOfParagraph, "date_field_at_end_of_paragraph.docx" ) +{ + // Additional line end was added by import and it was crashed on export + SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pMarkAccess->getAllMarksCount()); + + ::sw::mark::IDateFieldmark* pFieldmark + = dynamic_cast<::sw::mark::IDateFieldmark*>(pMarkAccess->getAllMarksBegin()->get()); + CPPUNIT_ASSERT(pFieldmark); + CPPUNIT_ASSERT_EQUAL(OUString(ODF_FORMDATE), pFieldmark->GetFieldname()); + CPPUNIT_ASSERT_EQUAL(OUString("Click here to enter a date."), pFieldmark->GetContent()); } CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index 6a0095651ffd..0c788dbb9c41 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -3055,7 +3055,7 @@ void DomainMapper::lcl_text(const sal_uInt8 * data_, size_t len) pContext->Insert(PROP_BREAK_TYPE, uno::makeAny(style::BreakType_COLUMN_BEFORE)); m_pImpl->clearDeferredBreak(COLUMN_BREAK); } - m_pImpl->finishParagraph(m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH)); + finishParagraph(); return; } case cFieldStart: @@ -3248,15 +3248,7 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len) m_pImpl->m_pSdtHelper->getLocale().truncate(); return; } - bool bIsInTable = (m_pImpl->hasTableManager() && m_pImpl->getTableManager().isInTable()) || - (m_pImpl->m_nTableDepth > 0); - if(bIsInTable || m_pImpl->IsInShape()) - { - // Inside an object we need to import date field earlier - m_pImpl->m_pSdtHelper->createDateContentControl(bIsInTable); - } } - if (!m_pImpl->hasTableManager()) return; @@ -3289,7 +3281,7 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len) if ( m_pImpl->GetIsFirstParagraphInSection() || !m_pImpl->IsFirstRun() ) { mbIsSplitPara = true; - m_pImpl->finishParagraph( m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH) ); + finishParagraph(); lcl_startParagraphGroup(); } @@ -3319,7 +3311,7 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len) xContext->Erase(PROP_NUMBERING_LEVEL); } m_pImpl->SetParaSectpr(false); - m_pImpl->finishParagraph(m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH), bRemove); + finishParagraph(bRemove); if (bRemove) m_pImpl->RemoveLastParagraph(); } @@ -3338,7 +3330,7 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len) if (m_pImpl->GetIsFirstParagraphInSection() || !m_pImpl->IsFirstRun()) { m_pImpl->m_bIsSplitPara = true; - m_pImpl->finishParagraph(m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH)); + finishParagraph(); lcl_startParagraphGroup(); } m_pImpl->GetTopContext()->Insert(PROP_BREAK_TYPE, uno::makeAny(style::BreakType_PAGE_BEFORE)); @@ -3348,7 +3340,7 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len) if (m_pImpl->GetIsFirstParagraphInSection() || !m_pImpl->IsFirstRun()) { mbIsSplitPara = true; - m_pImpl->finishParagraph(m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH)); + finishParagraph(); lcl_startParagraphGroup(); } m_pImpl->GetTopContext()->Insert(PROP_BREAK_TYPE, uno::makeAny(style::BreakType_COLUMN_BEFORE)); @@ -3793,6 +3785,13 @@ void DomainMapper::HandleRedline( Sprm& rSprm ) m_pImpl->SetCurrentRedlineIsRead(); } +void DomainMapper::finishParagraph(const bool bRemove) +{ + if (m_pImpl->m_pSdtHelper->validateDateFormat()) + m_pImpl->m_pSdtHelper->createDateContentControl(); + m_pImpl->finishParagraph(m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH), bRemove); +} + } //namespace dmapper } //namespace writerfilter diff --git a/writerfilter/source/dmapper/DomainMapper.hxx b/writerfilter/source/dmapper/DomainMapper.hxx index e6b082cfcd47..e7a52764bf94 100644 --- a/writerfilter/source/dmapper/DomainMapper.hxx +++ b/writerfilter/source/dmapper/DomainMapper.hxx @@ -159,6 +159,8 @@ private: // Table virtual void lcl_entry(int pos, writerfilter::Reference<Properties>::Pointer_t ref) override; + void finishParagraph(const bool bRemove = false); + static void handleUnderlineType(const Id nId, const ::tools::SvRef<PropertyMap>& rContext); void handleParaJustification(const sal_Int32 nIntValue, const ::tools::SvRef<PropertyMap>& rContext, const bool bExchangeLeftRight); static bool getColorFromId(const Id, sal_Int32 &nColor); diff --git a/writerfilter/source/dmapper/SdtHelper.cxx b/writerfilter/source/dmapper/SdtHelper.cxx index 0a109c53d000..5e56340e0b80 100644 --- a/writerfilter/source/dmapper/SdtHelper.cxx +++ b/writerfilter/source/dmapper/SdtHelper.cxx @@ -98,7 +98,7 @@ bool SdtHelper::validateDateFormat() return !m_sDateFormat.toString().isEmpty() && !m_sLocale.toString().isEmpty(); } -void SdtHelper::createDateContentControl(bool bInsideTable) +void SdtHelper::createDateContentControl() { if(!m_xDateFieldStartRange.is()) return; @@ -117,7 +117,10 @@ void SdtHelper::createDateContentControl(bool bInsideTable) try { xCrsr->gotoRange(m_xDateFieldStartRange, false); - if(bInsideTable) + bool bIsInTable + = (m_rDM_Impl.hasTableManager() && m_rDM_Impl.getTableManager().isInTable()) + || (m_rDM_Impl.m_nTableDepth > 0); + if (bIsInTable) xCrsr->goRight(1, false); xCrsr->gotoEnd(true); } diff --git a/writerfilter/source/dmapper/SdtHelper.hxx b/writerfilter/source/dmapper/SdtHelper.hxx index 5efb397edd8a..8f8f3ef9ba7b 100644 --- a/writerfilter/source/dmapper/SdtHelper.hxx +++ b/writerfilter/source/dmapper/SdtHelper.hxx @@ -124,7 +124,7 @@ public: /// Create drop-down control from w:sdt's w:dropDownList. void createDropDownControl(); /// Create date control from w:sdt's w:date. - void createDateContentControl(bool bInsideTable = false); + void createDateContentControl(); void appendToInteropGrabBag(const css::beans::PropertyValue& rValue); css::uno::Sequence<css::beans::PropertyValue> getInteropGrabBagAndClear(); _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
