summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@suse.cz>2013-03-07 17:42:26 +0100
committerMiklos Vajna <vmiklos@suse.cz>2013-03-07 18:20:18 +0100
commit344e4a25eac6505678f4ce8a6c1c8cef83c68276 (patch)
treedd5e32e7677ff8d7f2f1cfc7b788e1a81cc8842d
parentda03bb1ee6a69d2f4fef4c3ca0adc0ba9588bd19 (diff)
fdo#61343 fix DOCX import of OLE object after groupshape
Change-Id: I88d5e49cc3fb915d25c1b2576cdda1fffc9e2f23
-rwxr-xr-xsw/qa/extras/ooxmlimport/data/fdo61343.docxbin0 -> 114220 bytes
-rw-r--r--sw/qa/extras/ooxmlimport/ooxmlimport.cxx11
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx15
3 files changed, 25 insertions, 1 deletions
diff --git a/sw/qa/extras/ooxmlimport/data/fdo61343.docx b/sw/qa/extras/ooxmlimport/data/fdo61343.docx
new file mode 100755
index 000000000000..9ab99739b7c2
--- /dev/null
+++ b/sw/qa/extras/ooxmlimport/data/fdo61343.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index 8365013aff62..0332a0c41ca5 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -119,6 +119,7 @@ public:
void testTbLrHeight();
void testFdo53985();
void testFdo59638();
+ void testFdo61343();
CPPUNIT_TEST_SUITE(Test);
#if !defined(MACOSX) && !defined(WNT)
@@ -189,6 +190,7 @@ void Test::run()
{"tblr-height.docx", &Test::testTbLrHeight},
{"fdo53985.docx", &Test::testFdo53985},
{"fdo59638.docx", &Test::testFdo59638},
+ {"fdo61343.docx", &Test::testFdo61343},
};
header();
for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i)
@@ -1232,6 +1234,15 @@ void Test::testFdo59638()
CPPUNIT_FAIL("no BulletChar property");
}
+void Test::testFdo61343()
+{
+ // The problem was that there were a groupshape in the doc, followed by an
+ // OLE object, and this lead to a crash.
+ uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess> xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xDraws->getCount());
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(Test);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 383681d66f5d..50daf773a851 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -1626,6 +1626,19 @@ void DomainMapper_Impl::PushShapeContext( const uno::Reference< drawing::XShape
uno::Reference<text::XTextAppend> xTextAppend = m_aTextAppendStack.top().xTextAppend;
try
{
+ uno::Reference< lang::XServiceInfo > xSInfo( xShape, uno::UNO_QUERY_THROW );
+ if (xSInfo->supportsService("com.sun.star.drawing.GroupShape"))
+ {
+ // A GroupShape doesn't implement text::XTextRange, but appending
+ // an empty reference to the stacks still makes sense, because this
+ // way bToRemove can be set, and we won't end up with duplicated
+ // shapes for OLE objects.
+ m_aTextAppendStack.push(TextAppendContext(uno::Reference<text::XTextAppend>(xShape, uno::UNO_QUERY), uno::Reference<text::XTextCursor>()));
+ uno::Reference<text::XTextContent> xTxtContent(xShape, uno::UNO_QUERY);
+ m_aAnchoredStack.push(xTxtContent);
+ }
+ else
+ {
uno::Reference< text::XTextRange > xShapeText( xShape, uno::UNO_QUERY_THROW);
// Add the shape to the text append stack
m_aTextAppendStack.push( TextAppendContext(uno::Reference< text::XTextAppend >( xShape, uno::UNO_QUERY_THROW ),
@@ -1641,7 +1654,6 @@ void DomainMapper_Impl::PushShapeContext( const uno::Reference< drawing::XShape
#ifdef DEBUG_DOMAINMAPPER
dmapper_logger->unoPropertySet(xProps);
#endif
- uno::Reference< lang::XServiceInfo > xSInfo( xShape, uno::UNO_QUERY_THROW );
bool bIsGraphic = xSInfo->supportsService( "com.sun.star.drawing.GraphicObjectShape" );
// If there are position properties, the shape should not be inserted "as character".
@@ -1669,6 +1681,7 @@ void DomainMapper_Impl::PushShapeContext( const uno::Reference< drawing::XShape
{
xProps->setPropertyValue( rPropNameSupplier.GetName( PROP_ANCHOR_TYPE ), bIsGraphic ? uno::makeAny( text::TextContentAnchorType_AS_CHARACTER ) : uno::makeAny( text::TextContentAnchorType_AT_PARAGRAPH ) );
}
+ }
appendTableManager( );
appendTableHandler( );