diff options
-rw-r--r-- | chart2/qa/extras/chart2import.cxx | 4 | ||||
-rw-r--r-- | chart2/qa/extras/xshape/chart2xshape.cxx | 2 | ||||
-rw-r--r-- | oox/source/drawingml/textbody.cxx | 1 | ||||
-rw-r--r-- | oox/source/ppt/pptshape.cxx | 104 | ||||
-rw-r--r-- | sd/qa/unit/data/pptx/numfmt.pptx | bin | 41105 -> 41390 bytes | |||
-rw-r--r-- | sd/qa/unit/data/pptx/slidenum_field.pptx | bin | 34130 -> 32715 bytes | |||
-rw-r--r-- | sd/qa/unit/import-tests.cxx | 2 |
7 files changed, 109 insertions, 4 deletions
diff --git a/chart2/qa/extras/chart2import.cxx b/chart2/qa/extras/chart2import.cxx index 41d55297a336..383e4524468a 100644 --- a/chart2/qa/extras/chart2import.cxx +++ b/chart2/qa/extras/chart2import.cxx @@ -764,7 +764,7 @@ void Chart2ImportTest::testBnc864396() void Chart2ImportTest::testBnc889755() { load(u"/chart2/qa/extras/data/pptx/", "bnc889755.pptx"); - uno::Reference<chart2::XChartDocument> xChartDoc(getChartDocFromDrawImpress(0, 6), uno::UNO_QUERY_THROW); + uno::Reference<chart2::XChartDocument> xChartDoc(getChartDocFromDrawImpress(0, 5), uno::UNO_QUERY_THROW); CPPUNIT_ASSERT(xChartDoc->hasInternalDataProvider()); uno::Reference< chart2::XInternalDataProvider > xDataProvider( xChartDoc->getDataProvider(), uno::UNO_QUERY_THROW ); @@ -792,7 +792,7 @@ void Chart2ImportTest::testBnc889755() uno::Reference<drawing::XDrawPagesSupplier> xDoc(mxComponent, uno::UNO_QUERY_THROW); uno::Reference<drawing::XDrawPage> xPage(xDoc->getDrawPages()->getByIndex(0), uno::UNO_QUERY_THROW); // Shape "Title 3" - uno::Reference<beans::XPropertySet> xShapeProps(xPage->getByIndex(5), uno::UNO_QUERY_THROW); + uno::Reference<beans::XPropertySet> xShapeProps(xPage->getByIndex(4), uno::UNO_QUERY_THROW); awt::Gradient aTransparence; xShapeProps->getPropertyValue("FillTransparenceGradient") >>= aTransparence; CPPUNIT_ASSERT(aTransparence.StartColor != aTransparence.EndColor); diff --git a/chart2/qa/extras/xshape/chart2xshape.cxx b/chart2/qa/extras/xshape/chart2xshape.cxx index 895f84bb62a4..4964bfc455ee 100644 --- a/chart2/qa/extras/xshape/chart2xshape.cxx +++ b/chart2/qa/extras/xshape/chart2xshape.cxx @@ -177,7 +177,7 @@ void Chart2XShapeTest::testTdf76649TrendLineBug() void Chart2XShapeTest::testTdf88154LabelRotatedLayout() { load(u"chart2/qa/extras/xshape/data/pptx/", "tdf88154_LabelRotatedLayout.pptx"); - uno::Reference<chart::XChartDocument> xChartDoc = getChartDocFromDrawImpress(0, 6); + uno::Reference<chart::XChartDocument> xChartDoc = getChartDocFromDrawImpress(0, 5); uno::Reference<qa::XDumper> xDumper(xChartDoc, UNO_QUERY_THROW); OUString rDump = xDumper->dump(); OString aXmlDump = OUStringToOString(rDump, RTL_TEXTENCODING_UTF8); diff --git a/oox/source/drawingml/textbody.cxx b/oox/source/drawingml/textbody.cxx index b665e7b355a0..f4da6886a69c 100644 --- a/oox/source/drawingml/textbody.cxx +++ b/oox/source/drawingml/textbody.cxx @@ -35,6 +35,7 @@ TextBody::TextBody() } TextBody::TextBody( const TextBodyPtr& pBody ) + : mbHasNoninheritedBodyProperties( false ) { if( pBody ) { maTextProperties = pBody->maTextProperties; diff --git a/oox/source/ppt/pptshape.cxx b/oox/source/ppt/pptshape.cxx index 4e07ae104db3..f1c4a892ac14 100644 --- a/oox/source/ppt/pptshape.cxx +++ b/oox/source/ppt/pptshape.cxx @@ -20,8 +20,12 @@ #include <oox/ppt/pptshape.hxx> #include <oox/core/xmlfilterbase.hxx> #include <drawingml/textbody.hxx> +#include <drawingml/textparagraph.hxx> +#include <drawingml/textfield.hxx> #include <drawingml/table/tableproperties.hxx> +#include <editeng/flditem.hxx> +#include <com/sun/star/text/XTextField.hpp> #include <com/sun/star/container/XNamed.hpp> #include <com/sun/star/frame/XModel.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> @@ -86,6 +90,19 @@ static const char* lclDebugSubType( sal_Int32 nType ) return "unknown - please extend lclDebugSubType"; } +namespace +{ +bool ShapeHasNoVisualPropertiesOnImport(oox::ppt::PPTShape& rPPTShape) +{ + return !rPPTShape.hasNonInheritedShapeProperties() + && !rPPTShape.hasShapeStyleRefs() + && !rPPTShape.getTextBody()->hasVisualRunProperties() + && !rPPTShape.getTextBody()->hasNoninheritedBodyProperties() + && !rPPTShape.getTextBody()->hasListStyleOnImport() + && !rPPTShape.getTextBody()->hasParagraphProperties(); +} +} + oox::drawingml::TextListStylePtr PPTShape::getSubTypeTextListStyle( const SlidePersist& rSlidePersist, sal_Int32 nSubType ) { oox::drawingml::TextListStylePtr pTextListStyle; @@ -178,6 +195,37 @@ void PPTShape::addShape( } break; case XML_dt : + if ( meShapeLocation == Slide && !rSlidePersist.isNotesPage() + && getTextBody()->getParagraphs().size() == 1 + && getTextBody()->getParagraphs().front()->getRuns().size() == 1 + && ShapeHasNoVisualPropertiesOnImport(*this) ) + { + TextRunPtr& pTextRun = getTextBody()->getParagraphs().front()->getRuns().front(); + oox::drawingml::TextField* pTextField = dynamic_cast<oox::drawingml::TextField*>(pTextRun.get()); + if (pTextField) + { + OUString aType = pTextField->getType(); + if ( aType.startsWith("datetime") ) + { + SvxDateFormat eDateFormat = drawingml::TextField::getLODateFormat(aType); + SvxTimeFormat eTimeFormat = drawingml::TextField::getLOTimeFormat(aType); + Reference< XPropertySet > xPropertySet( rSlidePersist.getPage(), UNO_QUERY ); + + if( eDateFormat != SvxDateFormat::AppDefault + || eTimeFormat != SvxTimeFormat::AppDefault ) + { + // DateTimeFormat property looks for the date in 4 LSBs + // and looks for time format in the 4 bits after that + sal_Int32 nDateTimeFormat = static_cast<sal_Int32>(eDateFormat) | + static_cast<sal_Int32>(eTimeFormat) << 4; + xPropertySet->setPropertyValue( "IsDateTimeVisible", Any(true) ); + xPropertySet->setPropertyValue( "IsDateTimeFixed", Any(false) ); + xPropertySet->setPropertyValue( "DateTimeFormat", Any(nDateTimeFormat) ); + return; + } + } + } + } sServiceName = "com.sun.star.presentation.DateTimeShape"; bClearText = true; break; @@ -186,10 +234,46 @@ void PPTShape::addShape( bClearText = true; break; case XML_ftr : + if ( meShapeLocation == Slide && !rSlidePersist.isNotesPage() + && getTextBody()->getParagraphs().size() == 1 + && getTextBody()->getParagraphs().front()->getRuns().size() == 1 + && ShapeHasNoVisualPropertiesOnImport(*this) ) + { + const OUString& rFooterText = getTextBody()->toString(); + + if( !rFooterText.isEmpty() ) + { + // if it is possible to get the footer as a property the LO way, + // get it and discard the shape + Reference< XPropertySet > xPropertySet( rSlidePersist.getPage(), UNO_QUERY ); + xPropertySet->setPropertyValue( "IsFooterVisible", Any( true ) ); + xPropertySet->setPropertyValue( "FooterText", Any(rFooterText) ); + return; + } + } sServiceName = "com.sun.star.presentation.FooterShape"; bClearText = true; break; case XML_sldNum : + if (meShapeLocation == Slide && !rSlidePersist.isNotesPage() + && getTextBody()->getParagraphs().size() == 1 + && getTextBody()->getParagraphs().front()->getRuns().size() == 1 + && ShapeHasNoVisualPropertiesOnImport(*this)) + { + TextRunPtr& pTextRun + = getTextBody()->getParagraphs().front()->getRuns().front(); + oox::drawingml::TextField* pTextField + = dynamic_cast<oox::drawingml::TextField*>(pTextRun.get()); + if (pTextField && pTextField->getType() == "slidenum") + { + // if it is possible to get the slidenum placeholder as a property + // do that and discard the shape + Reference<XPropertySet> xPropertySet(rSlidePersist.getPage(), + UNO_QUERY); + xPropertySet->setPropertyValue("IsPageNumberVisible", Any(true)); + return; + } + } sServiceName = "com.sun.star.presentation.SlideNumberShape"; bClearText = true; break; @@ -393,6 +477,26 @@ void PPTShape::addShape( } } + // we will be losing whatever information there is in the footer placeholder on master/layout slides + // since they should have the "<footer>" textfield in them in order to make LibreOffice process them as expected + // likewise DateTime placeholder data on master/layout slides will be lost and replaced + if( (mnSubType == XML_ftr || mnSubType == XML_dt) && meShapeLocation != Slide ) + { + OUString aFieldType; + if( mnSubType == XML_ftr ) + aFieldType = "com.sun.star.presentation.TextField.Footer"; + else + aFieldType = "com.sun.star.presentation.TextField.DateTime"; + Reference < XTextField > xField( xServiceFact->createInstance( aFieldType ), UNO_QUERY ); + Reference < XText > xText(mxShape, UNO_QUERY); + if(xText.is()) + { + xText->setString(""); + Reference < XTextCursor > xTextCursor = xText->createTextCursor(); + xText->insertTextContent( xTextCursor, xField, false); + } + } + // if this is a group shape, we have to add also each child shape Reference<XShapes> xShapes(xShape, UNO_QUERY); if (xShapes.is()) diff --git a/sd/qa/unit/data/pptx/numfmt.pptx b/sd/qa/unit/data/pptx/numfmt.pptx Binary files differindex aca6927101d6..e5f0f5cf151a 100644 --- a/sd/qa/unit/data/pptx/numfmt.pptx +++ b/sd/qa/unit/data/pptx/numfmt.pptx diff --git a/sd/qa/unit/data/pptx/slidenum_field.pptx b/sd/qa/unit/data/pptx/slidenum_field.pptx Binary files differindex f3c184056905..3388568831d7 100644 --- a/sd/qa/unit/data/pptx/slidenum_field.pptx +++ b/sd/qa/unit/data/pptx/slidenum_field.pptx diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx index fec4db5b6586..69399a686162 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -1888,7 +1888,7 @@ void SdImportTest::testTdf95932() sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/tdf95932.pptx"), PPTX); const SdrPage *pPage = GetPage( 1, xDocShRef ); - SdrObject *const pObj = pPage->GetObj(2); + SdrObject *const pObj = pPage->GetObj(1); CPPUNIT_ASSERT(pObj); const XFillStyleItem& rStyleItem = dynamic_cast<const XFillStyleItem&>( |