diff --git a/svx/source/unodraw/unoprov.cxx b/svx/source/unodraw/unoprov.cxx index 986c290e4544..da19e34fb04e 100644 --- a/svx/source/unodraw/unoprov.cxx +++ b/svx/source/unodraw/unoprov.cxx @@ -618,6 +618,7 @@ SfxItemPropertyMapEntry const * ImplGetSvxControlShapePropertyMap() // #i112587# { OUString(UNO_NAME_MISC_OBJ_PRINTABLE), SDRATTR_OBJPRINTABLE , ::getBooleanCppuType(), 0, 0}, { OUString("Visible"), SDRATTR_OBJVISIBLE , ::getBooleanCppuType(), 0, 0}, + { OUString(UNO_NAME_MISC_OBJ_INTEROPGRABBAG), OWN_ATTR_INTEROPGRABBAG, ::getCppuType((::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >*)0), 0, 0}, { OUString(), 0, css::uno::Type(), 0, 0 } }; diff --git a/sw/qa/extras/ooxmlexport/data/date-control.docx b/sw/qa/extras/ooxmlexport/data/date-control.docx index 0563d56aac35..fdf229913702 100644 Binary files a/sw/qa/extras/ooxmlexport/data/date-control.docx and b/sw/qa/extras/ooxmlexport/data/date-control.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index 80189af85323..957dfbe9430d 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -2963,7 +2963,8 @@ DECLARE_OOXMLEXPORT_TEST(testDateControl, "date-control.docx") if (!pXmlDoc) return; assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:date", "fullDate", "2014-03-05T00:00:00Z"); - assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtContent/w:r/w:t", "05/03/2014"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:date/w:dateFormat", "val", "dddd, dd' de 'MMMM' de 'yyyy"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtContent/w:r/w:t", "miƩrcoles, 05 de marzo de 2014"); // check imported control uno::Reference xControl(getShape(1), uno::UNO_QUERY); diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 294927108bc3..a233c2317adc 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -3599,6 +3599,25 @@ void DocxAttributeOutput::WritePostponedFormControl(const SdrObject* pObject) { // gather component properties + Date aOriginalDate(Date::EMPTY); + OUString sOriginalContent, sDateFormat; + uno::Sequence aGrabBag; + uno::Reference xShapePropertySet(pFormObj->getUnoShape(), uno::UNO_QUERY); + 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 == "OriginalContent") + aGrabBag[i].Value >>= sOriginalContent; + else if (aGrabBag[i].Name == "OriginalDate") + { + css::util::Date aUNODate; + aGrabBag[i].Value >>= aUNODate; + aOriginalDate.SetDay(aUNODate.Day); + aOriginalDate.SetMonth(aUNODate.Month); + aOriginalDate.SetYear(aUNODate.Year); + } + uno::Reference xPropertySet(xControlModel, uno::UNO_QUERY); OString sDate; @@ -3610,7 +3629,17 @@ void DocxAttributeOutput::WritePostponedFormControl(const SdrObject* pObject) bHasDate = true; Date aDate(aUNODate.Day, aUNODate.Month, aUNODate.Year); sDate = DateToOString(aDate); - aContentText = OUString::createFromAscii(DateToDDMMYYYYOString(aDate).getStr()); + + if (aOriginalDate == aDate) + { + aContentText = sOriginalContent; + // sDateFormat was extracted from the grab bag + } + else + { + aContentText = OUString::createFromAscii(DateToDDMMYYYYOString(aDate).getStr()); + sDateFormat = "dd/MM/yyyy"; + } } else aContentText = xPropertySet->getPropertyValue("HelpText").get(); @@ -3628,7 +3657,8 @@ void DocxAttributeOutput::WritePostponedFormControl(const SdrObject* pObject) m_pSerializer->startElementNS(XML_w, XML_date, FSEND); m_pSerializer->singleElementNS(XML_w, XML_dateFormat, - FSNS(XML_w, XML_val), "dd/MM/yyyy", //TODO: hardwired + FSNS(XML_w, XML_val), + rtl::OUStringToOString( sDateFormat, RTL_TEXTENCODING_UTF8 ).getStr(), FSEND); m_pSerializer->singleElementNS(XML_w, XML_lid, FSNS(XML_w, XML_val), "en-US", //TODO: hardwired diff --git a/writerfilter/source/dmapper/SdtHelper.cxx b/writerfilter/source/dmapper/SdtHelper.cxx index 63b726aad03c..29ccf477bb2b 100644 --- a/writerfilter/source/dmapper/SdtHelper.cxx +++ b/writerfilter/source/dmapper/SdtHelper.cxx @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -120,11 +121,25 @@ void SdtHelper::createDateControl(OUString& rContentText) else xPropertySet->setPropertyValue("HelpText", uno::makeAny(rContentText)); + // append date format to grab bag + uno::Sequence aGrabBag(3); + aGrabBag[0].Name = "OriginalDate"; + aGrabBag[0].Value = uno::makeAny(aDate); + aGrabBag[1].Name = "OriginalContent"; + aGrabBag[1].Value = uno::makeAny(rContentText); + aGrabBag[2].Name = "DateFormat"; + aGrabBag[2].Value = uno::makeAny(sDateFormat); + std::vector aItems; - createControlShape(lcl_getOptimalWidth(m_rDM_Impl.GetStyleSheetTable(), rContentText, aItems), xControlModel); + createControlShape(lcl_getOptimalWidth(m_rDM_Impl.GetStyleSheetTable(), rContentText, aItems), xControlModel, aGrabBag); } void SdtHelper::createControlShape(awt::Size aSize, uno::Reference xControlModel) +{ + createControlShape(aSize, xControlModel, uno::Sequence()); +} + +void SdtHelper::createControlShape(awt::Size aSize, uno::Reference xControlModel, uno::Sequence rGrabBag) { uno::Reference xControlShape(m_rDM_Impl.GetTextFactory()->createInstance("com.sun.star.drawing.ControlShape"), uno::UNO_QUERY); xControlShape->setSize(aSize); @@ -133,6 +148,9 @@ void SdtHelper::createControlShape(awt::Size aSize, uno::Reference xPropertySet(xControlShape, uno::UNO_QUERY); xPropertySet->setPropertyValue("VertOrient", uno::makeAny(text::VertOrientation::CENTER)); + if(rGrabBag.hasElements()) + xPropertySet->setPropertyValue(UNO_NAME_MISC_OBJ_INTEROPGRABBAG, uno::makeAny(rGrabBag)); + uno::Reference xTextContent(xControlShape, uno::UNO_QUERY); m_rDM_Impl.appendTextContent(xTextContent, uno::Sequence< beans::PropertyValue >()); m_bHasElements = true; diff --git a/writerfilter/source/dmapper/SdtHelper.hxx b/writerfilter/source/dmapper/SdtHelper.hxx index e91d9b747901..8d89deabbd8c 100644 --- a/writerfilter/source/dmapper/SdtHelper.hxx +++ b/writerfilter/source/dmapper/SdtHelper.hxx @@ -60,6 +60,8 @@ class SdtHelper /// Create and append the drawing::XControlShape, containing the various models. void createControlShape(com::sun::star::awt::Size aSize, com::sun::star::uno::Reference); + void createControlShape(com::sun::star::awt::Size aSize, com::sun::star::uno::Reference, + com::sun::star::uno::Sequence rGrabBag); public: SdtHelper(DomainMapper_Impl& rDM_Impl); virtual ~SdtHelper();