diff options
author | Sarper Akdemir <sarper.akdemir@collabora.com> | 2021-04-25 15:59:39 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2021-06-23 11:50:15 +0200 |
commit | 6c9c2ab6437ca28e8deea4ae492bb429165aa243 (patch) | |
tree | 7abb8a34834d1fc368120c6a7734453877e0e70b | |
parent | 669926c70db7837f698b9aaa94afeaf70d242c18 (diff) |
tdf#59323: pptx import: import footer fields as properties
Makes footer, slidenum and datetime placeholders that are inserted to
the slides themselves on pptx files imported as slide properties if it
is possible to do so without losing information (style, position etc.)
If that is not the case and the footers have some special style applied
to them that isn't inherited from master slides, fallbacks to the current
implementation importing them as shapes.
Also since the default way of displaying slide footers in LO use the
respective text fields on master slides, information in master/layout
slide datetime and footer placeholders respectively get replaced with
<date/time> text fields and <footer> text fields.
Change-Id: Ib2f7d18103b62c0c9a8453e01cfd2fd1aa1d39af
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117008
Tested-by: Jenkins
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117626
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
-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 b3b5a3921d3a..4b7d2fadb88b 100644 --- a/chart2/qa/extras/chart2import.cxx +++ b/chart2/qa/extras/chart2import.cxx @@ -821,7 +821,7 @@ void Chart2ImportTest::testBnc864396() void Chart2ImportTest::testBnc889755() { load("/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 ); @@ -849,7 +849,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 68dcc1e7e030..bf820fcfd2bf 100644 --- a/chart2/qa/extras/xshape/chart2xshape.cxx +++ b/chart2/qa/extras/xshape/chart2xshape.cxx @@ -182,7 +182,7 @@ void Chart2XShapeTest::testTdf76649TrendLineBug() void Chart2XShapeTest::testTdf88154LabelRotatedLayout() { load("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 a419a41d0d83..0d44b81631d5 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 bd47dd0fae7a..5f21f7c459c9 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> @@ -84,6 +88,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; @@ -176,6 +193,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; @@ -184,10 +232,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; @@ -376,6 +460,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 5e09f0a2996f..f06af50d5110 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -1822,7 +1822,7 @@ void SdImportTest::testTdf95932() sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("/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&>( |