include/svx/svdundo.hxx | 9 +++++ sd/source/ui/func/undoback.cxx | 43 ++++++++++++++++++++++++- sd/source/ui/inc/undoback.hxx | 6 +++ svx/source/svdraw/svdundo.cxx | 70 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 126 insertions(+), 2 deletions(-)
New commits: commit fd45334b49c09538598f82f5ffa2f61f6bdd9d24 Author: David Tardon <dtar...@redhat.com> Date: Tue Apr 26 09:17:11 2016 +0200 rhbz#1326602 avoid exp. bg bitmaps from deleted slides ODF export uses SvxUnoBitmapTable (impl. of com.sun.star.drawing.BitmapTable) to create fill bitmap styles. That returns all XATTR_FILLBITMAP items that are in the document's pool. So we ensure that bitmaps that are only used on deleted (either explicitly or by undoing their insertion) slides are not in the pool. (cherry picked from commit b876bbe2cacce8af379b10d82da6c7e7d229b361) Change-Id: I54c594a94989158f22b156fe660c1e716b988b3e Reviewed-on: https://gerrit.libreoffice.org/24590 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/include/svx/svdundo.hxx b/include/svx/svdundo.hxx index 7d4973f..346f6c3 100644 --- a/include/svx/svdundo.hxx +++ b/include/svx/svdundo.hxx @@ -22,6 +22,7 @@ #include <sal/config.h> +#include <memory> #include <vector> #include <svl/solar.hrc> @@ -33,6 +34,7 @@ #include <svx/svxdllapi.h> class SfxItemSet; +class SfxPoolItem; class SfxStyleSheet; class SdrView; class SdrPageView; @@ -584,6 +586,8 @@ class SVX_DLLPUBLIC SdrUndoDelPage : public SdrUndoPageList // When deleting a MasterPage, we remember all relations of the // Character Page with the MasterPage in this UndoGroup. SdrUndoGroup* pUndoGroup; + std::unique_ptr<SfxPoolItem> mpFillBitmapItem; + bool mbHasFillBitmap; public: SdrUndoDelPage(SdrPage& rNewPg); @@ -597,6 +601,11 @@ public: virtual void SdrRepeat(SdrView& rView) override; virtual bool CanSdrRepeat(SdrView& rView) const override; + +private: + void queryFillBitmap(const SfxItemSet &rItemSet); + void clearFillBitmap(); + void restoreFillBitmap(); }; /** diff --git a/sd/source/ui/func/undoback.cxx b/sd/source/ui/func/undoback.cxx index 126101f..704b551 100644 --- a/sd/source/ui/func/undoback.cxx +++ b/sd/source/ui/func/undoback.cxx @@ -21,8 +21,14 @@ #include "sdpage.hxx" #include "sdresid.hxx" #include "strings.hrc" + +#include <com/sun/star/drawing/FillStyle.hpp> + +#include <o3tl/make_unique.hxx> + #include <svl/itemset.hxx> +#include <svx/xfillit0.hxx> SdBackgroundObjUndoAction::SdBackgroundObjUndoAction( SdDrawDocument& rDoc, @@ -30,10 +36,12 @@ SdBackgroundObjUndoAction::SdBackgroundObjUndoAction( const SfxItemSet& rItenSet) : SdUndoAction(&rDoc), mrPage(rPage), - mpItemSet(new SfxItemSet(rItenSet)) + mpItemSet(new SfxItemSet(rItenSet)), + mbHasFillBitmap(false) { OUString aString( SdResId( STR_UNDO_CHANGE_PAGEFORMAT ) ); SetComment( aString ); + saveFillBitmap(*mpItemSet); } SdBackgroundObjUndoAction::~SdBackgroundObjUndoAction() @@ -45,9 +53,14 @@ void SdBackgroundObjUndoAction::ImplRestoreBackgroundObj() { SfxItemSet* pNew = new SfxItemSet(mrPage.getSdrPageProperties().GetItemSet()); mrPage.getSdrPageProperties().ClearItem(); + if (bool(mpFillBitmapItem)) + restoreFillBitmap(*mpItemSet); + mpFillBitmapItem.reset(); + mbHasFillBitmap = false; mrPage.getSdrPageProperties().PutItemSet(*mpItemSet); delete mpItemSet; mpItemSet = pNew; + saveFillBitmap(*mpItemSet); // tell the page that it's visualization has changed mrPage.ActionChanged(); @@ -65,7 +78,33 @@ void SdBackgroundObjUndoAction::Redo() SdUndoAction* SdBackgroundObjUndoAction::Clone() const { - return new SdBackgroundObjUndoAction(*mpDoc, mrPage, *mpItemSet); + std::unique_ptr<SdBackgroundObjUndoAction> pCopy = o3tl::make_unique<SdBackgroundObjUndoAction>(*mpDoc, mrPage, *mpItemSet); + if (mpFillBitmapItem) + pCopy->mpFillBitmapItem.reset(mpFillBitmapItem->Clone()); + pCopy->mbHasFillBitmap = mbHasFillBitmap; + return pCopy.release(); +} + +void SdBackgroundObjUndoAction::saveFillBitmap(SfxItemSet &rItemSet) +{ + const SfxPoolItem *pItem = nullptr; + if (rItemSet.GetItemState(XATTR_FILLBITMAP, false, &pItem) == SfxItemState::SET) + mpFillBitmapItem.reset(pItem->Clone()); + if (bool(mpFillBitmapItem)) + { + if (rItemSet.GetItemState(XATTR_FILLSTYLE, false, &pItem) == SfxItemState::SET) + mbHasFillBitmap = static_cast<const XFillStyleItem*>(pItem)->GetValue() == css::drawing::FillStyle_BITMAP; + rItemSet.ClearItem(XATTR_FILLBITMAP); + if (mbHasFillBitmap) + rItemSet.ClearItem(XATTR_FILLSTYLE); + } +} + +void SdBackgroundObjUndoAction::restoreFillBitmap(SfxItemSet &rItemSet) +{ + rItemSet.Put(*mpFillBitmapItem); + if (mbHasFillBitmap) + rItemSet.Put(XFillStyleItem(css::drawing::FillStyle_BITMAP)); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/undoback.hxx b/sd/source/ui/inc/undoback.hxx index 3b1553b..35370ca 100644 --- a/sd/source/ui/inc/undoback.hxx +++ b/sd/source/ui/inc/undoback.hxx @@ -20,11 +20,13 @@ #ifndef INCLUDED_SD_SOURCE_UI_INC_UNDOBACK_HXX #define INCLUDED_SD_SOURCE_UI_INC_UNDOBACK_HXX +#include <memory> #include "sdundo.hxx" class SdDrawDocument; class SdPage; class SfxItemSet; +class SfxPoolItem; // SdBackgroundObjUndoAction class SdBackgroundObjUndoAction : public SdUndoAction @@ -33,8 +35,12 @@ private: SdPage& mrPage; SfxItemSet* mpItemSet; + std::unique_ptr<SfxPoolItem> mpFillBitmapItem; + bool mbHasFillBitmap; void ImplRestoreBackgroundObj(); + void saveFillBitmap(SfxItemSet &rItemSet); + void restoreFillBitmap(SfxItemSet &rItemSet); public: diff --git a/svx/source/svdraw/svdundo.cxx b/svx/source/svdraw/svdundo.cxx index 9567d9e..f51942d 100644 --- a/svx/source/svdraw/svdundo.cxx +++ b/svx/source/svdraw/svdundo.cxx @@ -17,6 +17,7 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#include <com/sun/star/drawing/FillStyle.hpp> #include <svl/lstner.hxx> @@ -27,6 +28,7 @@ #include <svx/svdlayer.hxx> #include <svx/svdmodel.hxx> #include <svx/svdview.hxx> +#include <svx/xfillit0.hxx> #include "svx/svdstr.hrc" #include "svdglob.hxx" #include <svx/scene3d.hxx> @@ -1461,9 +1463,24 @@ SdrUndoPageList::~SdrUndoPageList() SdrUndoDelPage::SdrUndoDelPage(SdrPage& rNewPg) : SdrUndoPageList(rNewPg) , pUndoGroup(nullptr) + , mbHasFillBitmap(false) { bItsMine = true; + // keep fill bitmap separately to remove it from pool if not used elsewhere + if (mrPage.IsMasterPage()) + { + SfxStyleSheet* const pStyleSheet = mrPage.getSdrPageProperties().GetStyleSheet(); + if (pStyleSheet) + queryFillBitmap(pStyleSheet->GetItemSet()); + } + else + { + queryFillBitmap(mrPage.getSdrPageProperties().GetItemSet()); + } + if (bool(mpFillBitmapItem)) + clearFillBitmap(); + // now remember the master page relationships if(mrPage.IsMasterPage()) { @@ -1498,6 +1515,8 @@ SdrUndoDelPage::~SdrUndoDelPage() void SdrUndoDelPage::Undo() { + if (bool(mpFillBitmapItem)) + restoreFillBitmap(); ImpInsertPage(nPageNum); if (pUndoGroup!=nullptr) { @@ -1511,6 +1530,8 @@ void SdrUndoDelPage::Undo() void SdrUndoDelPage::Redo() { ImpRemovePage(nPageNum); + if (bool(mpFillBitmapItem)) + clearFillBitmap(); // master page relations are dissolved automatically DBG_ASSERT(!bItsMine,"RedoDeletePage: mrPage already belongs to UndoAction."); bItsMine=true; @@ -1539,6 +1560,55 @@ bool SdrUndoDelPage::CanSdrRepeat(SdrView& /*rView*/) const return false; } +void SdrUndoDelPage::queryFillBitmap(const SfxItemSet& rItemSet) +{ + const SfxPoolItem *pItem = nullptr; + if (rItemSet.GetItemState(XATTR_FILLBITMAP, false, &pItem) == SfxItemState::SET) + mpFillBitmapItem.reset(pItem->Clone()); + if (rItemSet.GetItemState(XATTR_FILLSTYLE, false, &pItem) == SfxItemState::SET) + mbHasFillBitmap = static_cast<const XFillStyleItem*>(pItem)->GetValue() == css::drawing::FillStyle_BITMAP; +} + +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); + } + else + { + SdrPageProperties &rPageProps = mrPage.getSdrPageProperties(); + rPageProps.ClearItem(XATTR_FILLBITMAP); + if (mbHasFillBitmap) + rPageProps.ClearItem(XATTR_FILLSTYLE); + } +} + +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)); + } + else + { + SdrPageProperties &rPageProps = mrPage.getSdrPageProperties(); + rPageProps.PutItem(*mpFillBitmapItem); + if (mbHasFillBitmap) + rPageProps.PutItem(XFillStyleItem(css::drawing::FillStyle_BITMAP)); + } +} + void SdrUndoNewPage::Undo()
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits