summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2014-03-27 18:46:16 +0100
committerCaolán McNamara <caolanm@redhat.com>2014-03-28 11:05:49 +0000
commita929f282d7baa6cb73b17cae2d68d82d72008903 (patch)
treefb3a2e12d98a11982b5e31b840bc30e2b199ae47
parent16f1459e78bf286d029f0672ef2977d89ae3ef71 (diff)
write (no)wrap of text only for custom shapes to .pptx (fdo#71961)
Apparently checking the TextWordWrap property in DrawingML::WriteText() gives false by default for objects that do not have it set, which happens to be everything except for custom shapes, which seem to be the only ones to actually obey it. So all normal text would be exported as nowrap to .pptx and read back as custom shape that has non-wrapping text. I tried to make the property return true (which is what it should be in practice), but that appears to be an exercise in futility, or I'm not mad enough to follow the complicated property sets and whatnot. So just write it out only for custom shapes. UNO purists, if any, are welcome to change the dynamic_cast to something UNO-better if they manage without an ambiguous base class error. Conflicts: sd/qa/unit/import-tests.cxx Change-Id: I3ed906285fde88d902ac9c801986a82a7515638b Reviewed-on: https://gerrit.libreoffice.org/8774 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r--oox/source/export/drawingml.cxx4
-rw-r--r--sd/qa/unit/data/fdo71961.odpbin0 -> 23506 bytes
-rw-r--r--sd/qa/unit/import-tests.cxx36
3 files changed, 39 insertions, 1 deletions
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index a8c57418adba..dd6605b5e133 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -69,6 +69,7 @@
#include <editeng/svxenum.hxx>
#include <svx/unoapi.hxx>
#include <svx/svdoashp.hxx>
+#include <svx/unoshape.hxx>
using namespace ::com::sun::star;
using namespace ::com::sun::star::beans;
@@ -1320,7 +1321,8 @@ void DrawingML::WriteText( Reference< XInterface > rXIface )
sal_Bool bHasWrap = sal_False;
sal_Bool bWrap = sal_False;
- if( GETA( TextWordWrap ) ) {
+ // Only custom shapes obey the TextWordWrap option, normal text always wraps.
+ if( dynamic_cast<SvxCustomShape*>(rXIface.get()) && GETA( TextWordWrap ) ) {
mAny >>= bWrap;
bHasWrap = sal_True;
}
diff --git a/sd/qa/unit/data/fdo71961.odp b/sd/qa/unit/data/fdo71961.odp
new file mode 100644
index 000000000000..323fbe82a82c
--- /dev/null
+++ b/sd/qa/unit/data/fdo71961.odp
Binary files differ
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index 23ddec36fcc5..991f5fef1e81 100644
--- a/sd/qa/unit/import-tests.cxx
+++ b/sd/qa/unit/import-tests.cxx
@@ -17,6 +17,7 @@
#include <editeng/escapementitem.hxx>
#include <svx/svdotext.hxx>
+#include <svx/svdoashp.hxx>
#include <animations/animationnodehelper.hxx>
#include <com/sun/star/drawing/XDrawPage.hpp>
@@ -47,6 +48,7 @@ public:
void testFdo64512();
void testFdo71075();
void testN828390();
+ void testFdo71961();
CPPUNIT_TEST_SUITE(SdFiltersTest);
CPPUNIT_TEST(testDocumentLayout);
@@ -56,6 +58,7 @@ public:
CPPUNIT_TEST(testFdo64512);
CPPUNIT_TEST(testFdo71075);
CPPUNIT_TEST(testN828390);
+ CPPUNIT_TEST(testFdo71961);
CPPUNIT_TEST_SUITE_END();
};
@@ -327,6 +330,39 @@ void SdFiltersTest::testFdo71075()
CPPUNIT_ASSERT_MESSAGE( "Invalid Series count", aValues.getConstArray()[i] == values[i]);
}
+void SdFiltersTest::testFdo71961()
+{
+ ::sd::DrawDocShellRef xDocShRef = loadURL(getURLFromSrc("/sd/qa/unit/data/fdo71961.odp"));
+ CPPUNIT_ASSERT_MESSAGE( "failed to load", xDocShRef.Is() );
+ CPPUNIT_ASSERT_MESSAGE( "not in destruction", !xDocShRef->IsInDestruction() );
+
+ xDocShRef = saveAndReload( xDocShRef, PPTX );
+ CPPUNIT_ASSERT_MESSAGE( "failed to load", xDocShRef.Is() );
+ CPPUNIT_ASSERT_MESSAGE( "not in destruction", !xDocShRef->IsInDestruction() );
+
+ SdDrawDocument *pDoc = xDocShRef->GetDoc();
+ CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != NULL );
+ const SdrPage *pPage = pDoc->GetPage (1);
+ CPPUNIT_ASSERT_MESSAGE( "no page", pPage != NULL );
+
+ // Export to .pptx changes all text frames to custom shape objects, which obey TextWordWrap property
+ // (which is false for text frames otherwise and is ignored). Check that frames that should wrap still do.
+ SdrObjCustomShape *pTxtObj = dynamic_cast<SdrObjCustomShape *>( pPage->GetObj( 1 ));
+ CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != NULL);
+ CPPUNIT_ASSERT_EQUAL( OUString( "Text to be always wrapped" ), pTxtObj->GetOutlinerParaObject()->GetTextObject().GetText(0));
+ CPPUNIT_ASSERT_EQUAL( true, (static_cast<const SdrTextWordWrapItem&>(pTxtObj->GetMergedItem(SDRATTR_TEXT_WORDWRAP))).GetValue());
+
+ pTxtObj = dynamic_cast<SdrObjCustomShape *>( pPage->GetObj( 2 ));
+ CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != NULL);
+ CPPUNIT_ASSERT_EQUAL( OUString( "Custom shape non-wrapped text" ), pTxtObj->GetOutlinerParaObject()->GetTextObject().GetText(0));
+ CPPUNIT_ASSERT_EQUAL( false, (static_cast<const SdrTextWordWrapItem&>(pTxtObj->GetMergedItem(SDRATTR_TEXT_WORDWRAP))).GetValue());
+
+ pTxtObj = dynamic_cast<SdrObjCustomShape *>( pPage->GetObj( 3 ));
+ CPPUNIT_ASSERT_MESSAGE( "no text object", pTxtObj != NULL);
+ CPPUNIT_ASSERT_EQUAL( OUString( "Custom shape wrapped text" ), pTxtObj->GetOutlinerParaObject()->GetTextObject().GetText(0));
+ CPPUNIT_ASSERT_EQUAL( true, (static_cast<const SdrTextWordWrapItem&>(pTxtObj->GetMergedItem(SDRATTR_TEXT_WORDWRAP))).GetValue());
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(SdFiltersTest);
CPPUNIT_PLUGIN_IMPLEMENT();