[Libreoffice-commits] core.git: Branch 'feature/msforms' - 12 commits - sw/qa sw/source writerfilter/source

Tamás Zolnai (via logerrit) logerrit at kemper.freedesktop.org
Thu Jul 4 13:16:31 UTC 2019


Rebased ref, commits from common ancestor:
commit 17191508b9694461e17af65f772de2ff7513282c
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Wed Jul 3 19:57:19 2019 +0200
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Thu Jul 4 13:30:58 2019 +0200

    MSForms: DOCX filter: The new text-based field is allowed in the header.
    
    Change-Id: I71d61c702ccd0470c4c3df09531704783c1b3e01

diff --git a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx
index 3d3c528ef41a..b5b6b6040216 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx
@@ -589,13 +589,13 @@ DECLARE_OOXMLEXPORT_TEST(testfdo82492, "fdo82492.docx")
     assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt[1]/w:sdtContent/w:r",1);
 }
 
-/*DECLARE_OOXMLEXPORT_TEST(testSdtHeader, "sdt-header.docx")
+DECLARE_OOXMLEXPORT_TEST(testSdtHeader, "sdt-header.docx")
 {
     // Problem was that w:sdt elements in headers were lost on import.
     if (xmlDocPtr pXmlDoc = parseExport("word/header1.xml"))
         // This was 0, w:sdt (and then w:date) was missing.
         assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:date", 1);
-}*/
+}
 
 DECLARE_OOXMLEXPORT_TEST(testSdtCompanyMultipara, "sdt-company-multipara.docx")
 {
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index b24e258645d9..5647b6ef115d 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -1018,7 +1018,7 @@ void DomainMapper::lcl_attribute(Id nName, Value & val)
 
             if (!m_pImpl->m_pSdtHelper->getDropDownItems().empty())
                 m_pImpl->m_pSdtHelper->createDropDownControl();
-            else if (m_pImpl->m_pSdtHelper->validateDateFormat() && !IsInHeaderFooter())
+            else if (m_pImpl->m_pSdtHelper->validateDateFormat())
                 m_pImpl->m_pSdtHelper->createDateContentControl();
         break;
         case NS_ooxml::LN_CT_SdtListItem_displayText:
@@ -2427,30 +2427,20 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext )
     break;
     case NS_ooxml::LN_CT_SdtDate_dateFormat:
     {
-        if (!IsInHeaderFooter())
-            m_pImpl->m_pSdtHelper->getDateFormat().append(sStringValue);
-        else
-            m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_SdtDate_dateFormat", sStringValue);
+        m_pImpl->m_pSdtHelper->getDateFormat().append(sStringValue);
     }
     break;
     case NS_ooxml::LN_CT_SdtDate_storeMappedDataAs:
     {
-        if (IsInHeaderFooter())
-            m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_SdtDate_storeMappedDataAs", sStringValue);
     }
     break;
     case NS_ooxml::LN_CT_SdtDate_calendar:
     {
-        if (IsInHeaderFooter())
-            m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_SdtDate_calendar", sStringValue);
     }
     break;
     case NS_ooxml::LN_CT_SdtDate_lid:
     {
-        if (!IsInHeaderFooter())
-            m_pImpl->m_pSdtHelper->getLocale().append(sStringValue);
-        else
-            m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_SdtDate_lid", sStringValue);
+        m_pImpl->m_pSdtHelper->getLocale().append(sStringValue);
     }
     break;
     case NS_ooxml::LN_CT_SdtPr_dataBinding:
@@ -3213,13 +3203,13 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len)
             return;
         }
     }
-    // Form controls are not allowed in headers / footers; see sw::DocumentContentOperationsManager::InsertDrawObj()
-    else if (m_pImpl->m_pSdtHelper->validateDateFormat() && !IsInHeaderFooter())
+    else if (m_pImpl->m_pSdtHelper->validateDateFormat())
     {
         // Date field will be imported, so we don't need the corresponding date text in most of the cases
         // however when fullDate is not specified, but we have a date string we need to import it as
         // simple text (this is the case when user sets date field manually in MSO).
-        if(!m_pImpl->m_pSdtHelper->getDate().toString().isEmpty() || sText.isEmpty())
+        if((!m_pImpl->m_pSdtHelper->getDate().toString().isEmpty() || sText.isEmpty()) &&
+           (!IsInHeaderFooter() || !m_pImpl->IsDiscardHeaderFooter())) // discard date control with header / footer
         {
             return;
         }
commit b82558c48932fa1c4e853e520fd712aaa67932a5
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Wed Jul 3 19:46:48 2019 +0200
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Thu Jul 4 13:30:57 2019 +0200

    MSForms: DOCX filter: update testN820509() test
    
    Now we import date field as date form field and not as date form control.
    Design mode has no interaction with this kind of field, so we don't need
    check the design mode status.
    
    Change-Id: I5dc2abc33f307d934771e4f6608d1c3a9ed71b0b

diff --git a/sw/qa/extras/ooxmlexport/data/n820509.docx b/sw/qa/extras/ooxmlexport/data/n820509.docx
index a6da1e16842c..bfaea9075652 100644
Binary files a/sw/qa/extras/ooxmlexport/data/n820509.docx and b/sw/qa/extras/ooxmlexport/data/n820509.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx
index 0ab2ee04f42c..59ab8b015be6 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx
@@ -44,6 +44,9 @@
 #include <unotools/fltrcfg.hxx>
 #include <comphelper/sequenceashashmap.hxx>
 #include <oox/drawingml/drawingmltypes.hxx>
+#include <xmloff/odffields.hxx>
+#include <IDocumentMarkAccess.hxx>
+#include <IMark.hxx>
 
 #include <bordertest.hxx>
 
@@ -958,19 +961,34 @@ DECLARE_OOXMLEXPORT_TEST(testN816593, "n816593.docx")
     CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTables->getCount());
 }
 
-/*DECLARE_OOXMLEXPORT_TEST(testN820509, "n820509.docx")
+DECLARE_OOXMLEXPORT_TEST(testN820509, "n820509.docx")
 {
-    // Design mode was enabled.
-    uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
-    uno::Reference<view::XFormLayerAccess> xFormLayerAccess(xModel->getCurrentController(), uno::UNO_QUERY);
-    CPPUNIT_ASSERT_EQUAL(false, bool(xFormLayerAccess->isFormDesignMode()));
-
     // M.d.yyyy date format was unhandled.
-    uno::Reference<drawing::XControlShape> xControlShape(getShape(1), uno::UNO_QUERY);
-    uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
-    uno::Reference<lang::XServiceInfo> xServiceInfo(xPropertySet, uno::UNO_QUERY);
-    CPPUNIT_ASSERT_EQUAL(sal_Int16(8), getProperty<sal_Int16>(xPropertySet, "DateFormat"));
-}*/
+    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());
+
+    for(auto aIter = pMarkAccess->getAllMarksBegin(); aIter != pMarkAccess->getAllMarksEnd(); ++aIter)
+    {
+        ::sw::mark::IFieldmark* pFieldmark = dynamic_cast<::sw::mark::IFieldmark*>(*aIter);
+
+        if(!pFieldmark)
+            continue;
+
+        CPPUNIT_ASSERT_EQUAL(OUString(ODF_FORMDATE), pFieldmark->GetFieldname());
+
+        const sw::mark::IFieldmark::parameter_map_t* const pParameters = pFieldmark->GetParameters();
+        OUString sDateFormat;
+        auto pResult = pParameters->find(ODF_FORMDATE_DATEFORMAT);
+        if (pResult != pParameters->end())
+        {
+            pResult->second >>= sDateFormat;
+        }
+        CPPUNIT_ASSERT_EQUAL(OUString("M.d.yyyy"), sDateFormat);
+    }
+}
 
 DECLARE_OOXMLEXPORT_TEST(testN830205, "n830205.docx")
 {
commit fa751efff1a0ebcc00743130f32f6914a1110282
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Wed Jul 3 19:21:35 2019 +0200
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Thu Jul 4 13:30:56 2019 +0200

    MSForms: DOCX filter: reenable passing test
    
    Change-Id: I566a65fa4ece6500128ceeb497c01f1c6e38470c

diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx
index 2d717f106b54..0ab2ee04f42c 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx
@@ -527,21 +527,21 @@ DECLARE_OOXMLEXPORT_TEST(testN780563, "n780563.docx")
     CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount( ));
 }
 
-/*DECLARE_OOXMLEXPORT_TEST(testN780853, "n780853.docx")
-{*/
+DECLARE_OOXMLEXPORT_TEST(testN780853, "n780853.docx")
+{
     /*
      * The problem was that the table was not imported.
      *
      * xray ThisComponent.TextTables.Count 'was 0
      */
-    /*uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY);
     uno::Reference<container::XIndexAccess> xIndexAccess(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY);
     CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount());
 
     //tdf#102619 - I would have expected this to be "Standard", but MSO 2013/2010/2003 all give FollowStyle==Date
     uno::Reference< beans::XPropertySet > properties(getStyles("ParagraphStyles")->getByName("Date"), uno::UNO_QUERY);
     CPPUNIT_ASSERT_EQUAL(OUString("Date"), getProperty<OUString>(properties, "FollowStyle"));
-}*/
+}
 
 DECLARE_OOXMLEXPORT_TEST(testN780843, "n780843.docx")
 {
commit 112401ce78b2752b510283d2502a57b815e0450b
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Wed Jul 3 14:43:54 2019 +0200
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Thu Jul 4 13:30:56 2019 +0200

    MSForms: DOCX filter: handle date formats with quotation marks.
    
    Change-Id: I61cc6d47200acdd55f147b4f1829330dec8562a0

diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx
index c6d67de8bd25..6e4fd349935f 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx
@@ -661,7 +661,7 @@ DECLARE_OOXMLEXPORT_TEST(testTableCurruption, "tableCurrupt.docx")
     CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), aHeaderBottomBorder.LineWidth);
 }
 
-/*DECLARE_OOXMLEXPORT_TEST(testDateControl, "date-control.docx")
+DECLARE_OOXMLEXPORT_TEST(testDateControl, "date-control.docx")
 {
     // check XML
     xmlDocPtr pXmlDoc = parseExport("word/document.xml");
@@ -671,7 +671,7 @@ DECLARE_OOXMLEXPORT_TEST(testTableCurruption, "tableCurrupt.docx")
     assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:date/w:dateFormat", "val", "dddd, dd' de 'MMMM' de 'yyyy");
     assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:date/w:lid", "val", "es-ES");
     assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtContent/w:r/w:t", u"mi\u00E9rcoles, 05 de marzo de 2014");
-}*/
+}
 
 DECLARE_OOXMLEXPORT_TEST(test_OpeningBrace, "2120112713_OpenBrace.docx")
 {
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 0a708d0bc6f0..eac660544018 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -1884,8 +1884,11 @@ void DocxAttributeOutput::WriteFormDate(const OUString& sCurrentDate, const OUSt
     else
         m_pSerializer->startElementNS(XML_w, XML_date);
 
+    OString sUTF8DateFormat = sDateFormat.toUtf8();
+    // Replace quotation mark used for mark static strings in date format
+    sUTF8DateFormat = sUTF8DateFormat.replaceAll("\"", "'");
     m_pSerializer->singleElementNS(XML_w, XML_dateFormat,
-                                   FSNS(XML_w, XML_val), sDateFormat.toUtf8());
+                                   FSNS(XML_w, XML_val), sUTF8DateFormat);
     m_pSerializer->singleElementNS(XML_w, XML_lid,
                                    FSNS(XML_w, XML_val), sLang.toUtf8());
     m_pSerializer->singleElementNS(XML_w, XML_storeMappedDataAs,
diff --git a/writerfilter/source/dmapper/SdtHelper.cxx b/writerfilter/source/dmapper/SdtHelper.cxx
index c55ceaec0d65..1c7c04563f09 100644
--- a/writerfilter/source/dmapper/SdtHelper.cxx
+++ b/writerfilter/source/dmapper/SdtHelper.cxx
@@ -122,7 +122,10 @@ void SdtHelper::createDateContentControl()
             uno::Reference<container::XNameContainer> xNameCont = xFormField->getParameters();
             if(xNameCont.is())
             {
-                xNameCont->insertByName(ODF_FORMDATE_DATEFORMAT, uno::makeAny(m_sDateFormat.makeStringAndClear()));
+                OUString sDateFormat = m_sDateFormat.makeStringAndClear();
+                // Replace quotation mark used for mark static strings in date format
+                sDateFormat = sDateFormat.replaceAll("'", "\"");
+                xNameCont->insertByName(ODF_FORMDATE_DATEFORMAT, uno::makeAny(sDateFormat));
                 xNameCont->insertByName(ODF_FORMDATE_DATEFORMAT_LANGUAGE, uno::makeAny(m_sLocale.makeStringAndClear()));
                 OUString sDate = m_sDate.makeStringAndClear();
                 if(!sDate.isEmpty())
commit 607defef5da655ca998e0ab1285701a26d9edb5a
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Wed Jul 3 14:43:12 2019 +0200
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Thu Jul 4 13:30:55 2019 +0200

    MSForms: date format: better searching of date format entries
    
    GetEntryKey and PutEntry methods are not consistent.
    It can happen that GetEntryKey does not found the format
    we are searching for, however the PutEntry() method finds
    it among the entries and so returns with failure.
    Let's check the nFormat instead, PutEntry returns the found
    entry key if the entry exists.
    
    Change-Id: Ia7e8702b03999950adfa649d1adc3a839dc5a178

diff --git a/sw/source/core/crsr/DateFormFieldButton.cxx b/sw/source/core/crsr/DateFormFieldButton.cxx
index f9586c14b3fb..db4275746176 100644
--- a/sw/source/core/crsr/DateFormFieldButton.cxx
+++ b/sw/source/core/crsr/DateFormFieldButton.cxx
@@ -56,20 +56,19 @@ SwDatePickerDialog::SwDatePickerDialog(SwEditWin* parent, sw::mark::IFieldmark*
             pResult->second >>= sDateString;
 
             sal_uInt32 nFormat = m_pNumberFormatter->GetEntryKey(ODF_FORMDATE_CURRENTDATE_FORMAT, ODF_FORMDATE_CURRENTDATE_LANGUAGE);
-            bool bValidFormat = nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND;
             if (nFormat == NUMBERFORMAT_ENTRY_NOT_FOUND)
             {
                 sal_Int32 nCheckPos = 0;
                 SvNumFormatType nType;
                 OUString sFormat = ODF_FORMDATE_CURRENTDATE_FORMAT;
-                bValidFormat = m_pNumberFormatter->PutEntry(sFormat,
-                                                            nCheckPos,
-                                                            nType,
-                                                            nFormat,
-                                                            ODF_FORMDATE_CURRENTDATE_LANGUAGE);
+                m_pNumberFormatter->PutEntry(sFormat,
+                                             nCheckPos,
+                                             nType,
+                                             nFormat,
+                                             ODF_FORMDATE_CURRENTDATE_LANGUAGE);
             }
 
-            if (bValidFormat)
+            if (nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND)
             {
                 double dCurrentDate = 0;
                 m_pNumberFormatter->IsNumberFormat(sDateString, nFormat, dCurrentDate);
@@ -100,20 +99,19 @@ IMPL_LINK(SwDatePickerDialog, ImplSelectHdl, Calendar*, pCalendar, void)
         if (m_pFieldmark != nullptr)
         {
             sal_uInt32 nFormat = m_pNumberFormatter->GetEntryKey(ODF_FORMDATE_CURRENTDATE_FORMAT, ODF_FORMDATE_CURRENTDATE_LANGUAGE);
-            bool bValidFormat = nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND;
             if (nFormat == NUMBERFORMAT_ENTRY_NOT_FOUND)
             {
                 sal_Int32 nCheckPos = 0;
                 SvNumFormatType nType;
                 OUString sFormat = ODF_FORMDATE_CURRENTDATE_FORMAT;
-                bValidFormat = m_pNumberFormatter->PutEntry(sFormat,
-                                                   nCheckPos,
-                                                   nType,
-                                                   nFormat,
-                                                   ODF_FORMDATE_CURRENTDATE_LANGUAGE);
+                m_pNumberFormatter->PutEntry(sFormat,
+                                             nCheckPos,
+                                             nType,
+                                             nFormat,
+                                             ODF_FORMDATE_CURRENTDATE_LANGUAGE);
             }
 
-            if (bValidFormat)
+            if (nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND)
             {
                 Color* pCol = nullptr;
                 OUString sOutput;
diff --git a/sw/source/core/text/itrform2.cxx b/sw/source/core/text/itrform2.cxx
index 9040eb3f6362..905b427c44e9 100644
--- a/sw/source/core/text/itrform2.cxx
+++ b/sw/source/core/text/itrform2.cxx
@@ -891,20 +891,19 @@ namespace sw { namespace mark {
             pResult->second >>= sFormattedDate;
 
             sal_uInt32 nFormat = pFormatter->GetEntryKey(ODF_FORMDATE_CURRENTDATE_FORMAT, ODF_FORMDATE_CURRENTDATE_LANGUAGE);
-            bool bValidFormat = nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND;
             if (nFormat == NUMBERFORMAT_ENTRY_NOT_FOUND)
             {
                 sal_Int32 nCheckPos = 0;
                 SvNumFormatType nType;
                 OUString sFormat = ODF_FORMDATE_CURRENTDATE_FORMAT;
-                bValidFormat = pFormatter->PutEntry(sFormat,
-                                                    nCheckPos,
-                                                    nType,
-                                                    nFormat,
-                                                    ODF_FORMDATE_CURRENTDATE_LANGUAGE);
+                pFormatter->PutEntry(sFormat,
+                                     nCheckPos,
+                                     nType,
+                                     nFormat,
+                                     ODF_FORMDATE_CURRENTDATE_LANGUAGE);
             }
 
-            if (bValidFormat)
+            if (nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND)
             {
                 pFormatter->IsNumberFormat(sFormattedDate, nFormat, dCurrentDate);
                 bHasCurrentDate = true;
@@ -914,20 +913,19 @@ namespace sw { namespace mark {
         if (!sDateFormat.isEmpty() && !sLang.isEmpty() && bHasCurrentDate)
         {
             sal_uInt32 nFormat = pFormatter->GetEntryKey(sDateFormat, LanguageTag(sLang).getLanguageType());
-            bool bValidFormat = nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND;
             if (nFormat == NUMBERFORMAT_ENTRY_NOT_FOUND)
             {
                 sal_Int32 nCheckPos = 0;
                 SvNumFormatType nType;
-                bValidFormat = pFormatter->PutEntry(sDateFormat,
-                                                    nCheckPos,
-                                                    nType,
-                                                    nFormat,
-                                                    LanguageTag(sLang).getLanguageType());
+                pFormatter->PutEntry(sDateFormat,
+                                     nCheckPos,
+                                     nType,
+                                     nFormat,
+                                     LanguageTag(sLang).getLanguageType());
             }
 
             OUString sOutput;
-            if (bValidFormat)
+            if (nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND)
             {
                 Color* pCol = nullptr;
                 pFormatter->GetOutputString(dCurrentDate, nFormat, sOutput, &pCol, false);
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index abd054ce32cb..0a708d0bc6f0 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -1899,57 +1899,52 @@ void DocxAttributeOutput::WriteFormDate(const OUString& sCurrentDate, const OUSt
     m_pSerializer->startElementNS(XML_w, XML_sdtContent);
     m_pSerializer->startElementNS(XML_w, XML_r);
 
+    // Convert the current date to the right format
     if (!sCurrentDate.isEmpty())
     {
-        // Convert the current date to the right format
-        if (!sCurrentDate.isEmpty())
-        {
-            SvNumberFormatter* pFormatter = m_rExport.m_pDoc->GetNumberFormatter();
+        SvNumberFormatter* pFormatter = m_rExport.m_pDoc->GetNumberFormatter();
 
-            double dCurrentDate = 0.0;
-            // First get the date internal double representation
-            sal_uInt32 nFormat = pFormatter->GetEntryKey(ODF_FORMDATE_CURRENTDATE_FORMAT, ODF_FORMDATE_CURRENTDATE_LANGUAGE);
-            bool bValidFormat = nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND;
-            if (nFormat == NUMBERFORMAT_ENTRY_NOT_FOUND)
-            {
-                sal_Int32 nCheckPos = 0;
-                SvNumFormatType nType;
-                OUString sFormat = ODF_FORMDATE_CURRENTDATE_FORMAT;
-                bValidFormat = pFormatter->PutEntry(sFormat,
-                                                    nCheckPos,
-                                                    nType,
-                                                    nFormat,
-                                                    ODF_FORMDATE_CURRENTDATE_LANGUAGE);
-            }
-            if (bValidFormat)
-            {
-                pFormatter->IsNumberFormat(sCurrentDate, nFormat, dCurrentDate);
-            }
-
-            // Then convert the date to a fromatter string
-            nFormat = pFormatter->GetEntryKey(sDateFormat, LanguageTag(sLang).getLanguageType());
-            bValidFormat = nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND;
-            if (nFormat == NUMBERFORMAT_ENTRY_NOT_FOUND)
-            {
-                sal_Int32 nCheckPos = 0;
-                SvNumFormatType nType;
-                OUString sNonConstDateFormat = sDateFormat;
-                bValidFormat = pFormatter->PutEntry(sNonConstDateFormat,
-                                                    nCheckPos,
-                                                    nType,
-                                                    nFormat,
-                                                    LanguageTag(sLang).getLanguageType());
-            }
+        double dCurrentDate = 0.0;
+        // First get the date internal double representation
+        sal_uInt32 nFormat = pFormatter->GetEntryKey(ODF_FORMDATE_CURRENTDATE_FORMAT, ODF_FORMDATE_CURRENTDATE_LANGUAGE);
+        if (nFormat == NUMBERFORMAT_ENTRY_NOT_FOUND)
+        {
+            sal_Int32 nCheckPos = 0;
+            SvNumFormatType nType;
+            OUString sFormat = ODF_FORMDATE_CURRENTDATE_FORMAT;
+            pFormatter->PutEntry(sFormat,
+                                 nCheckPos,
+                                 nType,
+                                 nFormat,
+                                 ODF_FORMDATE_CURRENTDATE_LANGUAGE);
+        }
+        if (nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND)
+        {
+            pFormatter->IsNumberFormat(sCurrentDate, nFormat, dCurrentDate);
+        }
 
-            OUString sOutput;
-            if (bValidFormat)
-            {
-                Color* pCol = nullptr;
-                pFormatter->GetOutputString(dCurrentDate, nFormat, sOutput, &pCol, false);
-            }
+        // Then convert the date to a fromatter string
+        nFormat = pFormatter->GetEntryKey(sDateFormat, LanguageTag(sLang).getLanguageType());
+        if (nFormat == NUMBERFORMAT_ENTRY_NOT_FOUND)
+        {
+            sal_Int32 nCheckPos = 0;
+            SvNumFormatType nType;
+            OUString sNonConstDateFormat = sDateFormat;
+            pFormatter->PutEntry(sNonConstDateFormat,
+                                 nCheckPos,
+                                 nType,
+                                 nFormat,
+                                 LanguageTag(sLang).getLanguageType());
+        }
 
-            RunText(sOutput);
+        OUString sOutput;
+        if (nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND)
+        {
+            Color* pCol = nullptr;
+            pFormatter->GetOutputString(dCurrentDate, nFormat, sOutput, &pCol, false);
         }
+
+        RunText(sOutput);
     }
 
     m_pSerializer->endElementNS(XML_w, XML_r);
diff --git a/sw/source/ui/fldui/DateFormFieldDialog.cxx b/sw/source/ui/fldui/DateFormFieldDialog.cxx
index 6b8fbaf35d38..30b97178f44e 100644
--- a/sw/source/ui/fldui/DateFormFieldDialog.cxx
+++ b/sw/source/ui/fldui/DateFormFieldDialog.cxx
@@ -77,19 +77,18 @@ void DateFormFieldDialog::InitControls()
         {
             LanguageType aLangType = LanguageTag(sLang).getLanguageType();
             sal_uInt32 nFormatKey = m_pNumberFormatter->GetEntryKey(sFormatString, aLangType);
-            bool bValidFormat = nFormatKey != NUMBERFORMAT_ENTRY_NOT_FOUND;
             if (nFormatKey == NUMBERFORMAT_ENTRY_NOT_FOUND)
             {
                 sal_Int32 nCheckPos = 0;
                 SvNumFormatType nType;
-                bValidFormat = m_pNumberFormatter->PutEntry(sFormatString,
-                                                            nCheckPos,
-                                                            nType,
-                                                            nFormatKey,
-                                                            LanguageTag(sLang).getLanguageType());
+                m_pNumberFormatter->PutEntry(sFormatString,
+                                             nCheckPos,
+                                             nType,
+                                             nFormatKey,
+                                             LanguageTag(sLang).getLanguageType());
             }
 
-            if(aLangType != LANGUAGE_DONTKNOW && bValidFormat)
+            if(aLangType != LANGUAGE_DONTKNOW && nFormatKey != NUMBERFORMAT_ENTRY_NOT_FOUND)
             {
                 if (m_xFormatLB->GetCurLanguage() == aLangType)
                 {
commit 796b73bd1f4319780d8e7fa4f099e02a4d9a8898
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Mon Jul 1 15:49:01 2019 +0200
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Thu Jul 4 13:30:54 2019 +0200

    MSForms: DOCX filter: import manually set date field as plain text
    
    In MSO the user can add any text in the date field without having it
    in the specified date format. We import this kind of date as plain text.
    
    Change-Id: Ied4bf03a3ac4c9b6f1cfc78d91e6a52ad3d6e179

diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx
index 0a989161fba6..9bae9e7fab91 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx
@@ -34,13 +34,19 @@ DECLARE_OOXMLIMPORT_TEST(testTdf108545_embeddedDocxIcon, "tdf108545_embeddedDocx
     CPPUNIT_ASSERT_EQUAL(embed::Aspects::MSOLE_ICON, xSupplier->getAspect());
 }
 
-/*DECLARE_OOXMLIMPORT_TEST(testTdf121203, "tdf121203.docx")
+DECLARE_OOXMLIMPORT_TEST(testTdf121203, "tdf121203.docx")
 {
-    // Make sure that the date SDT's content is imported as plain text, as it
-    // has no ISO date, so we have no idea how to represent that with our date
-    // control.
+    // Make sure that the date SDT's content is imported as plain text, as
+    // the field has no fullDate attribute which we can use to find out the actual date.
     CPPUNIT_ASSERT_EQUAL(OUString("17-Oct-2018 09:00"), getRun(getParagraph(1), 1)->getString());
-}*/
+
+    // Make sure we did not import a date field.
+    SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
+    CPPUNIT_ASSERT(pTextDoc);
+    SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc();
+    IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess();
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pMarkAccess->getAllMarksCount());
+}
 
 DECLARE_OOXMLIMPORT_TEST(testTdf109053, "tdf109053.docx")
 {
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 749102c4e903..b24e258645d9 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -1028,10 +1028,7 @@ void DomainMapper::lcl_attribute(Id nName, Value & val)
             m_pImpl->m_pSdtHelper->getDropDownItems().push_back(sStringValue);
         break;
         case NS_ooxml::LN_CT_SdtDate_fullDate:
-            if (!IsInHeaderFooter())
-                m_pImpl->m_pSdtHelper->getDate().append(sStringValue);
-            else
-                m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_SdtDate_fullDate", sStringValue);
+            m_pImpl->m_pSdtHelper->getDate().append(sStringValue);
         break;
         case NS_ooxml::LN_CT_Background_color:
             if (m_pImpl->GetSettingsTable()->GetDisplayBackgroundShape())
@@ -3219,8 +3216,16 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len)
     // Form controls are not allowed in headers / footers; see sw::DocumentContentOperationsManager::InsertDrawObj()
     else if (m_pImpl->m_pSdtHelper->validateDateFormat() && !IsInHeaderFooter())
     {
-        // date field is imported, we don't need the corresponding date text
-        return;
+        // Date field will be imported, so we don't need the corresponding date text in most of the cases
+        // however when fullDate is not specified, but we have a date string we need to import it as
+        // simple text (this is the case when user sets date field manually in MSO).
+        if(!m_pImpl->m_pSdtHelper->getDate().toString().isEmpty() || sText.isEmpty())
+        {
+            return;
+        }
+        // Remove date field attributes to avoid to import an actual date field
+        m_pImpl->m_pSdtHelper->getDateFormat().truncate();
+        m_pImpl->m_pSdtHelper->getLocale().truncate();
     }
     else if (!m_pImpl->m_pSdtHelper->isInteropGrabBagEmpty())
     {
commit c1e976997f6a7858f353ace7fe6aa016c991cca4
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Mon Jul 1 14:51:38 2019 +0200
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Thu Jul 4 13:30:54 2019 +0200

    MSForms: DOCX filter: add a test case about invalid date fields
    
    Change-Id: I2048198d81ea4abf58b2b499b89495cd51b5c7ff

diff --git a/sw/qa/extras/ooxmlexport/data/invalid_date_form_field.docx b/sw/qa/extras/ooxmlexport/data/invalid_date_form_field.docx
new file mode 100644
index 000000000000..9dc24e768b0f
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/invalid_date_form_field.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
index 8b2cab87042e..64de29ac9175 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
@@ -351,6 +351,83 @@ DECLARE_OOXMLIMPORT_TEST(testTdf121784, "tdf121784.docx")
     CPPUNIT_ASSERT_EQUAL( OUString( "i" ), getRun( getParagraph( 2 ), 3 )->getString());
 }
 
+DECLARE_OOXMLIMPORT_TEST(testInvalidDateFormField, "invalid_date_form_field.docx")
+{
+
+    SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
+    CPPUNIT_ASSERT(pTextDoc);
+    SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc();
+    IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess();
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(6), pMarkAccess->getAllMarksCount());
+
+    int nIndex = 0;
+    for(auto aIter = pMarkAccess->getAllMarksBegin(); aIter != pMarkAccess->getAllMarksEnd(); ++aIter)
+    {
+        ::sw::mark::IFieldmark* pFieldmark = dynamic_cast<::sw::mark::IFieldmark*>(*aIter);
+
+        if(!pFieldmark)
+            continue;
+
+        CPPUNIT_ASSERT(pFieldmark);
+        CPPUNIT_ASSERT_EQUAL(OUString(ODF_FORMDATE), pFieldmark->GetFieldname());
+
+        // Check drop down field's parameters.
+        const sw::mark::IFieldmark::parameter_map_t* const pParameters = pFieldmark->GetParameters();
+        OUString sDateFormat;
+        auto pResult = pParameters->find(ODF_FORMDATE_DATEFORMAT);
+        if (pResult != pParameters->end())
+        {
+            pResult->second >>= sDateFormat;
+        }
+
+        OUString sLang;
+        pResult = pParameters->find(ODF_FORMDATE_DATEFORMAT_LANGUAGE);
+        if (pResult != pParameters->end())
+        {
+            pResult->second >>= sLang;
+        }
+
+        OUString sCurrentDate;
+        pResult = pParameters->find(ODF_FORMDATE_CURRENTDATE);
+        if (pResult != pParameters->end())
+        {
+            pResult->second >>= sCurrentDate;
+        }
+
+        // The first one has invalid date format (invalid = LO can't parse it)
+        if(nIndex == 0)
+        {
+
+            CPPUNIT_ASSERT_EQUAL(OUString("YYYY.MM.DDT00:00:00Z"), sDateFormat);
+            CPPUNIT_ASSERT_EQUAL(OUString("en-US"), sLang);
+            CPPUNIT_ASSERT_EQUAL(OUString(""), sCurrentDate);
+
+            CPPUNIT_ASSERT_EQUAL(sal_uLong(9), pFieldmark->GetMarkStart().nNode.GetIndex());
+            CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pFieldmark->GetMarkStart().nContent.GetIndex());
+        }
+        else if (nIndex == 1) // The second has wrong date
+        {
+            CPPUNIT_ASSERT_EQUAL(OUString("MM/DD/YY"), sDateFormat);
+            CPPUNIT_ASSERT_EQUAL(OUString("en-US"), sLang);
+            CPPUNIT_ASSERT_EQUAL(OUString("2019.06.34"), sCurrentDate);
+
+            CPPUNIT_ASSERT_EQUAL(sal_uLong(9), pFieldmark->GetMarkStart().nNode.GetIndex());
+            CPPUNIT_ASSERT_EQUAL(sal_Int32(13), pFieldmark->GetMarkStart().nContent.GetIndex());
+        }
+        else // The third one has wrong local
+        {
+            CPPUNIT_ASSERT_EQUAL(OUString("[NatNum12 MMMM=abbreviation]YYYY\". \"MMMM D."), sDateFormat);
+            CPPUNIT_ASSERT_EQUAL(OUString("xxxx"), sLang);
+            CPPUNIT_ASSERT_EQUAL(OUString("2019.06.11"), sCurrentDate);
+
+            CPPUNIT_ASSERT_EQUAL(sal_uLong(9), pFieldmark->GetMarkStart().nNode.GetIndex());
+            CPPUNIT_ASSERT_EQUAL(sal_Int32(23), pFieldmark->GetMarkStart().nContent.GetIndex());
+        }
+        ++nIndex;
+    }
+    CPPUNIT_ASSERT_EQUAL(int(3), nIndex);
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 42d027e583319429d9fe2befc0f49df46c614c82
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Mon Jul 1 14:24:08 2019 +0200
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Thu Jul 4 13:30:53 2019 +0200

    MSForms: date form field dialog: create the format entry if it does not exist
    
    Change-Id: I62da736efeabc2da634d9a7a38512d7e908b03fc

diff --git a/sw/source/ui/fldui/DateFormFieldDialog.cxx b/sw/source/ui/fldui/DateFormFieldDialog.cxx
index a265dc130826..6b8fbaf35d38 100644
--- a/sw/source/ui/fldui/DateFormFieldDialog.cxx
+++ b/sw/source/ui/fldui/DateFormFieldDialog.cxx
@@ -77,8 +77,19 @@ void DateFormFieldDialog::InitControls()
         {
             LanguageType aLangType = LanguageTag(sLang).getLanguageType();
             sal_uInt32 nFormatKey = m_pNumberFormatter->GetEntryKey(sFormatString, aLangType);
+            bool bValidFormat = nFormatKey != NUMBERFORMAT_ENTRY_NOT_FOUND;
+            if (nFormatKey == NUMBERFORMAT_ENTRY_NOT_FOUND)
+            {
+                sal_Int32 nCheckPos = 0;
+                SvNumFormatType nType;
+                bValidFormat = m_pNumberFormatter->PutEntry(sFormatString,
+                                                            nCheckPos,
+                                                            nType,
+                                                            nFormatKey,
+                                                            LanguageTag(sLang).getLanguageType());
+            }
 
-            if(aLangType != LANGUAGE_DONTKNOW && nFormatKey != NUMBERFORMAT_ENTRY_NOT_FOUND)
+            if(aLangType != LANGUAGE_DONTKNOW && bValidFormat)
             {
                 if (m_xFormatLB->GetCurLanguage() == aLangType)
                 {
commit 1b60b5895a67f36bb53f5b1fee7aee7829711782
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Mon Jul 1 13:45:09 2019 +0200
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Thu Jul 4 13:30:52 2019 +0200

    MSForms: date field converions: better error handling
    
    Change-Id: Ia518c7c50079e443ddf135f1c32c5c39d2c85552

diff --git a/sw/source/core/crsr/DateFormFieldButton.cxx b/sw/source/core/crsr/DateFormFieldButton.cxx
index 5ad43faf1ebb..f9586c14b3fb 100644
--- a/sw/source/core/crsr/DateFormFieldButton.cxx
+++ b/sw/source/core/crsr/DateFormFieldButton.cxx
@@ -55,24 +55,28 @@ SwDatePickerDialog::SwDatePickerDialog(SwEditWin* parent, sw::mark::IFieldmark*
             OUString sDateString;
             pResult->second >>= sDateString;
 
-            double dCurrentDate = 0;
             sal_uInt32 nFormat = m_pNumberFormatter->GetEntryKey(ODF_FORMDATE_CURRENTDATE_FORMAT, ODF_FORMDATE_CURRENTDATE_LANGUAGE);
+            bool bValidFormat = nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND;
             if (nFormat == NUMBERFORMAT_ENTRY_NOT_FOUND)
             {
                 sal_Int32 nCheckPos = 0;
                 SvNumFormatType nType;
                 OUString sFormat = ODF_FORMDATE_CURRENTDATE_FORMAT;
-                m_pNumberFormatter->PutEntry(sFormat,
-                                             nCheckPos,
-                                             nType,
-                                             nFormat,
-                                             ODF_FORMDATE_CURRENTDATE_LANGUAGE);
+                bValidFormat = m_pNumberFormatter->PutEntry(sFormat,
+                                                            nCheckPos,
+                                                            nType,
+                                                            nFormat,
+                                                            ODF_FORMDATE_CURRENTDATE_LANGUAGE);
             }
 
-            m_pNumberFormatter->IsNumberFormat(sDateString, nFormat, dCurrentDate);
+            if (bValidFormat)
+            {
+                double dCurrentDate = 0;
+                m_pNumberFormatter->IsNumberFormat(sDateString, nFormat, dCurrentDate);
 
-            const Date& rNullDate = m_pNumberFormatter->GetNullDate();
-            m_pCalendar->SetCurDate(rNullDate + dCurrentDate);
+                const Date& rNullDate = m_pNumberFormatter->GetNullDate();
+                m_pCalendar->SetCurDate(rNullDate + dCurrentDate);
+            }
         }
     }
     m_pCalendar->SetSelectHdl(LINK(this, SwDatePickerDialog, ImplSelectHdl));
@@ -95,28 +99,33 @@ IMPL_LINK(SwDatePickerDialog, ImplSelectHdl, Calendar*, pCalendar, void)
     {
         if (m_pFieldmark != nullptr)
         {
-            Color* pCol = nullptr;
-            OUString sOutput;
             sal_uInt32 nFormat = m_pNumberFormatter->GetEntryKey(ODF_FORMDATE_CURRENTDATE_FORMAT, ODF_FORMDATE_CURRENTDATE_LANGUAGE);
+            bool bValidFormat = nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND;
             if (nFormat == NUMBERFORMAT_ENTRY_NOT_FOUND)
             {
                 sal_Int32 nCheckPos = 0;
                 SvNumFormatType nType;
                 OUString sFormat = ODF_FORMDATE_CURRENTDATE_FORMAT;
-                m_pNumberFormatter->PutEntry(sFormat,
-                                             nCheckPos,
-                                             nType,
-                                             nFormat,
-                                             ODF_FORMDATE_CURRENTDATE_LANGUAGE);
+                bValidFormat = m_pNumberFormatter->PutEntry(sFormat,
+                                                   nCheckPos,
+                                                   nType,
+                                                   nFormat,
+                                                   ODF_FORMDATE_CURRENTDATE_LANGUAGE);
             }
 
-            const Date& rNullDate = m_pNumberFormatter->GetNullDate();
-            double dDate = pCalendar->GetFirstSelectedDate() - rNullDate;
+            if (bValidFormat)
+            {
+                Color* pCol = nullptr;
+                OUString sOutput;
 
-            m_pNumberFormatter->GetOutputString(dDate, nFormat, sOutput, &pCol, false);
+                const Date& rNullDate = m_pNumberFormatter->GetNullDate();
+                double dDate = pCalendar->GetFirstSelectedDate() - rNullDate;
 
-            sw::mark::IFieldmark::parameter_map_t* pParameters = m_pFieldmark->GetParameters();
-            (*pParameters)[ODF_FORMDATE_CURRENTDATE] <<= sOutput;
+                m_pNumberFormatter->GetOutputString(dDate, nFormat, sOutput, &pCol, false);
+
+                sw::mark::IFieldmark::parameter_map_t* pParameters = m_pFieldmark->GetParameters();
+                (*pParameters)[ODF_FORMDATE_CURRENTDATE] <<= sOutput;
+            }
         }
         EndPopupMode();
     }
diff --git a/sw/source/core/text/itrform2.cxx b/sw/source/core/text/itrform2.cxx
index 131ef946d8a6..9040eb3f6362 100644
--- a/sw/source/core/text/itrform2.cxx
+++ b/sw/source/core/text/itrform2.cxx
@@ -890,38 +890,48 @@ namespace sw { namespace mark {
             OUString sFormattedDate;
             pResult->second >>= sFormattedDate;
 
-            sal_uInt32 nFormat = pFormatter->GetEntryKey(ODF_FORMDATE_CURRENTDATE_FORMAT, ODF_FORMDATE_CURRENTDATE_LANGUAGE);            if (nFormat == NUMBERFORMAT_ENTRY_NOT_FOUND)
+            sal_uInt32 nFormat = pFormatter->GetEntryKey(ODF_FORMDATE_CURRENTDATE_FORMAT, ODF_FORMDATE_CURRENTDATE_LANGUAGE);
+            bool bValidFormat = nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND;
             if (nFormat == NUMBERFORMAT_ENTRY_NOT_FOUND)
             {
                 sal_Int32 nCheckPos = 0;
                 SvNumFormatType nType;
                 OUString sFormat = ODF_FORMDATE_CURRENTDATE_FORMAT;
-                pFormatter->PutEntry(sFormat,
-                                     nCheckPos,
-                                     nType,
-                                     nFormat,
-                                     ODF_FORMDATE_CURRENTDATE_LANGUAGE);
+                bValidFormat = pFormatter->PutEntry(sFormat,
+                                                    nCheckPos,
+                                                    nType,
+                                                    nFormat,
+                                                    ODF_FORMDATE_CURRENTDATE_LANGUAGE);
+            }
+
+            if (bValidFormat)
+            {
+                pFormatter->IsNumberFormat(sFormattedDate, nFormat, dCurrentDate);
+                bHasCurrentDate = true;
             }
-            pFormatter->IsNumberFormat(sFormattedDate, nFormat, dCurrentDate);
-            bHasCurrentDate = true;
         }
 
-        Color* pCol = nullptr;
         if (!sDateFormat.isEmpty() && !sLang.isEmpty() && bHasCurrentDate)
         {
-            OUString sOutput;
             sal_uInt32 nFormat = pFormatter->GetEntryKey(sDateFormat, LanguageTag(sLang).getLanguageType());
+            bool bValidFormat = nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND;
             if (nFormat == NUMBERFORMAT_ENTRY_NOT_FOUND)
             {
                 sal_Int32 nCheckPos = 0;
                 SvNumFormatType nType;
-                pFormatter->PutEntry(sDateFormat,
-                                     nCheckPos,
-                                     nType,
-                                     nFormat,
-                                     LanguageTag(sLang).getLanguageType());
+                bValidFormat = pFormatter->PutEntry(sDateFormat,
+                                                    nCheckPos,
+                                                    nType,
+                                                    nFormat,
+                                                    LanguageTag(sLang).getLanguageType());
+            }
+
+            OUString sOutput;
+            if (bValidFormat)
+            {
+                Color* pCol = nullptr;
+                pFormatter->GetOutputString(dCurrentDate, nFormat, sOutput, &pCol, false);
             }
-            pFormatter->GetOutputString(dCurrentDate, nFormat, sOutput, &pCol, false);
             return sOutput;
         }
 
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 0d1864115099..abd054ce32cb 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -1908,36 +1908,45 @@ void DocxAttributeOutput::WriteFormDate(const OUString& sCurrentDate, const OUSt
 
             double dCurrentDate = 0.0;
             // First get the date internal double representation
-            sal_uInt32 nFormat = pFormatter->GetEntryKey(ODF_FORMDATE_CURRENTDATE_FORMAT, ODF_FORMDATE_CURRENTDATE_LANGUAGE);            if (nFormat == NUMBERFORMAT_ENTRY_NOT_FOUND)
+            sal_uInt32 nFormat = pFormatter->GetEntryKey(ODF_FORMDATE_CURRENTDATE_FORMAT, ODF_FORMDATE_CURRENTDATE_LANGUAGE);
+            bool bValidFormat = nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND;
             if (nFormat == NUMBERFORMAT_ENTRY_NOT_FOUND)
             {
                 sal_Int32 nCheckPos = 0;
                 SvNumFormatType nType;
                 OUString sFormat = ODF_FORMDATE_CURRENTDATE_FORMAT;
-                pFormatter->PutEntry(sFormat,
-                                     nCheckPos,
-                                     nType,
-                                     nFormat,
-                                     ODF_FORMDATE_CURRENTDATE_LANGUAGE);
+                bValidFormat = pFormatter->PutEntry(sFormat,
+                                                    nCheckPos,
+                                                    nType,
+                                                    nFormat,
+                                                    ODF_FORMDATE_CURRENTDATE_LANGUAGE);
+            }
+            if (bValidFormat)
+            {
+                pFormatter->IsNumberFormat(sCurrentDate, nFormat, dCurrentDate);
             }
-            pFormatter->IsNumberFormat(sCurrentDate, nFormat, dCurrentDate);
 
             // Then convert the date to a fromatter string
-            OUString sOutput;
-            Color* pCol = nullptr;
             nFormat = pFormatter->GetEntryKey(sDateFormat, LanguageTag(sLang).getLanguageType());
+            bValidFormat = nFormat != NUMBERFORMAT_ENTRY_NOT_FOUND;
             if (nFormat == NUMBERFORMAT_ENTRY_NOT_FOUND)
             {
                 sal_Int32 nCheckPos = 0;
                 SvNumFormatType nType;
                 OUString sNonConstDateFormat = sDateFormat;
-                pFormatter->PutEntry(sNonConstDateFormat,
-                                     nCheckPos,
-                                     nType,
-                                     nFormat,
-                                     LanguageTag(sLang).getLanguageType());
+                bValidFormat = pFormatter->PutEntry(sNonConstDateFormat,
+                                                    nCheckPos,
+                                                    nType,
+                                                    nFormat,
+                                                    LanguageTag(sLang).getLanguageType());
+            }
+
+            OUString sOutput;
+            if (bValidFormat)
+            {
+                Color* pCol = nullptr;
+                pFormatter->GetOutputString(dCurrentDate, nFormat, sOutput, &pCol, false);
             }
-            pFormatter->GetOutputString(dCurrentDate, nFormat, sOutput, &pCol, false);
 
             RunText(sOutput);
         }
diff --git a/sw/source/ui/fldui/DateFormFieldDialog.cxx b/sw/source/ui/fldui/DateFormFieldDialog.cxx
index e5cc6961b05e..a265dc130826 100644
--- a/sw/source/ui/fldui/DateFormFieldDialog.cxx
+++ b/sw/source/ui/fldui/DateFormFieldDialog.cxx
@@ -78,20 +78,23 @@ void DateFormFieldDialog::InitControls()
             LanguageType aLangType = LanguageTag(sLang).getLanguageType();
             sal_uInt32 nFormatKey = m_pNumberFormatter->GetEntryKey(sFormatString, aLangType);
 
-            if (m_xFormatLB->GetCurLanguage() == aLangType)
+            if(aLangType != LANGUAGE_DONTKNOW && nFormatKey != NUMBERFORMAT_ENTRY_NOT_FOUND)
             {
-                m_xFormatLB->SetAutomaticLanguage(true);
-            }
-            else
-            {
-                m_xFormatLB->SetAutomaticLanguage(false);
-                m_xFormatLB->SetLanguage(aLangType);
+                if (m_xFormatLB->GetCurLanguage() == aLangType)
+                {
+                    m_xFormatLB->SetAutomaticLanguage(true);
+                }
+                else
+                {
+                    m_xFormatLB->SetAutomaticLanguage(false);
+                    m_xFormatLB->SetLanguage(aLangType);
 
-                // Change format and change back for regenerating the list
-                m_xFormatLB->SetFormatType(SvNumFormatType::ALL);
-                m_xFormatLB->SetFormatType(SvNumFormatType::DATE);
+                    // Change format and change back for regenerating the list
+                    m_xFormatLB->SetFormatType(SvNumFormatType::ALL);
+                    m_xFormatLB->SetFormatType(SvNumFormatType::DATE);
+                }
+                m_xFormatLB->SetDefFormat(nFormatKey);
             }
-            m_xFormatLB->SetDefFormat(nFormatKey);
         }
     }
 }
commit af65069ebd55a295b7aa601e1eaa3ae8a2e841e4
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Mon Jul 1 13:27:31 2019 +0200
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Thu Jul 4 13:30:51 2019 +0200

    MSForms: DOCX filter: reenable passing test
    
    Change-Id: Ic82e2edddce7e46740f74f7b20bb849b6735a3b8

diff --git a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx
index 3b7f928facdb..3d3c528ef41a 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx
@@ -510,14 +510,14 @@ DECLARE_OOXMLEXPORT_TEST(testTableStart2Sdt, "table-start-2-sdt.docx")
     }
 }
 
-/*DECLARE_OOXMLEXPORT_TEST(testSdtDateDuplicate, "sdt-date-duplicate.docx")
+DECLARE_OOXMLEXPORT_TEST(testSdtDateDuplicate, "sdt-date-duplicate.docx")
 {
     if (xmlDocPtr pXmlDoc = parseExport())
     {
         // Single <w:sdt> was exported as 2 <w:sdt> elements.
         assertXPath(pXmlDoc, "//w:sdt", 1);
     }
-}*/
+}
 
 DECLARE_OOXMLEXPORT_TEST(testFdo81492, "fdo81492.docx")
 {
commit 5dcc4f3508f3e8f279123de330d705f5e1d8e0f4
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Mon Jul 1 12:20:45 2019 +0200
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Thu Jul 4 13:30:51 2019 +0200

    MSForms: DOCX filter: handle export of empty date from control
    
    It's converted to date content control which is imported as text-based
    date control.
    By now, we don't need to set a dummy text for empty date.
    
    Change-Id: I29b2a72e3ae2722c1d765c4fcb9bd13052619372

diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
index d921551e5020..8b2cab87042e 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
@@ -14,6 +14,7 @@
 #include <com/sun/star/drawing/XControlShape.hpp>
 #include <com/sun/star/style/ParagraphAdjust.hpp>
 #include <IDocumentSettingAccess.hxx>
+#include <xmloff/odffields.hxx>
 
 #include <editsh.hxx>
 
@@ -138,24 +139,51 @@ DECLARE_OOXMLEXPORT_TEST(tdf123912_protectedForm, "tdf123912_protectedForm.odt")
         CPPUNIT_ASSERT_EQUAL_MESSAGE("Section1 is protected", false, getProperty<bool>(xSect, "IsProtected"));
 }
 
-/*DECLARE_OOXMLEXPORT_TEST(testDateControl, "empty-date-control.odt")
+DECLARE_OOXMLEXPORT_TEST(testDateControl, "empty-date-control.odt")
 {
-    // Check that we did not lost the date control
-    uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
-    uno::Reference<container::XIndexAccess> xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY);
-    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), xDraws->getCount());
-    uno::Reference<drawing::XControlShape> xControl(getShape(1), uno::UNO_QUERY);
-    CPPUNIT_ASSERT(xControl->getControl().is());
-
-    // check XML
-    xmlDocPtr pXmlDoc = parseExport("word/document.xml");
-    if (!pXmlDoc)
-        return;
+    // Check that we exported the empty date control correctly
+    // Date form field is converted to date content control.
+    if (!mbExported)
+        return ;
+
+    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::IFieldmark* pFieldmark = dynamic_cast<::sw::mark::IFieldmark*>(*pMarkAccess->getAllMarksBegin());
+
+    CPPUNIT_ASSERT(pFieldmark);
+    CPPUNIT_ASSERT_EQUAL(OUString(ODF_FORMDATE), pFieldmark->GetFieldname());
 
-    // We need to export date format and a dummy character (" ") for empty date control
-    assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:date/w:dateFormat", "val", "dd/MM/yyyy");
-    assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtContent/w:r/w:t", u" ");
-}*/
+    const sw::mark::IFieldmark::parameter_map_t* const pParameters = pFieldmark->GetParameters();
+    OUString sDateFormat;
+    auto pResult = pParameters->find(ODF_FORMDATE_DATEFORMAT);
+    if (pResult != pParameters->end())
+    {
+        pResult->second >>= sDateFormat;
+    }
+
+    OUString sLang;
+    pResult = pParameters->find(ODF_FORMDATE_DATEFORMAT_LANGUAGE);
+    if (pResult != pParameters->end())
+    {
+        pResult->second >>= sLang;
+    }
+
+    OUString sCurrentDate;
+    pResult = pParameters->find(ODF_FORMDATE_CURRENTDATE);
+    if (pResult != pParameters->end())
+    {
+        pResult->second >>= sCurrentDate;
+    }
+
+    CPPUNIT_ASSERT_EQUAL(OUString("dd/MM/yyyy"), sDateFormat);
+    CPPUNIT_ASSERT_EQUAL(OUString("en-US"), sLang);
+    CPPUNIT_ASSERT_EQUAL(OUString(""), sCurrentDate);
+}
 
 DECLARE_OOXMLEXPORT_TEST(testTdf121867, "tdf121867.odt")
 {
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 1aecd9474600..0d1864115099 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -5193,8 +5193,6 @@ void DocxAttributeOutput::WritePostponedFormControl(const SdrObject* pObject)
         else
         {
             aContentText = xPropertySet->getPropertyValue("HelpText").get<OUString>();
-            if(aContentText.isEmpty())
-                aContentText = " "; // Need to write out something to have it imported by MS Word
             if(sDateFormat.isEmpty())
                 sDateFormat = "dd/MM/yyyy"; // Need to set date format even if there is no date set
         }
commit 128d52cda6dd3c835daa77e0c2d93eb63aac870d
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Tue Jul 2 21:09:25 2019 +0200
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Thu Jul 4 13:30:32 2019 +0200

    MSForms: DOCX import of text-based date field
    
    Before the date content control was imported as LO specific
    date form control, but now I changed it to be imported into
    the compatible text-based date field.
    Also removed the things stored in the grabbag, which are useless now.
    Disabled some unit tests, I'll update them for the new field
    in other patches.
    
    Change-Id: Ide8f4b27ec6b2dbb182abb4180229736bf9c434f

diff --git a/sw/qa/extras/globalfilter/globalfilter.cxx b/sw/qa/extras/globalfilter/globalfilter.cxx
index 9bce252a7512..b25bbf7ae999 100644
--- a/sw/qa/extras/globalfilter/globalfilter.cxx
+++ b/sw/qa/extras/globalfilter/globalfilter.cxx
@@ -1244,8 +1244,7 @@ void Test::testDateFormField()
 {
     const OUString aFilterNames[] = {
         "writer8",
-        //"MS Word 97",
-        //"Office Open XML Text",
+        "Office Open XML Text",
     };
 
     for (const OUString& rFilterName : aFilterNames)
@@ -1273,7 +1272,10 @@ void Test::testDateFormField()
         SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc();
         IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess();
 
-        CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(3), pMarkAccess->getAllMarksCount());
+        if(rFilterName == "Office Open XML Text")
+            CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(6), pMarkAccess->getAllMarksCount());
+        else
+            CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(3), pMarkAccess->getAllMarksCount());
 
         int nIndex = 0;
         for(auto aIter = pMarkAccess->getAllMarksBegin(); aIter != pMarkAccess->getAllMarksEnd(); ++aIter)
@@ -1316,18 +1318,28 @@ void Test::testDateFormField()
                 CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("MM/DD/YY"), sDateFormat);
                 CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("en-US"), sLang);
                 CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString(""), sCurrentDate);
+
+                CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_uLong(9), pFieldmark->GetMarkStart().nNode.GetIndex());
+                CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(5), pFieldmark->GetMarkStart().nContent.GetIndex());
             }
             else if (nIndex == 1) // The second has the default format
             {
                 CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("MM/DD/YY"), sDateFormat);
                 CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("en-US"), sLang);
                 CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("2019-06-12"), sCurrentDate);
+
+                CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_uLong(9), pFieldmark->GetMarkStart().nNode.GetIndex());
+                CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(13), pFieldmark->GetMarkStart().nContent.GetIndex());
             }
             else // The third one has special format
             {
                 CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("[NatNum12 MMMM=abbreviation]YYYY\". \"MMMM D."), sDateFormat);
                 CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("hu-HU"), sLang);
                 CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("2019-06-11"), sCurrentDate);
+
+                CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_uLong(9), pFieldmark->GetMarkStart().nNode.GetIndex());
+                CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(23), pFieldmark->GetMarkStart().nContent.GetIndex());
+
             }
             ++nIndex;
         }
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
index 23eb22cb8d03..bd1cf12450af 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
@@ -71,7 +71,7 @@ DECLARE_OOXMLEXPORT_TEST(testSdtAlias, "sdt-alias.docx")
     assertXPath(pXmlDoc, "/w:document/w:body/w:sdt/w:sdtPr/w:alias", "val", "Subtitle");
 }
 
-DECLARE_OOXMLEXPORT_TEST(testSdtDateCharformat, "sdt-date-charformat.docx")
+/*DECLARE_OOXMLEXPORT_TEST(testSdtDateCharformat, "sdt-date-charformat.docx")
 {
     if (xmlDocPtr pXmlDoc = parseExport())
     {
@@ -80,7 +80,7 @@ DECLARE_OOXMLEXPORT_TEST(testSdtDateCharformat, "sdt-date-charformat.docx")
         // alias was also missing.
         assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:alias", 1);
     }
-}
+}*/
 
 DECLARE_OOXMLEXPORT_TEST(testFooterBodyDistance, "footer-body-distance.docx")
 {
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
index edbc0964685d..d921551e5020 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
@@ -138,7 +138,7 @@ DECLARE_OOXMLEXPORT_TEST(tdf123912_protectedForm, "tdf123912_protectedForm.odt")
         CPPUNIT_ASSERT_EQUAL_MESSAGE("Section1 is protected", false, getProperty<bool>(xSect, "IsProtected"));
 }
 
-DECLARE_OOXMLEXPORT_TEST(testDateControl, "empty-date-control.odt")
+/*DECLARE_OOXMLEXPORT_TEST(testDateControl, "empty-date-control.odt")
 {
     // Check that we did not lost the date control
     uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
@@ -155,7 +155,7 @@ DECLARE_OOXMLEXPORT_TEST(testDateControl, "empty-date-control.odt")
     // We need to export date format and a dummy character (" ") for empty date control
     assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:date/w:dateFormat", "val", "dd/MM/yyyy");
     assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtContent/w:r/w:t", u" ");
-}
+}*/
 
 DECLARE_OOXMLEXPORT_TEST(testTdf121867, "tdf121867.odt")
 {
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx
index 9405ff7e29bc..c6d67de8bd25 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx
@@ -661,7 +661,7 @@ DECLARE_OOXMLEXPORT_TEST(testTableCurruption, "tableCurrupt.docx")
     CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), aHeaderBottomBorder.LineWidth);
 }
 
-DECLARE_OOXMLEXPORT_TEST(testDateControl, "date-control.docx")
+/*DECLARE_OOXMLEXPORT_TEST(testDateControl, "date-control.docx")
 {
     // check XML
     xmlDocPtr pXmlDoc = parseExport("word/document.xml");
@@ -671,14 +671,7 @@ DECLARE_OOXMLEXPORT_TEST(testDateControl, "date-control.docx")
     assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:date/w:dateFormat", "val", "dddd, dd' de 'MMMM' de 'yyyy");
     assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:date/w:lid", "val", "es-ES");
     assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtContent/w:r/w:t", u"mi\u00E9rcoles, 05 de marzo de 2014");
-
-    // check imported control
-    uno::Reference<drawing::XControlShape> xControl(getShape(1), uno::UNO_QUERY);
-    util::Date aDate = getProperty<util::Date>(xControl->getControl(), "Date");
-    CPPUNIT_ASSERT_EQUAL(sal_Int32(5),    sal_Int32(aDate.Day));
-    CPPUNIT_ASSERT_EQUAL(sal_Int32(3),    sal_Int32(aDate.Month));
-    CPPUNIT_ASSERT_EQUAL(sal_Int32(2014), sal_Int32(aDate.Year));
-}
+}*/
 
 DECLARE_OOXMLEXPORT_TEST(test_OpeningBrace, "2120112713_OpenBrace.docx")
 {
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx
index f798ad98000e..2d717f106b54 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx
@@ -527,21 +527,21 @@ DECLARE_OOXMLEXPORT_TEST(testN780563, "n780563.docx")
     CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount( ));
 }
 
-DECLARE_OOXMLEXPORT_TEST(testN780853, "n780853.docx")
-{
+/*DECLARE_OOXMLEXPORT_TEST(testN780853, "n780853.docx")
+{*/
     /*
      * The problem was that the table was not imported.
      *
      * xray ThisComponent.TextTables.Count 'was 0
      */
-    uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY);
+    /*uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY);
     uno::Reference<container::XIndexAccess> xIndexAccess(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY);
     CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount());
 
     //tdf#102619 - I would have expected this to be "Standard", but MSO 2013/2010/2003 all give FollowStyle==Date
     uno::Reference< beans::XPropertySet > properties(getStyles("ParagraphStyles")->getByName("Date"), uno::UNO_QUERY);
     CPPUNIT_ASSERT_EQUAL(OUString("Date"), getProperty<OUString>(properties, "FollowStyle"));
-}
+}*/
 
 DECLARE_OOXMLEXPORT_TEST(testN780843, "n780843.docx")
 {
@@ -919,19 +919,10 @@ DECLARE_OOXMLEXPORT_TEST(testN592908_Picture, "n592908-picture.docx")
 
 DECLARE_OOXMLEXPORT_TEST(testN779630, "n779630.docx")
 {
-    // First shape: date picker
+    // A combo box is imported
     uno::Reference<drawing::XControlShape> xControlShape(getShape(1), uno::UNO_QUERY);
     uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
     uno::Reference<lang::XServiceInfo> xServiceInfo(xPropertySet, uno::UNO_QUERY);
-    CPPUNIT_ASSERT_EQUAL(true, bool(xServiceInfo->supportsService("com.sun.star.form.component.DateField")));
-    CPPUNIT_ASSERT_EQUAL(OUString("date default text"), getProperty<OUString>(xPropertySet, "HelpText"));
-    CPPUNIT_ASSERT_EQUAL(sal_Int16(8), getProperty<sal_Int16>(xPropertySet, "DateFormat"));
-    CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xPropertySet, "Dropdown"));
-
-    // Second shape: combo box
-    xControlShape.set(getShape(2), uno::UNO_QUERY);
-    xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
-    xServiceInfo.set(xPropertySet, uno::UNO_QUERY);
     CPPUNIT_ASSERT_EQUAL(true, bool(xServiceInfo->supportsService("com.sun.star.form.component.ComboBox")));
     CPPUNIT_ASSERT_EQUAL(OUString("dropdown default text"), getProperty<OUString>(xPropertySet, "DefaultText"));
     CPPUNIT_ASSERT_EQUAL(sal_Int32(2), getProperty< uno::Sequence<OUString> >(xPropertySet, "StringItemList").getLength());
@@ -967,7 +958,7 @@ DECLARE_OOXMLEXPORT_TEST(testN816593, "n816593.docx")
     CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTables->getCount());
 }
 
-DECLARE_OOXMLEXPORT_TEST(testN820509, "n820509.docx")
+/*DECLARE_OOXMLEXPORT_TEST(testN820509, "n820509.docx")
 {
     // Design mode was enabled.
     uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
@@ -979,7 +970,7 @@ DECLARE_OOXMLEXPORT_TEST(testN820509, "n820509.docx")
     uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
     uno::Reference<lang::XServiceInfo> xServiceInfo(xPropertySet, uno::UNO_QUERY);
     CPPUNIT_ASSERT_EQUAL(sal_Int16(8), getProperty<sal_Int16>(xPropertySet, "DateFormat"));
-}
+}*/
 
 DECLARE_OOXMLEXPORT_TEST(testN830205, "n830205.docx")
 {
diff --git a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx
index b5b6b6040216..3b7f928facdb 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx
@@ -510,14 +510,14 @@ DECLARE_OOXMLEXPORT_TEST(testTableStart2Sdt, "table-start-2-sdt.docx")
     }
 }
 
-DECLARE_OOXMLEXPORT_TEST(testSdtDateDuplicate, "sdt-date-duplicate.docx")
+/*DECLARE_OOXMLEXPORT_TEST(testSdtDateDuplicate, "sdt-date-duplicate.docx")
 {
     if (xmlDocPtr pXmlDoc = parseExport())
     {
         // Single <w:sdt> was exported as 2 <w:sdt> elements.
         assertXPath(pXmlDoc, "//w:sdt", 1);
     }
-}
+}*/
 
 DECLARE_OOXMLEXPORT_TEST(testFdo81492, "fdo81492.docx")
 {
@@ -589,13 +589,13 @@ DECLARE_OOXMLEXPORT_TEST(testfdo82492, "fdo82492.docx")
     assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt[1]/w:sdtContent/w:r",1);
 }
 
-DECLARE_OOXMLEXPORT_TEST(testSdtHeader, "sdt-header.docx")
+/*DECLARE_OOXMLEXPORT_TEST(testSdtHeader, "sdt-header.docx")
 {
     // Problem was that w:sdt elements in headers were lost on import.
     if (xmlDocPtr pXmlDoc = parseExport("word/header1.xml"))
         // This was 0, w:sdt (and then w:date) was missing.
         assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:date", 1);
-}
+}*/
 
 DECLARE_OOXMLEXPORT_TEST(testSdtCompanyMultipara, "sdt-company-multipara.docx")
 {
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx
index 1c7282623b00..0a989161fba6 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx
@@ -34,13 +34,13 @@ DECLARE_OOXMLIMPORT_TEST(testTdf108545_embeddedDocxIcon, "tdf108545_embeddedDocx
     CPPUNIT_ASSERT_EQUAL(embed::Aspects::MSOLE_ICON, xSupplier->getAspect());
 }
 
-DECLARE_OOXMLIMPORT_TEST(testTdf121203, "tdf121203.docx")
+/*DECLARE_OOXMLIMPORT_TEST(testTdf121203, "tdf121203.docx")
 {
     // Make sure that the date SDT's content is imported as plain text, as it
     // has no ISO date, so we have no idea how to represent that with our date
     // control.
     CPPUNIT_ASSERT_EQUAL(OUString("17-Oct-2018 09:00"), getRun(getParagraph(1), 1)->getString());
-}
+}*/
 
 DECLARE_OOXMLIMPORT_TEST(testTdf109053, "tdf109053.docx")
 {
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 08bb7e2e690b..1aecd9474600 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -5174,34 +5174,8 @@ void DocxAttributeOutput::WritePostponedFormControl(const SdrObject* pObject)
     {
         // gather component properties
 
-        Date aOriginalDate(Date::EMPTY);
-        OUString sOriginalContent, sDateFormat, sAlias;
+        OUString sDateFormat;
         OUString sLocale("en-US");
-        uno::Sequence<beans::PropertyValue> aGrabBag;
-        uno::Reference<beans::XPropertySet> xShapePropertySet(pFormObj->getUnoShape(), uno::UNO_QUERY);
-        uno::Sequence<beans::PropertyValue> aCharFormat;
-        if (xShapePropertySet->getPropertyValue(UNO_NAME_MISC_OBJ_INTEROPGRABBAG) >>= aGrabBag)
-        {
-            for (sal_Int32 i=0; i < aGrabBag.getLength(); ++i)
-            {
-                if (aGrabBag[i].Name == "DateFormat")
-                    aGrabBag[i].Value >>= sDateFormat;
-                else if (aGrabBag[i].Name == "Locale")
-                    aGrabBag[i].Value >>= sLocale;
-                else if (aGrabBag[i].Name == "OriginalContent")
-                    aGrabBag[i].Value >>= sOriginalContent;
-                else if (aGrabBag[i].Name == "OriginalDate")
-                {
-                    css::util::Date aUNODate;
-                    aGrabBag[i].Value >>= aUNODate;
-                    aOriginalDate = aUNODate;
-                }
-                else if (aGrabBag[i].Name == "CharFormat")
-                    aGrabBag[i].Value >>= aCharFormat;
-                else if (aGrabBag[i].Name == "ooxml:CT_SdtPr_alias")
-                    aGrabBag[i].Value >>= sAlias;
-            }
-        }
         uno::Reference<beans::XPropertySet> xPropertySet(xControlModel, uno::UNO_QUERY);
 
         OString sDate;
@@ -5213,17 +5187,8 @@ void DocxAttributeOutput::WritePostponedFormControl(const SdrObject* pObject)
             bHasDate = true;
             Date aDate(aUNODate.Day, aUNODate.Month, aUNODate.Year);
             sDate = DateToOString(aDate);
-
-            if (aOriginalDate == aDate)
-            {
-                aContentText = sOriginalContent;
-                // sDateFormat was extracted from the grab bag
-            }
-            else
-            {
-                aContentText = OUString::createFromAscii(DateToDDMMYYYYOString(aDate).getStr());
-                sDateFormat = "dd/MM/yyyy";
-            }
+            aContentText = OUString::createFromAscii(DateToDDMMYYYYOString(aDate).getStr());
+            sDateFormat = "dd/MM/yyyy";
         }
         else
         {
@@ -5239,10 +5204,6 @@ void DocxAttributeOutput::WritePostponedFormControl(const SdrObject* pObject)
         m_pSerializer->startElementNS(XML_w, XML_sdt);
         m_pSerializer->startElementNS(XML_w, XML_sdtPr);
 
-        if (!sAlias.isEmpty())
-            m_pSerializer->singleElementNS(XML_w, XML_alias,
-                                           FSNS(XML_w, XML_val), OUStringToOString(sAlias, RTL_TEXTENCODING_UTF8));
-
         if (bHasDate)
             m_pSerializer->startElementNS(XML_w, XML_date, FSNS(XML_w, XML_fullDate), sDate);
         else
@@ -5263,12 +5224,6 @@ void DocxAttributeOutput::WritePostponedFormControl(const SdrObject* pObject)
         m_pSerializer->startElementNS(XML_w, XML_sdtContent);
         m_pSerializer->startElementNS(XML_w, XML_r);
 
-        if (aCharFormat.hasElements())
-        {
-            m_pTableStyleExport->SetSerializer(m_pSerializer);
-            m_pTableStyleExport->CharFormat(aCharFormat);
-        }
-
         RunText(aContentText);
         m_pSerializer->endElementNS(XML_w, XML_r);
         m_pSerializer->endElementNS(XML_w, XML_sdtContent);
@@ -8929,28 +8884,6 @@ void DocxAttributeOutput::ParaGrabBag(const SfxGrabBagItem& rItem)
                 }
                 else if (aPropertyValue.Name == "ooxml:CT_SdtPr_id")
                     m_bParagraphSdtHasId = true;
-                else if (aPropertyValue.Name == "ooxml:CT_SdtPr_date")
-                {
-                    m_nParagraphSdtPrToken = FSNS(XML_w, XML_date);
-                    uno::Sequence<beans::PropertyValue> aGrabBag = aPropertyValue.Value.get< uno::Sequence<beans::PropertyValue> >();
-                    for (sal_Int32 j=0; j < aGrabBag.getLength(); ++j)
-                    {
-                        OString sValue = OUStringToOString(aGrabBag[j].Value.get<OUString>(), RTL_TEXTENCODING_UTF8);
-
-                        if (aGrabBag[j].Name == "ooxml:CT_SdtDate_fullDate")
-                            AddToAttrList(m_pParagraphSdtPrTokenAttributes, FSNS(XML_w, XML_fullDate), sValue.getStr());
-                        else if (aGrabBag[j].Name == "ooxml:CT_SdtDate_dateFormat")
-                            AddToAttrList(m_pParagraphSdtPrTokenChildren, FSNS(XML_w, XML_dateFormat), sValue.getStr());
-                        else if (aGrabBag[j].Name == "ooxml:CT_SdtDate_lid")
-                            AddToAttrList(m_pParagraphSdtPrTokenChildren, FSNS(XML_w, XML_lid), sValue.getStr());
-                        else if (aGrabBag[j].Name == "ooxml:CT_SdtDate_storeMappedDataAs")
-                            AddToAttrList(m_pParagraphSdtPrTokenChildren, FSNS(XML_w, XML_storeMappedDataAs), sValue.getStr());
-                        else if (aGrabBag[j].Name == "ooxml:CT_SdtDate_calendar")
-                            AddToAttrList(m_pParagraphSdtPrTokenChildren, FSNS(XML_w, XML_calendar), sValue.getStr());
-                        else
-                            SAL_WARN("sw.ww8", "DocxAttributeOutput::ParaGrabBag: unhandled SdtPr / ooxml:CT_SdtPr_date grab bag property " << aGrabBag[j].Name);
-                    }
-                }
                 else
                     SAL_WARN("sw.ww8", "DocxAttributeOutput::ParaGrabBag: unhandled SdtPr grab bag property " << aPropertyValue.Name);
             }
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 6276d56a1b01..749102c4e903 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -1018,6 +1018,8 @@ void DomainMapper::lcl_attribute(Id nName, Value & val)
 
             if (!m_pImpl->m_pSdtHelper->getDropDownItems().empty())
                 m_pImpl->m_pSdtHelper->createDropDownControl();
+            else if (m_pImpl->m_pSdtHelper->validateDateFormat() && !IsInHeaderFooter())
+                m_pImpl->m_pSdtHelper->createDateContentControl();
         break;
         case NS_ooxml::LN_CT_SdtListItem_displayText:
             // TODO handle when this is != value
@@ -2423,16 +2425,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext )
     break;
     case NS_ooxml::LN_CT_SdtPr_date:
     {
-        if (!IsInHeaderFooter())
-            resolveSprmProps(*this, rSprm);
-        else
-        {
-            OUString sName = "ooxml:CT_SdtPr_date";
-            enableInteropGrabBag(sName);
-            resolveSprmProps(*this, rSprm);
-            m_pImpl->m_pSdtHelper->appendToInteropGrabBag(getInteropGrabBag());
-            m_pImpl->disableInteropGrabBag();
-        }
+        resolveSprmProps(*this, rSprm);
     }
     break;
     case NS_ooxml::LN_CT_SdtDate_dateFormat:
@@ -3226,12 +3219,7 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len)
     // Form controls are not allowed in headers / footers; see sw::DocumentContentOperationsManager::InsertDrawObj()
     else if (m_pImpl->m_pSdtHelper->validateDateFormat() && !IsInHeaderFooter())
     {
-        /*
-         * Here we assume w:sdt only contains a single text token. We need to
-         * create the control early, as in Writer, it's part of the cell, but
-         * in OOXML, the sdt contains the cell.
-         */
-        m_pImpl->m_pSdtHelper->createDateControl(sText, getInteropGrabBag());
+        // date field is imported, we don't need the corresponding date text
         return;
     }
     else if (!m_pImpl->m_pSdtHelper->isInteropGrabBagEmpty())
@@ -3248,7 +3236,6 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len)
                 m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_text") ||
                 m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_dataBinding") ||
                 m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_citation") ||
-                m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_date") ||
                 (m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_id") &&
                         m_pImpl->m_pSdtHelper->getInteropGrabBagSize() == 1)) && !m_pImpl->m_pSdtHelper->isOutsideAParagraph())
         {
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index eb852bf943d4..258b829aafc7 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -617,6 +617,10 @@ PropertyMapPtr DomainMapper_Impl::GetTopContextOfType(ContextType eId)
     return pRet;
 }
 
+bool DomainMapper_Impl::HasTopText() const
+{
+    return !m_aTextAppendStack.empty();
+}
 
 uno::Reference< text::XTextAppend > const &  DomainMapper_Impl::GetTopTextAppend()
 {
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index 793631530d66..a98e24cf180b 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -666,6 +666,7 @@ public:
     }
     PropertyMapPtr GetTopContextOfType(ContextType eId);
 
+    bool HasTopText() const;
     css::uno::Reference<css::text::XTextAppend> const & GetTopTextAppend();
     FieldContextPtr const & GetTopFieldContext();
 
diff --git a/writerfilter/source/dmapper/SdtHelper.cxx b/writerfilter/source/dmapper/SdtHelper.cxx
index 0b870749313b..c55ceaec0d65 100644
--- a/writerfilter/source/dmapper/SdtHelper.cxx
+++ b/writerfilter/source/dmapper/SdtHelper.cxx
@@ -21,30 +21,11 @@
 #include <vcl/outdev.hxx>
 #include <unotools/datetime.hxx>
 #include <comphelper/sequence.hxx>
+#include <xmloff/odffields.hxx>
 
 #include "DomainMapper_Impl.hxx"
 #include "StyleSheetTable.hxx"
 
-namespace
-{
-/// Maps OOXML <w:dateFormat> values to UNO date format values.
-sal_Int16 getUNODateFormat(const OUString& rDateFormat)
-{
-    // See com/sun/star/awt/UnoControlDateFieldModel.idl, DateFormat; sadly
-    // there are no constants.
-    sal_Int16 nDateFormat = -1;
-
-    if (rDateFormat == "M/d/yyyy" || rDateFormat == "M.d.yyyy")
-        // MMDDYYYY
-        nDateFormat = 8;
-    else if (rDateFormat == "dd/MM/yyyy")
-        // DDMMYYYY
-        nDateFormat = 7;
-
-    return nDateFormat;
-}
-}
-
 namespace writerfilter
 {
 namespace dmapper
@@ -115,70 +96,46 @@ void SdtHelper::createDropDownControl()
 
 bool SdtHelper::validateDateFormat()
 {
-    bool bRet = !m_sDate.isEmpty() || getUNODateFormat(m_sDateFormat.toString()) != -1;
-    if (!bRet)
-        m_sDateFormat.setLength(0);
-    return bRet;
+    return !m_sDateFormat.toString().isEmpty() && !m_sLocale.toString().isEmpty();
 }
 
-void SdtHelper::createDateControl(OUString const& rContentText, const beans::PropertyValue& rCharFormat)
+void SdtHelper::createDateContentControl()
 {
-    uno::Reference<awt::XControlModel> xControlModel;
-    try
+    uno::Reference<text::XTextCursor> xCrsr;
+    if(m_rDM_Impl.HasTopText())
     {
-        xControlModel.set(m_rDM_Impl.GetTextFactory()->createInstance("com.sun.star.form.component.DateField"), uno::UNO_QUERY_THROW);
+        uno::Reference<text::XTextAppend> xTextAppend = m_rDM_Impl.GetTopTextAppend();
+        if (xTextAppend.is())
+            xCrsr = xTextAppend->createTextCursorByRange(xTextAppend->getEnd());
     }
-    catch (css::uno::RuntimeException&)
+    if (xCrsr.is())
     {
-        throw;
+        uno::Reference< uno::XInterface > xFieldInterface;
+        xFieldInterface = m_rDM_Impl.GetTextFactory()->createInstance("com.sun.star.text.FormFieldmark");
+        uno::Reference< text::XFormField > xFormField( xFieldInterface, uno::UNO_QUERY );
+        uno::Reference< text::XTextContent > xToInsert(xFormField, uno::UNO_QUERY);
+        if ( xFormField.is() && xToInsert.is() )
+        {
+            xCrsr->gotoEnd(true);
+            xToInsert->attach( uno::Reference< text::XTextRange >( xCrsr, uno::UNO_QUERY_THROW ));
+            xFormField->setFieldType(ODF_FORMDATE);
+            uno::Reference<container::XNameContainer> xNameCont = xFormField->getParameters();
+            if(xNameCont.is())
+            {
+                xNameCont->insertByName(ODF_FORMDATE_DATEFORMAT, uno::makeAny(m_sDateFormat.makeStringAndClear()));
+                xNameCont->insertByName(ODF_FORMDATE_DATEFORMAT_LANGUAGE, uno::makeAny(m_sLocale.makeStringAndClear()));
+                OUString sDate = m_sDate.makeStringAndClear();
+                if(!sDate.isEmpty())
+                {
+                    // Remove time part of the full date
+                    sal_Int32 nTimeSep = sDate.indexOf("T");
+                    if(nTimeSep != -1)
+                        sDate = sDate.copy(0, nTimeSep);
+                    xNameCont->insertByName(ODF_FORMDATE_CURRENTDATE, uno::makeAny(sDate));
+                }
+            }
+        }
     }
-    catch (css::uno::Exception& e)
-    {
-        css::uno::Any a(cppu::getCaughtException());
-        throw css::lang::WrappedTargetRuntimeException("wrapped " + a.getValueTypeName() + ": " + e.Message, css::uno::Reference<css::uno::XInterface>(), a);
-    }
-    uno::Reference<beans::XPropertySet> xPropertySet(
-        xControlModel, uno::UNO_QUERY_THROW);
-
-    xPropertySet->setPropertyValue("Dropdown", uno::makeAny(true));
-
-    // See com/sun/star/awt/UnoControlDateFieldModel.idl, DateFormat; sadly there are no constants
-    OUString sDateFormat = m_sDateFormat.makeStringAndClear();
-    sal_Int16 nDateFormat = getUNODateFormat(sDateFormat);
-    if (nDateFormat == -1)
-    {
-        // Set default format, so at least the date picker is created.
-        SAL_WARN("writerfilter", "unhandled w:dateFormat value");
-        if (m_sDate.isEmpty())
-            return;
-        nDateFormat = 0;
-    }
-    xPropertySet->setPropertyValue("DateFormat", uno::makeAny(nDateFormat));
-
-    util::Date aDate;
-    util::DateTime aDateTime;
-    if (utl::ISO8601parseDateTime(m_sDate.makeStringAndClear(), aDateTime))
-    {
-        utl::extractDate(aDateTime, aDate);
-        xPropertySet->setPropertyValue("Date", uno::makeAny(aDate));
-    }
-    else
-        xPropertySet->setPropertyValue("HelpText", uno::makeAny(rContentText.trim()));
-
-    // append date format to grab bag
-    comphelper::SequenceAsHashMap aGrabBag;
-    aGrabBag["OriginalDate"] <<= aDate;
-    aGrabBag["OriginalContent"] <<= rContentText;
-    aGrabBag["DateFormat"] <<= sDateFormat;
-    aGrabBag["Locale"] <<= m_sLocale.makeStringAndClear();
-    aGrabBag["CharFormat"] = rCharFormat.Value;
-    // merge in properties like ooxml:CT_SdtPr_alias and friends.
-    aGrabBag.update(comphelper::SequenceAsHashMap(comphelper::containerToSequence(m_aGrabBag)));
-    // and empty the property list, so they won't end up on the next sdt as well
-    m_aGrabBag.clear();
-
-    std::vector<OUString> aItems;
-    createControlShape(lcl_getOptimalWidth(m_rDM_Impl.GetStyleSheetTable(), rContentText, aItems), xControlModel, aGrabBag.getAsConstPropertyValueList());
 }
 
 void SdtHelper::createControlShape(awt::Size aSize, uno::Reference<awt::XControlModel> const& xControlModel, const uno::Sequence<beans::PropertyValue>& rGrabBag)
diff --git a/writerfilter/source/dmapper/SdtHelper.hxx b/writerfilter/source/dmapper/SdtHelper.hxx
index 91f005f9d544..01abd4117adb 100644
--- a/writerfilter/source/dmapper/SdtHelper.hxx
+++ b/writerfilter/source/dmapper/SdtHelper.hxx
@@ -114,7 +114,7 @@ public:
     /// Create drop-down control from w:sdt's w:dropDownList.
     void createDropDownControl();
     /// Create date control from w:sdt's w:date.
-    void createDateControl(OUString const& rContentText, const css::beans::PropertyValue& rCharFormat);
+    void createDateContentControl();
 
     void appendToInteropGrabBag(const css::beans::PropertyValue& rValue);
     css::uno::Sequence<css::beans::PropertyValue> getInteropGrabBagAndClear();


More information about the Libreoffice-commits mailing list