summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--oox/source/ppt/presentationfragmenthandler.cxx6
-rw-r--r--sd/qa/unit/export-tests-ooxml2.cxx6
-rw-r--r--sd/qa/unit/export-tests-ooxml3.cxx4
-rw-r--r--sd/source/filter/eppt/epptooxml.hxx4
-rw-r--r--sd/source/filter/eppt/pptx-epptooxml.cxx128
-rw-r--r--sd/source/ui/inc/unopage.hxx1
-rw-r--r--sd/source/ui/unoidl/unopage.cxx13
7 files changed, 147 insertions, 15 deletions
diff --git a/oox/source/ppt/presentationfragmenthandler.cxx b/oox/source/ppt/presentationfragmenthandler.cxx
index 8c5fbf261414..edb523161c9e 100644
--- a/oox/source/ppt/presentationfragmenthandler.cxx
+++ b/oox/source/ppt/presentationfragmenthandler.cxx
@@ -230,6 +230,9 @@ SlidePersistPtr PresentationFragmentHandler::importMasterSlide(const Reference<f
for (const auto& rEntry : *xMasterRelations)
{
+ if (!rEntry.second.maType.endsWith("relationships/slideLayout"))
+ continue;
+
aLayoutFragmentPath = xMasterRelations->getFragmentPathFromRelation(rEntry.second);
sal_Int32 nIndex;
@@ -286,6 +289,9 @@ SlidePersistPtr PresentationFragmentHandler::importMasterSlide(const Reference<f
pMasterPersistPtr->createBackground( rFilter );
pMasterPersistPtr->createXShapes( rFilter );
+ uno::Reference< beans::XPropertySet > xSet(pMasterPersistPtr->getPage(), uno::UNO_QUERY_THROW);
+ xSet->setPropertyValue("SlideLayout", Any(pMasterPersistPtr->getLayoutFromValueToken()));
+
oox::drawingml::ThemePtr pTheme = pMasterPersistPtr->getTheme();
if (pTheme)
{
diff --git a/sd/qa/unit/export-tests-ooxml2.cxx b/sd/qa/unit/export-tests-ooxml2.cxx
index 625c04953006..30301c6e4c16 100644
--- a/sd/qa/unit/export-tests-ooxml2.cxx
+++ b/sd/qa/unit/export-tests-ooxml2.cxx
@@ -1313,7 +1313,7 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf106867)
"/p:sld/p:timing/p:tnLst/p:par/p:cTn/p:childTnLst/p:seq/p:cTn/p:childTnLst/p:par/"
"p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:par/p:cTn/p:childTnLst/p:cmd/"
"p:cBhvr/p:tgtEl/p:spTgt",
- "spid", "491");
+ "spid", "42");
}
CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testTdf112280)
@@ -1694,7 +1694,7 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testAccentColor)
"70ad47");
xmlDocUniquePtr pXmlDocTheme2 = parseExport("ppt/theme/theme2.xml");
assertXPath(pXmlDocTheme2, "/a:theme/a:themeElements/a:clrScheme/a:accent6/a:srgbClr", "val",
- "70ad47");
+ "deb340");
// Without the accompanying fix in place, this test would have failed with:
// - Expected: Motyw pakietu Office
@@ -1709,7 +1709,7 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest2, testThemeColors)
createSdImpressDoc("pptx/tdf84205.pptx");
save("Impress Office Open XML");
- xmlDocUniquePtr pXmlDocTheme2 = parseExport("ppt/theme/theme2.xml");
+ xmlDocUniquePtr pXmlDocTheme2 = parseExport("ppt/theme/theme1.xml");
assertXPath(pXmlDocTheme2, "/a:theme/a:themeElements/a:clrScheme/a:dk2/a:srgbClr", "val",
"44546a");
assertXPath(pXmlDocTheme2, "/a:theme/a:themeElements/a:clrScheme/a:accent3/a:srgbClr", "val",
diff --git a/sd/qa/unit/export-tests-ooxml3.cxx b/sd/qa/unit/export-tests-ooxml3.cxx
index 409a8affc8d5..74bcfebb40a5 100644
--- a/sd/qa/unit/export-tests-ooxml3.cxx
+++ b/sd/qa/unit/export-tests-ooxml3.cxx
@@ -75,10 +75,6 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf114848)
xmlDocUniquePtr pXmlDocTheme1 = parseExport("ppt/theme/theme1.xml");
assertXPath(pXmlDocTheme1, "/a:theme/a:themeElements/a:clrScheme/a:dk2/a:srgbClr", "val",
"1f497d");
- xmlDocUniquePtr pXmlDocTheme2 = parseExport("ppt/theme/theme2.xml");
-
- assertXPath(pXmlDocTheme2, "/a:theme/a:themeElements/a:clrScheme/a:dk2/a:srgbClr", "val",
- "1f497d");
}
CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf147586)
diff --git a/sd/source/filter/eppt/epptooxml.hxx b/sd/source/filter/eppt/epptooxml.hxx
index 0c7644c72b3d..6d804c80cf1f 100644
--- a/sd/source/filter/eppt/epptooxml.hxx
+++ b/sd/source/filter/eppt/epptooxml.hxx
@@ -131,6 +131,8 @@ private:
css::uno::Reference<css::drawing::XShape> GetReferencedPlaceholderXShape(const PlaceholderType eType, PageType ePageType) const;
void WritePlaceholderReferenceShapes(PowerPointShapeExport& rDML, PageType ePageType);
+ long FindEquivalentMasterPage(SdrPage* pMasterPage) const;
+
/// Should we export as .pptm, ie. do we contain macros?
bool mbPptm;
@@ -140,12 +142,14 @@ private:
::sax_fastparser::FSHelperPtr mPresentationFS;
LayoutInfo mLayoutInfo[EPP_LAYOUT_SIZE];
+ std::vector<std::pair<SdrPage*, size_t>> mpSlidesMaster;
std::vector< ::sax_fastparser::FSHelperPtr > mpSlidesFSArray;
sal_Int32 mnLayoutFileIdMax;
sal_uInt32 mnSlideIdMax;
sal_uInt32 mnSlideMasterIdMax;
sal_uInt32 mnAnimationNodeIdMax;
+ sal_uInt32 mnThemeIdMax;
sal_uInt32 mnDiagramId;
diff --git a/sd/source/filter/eppt/pptx-epptooxml.cxx b/sd/source/filter/eppt/pptx-epptooxml.cxx
index 9a77780614d4..ef87fcc81a8a 100644
--- a/sd/source/filter/eppt/pptx-epptooxml.cxx
+++ b/sd/source/filter/eppt/pptx-epptooxml.cxx
@@ -25,6 +25,8 @@
#include <oox/ole/vbaproject.hxx>
#include "epptooxml.hxx"
#include <oox/export/shapes.hxx>
+#include <svx/svdlayer.hxx>
+#include <unokywds.hxx>
#include <comphelper/sequenceashashmap.hxx>
#include <comphelper/storagehelper.hxx>
@@ -40,6 +42,8 @@
#include <com/sun/star/drawing/FillStyle.hpp>
#include <com/sun/star/drawing/XDrawPages.hpp>
#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/drawing/XMasterPageTarget.hpp>
+#include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
#include <com/sun/star/embed/ElementModes.hpp>
#include <com/sun/star/geometry/RealPoint2D.hpp>
#include <com/sun/star/office/XAnnotationEnumeration.hpp>
@@ -388,6 +392,7 @@ PowerPointExport::PowerPointExport(const Reference< XComponentContext >& rContex
, mnSlideIdMax(1 << 8)
, mnSlideMasterIdMax(1U << 31)
, mnAnimationNodeIdMax(1)
+ , mnThemeIdMax(0)
, mnDiagramId(1)
, mbCreateNotes(false)
, mnPlaceholderIndexMax(1)
@@ -1491,8 +1496,111 @@ void PowerPointExport::AddLayoutIdAndRelation(const FSHelperPtr& pFS, sal_Int32
FSNS(XML_r, XML_id), sRelId);
}
+static bool lcl_ContainsEquivalentObject(SdrPage* pPage, SdrObject* pObj)
+{
+ bool bFound = false;
+ SdrObject* pObjNext;
+
+ if (!pPage || !pObj)
+ return bFound;
+
+ for (size_t nObj = 0; nObj < pPage->GetObjCount(); ++nObj)
+ {
+ pObjNext = pPage->GetObj(nObj);
+ if (pObjNext && pObjNext->GetMergedItemSet().Equals(
+ pObj->GetMergedItemSet(), false))
+ {
+ bFound = true;
+ break;
+ }
+ }
+
+ return bFound;
+}
+
+static bool lcl_ComparePageObjects(SdrPage* pMasterPage, SdrPage* pMasterNext)
+{
+ if (!pMasterPage || !pMasterNext)
+ return false;
+
+ bool bFound = true;
+ SdrObject* pObjNext;
+ SdrLayerID aLayer =
+ pMasterNext->GetLayerAdmin().GetLayerID(sUNO_LayerName_background_objects);
+
+ for (size_t nObj = 0; nObj < pMasterPage->GetObjCount(); ++nObj)
+ {
+ pObjNext = pMasterPage->GetObj(nObj);
+ if (!pObjNext || pObjNext->GetLayer() == aLayer)
+ continue;
+
+ if (!lcl_ContainsEquivalentObject(pMasterNext, pObjNext))
+ {
+ bFound = false;
+ break;
+ }
+ }
+
+ return bFound;
+}
+
+long PowerPointExport::FindEquivalentMasterPage(SdrPage* pMasterPage) const
+{
+ SdrPage* pMasterNext;
+ long nFound = -1;
+
+ if (!pMasterPage)
+ return nFound;
+
+ for (size_t nMaster = 0; nMaster < mpSlidesMaster.size(); ++nMaster)
+ {
+ pMasterNext = mpSlidesMaster[nMaster].first;
+ if (!pMasterNext)
+ continue;
+
+ if (pMasterNext->getSdrPageProperties().GetItemSet().Equals(
+ pMasterPage->getSdrPageProperties().GetItemSet(), false) &&
+ lcl_ComparePageObjects(pMasterPage, pMasterNext))
+ {
+ nFound = nMaster;
+ break;
+ }
+ }
+
+ return nFound;
+}
+
void PowerPointExport::ImplWriteSlideMaster(sal_uInt32 nPageNum, Reference< XPropertySet > const& aXBackgroundPropSet)
{
+ SdrPage* pMasterPage = SdPage::getImplementation(mXDrawPage);
+ if (!pMasterPage)
+ return;
+
+ uno::Reference<beans::XPropertySet> xPropSet(mXDrawPage, uno::UNO_QUERY_THROW);
+ if (!xPropSet.is())
+ return;
+
+ sal_Int32 nLayout = 0;
+ Any aLayout = xPropSet->getPropertyValue("SlideLayout");
+ long nFound = FindEquivalentMasterPage(pMasterPage);
+ if (aLayout.hasValue() && nFound != -1)
+ {
+ aLayout >>= nLayout;
+ size_t nOffset = GetPPTXLayoutId(nLayout);
+
+ if (mLayoutInfo[nOffset].mnFileIdArray.size() < mnMasterPages)
+ {
+ mLayoutInfo[nOffset].mnFileIdArray.resize(mnMasterPages);
+ }
+
+ mLayoutInfo[nOffset].mnFileIdArray[nPageNum] = mpSlidesMaster[nFound].second;
+
+ if (nPageNum == mnMasterPages - 1)
+ mPresentationFS->endElementNS(XML_p, XML_sldMasterIdLst);
+
+ return;
+ }
+
SAL_INFO("sd.eppt", "write master slide: " << nPageNum << "\n--------------");
// slides list
@@ -1515,7 +1623,7 @@ void PowerPointExport::ImplWriteSlideMaster(sal_uInt32 nPageNum, Reference< XPro
OUString::number(nPageNum + 1) + ".xml",
"application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml");
- SdrPage* pMasterPage = SdPage::getImplementation(mXDrawPage);
+
model::Theme* pTheme = nullptr;
if (pMasterPage)
{
@@ -1523,12 +1631,12 @@ void PowerPointExport::ImplWriteSlideMaster(sal_uInt32 nPageNum, Reference< XPro
}
// write theme per master
- WriteTheme(nPageNum, pTheme);
+ WriteTheme(mnThemeIdMax, pTheme);
// add implicit relation to the presentation theme
addRelation(pFS->getOutputStream(),
oox::getRelationship(Relationship::THEME),
- Concat2View("../theme/theme" + OUString::number(nPageNum + 1) + ".xml"));
+ Concat2View("../theme/theme" + OUString::number(++mnThemeIdMax) + ".xml"));
pFS->startElementNS(XML_p, XML_sldMaster, PNMSS);
@@ -1572,6 +1680,13 @@ void PowerPointExport::ImplWriteSlideMaster(sal_uInt32 nPageNum, Reference< XPro
}
}
+ if (aLayout.hasValue())
+ {
+ aLayout >>= nLayout;
+ mpSlidesMaster.push_back(std::make_pair(pMasterPage,
+ GetLayoutFileId(GetPPTXLayoutId(nLayout), nPageNum)));
+ }
+
pFS->endElementNS(XML_p, XML_sldLayoutIdLst);
pFS->endElementNS(XML_p, XML_sldMaster);
@@ -2270,10 +2385,11 @@ Reference<XShape> PowerPointExport::GetReferencedPlaceholderXShape(const Placeho
}
else
{
- pMasterPage
- = &static_cast<SdPage&>(SdPage::getImplementation(mXDrawPage)->TRG_GetMasterPage());
+ SdrPage* pPage = &SdPage::getImplementation(mXDrawPage)->TRG_GetMasterPage();
+ long nFound = FindEquivalentMasterPage(pPage);
+ pMasterPage = dynamic_cast<SdPage*>(nFound != -1 ? mpSlidesMaster[nFound].first : pPage);
}
- if (SdrObject* pMasterFooter = pMasterPage->GetPresObj(ePresObjKind))
+ if (SdrObject* pMasterFooter = (pMasterPage ? pMasterPage->GetPresObj(ePresObjKind) : nullptr))
return GetXShapeForSdrObject(pMasterFooter);
}
return nullptr;
diff --git a/sd/source/ui/inc/unopage.hxx b/sd/source/ui/inc/unopage.hxx
index cc7b48f8b0de..14b4975b2cb2 100644
--- a/sd/source/ui/inc/unopage.hxx
+++ b/sd/source/ui/inc/unopage.hxx
@@ -55,6 +55,7 @@ private:
SdrModel* mpSdrModel;
bool mbIsImpressDocument;
sal_Int16 mnTempPageNumber; // for printing handouts
+ css::uno::Any mSlideLayout; // import slide layout pptx
const SvxItemPropertySet* mpPropSet;
void UpdateModel();
diff --git a/sd/source/ui/unoidl/unopage.cxx b/sd/source/ui/unoidl/unopage.cxx
index 40d10ab5a666..efaaec7105c2 100644
--- a/sd/source/ui/unoidl/unopage.cxx
+++ b/sd/source/ui/unoidl/unopage.cxx
@@ -103,7 +103,8 @@ enum WID_PAGE
WID_PAGE_PAGENUMBERVISIBLE, WID_PAGE_DATETIMEVISIBLE, WID_PAGE_DATETIMEFIXED,
WID_PAGE_DATETIMETEXT, WID_PAGE_DATETIMEFORMAT, WID_TRANSITION_TYPE, WID_TRANSITION_SUBTYPE,
WID_TRANSITION_DIRECTION, WID_TRANSITION_FADE_COLOR, WID_TRANSITION_DURATION, WID_LOOP_SOUND,
- WID_NAVORDER, WID_PAGE_PREVIEWMETAFILE, WID_PAGE_THEME, WID_PAGE_THEME_UNO_REPRESENTATION
+ WID_NAVORDER, WID_PAGE_PREVIEWMETAFILE, WID_PAGE_THEME, WID_PAGE_THEME_UNO_REPRESENTATION,
+ WID_PAGE_SLIDE_LAYOUT
};
}
@@ -284,7 +285,8 @@ static const SvxItemPropertySet* ImplGetMasterPagePropertySet( PageKind ePageKin
{ u"IsBackgroundDark"_ustr, WID_PAGE_ISDARK, cppu::UnoType<bool>::get(), beans::PropertyAttribute::READONLY, 0},
{ u"Theme"_ustr, WID_PAGE_THEME, cppu::UnoType<util::XTheme>::get(), 0, 0},
// backwards compatible view of the theme for use in tests
- { u"ThemeUnoRepresentation"_ustr, WID_PAGE_THEME_UNO_REPRESENTATION, cppu::UnoType<uno::Sequence<beans::PropertyValue>>::get(), 0, 0}
+ { u"ThemeUnoRepresentation"_ustr, WID_PAGE_THEME_UNO_REPRESENTATION, cppu::UnoType<uno::Sequence<beans::PropertyValue>>::get(), 0, 0},
+ { u"SlideLayout"_ustr, WID_PAGE_SLIDE_LAYOUT, ::cppu::UnoType<sal_Int16>::get(), 0, 0}
};
static const SfxItemPropertyMapEntry aHandoutMasterPagePropertyMap_Impl[] =
@@ -591,6 +593,7 @@ void SAL_CALL SdGenericDrawPage::setPropertyValue( const OUString& aPropertyName
case WID_PAGE_TOP:
case WID_PAGE_BOTTOM:
case WID_PAGE_LAYOUT:
+ case WID_PAGE_SLIDE_LAYOUT:
case WID_PAGE_DURATION:
case WID_PAGE_CHANGE:
{
@@ -618,6 +621,9 @@ void SAL_CALL SdGenericDrawPage::setPropertyValue( const OUString& aPropertyName
case WID_PAGE_LAYOUT:
GetPage()->SetAutoLayout( static_cast<AutoLayout>(nValue), true );
break;
+ case WID_PAGE_SLIDE_LAYOUT:
+ mSlideLayout <<= nValue;
+ break;
case WID_PAGE_DURATION:
GetPage()->SetTime(nValue);
break;
@@ -1057,6 +1063,9 @@ Any SAL_CALL SdGenericDrawPage::getPropertyValue( const OUString& PropertyName )
case WID_PAGE_LAYOUT:
aAny <<= static_cast<sal_Int16>( GetPage()->GetAutoLayout() );
break;
+ case WID_PAGE_SLIDE_LAYOUT:
+ aAny = mSlideLayout;
+ break;
case WID_PAGE_NUMBER:
{
const sal_uInt16 nPageNumber(GetPage()->GetPageNum());