rbhz#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. Change-Id: I54c594a94989158f22b156fe660c1e716b988b3e
This commit is contained in:
@@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#include <sal/config.h>
|
#include <sal/config.h>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <svl/solar.hrc>
|
#include <svl/solar.hrc>
|
||||||
@@ -33,6 +34,7 @@
|
|||||||
#include <svx/svxdllapi.h>
|
#include <svx/svxdllapi.h>
|
||||||
|
|
||||||
class SfxItemSet;
|
class SfxItemSet;
|
||||||
|
class SfxPoolItem;
|
||||||
class SfxStyleSheet;
|
class SfxStyleSheet;
|
||||||
class SdrView;
|
class SdrView;
|
||||||
class SdrPageView;
|
class SdrPageView;
|
||||||
@@ -584,6 +586,8 @@ class SVX_DLLPUBLIC SdrUndoDelPage : public SdrUndoPageList
|
|||||||
// When deleting a MasterPage, we remember all relations of the
|
// When deleting a MasterPage, we remember all relations of the
|
||||||
// Character Page with the MasterPage in this UndoGroup.
|
// Character Page with the MasterPage in this UndoGroup.
|
||||||
SdrUndoGroup* pUndoGroup;
|
SdrUndoGroup* pUndoGroup;
|
||||||
|
std::unique_ptr<SfxPoolItem> mpFillBitmapItem;
|
||||||
|
bool mbHasFillBitmap;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SdrUndoDelPage(SdrPage& rNewPg);
|
SdrUndoDelPage(SdrPage& rNewPg);
|
||||||
@@ -597,6 +601,11 @@ public:
|
|||||||
|
|
||||||
virtual void SdrRepeat(SdrView& rView) override;
|
virtual void SdrRepeat(SdrView& rView) override;
|
||||||
virtual bool CanSdrRepeat(SdrView& rView) const override;
|
virtual bool CanSdrRepeat(SdrView& rView) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void queryFillBitmap(const SfxItemSet &rItemSet);
|
||||||
|
void clearFillBitmap();
|
||||||
|
void restoreFillBitmap();
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -21,8 +21,14 @@
|
|||||||
#include "sdpage.hxx"
|
#include "sdpage.hxx"
|
||||||
#include "sdresid.hxx"
|
#include "sdresid.hxx"
|
||||||
#include "strings.hrc"
|
#include "strings.hrc"
|
||||||
|
|
||||||
|
#include <com/sun/star/drawing/FillStyle.hpp>
|
||||||
|
|
||||||
|
#include <o3tl/make_unique.hxx>
|
||||||
|
|
||||||
#include <svl/itemset.hxx>
|
#include <svl/itemset.hxx>
|
||||||
|
|
||||||
|
#include <svx/xfillit0.hxx>
|
||||||
|
|
||||||
SdBackgroundObjUndoAction::SdBackgroundObjUndoAction(
|
SdBackgroundObjUndoAction::SdBackgroundObjUndoAction(
|
||||||
SdDrawDocument& rDoc,
|
SdDrawDocument& rDoc,
|
||||||
@@ -30,10 +36,12 @@ SdBackgroundObjUndoAction::SdBackgroundObjUndoAction(
|
|||||||
const SfxItemSet& rItenSet)
|
const SfxItemSet& rItenSet)
|
||||||
: SdUndoAction(&rDoc),
|
: SdUndoAction(&rDoc),
|
||||||
mrPage(rPage),
|
mrPage(rPage),
|
||||||
mpItemSet(new SfxItemSet(rItenSet))
|
mpItemSet(new SfxItemSet(rItenSet)),
|
||||||
|
mbHasFillBitmap(false)
|
||||||
{
|
{
|
||||||
OUString aString( SdResId( STR_UNDO_CHANGE_PAGEFORMAT ) );
|
OUString aString( SdResId( STR_UNDO_CHANGE_PAGEFORMAT ) );
|
||||||
SetComment( aString );
|
SetComment( aString );
|
||||||
|
saveFillBitmap(*mpItemSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
SdBackgroundObjUndoAction::~SdBackgroundObjUndoAction()
|
SdBackgroundObjUndoAction::~SdBackgroundObjUndoAction()
|
||||||
@@ -45,9 +53,14 @@ void SdBackgroundObjUndoAction::ImplRestoreBackgroundObj()
|
|||||||
{
|
{
|
||||||
SfxItemSet* pNew = new SfxItemSet(mrPage.getSdrPageProperties().GetItemSet());
|
SfxItemSet* pNew = new SfxItemSet(mrPage.getSdrPageProperties().GetItemSet());
|
||||||
mrPage.getSdrPageProperties().ClearItem();
|
mrPage.getSdrPageProperties().ClearItem();
|
||||||
|
if (bool(mpFillBitmapItem))
|
||||||
|
restoreFillBitmap(*mpItemSet);
|
||||||
|
mpFillBitmapItem.reset();
|
||||||
|
mbHasFillBitmap = false;
|
||||||
mrPage.getSdrPageProperties().PutItemSet(*mpItemSet);
|
mrPage.getSdrPageProperties().PutItemSet(*mpItemSet);
|
||||||
delete mpItemSet;
|
delete mpItemSet;
|
||||||
mpItemSet = pNew;
|
mpItemSet = pNew;
|
||||||
|
saveFillBitmap(*mpItemSet);
|
||||||
|
|
||||||
// tell the page that it's visualization has changed
|
// tell the page that it's visualization has changed
|
||||||
mrPage.ActionChanged();
|
mrPage.ActionChanged();
|
||||||
@@ -65,7 +78,33 @@ void SdBackgroundObjUndoAction::Redo()
|
|||||||
|
|
||||||
SdUndoAction* SdBackgroundObjUndoAction::Clone() const
|
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: */
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
||||||
|
@@ -20,11 +20,13 @@
|
|||||||
#ifndef INCLUDED_SD_SOURCE_UI_INC_UNDOBACK_HXX
|
#ifndef INCLUDED_SD_SOURCE_UI_INC_UNDOBACK_HXX
|
||||||
#define INCLUDED_SD_SOURCE_UI_INC_UNDOBACK_HXX
|
#define INCLUDED_SD_SOURCE_UI_INC_UNDOBACK_HXX
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include "sdundo.hxx"
|
#include "sdundo.hxx"
|
||||||
|
|
||||||
class SdDrawDocument;
|
class SdDrawDocument;
|
||||||
class SdPage;
|
class SdPage;
|
||||||
class SfxItemSet;
|
class SfxItemSet;
|
||||||
|
class SfxPoolItem;
|
||||||
|
|
||||||
// SdBackgroundObjUndoAction
|
// SdBackgroundObjUndoAction
|
||||||
class SdBackgroundObjUndoAction : public SdUndoAction
|
class SdBackgroundObjUndoAction : public SdUndoAction
|
||||||
@@ -33,8 +35,12 @@ private:
|
|||||||
|
|
||||||
SdPage& mrPage;
|
SdPage& mrPage;
|
||||||
SfxItemSet* mpItemSet;
|
SfxItemSet* mpItemSet;
|
||||||
|
std::unique_ptr<SfxPoolItem> mpFillBitmapItem;
|
||||||
|
bool mbHasFillBitmap;
|
||||||
|
|
||||||
void ImplRestoreBackgroundObj();
|
void ImplRestoreBackgroundObj();
|
||||||
|
void saveFillBitmap(SfxItemSet &rItemSet);
|
||||||
|
void restoreFillBitmap(SfxItemSet &rItemSet);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <com/sun/star/drawing/FillStyle.hpp>
|
||||||
|
|
||||||
#include <svl/lstner.hxx>
|
#include <svl/lstner.hxx>
|
||||||
|
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
#include <svx/svdlayer.hxx>
|
#include <svx/svdlayer.hxx>
|
||||||
#include <svx/svdmodel.hxx>
|
#include <svx/svdmodel.hxx>
|
||||||
#include <svx/svdview.hxx>
|
#include <svx/svdview.hxx>
|
||||||
|
#include <svx/xfillit0.hxx>
|
||||||
#include "svx/svdstr.hrc"
|
#include "svx/svdstr.hrc"
|
||||||
#include "svdglob.hxx"
|
#include "svdglob.hxx"
|
||||||
#include <svx/scene3d.hxx>
|
#include <svx/scene3d.hxx>
|
||||||
@@ -1445,9 +1447,24 @@ SdrUndoPageList::~SdrUndoPageList()
|
|||||||
SdrUndoDelPage::SdrUndoDelPage(SdrPage& rNewPg)
|
SdrUndoDelPage::SdrUndoDelPage(SdrPage& rNewPg)
|
||||||
: SdrUndoPageList(rNewPg)
|
: SdrUndoPageList(rNewPg)
|
||||||
, pUndoGroup(nullptr)
|
, pUndoGroup(nullptr)
|
||||||
|
, mbHasFillBitmap(false)
|
||||||
{
|
{
|
||||||
bItsMine = true;
|
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
|
// now remember the master page relationships
|
||||||
if(mrPage.IsMasterPage())
|
if(mrPage.IsMasterPage())
|
||||||
{
|
{
|
||||||
@@ -1482,6 +1499,8 @@ SdrUndoDelPage::~SdrUndoDelPage()
|
|||||||
|
|
||||||
void SdrUndoDelPage::Undo()
|
void SdrUndoDelPage::Undo()
|
||||||
{
|
{
|
||||||
|
if (bool(mpFillBitmapItem))
|
||||||
|
restoreFillBitmap();
|
||||||
ImpInsertPage(nPageNum);
|
ImpInsertPage(nPageNum);
|
||||||
if (pUndoGroup!=nullptr)
|
if (pUndoGroup!=nullptr)
|
||||||
{
|
{
|
||||||
@@ -1495,6 +1514,8 @@ void SdrUndoDelPage::Undo()
|
|||||||
void SdrUndoDelPage::Redo()
|
void SdrUndoDelPage::Redo()
|
||||||
{
|
{
|
||||||
ImpRemovePage(nPageNum);
|
ImpRemovePage(nPageNum);
|
||||||
|
if (bool(mpFillBitmapItem))
|
||||||
|
clearFillBitmap();
|
||||||
// master page relations are dissolved automatically
|
// master page relations are dissolved automatically
|
||||||
DBG_ASSERT(!bItsMine,"RedoDeletePage: mrPage already belongs to UndoAction.");
|
DBG_ASSERT(!bItsMine,"RedoDeletePage: mrPage already belongs to UndoAction.");
|
||||||
bItsMine=true;
|
bItsMine=true;
|
||||||
@@ -1523,6 +1544,55 @@ bool SdrUndoDelPage::CanSdrRepeat(SdrView& /*rView*/) const
|
|||||||
return false;
|
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()
|
void SdrUndoNewPage::Undo()
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user