From 4edb7599d83c897cc7e800b916dcedf07b645cba Mon Sep 17 00:00:00 2001 From: Balazs Varga Date: Tue, 17 Jul 2018 10:06:27 +0200 Subject: tdf#118651 OOXML ActiveX textbox: fix multiline support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit of textfield component in DOCX/PPTX by handling properties AX_FLAGS_MULTILINE and AX_FLAGS_WORDWRAP during the import and export. Both of them need to be enabled to get multiline textfield in MSO, but LibreOffice has got only one multiline property. With this fix, LibreOffice imports only really multiline textfields as multiline, and it doesn't export multiline textfields as single line anymore. Change-Id: I9b567c3fcdc5d01a5838a3ec2517579f8d788954 Reviewed-on: https://gerrit.libreoffice.org/57552 Reviewed-by: László Németh Tested-by: László Németh --- oox/source/ole/axcontrol.cxx | 9 ++++++-- sd/qa/unit/activex-controls-tests.cxx | 3 ++- sw/qa/extras/ooxmlexport/data/activex_textbox.docx | Bin 0 -> 16937 bytes sw/qa/extras/ooxmlexport/ooxmlexport9.cxx | 25 +++++++++++++++++++++ 4 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 sw/qa/extras/ooxmlexport/data/activex_textbox.docx diff --git a/oox/source/ole/axcontrol.cxx b/oox/source/ole/axcontrol.cxx index c8be2ca7c7bc..fe1c36d1fb17 100644 --- a/oox/source/ole/axcontrol.cxx +++ b/oox/source/ole/axcontrol.cxx @@ -1768,7 +1768,10 @@ ApiControlType AxTextBoxModel::getControlType() const void AxTextBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const { - rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_MULTILINE ) ); + if (getFlag( mnFlags, AX_FLAGS_MULTILINE ) && getFlag( mnFlags, AX_FLAGS_WORDWRAP )) + rPropMap.setProperty( PROP_MultiLine, true ); + else + rPropMap.setProperty( PROP_MultiLine, false ); rPropMap.setProperty( PROP_HideInactiveSelection, getFlag( mnFlags, AX_FLAGS_HIDESELECTION ) ); rPropMap.setProperty( PROP_ReadOnly, getFlag( mnFlags, AX_FLAGS_LOCKED ) ); rPropMap.setProperty( mbAwtModel ? PROP_Text : PROP_DefaultText, maValue ); @@ -1785,8 +1788,10 @@ void AxTextBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConv void AxTextBoxModel::convertFromProperties( PropertySet& rPropSet, const ControlConverter& rConv ) { bool bRes = false; - if ( rPropSet.getProperty( bRes, PROP_MultiLine ) ) + if ( rPropSet.getProperty( bRes, PROP_MultiLine ) ) { setFlag( mnFlags, AX_FLAGS_WORDWRAP, bRes ); + setFlag( mnFlags, AX_FLAGS_MULTILINE, bRes ); + } if ( rPropSet.getProperty( bRes, PROP_HideInactiveSelection ) ) setFlag( mnFlags, AX_FLAGS_HIDESELECTION, bRes ); if ( rPropSet.getProperty( bRes, PROP_ReadOnly ) ) diff --git a/sd/qa/unit/activex-controls-tests.cxx b/sd/qa/unit/activex-controls-tests.cxx index 677db75a0a6c..692a5b8b6d5d 100644 --- a/sd/qa/unit/activex-controls-tests.cxx +++ b/sd/qa/unit/activex-controls-tests.cxx @@ -260,8 +260,9 @@ void SdActiveXControlsTest::testTextBoxProperties() xPropertySet->getPropertyValue("Enabled") >>= bEnabled; CPPUNIT_ASSERT_EQUAL(false, bEnabled); + // These textfields are not multilines in the pptx testfile xPropertySet->getPropertyValue("MultiLine") >>= bMultiLine; - CPPUNIT_ASSERT_EQUAL(true, bMultiLine); + CPPUNIT_ASSERT_EQUAL(false, bMultiLine); xPropertySet->getPropertyValue("TextColor") >>= nColor; CPPUNIT_ASSERT_EQUAL(sal_Int32(0x404040), nColor); diff --git a/sw/qa/extras/ooxmlexport/data/activex_textbox.docx b/sw/qa/extras/ooxmlexport/data/activex_textbox.docx new file mode 100644 index 000000000000..6f137008ce78 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/activex_textbox.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx index 1d40cfef8268..b3551e52ae89 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx @@ -934,6 +934,31 @@ DECLARE_OOXMLEXPORT_TEST(testTdf106062_nonHangingFootnote, "tdf106062_nonHanging CPPUNIT_ASSERT_MESSAGE( "Footnote starts with a tab", xTextRange->getString().startsWith("\t") ); } +DECLARE_OOXMLEXPORT_TEST( testActiveXTextfield, "activex_textbox.docx" ) +{ + uno::Reference xControlShape( getShape(1), uno::UNO_QUERY ); + CPPUNIT_ASSERT( xControlShape.is() ); + + // Check control type + 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.TextField" ) ) ); + + // Check textfield is multi-line + CPPUNIT_ASSERT_EQUAL( true, getProperty(xPropertySet, "MultiLine") ); + + uno::Reference xControlShape2( getShape(2), uno::UNO_QUERY ); + CPPUNIT_ASSERT( xControlShape2.is() ); + + // Check control type + uno::Reference xPropertySet2( xControlShape2->getControl(), uno::UNO_QUERY ); + uno::Reference xServiceInfo2( xPropertySet2, uno::UNO_QUERY ); + CPPUNIT_ASSERT_EQUAL( true, bool( xServiceInfo2->supportsService ( "com.sun.star.form.component.TextField" ) ) ); + + // Check textfield is single-line + CPPUNIT_ASSERT_EQUAL( false, getProperty(xPropertySet2, "MultiLine") ); +} + DECLARE_OOXMLEXPORT_TEST( testActiveXCheckbox, "activex_checkbox.docx" ) { uno::Reference xControlShape( getShape(1), uno::UNO_QUERY ); -- cgit v1.2.3