Blob Blame History Raw
From de4908eb4d2f1f2ce38a37eea18a9efc4a0073b1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
Date: Wed, 6 Jul 2016 10:10:27 +0100
Subject: [PATCH] Resolves: rhbz#1353069 don't clear XATTR_FILL* from
 stylesheet if...

the master page is not the sole owner. Which happens when copying
and pasting slides which bring along a duplicate master page to
an already existing one, and the attempt to remove the duplicate
strips the fill properties from the shared stylesheet in use by
the other

regression from...

commit b876bbe2cacce8af379b10d82da6c7e7d229b361
Author: David Tardon <dtardon@redhat.com>
Date:   Tue Apr 26 09:17:11 2016 +0200

    rbhz#1326602 avoid exp. bg bitmaps from deleted slides

Change-Id: I91fb8f622a0e35741ecc37cef14fc93199bb730b
---
 include/svx/svdundo.hxx                            |  5 +--
 reportdesign/source/core/inc/ReportUndoFactory.hxx |  2 +-
 reportdesign/source/core/sdr/ReportUndoFactory.cxx |  4 +--
 sc/source/core/data/drwlayer.cxx                   |  2 +-
 sd/source/core/drawdoc3.cxx                        | 13 ++++++--
 svx/source/svdraw/svdundo.cxx                      | 37 +++++++++++++---------
 6 files changed, 40 insertions(+), 23 deletions(-)

diff --git a/include/svx/svdundo.hxx b/include/svx/svdundo.hxx
index dc09f22..9d63557 100644
--- a/include/svx/svdundo.hxx
+++ b/include/svx/svdundo.hxx
@@ -588,9 +588,10 @@ class SVX_DLLPUBLIC SdrUndoDelPage : public SdrUndoPageList
     SdrUndoGroup*               pUndoGroup;
     std::unique_ptr<SfxPoolItem> mpFillBitmapItem;
     bool mbHasFillBitmap;
+    bool mbSoleOwnerOfFillBitmapProps;
 
 public:
-    SdrUndoDelPage(SdrPage& rNewPg);
+    SdrUndoDelPage(SdrPage& rNewPg, bool bSoleOwnerOfFillBitmapProps);
     virtual ~SdrUndoDelPage();
 
     virtual void Undo() override;
@@ -762,7 +763,7 @@ public:
     virtual SdrUndoAction* CreateUndoMoveLayer(sal_uInt16 nLayerNum, SdrLayerAdmin& rNewLayerAdmin, SdrModel& rNewModel, sal_uInt16 nNeuPos1);
 
     // Page
-    virtual SdrUndoAction*  CreateUndoDeletePage(SdrPage& rPage);
+    virtual SdrUndoAction* CreateUndoDeletePage(SdrPage& rPage, bool bSoleOwnerOfFillBitmapProps = true);
     virtual SdrUndoAction* CreateUndoNewPage(SdrPage& rPage);
     virtual SdrUndoAction* CreateUndoCopyPage(SdrPage& rPage);
     virtual SdrUndoAction* CreateUndoSetPageNum(SdrPage& rNewPg, sal_uInt16 nOldPageNum1, sal_uInt16 nNewPageNum1);
diff --git a/reportdesign/source/core/inc/ReportUndoFactory.hxx b/reportdesign/source/core/inc/ReportUndoFactory.hxx
index 88d0024..1839f1f 100644
--- a/reportdesign/source/core/inc/ReportUndoFactory.hxx
+++ b/reportdesign/source/core/inc/ReportUndoFactory.hxx
@@ -59,7 +59,7 @@ namespace rptui
         virtual SdrUndoAction* CreateUndoMoveLayer(sal_uInt16 nLayerNum, SdrLayerAdmin& rNewLayerAdmin, SdrModel& rNewModel, sal_uInt16 nNeuPos1) override;
 
         // page
-        virtual SdrUndoAction*  CreateUndoDeletePage(SdrPage& rPage) override;
+        virtual SdrUndoAction* CreateUndoDeletePage(SdrPage& rPage, bool bSoleOwnerOfFillBitmapProps = true) override;
         virtual SdrUndoAction* CreateUndoNewPage(SdrPage& rPage) override;
         virtual SdrUndoAction* CreateUndoCopyPage(SdrPage& rPage) override;
         virtual SdrUndoAction* CreateUndoSetPageNum(SdrPage& rNewPg, sal_uInt16 nOldPageNum1, sal_uInt16 nNewPageNum1) override;
diff --git a/reportdesign/source/core/sdr/ReportUndoFactory.cxx b/reportdesign/source/core/sdr/ReportUndoFactory.cxx
index cbb5a8a..566400c 100644
--- a/reportdesign/source/core/sdr/ReportUndoFactory.cxx
+++ b/reportdesign/source/core/sdr/ReportUndoFactory.cxx
@@ -133,9 +133,9 @@ SdrUndoAction* OReportUndoFactory::CreateUndoMoveLayer(sal_uInt16 nLayerNum, Sdr
 }
 
 // page
-SdrUndoAction*  OReportUndoFactory::CreateUndoDeletePage(SdrPage& rPage)
+SdrUndoAction*  OReportUndoFactory::CreateUndoDeletePage(SdrPage& rPage, bool bSoleOwnerOfFillBitmapProps)
 {
-    return m_pUndoFactory->CreateUndoDeletePage( rPage );
+    return m_pUndoFactory->CreateUndoDeletePage(rPage, bSoleOwnerOfFillBitmapProps);
 }
 
 SdrUndoAction* OReportUndoFactory::CreateUndoNewPage(SdrPage& rPage)
diff --git a/sc/source/core/data/drwlayer.cxx b/sc/source/core/data/drwlayer.cxx
index 7ea6758..b2c7ab9 100644
--- a/sc/source/core/data/drwlayer.cxx
+++ b/sc/source/core/data/drwlayer.cxx
@@ -412,7 +412,7 @@ void ScDrawLayer::ScRemovePage( SCTAB nTab )
     if (bRecording)
     {
         SdrPage* pPage = GetPage(static_cast<sal_uInt16>(nTab));
-        AddCalcUndo(new SdrUndoDelPage(*pPage));        // Undo-Action becomes the page owner
+        AddCalcUndo(new SdrUndoDelPage(*pPage, true));  // Undo-Action becomes the page owner
         RemovePage( static_cast<sal_uInt16>(nTab) );    // just deliver, not deleting
     }
     else
diff --git a/sd/source/core/drawdoc3.cxx b/sd/source/core/drawdoc3.cxx
index cf01895..d857b38 100644
--- a/sd/source/core/drawdoc3.cxx
+++ b/sd/source/core/drawdoc3.cxx
@@ -792,8 +792,17 @@ bool SdDrawDocument::InsertBookmarkAsPage(
                  aTest == aMPLayout &&
                  eKind == pTest->GetPageKind() )
             {
-                if( bUndo )
-                    AddUndo(GetSdrUndoFactory().CreateUndoDeletePage(*pRefPage));
+                if (bUndo)
+                {
+                    bool bSoleOwnerOfStyleSheet = true;
+                    if (pRefPage->IsMasterPage())
+                    {
+                        const SfxStyleSheet* pRefSheet = pRefPage->getSdrPageProperties().GetStyleSheet();
+                        const SfxStyleSheet* pTestSheet = pTest->getSdrPageProperties().GetStyleSheet();
+                        bSoleOwnerOfStyleSheet = pRefSheet != pTestSheet;
+                    }
+                    AddUndo(GetSdrUndoFactory().CreateUndoDeletePage(*pRefPage, bSoleOwnerOfStyleSheet));
+                }
 
                 RemoveMasterPage(nPage);
 
diff --git a/svx/source/svdraw/svdundo.cxx b/svx/source/svdraw/svdundo.cxx
index abc459f..ec5f2fe 100644
--- a/svx/source/svdraw/svdundo.cxx
+++ b/svx/source/svdraw/svdundo.cxx
@@ -1444,10 +1444,11 @@ SdrUndoPageList::~SdrUndoPageList()
 }
 
 
-SdrUndoDelPage::SdrUndoDelPage(SdrPage& rNewPg)
+SdrUndoDelPage::SdrUndoDelPage(SdrPage& rNewPg, bool bSoleOwnerOfFillBitmapProps)
     : SdrUndoPageList(rNewPg)
     , pUndoGroup(nullptr)
     , mbHasFillBitmap(false)
+    , mbSoleOwnerOfFillBitmapProps(bSoleOwnerOfFillBitmapProps)
 {
     bItsMine = true;
 
@@ -1557,12 +1558,15 @@ void SdrUndoDelPage::clearFillBitmap()
 {
     if (mrPage.IsMasterPage())
     {
-        SfxStyleSheet* const pStyleSheet = mrPage.getSdrPageProperties().GetStyleSheet();
-        assert(bool(pStyleSheet)); // who took away my stylesheet?
-        SfxItemSet& rItemSet = pStyleSheet->GetItemSet();
-        rItemSet.ClearItem(XATTR_FILLBITMAP);
-        if (mbHasFillBitmap)
-            rItemSet.ClearItem(XATTR_FILLSTYLE);
+        if (mbSoleOwnerOfFillBitmapProps)
+        {
+            SfxStyleSheet* const pStyleSheet = mrPage.getSdrPageProperties().GetStyleSheet();
+            assert(bool(pStyleSheet)); // who took away my stylesheet?
+            SfxItemSet& rItemSet = pStyleSheet->GetItemSet();
+            rItemSet.ClearItem(XATTR_FILLBITMAP);
+            if (mbHasFillBitmap)
+                rItemSet.ClearItem(XATTR_FILLSTYLE);
+        }
     }
     else
     {
@@ -1577,12 +1581,15 @@ void SdrUndoDelPage::restoreFillBitmap()
 {
     if (mrPage.IsMasterPage())
     {
-        SfxStyleSheet* const pStyleSheet = mrPage.getSdrPageProperties().GetStyleSheet();
-        assert(bool(pStyleSheet)); // who took away my stylesheet?
-        SfxItemSet& rItemSet = pStyleSheet->GetItemSet();
-        rItemSet.Put(*mpFillBitmapItem);
-        if (mbHasFillBitmap)
-            rItemSet.Put(XFillStyleItem(css::drawing::FillStyle_BITMAP));
+        if (mbSoleOwnerOfFillBitmapProps)
+        {
+            SfxStyleSheet* const pStyleSheet = mrPage.getSdrPageProperties().GetStyleSheet();
+            assert(bool(pStyleSheet)); // who took away my stylesheet?
+            SfxItemSet& rItemSet = pStyleSheet->GetItemSet();
+            rItemSet.Put(*mpFillBitmapItem);
+            if (mbHasFillBitmap)
+                rItemSet.Put(XFillStyleItem(css::drawing::FillStyle_BITMAP));
+        }
     }
     else
     {
@@ -1839,9 +1846,9 @@ SdrUndoAction* SdrUndoFactory::CreateUndoMoveLayer(sal_uInt16 nLayerNum, SdrLaye
 }
 
 // page
-SdrUndoAction*  SdrUndoFactory::CreateUndoDeletePage(SdrPage& rPage)
+SdrUndoAction*  SdrUndoFactory::CreateUndoDeletePage(SdrPage& rPage, bool bSoleOwnerOfFillBitmapProps)
 {
-    return new SdrUndoDelPage( rPage );
+    return new SdrUndoDelPage(rPage, bSoleOwnerOfFillBitmapProps);
 }
 
 SdrUndoAction* SdrUndoFactory::CreateUndoNewPage(SdrPage& rPage)
-- 
2.7.4