From b45446fcb4958b13bc94e70e2d3d1940db3322e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20Zolnai?= Date: Tue, 22 Aug 2017 23:40:56 +0200 Subject: [PATCH] tdf#111975: Inline checkbox control's label is not saved to DOC format MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This MiserableFormFieldExportHack lives from the beginning of the git history: 7155b11b7eac65e242aca1efaf29ffcfa28f2564 So it might be a workaround of an old issue. By now when the checkbox is not inline, but a floating one, it is exported as ActiveX control, which works nicely. So just remove this workaround and let the code export also inline checkboxes as ActiveX controls. Change-Id: I350b7a7595bb46334c63d9dfcf40abf9e10943bc Reviewed-on: https://gerrit.libreoffice.org/41436 Reviewed-by: Tamás Zolnai Tested-by: Tamás Zolnai --- sw/CppunitTest_sw_ww8export2.mk | 2 + .../ww8export/data/checkbox_control.odt | Bin 0 -> 9601 bytes sw/qa/extras/ww8export/ww8export2.cxx | 39 ++++++++++ sw/source/filter/ww8/rtfattributeoutput.cxx | 2 +- sw/source/filter/ww8/wrtw8esh.cxx | 69 ------------------ sw/source/filter/ww8/wrtww8.hxx | 1 - 6 files changed, 42 insertions(+), 71 deletions(-) create mode 100755 sw/qa/extras/ww8export/data/checkbox_control.odt diff --git a/sw/CppunitTest_sw_ww8export2.mk b/sw/CppunitTest_sw_ww8export2.mk index 20f7df957a61..99551b36750e 100644 --- a/sw/CppunitTest_sw_ww8export2.mk +++ b/sw/CppunitTest_sw_ww8export2.mk @@ -52,6 +52,8 @@ $(eval $(call gb_CppunitTest_use_components,sw_ww8export2,\ comphelper/util/comphelp \ configmgr/source/configmgr \ dbaccess/util/dba \ + embeddedobj/util/embobj \ + emfio/emfio \ filter/source/config/cache/filterconfig1 \ filter/source/storagefilterdetect/storagefd \ forms/util/frm \ diff --git a/sw/qa/extras/ww8export/data/checkbox_control.odt b/sw/qa/extras/ww8export/data/checkbox_control.odt new file mode 100755 index 0000000000000000000000000000000000000000..b5281b30eecd125a36ac646e3db51c16f76fe197 GIT binary patch literal 9601 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 literal 0 HcmV?d00001 diff --git a/sw/qa/extras/ww8export/ww8export2.cxx b/sw/qa/extras/ww8export/ww8export2.cxx index cb6155cf444a..066b680d01dd 100644 --- a/sw/qa/extras/ww8export/ww8export2.cxx +++ b/sw/qa/extras/ww8export/ww8export2.cxx @@ -16,6 +16,8 @@ #include #include #include +#include +#include #include #include @@ -229,6 +231,43 @@ DECLARE_WW8EXPORT_TEST(testTdf111480, "tdf111480.doc") CPPUNIT_ASSERT(xText->getSize().Width > 11000); } +DECLARE_WW8EXPORT_TEST( testActiveXCheckbox, "checkbox_control.odt" ) +{ + // First check box anchored as a floating object + uno::Reference xControlShape; + if(!mbExported) + xControlShape.set(getShape(1), uno::UNO_QUERY); + else + xControlShape.set(getShape(2), uno::UNO_QUERY); + CPPUNIT_ASSERT(xControlShape.is()); + + // Check whether we have the right control + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + uno::Reference xServiceInfo(xPropertySet, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, bool(xServiceInfo->supportsService( "com.sun.star.form.component.CheckBox"))); + CPPUNIT_ASSERT_EQUAL(OUString("Floating Checkbox"), getProperty(xPropertySet, "Label")); + + // Check anchor type + uno::Reference xPropertySet2(xControlShape, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AT_CHARACTER,getProperty(xPropertySet2,"AnchorType")); + + // Second check box anchored inline / as character + if(!mbExported) + xControlShape.set(getShape(2), uno::UNO_QUERY); + else + xControlShape.set(getShape(1), uno::UNO_QUERY); + + // Check whether we have the right control + 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.CheckBox"))); + CPPUNIT_ASSERT_EQUAL(OUString("Inline Checkbox"), getProperty(xPropertySet, "Label")); + + // Check anchor type + xPropertySet2.set(xControlShape, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AS_CHARACTER,getProperty(xPropertySet2,"AnchorType")); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx b/sw/source/filter/ww8/rtfattributeoutput.cxx index e0020a473856..5a1cd9252921 100644 --- a/sw/source/filter/ww8/rtfattributeoutput.cxx +++ b/sw/source/filter/ww8/rtfattributeoutput.cxx @@ -1967,7 +1967,7 @@ void RtfAttributeOutput::OutputFlyFrame_Impl(const ww8::Frame& rFrame, const Poi m_aRun->append(OUStringToOString(FieldString(ww::eFORMCHECKBOX), m_rExport.m_eCurrentEncoding)); m_aRun->append("{" OOO_STRING_SVTOOLS_RTF_IGNORE OOO_STRING_SVTOOLS_RTF_FORMFIELD "{"); m_aRun->append(OOO_STRING_SVTOOLS_RTF_FFTYPE "1"); // 1 = checkbox - // checkbox size in half points, this seems to be always 20, see WW8Export::DoCheckBox() + // checkbox size in half points, this seems to be always 20 m_aRun->append(OOO_STRING_SVTOOLS_RTF_FFHPS "20"); OUString aStr; diff --git a/sw/source/filter/ww8/wrtw8esh.cxx b/sw/source/filter/ww8/wrtw8esh.cxx index f29a568a27a5..f5450722ce38 100644 --- a/sw/source/filter/ww8/wrtw8esh.cxx +++ b/sw/source/filter/ww8/wrtw8esh.cxx @@ -384,12 +384,6 @@ bool WW8Export::MiserableFormFieldExportHack(const SwFrameFormat& rFrameFormat) return true; } - if (xInfo->supportsService("com.sun.star.form.component.CheckBox")) - { - DoCheckBox(xPropSet); - return true; - } - return false; } @@ -488,69 +482,6 @@ void WW8Export::DoComboBox(const OUString &rName, aFFData.Write(pDataStrm); } -void WW8Export::DoCheckBox(uno::Reference const & xPropSet) -{ - uno::Reference xPropSetInfo = - xPropSet->getPropertySetInfo(); - - OutputField(nullptr, ww::eFORMCHECKBOX, FieldString(ww::eFORMCHECKBOX), - FieldFlags::Start | FieldFlags::CmdStart); - // write the reference to the "picture" structure - sal_uLong nDataStt = pDataStrm->Tell(); - m_pChpPlc->AppendFkpEntry( Strm().Tell() ); - - WriteChar( 0x01 ); - static sal_uInt8 aArr1[] = { - 0x03, 0x6a, 0,0,0,0, // sprmCPicLocation - - 0x06, 0x08, 0x01, // sprmCFData - 0x55, 0x08, 0x01, // sprmCFSpec - 0x02, 0x08, 0x01 // sprmCFFieldVanish - }; - sal_uInt8* pDataAdr = aArr1 + 2; - Set_UInt32( pDataAdr, nDataStt ); - - m_pChpPlc->AppendFkpEntry(Strm().Tell(), - sizeof( aArr1 ), aArr1 ); - - ::sw::WW8FFData aFFData; - - aFFData.setType(1); - aFFData.setCheckboxHeight(0x14); - - sal_Int16 nTemp = 0; - xPropSet->getPropertyValue("DefaultState") >>= nTemp; - aFFData.setDefaultResult(nTemp); - - xPropSet->getPropertyValue("State") >>= nTemp; - aFFData.setResult(nTemp); - - OUString aStr; - static const char sName[] = "Name"; - if (xPropSetInfo->hasPropertyByName(sName)) - { - xPropSet->getPropertyValue(sName) >>= aStr; - aFFData.setName(aStr); - } - - static const char sHelpText[] = "HelpText"; - if (xPropSetInfo->hasPropertyByName(sHelpText)) - { - xPropSet->getPropertyValue(sHelpText) >>= aStr; - aFFData.setHelp(aStr); - } - static const char sHelpF1Text[] = "HelpF1Text"; - if (xPropSetInfo->hasPropertyByName(sHelpF1Text)) - { - xPropSet->getPropertyValue(sHelpF1Text) >>= aStr; - aFFData.setStatus(aStr); - } - - aFFData.Write(pDataStrm); - - OutputField(nullptr, ww::eFORMCHECKBOX, OUString(), FieldFlags::Close); -} - void WW8Export::DoFormText(const SwInputField * pField) { OutputField(nullptr, ww::eFORMTEXT, FieldString(ww::eFORMTEXT), diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx index ffa7221bdb90..e726231442fa 100644 --- a/sw/source/filter/ww8/wrtww8.hxx +++ b/sw/source/filter/ww8/wrtww8.hxx @@ -998,7 +998,6 @@ private: void RestoreMacroCmds(); void DoComboBox(css::uno::Reference const & xPropSet); - void DoCheckBox(css::uno::Reference const & xPropSet); public: