summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBalazs Varga <balazs.varga.extern@allotropia.de>2023-12-29 12:01:10 +0100
committerMichael Stahl <michael.stahl@allotropia.de>2024-01-11 13:00:06 +0100
commit7f66797b10b91242c7025215156922bb17c5a777 (patch)
tree563f08b8c1324120679f2b765168ee7365f58ef2
parenttdf#159110: store URLs to DOCX correctly (diff)
downloadcore-7f66797b10b91242c7025215156922bb17c5a777.tar.gz
core-7f66797b10b91242c7025215156922bb17c5a777.zip
tdf#157742 tdf#157783 - sd: fix copy master slides style
Copy SlideLayout property and themes from the old slide to the new one. Change-Id: I7310200c731839a606981c6d63c8d0d4f9ec0536 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161401 Tested-by: Jenkins Reviewed-by: Balazs Varga <balazs.varga.extern@allotropia.de> (cherry picked from commit 167659bf16a68c27fa547e6eccd62c1a6f69b057) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161420 Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
-rw-r--r--sd/source/core/drawdoc3.cxx64
1 files changed, 46 insertions, 18 deletions
diff --git a/sd/source/core/drawdoc3.cxx b/sd/source/core/drawdoc3.cxx
index 5062630edb88..5310789d2988 100644
--- a/sd/source/core/drawdoc3.cxx
+++ b/sd/source/core/drawdoc3.cxx
@@ -67,11 +67,11 @@ namespace {
class InsertBookmarkAsPage_FindDuplicateLayouts
{
public:
- explicit InsertBookmarkAsPage_FindDuplicateLayouts( std::map<OUString, sal_Int32> &rLayoutsToTransfer )
+ explicit InsertBookmarkAsPage_FindDuplicateLayouts( std::vector<OUString> &rLayoutsToTransfer )
: mrLayoutsToTransfer(rLayoutsToTransfer) {}
void operator()( SdDrawDocument&, SdPage const *, bool, SdDrawDocument* );
private:
- std::map<OUString, sal_Int32> &mrLayoutsToTransfer;
+ std::vector<OUString> &mrLayoutsToTransfer;
};
}
@@ -85,11 +85,11 @@ void InsertBookmarkAsPage_FindDuplicateLayouts::operator()( SdDrawDocument& rDoc
if( nIndex != -1 )
aLayout = aLayout.copy(0, nIndex);
- std::map<OUString, sal_Int32>::const_iterator pIter = mrLayoutsToTransfer.find(aLayout);
+ std::vector<OUString>::const_iterator pIter =
+ find(mrLayoutsToTransfer.begin(), mrLayoutsToTransfer.end(), aLayout);
bool bFound = pIter != mrLayoutsToTransfer.end();
- sal_Int32 nLayout = 20; // blank page - master slide layout ID
const sal_uInt16 nMPageCount = rDoc.GetMasterPageCount();
for (sal_uInt16 nMPage = 0; nMPage < nMPageCount && !bFound; nMPage++)
{
@@ -110,15 +110,6 @@ void InsertBookmarkAsPage_FindDuplicateLayouts::operator()( SdDrawDocument& rDoc
pBMMPage->GetLayoutName(), pBMMPage->GetName() + "_");
aLayout = pBMMPage->GetName();
- uno::Reference< drawing::XDrawPage > xOldPage(rDoc.GetMasterPage(nMPage)->getUnoPage(), uno::UNO_QUERY_THROW);
- uno::Reference<beans::XPropertySet> xPropSet(xOldPage, uno::UNO_QUERY_THROW);
- if (xPropSet.is())
- {
- uno::Any aLayoutID = xPropSet->getPropertyValue("SlideLayout");
- if (aLayoutID.hasValue()) {
- aLayoutID >>= nLayout;
- }
- }
break;
}
else
@@ -127,7 +118,7 @@ void InsertBookmarkAsPage_FindDuplicateLayouts::operator()( SdDrawDocument& rDoc
}
if (!bFound)
- mrLayoutsToTransfer.insert({ aLayout, nLayout });
+ mrLayoutsToTransfer.push_back(aLayout);
}
// Inserts a bookmark as a page
@@ -508,7 +499,7 @@ bool SdDrawDocument::InsertBookmarkAsPage(
// Refactored copy'n'pasted layout name collection into IterateBookmarkPages
- std::map<OUString, sal_Int32> aLayoutsToTransfer;
+ std::vector<OUString> aLayoutsToTransfer;
InsertBookmarkAsPage_FindDuplicateLayouts aSearchFunctor( aLayoutsToTransfer );
lcl_IterateBookmarkPages( *this, pBookmarkDoc, rBookmarkList, nBMSdPageCount, aSearchFunctor, ( rBookmarkList.empty() && pBookmarkDoc != this ) );
@@ -520,11 +511,14 @@ bool SdDrawDocument::InsertBookmarkAsPage(
if( !aLayoutsToTransfer.empty() )
bMergeMasterPages = true;
- for ( const auto& layout : aLayoutsToTransfer )
+ std::map<OUString, sal_Int32> aSlideLayoutsToTransfer;
+ std::map<OUString, std::shared_ptr<model::Theme>> aThemesToTransfer;
+
+ for ( const OUString& layoutName : aLayoutsToTransfer )
{
StyleSheetCopyResultVector aCreatedStyles;
- rStyleSheetPool.CopyLayoutSheets(layout.first, rBookmarkStyleSheetPool, aCreatedStyles);
+ rStyleSheetPool.CopyLayoutSheets(layoutName, rBookmarkStyleSheetPool, aCreatedStyles);
if(!aCreatedStyles.empty())
{
@@ -533,6 +527,29 @@ bool SdDrawDocument::InsertBookmarkAsPage(
pUndoMgr->AddUndoAction(std::make_unique<SdMoveStyleSheetsUndoAction>(this, aCreatedStyles, true));
}
}
+
+ // copy SlideLayout and Theme of the master slide
+ sal_Int32 nLayout = 20; // blank page - master slide layout ID
+ bool bIsMasterPage = false;
+ sal_uInt16 nBMPage = pBookmarkDoc->GetPageByName(layoutName, bIsMasterPage);
+ if (bIsMasterPage)
+ {
+ uno::Reference< drawing::XDrawPage > xOldPage(pBookmarkDoc->GetMasterPage(nBMPage)->getUnoPage(), uno::UNO_QUERY_THROW);
+ SdrPage* pMasterPage = SdPage::getImplementation(xOldPage);
+ if (pMasterPage)
+ {
+ aThemesToTransfer.insert({ layoutName, pMasterPage->getSdrPageProperties().getTheme() });
+ uno::Reference<beans::XPropertySet> xPropSet(xOldPage, uno::UNO_QUERY_THROW);
+ if (xPropSet.is())
+ {
+ uno::Any aLayoutID = xPropSet->getPropertyValue("SlideLayout");
+ if (aLayoutID.hasValue()) {
+ aLayoutID >>= nLayout;
+ }
+ }
+ }
+ aSlideLayoutsToTransfer.insert({ layoutName, nLayout });
+ }
}
// Copy styles. This unconditionally copies all styles, even those
@@ -910,12 +927,23 @@ bool SdDrawDocument::InsertBookmarkAsPage(
pRefPage->SetOrientation( eOrient );
uno::Reference< drawing::XDrawPage > xNewPage(GetMasterPage(nPage)->getUnoPage(), uno::UNO_QUERY_THROW);
+
+ SdrPage* pMasterPage = SdPage::getImplementation(xNewPage);
+ if (pMasterPage)
+ {
+ OUString aLayout(pRefPage->GetName());
+ if (auto it{ aThemesToTransfer.find(aLayout) }; it != std::end(aThemesToTransfer))
+ {
+ pMasterPage->getSdrPageProperties().setTheme(it->second);
+ }
+ }
+
uno::Reference<beans::XPropertySet> xNewPropSet(xNewPage, uno::UNO_QUERY_THROW);
if (xNewPropSet.is())
{
OUString aLayout(pRefPage->GetName());
sal_Int32 nLayout = 20; // blank page - master slide layout ID
- if (auto it{ aLayoutsToTransfer.find(aLayout) }; it != std::end(aLayoutsToTransfer))
+ if (auto it{ aSlideLayoutsToTransfer.find(aLayout) }; it != std::end(aSlideLayoutsToTransfer))
{
nLayout = it->second;
}