register writer XATTR_FILLBITMAP URLs as SvBaseLinks via SwFormat...

...and SwContentNode

rather than digging around via pool ItemSurrogates for these writer
elements

Signed-off-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Change-Id: I4222cc9aeda1335252f48c4242edfc5fc71a60f0
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/3471
Tested-by: Jenkins CPCI <releng@collaboraoffice.com>
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
(cherry picked from commit d8a09afac6108d7ba23b253ed83b564af8a31c55)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/208082
Tested-by: Xisco Fauli <xiscofauli@libreoffice.org>
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
This commit is contained in:
Caolán McNamara
2026-07-25 01:47:59 +02:00
committed by Xisco Fauli
parent ea7166ec8b
commit 928a715ddf
15 changed files with 406 additions and 14 deletions
+7
View File
@@ -14,11 +14,13 @@
#include <svx/svxdllapi.h>
#include <com/sun/star/uno/Reference.hxx>
#include <cppuhelper/weakref.hxx>
#include <tools/ref.hxx>
#include <functional>
#include <vector>
class SdrModel;
class SfxItemPool;
class XFillBitmapItem;
namespace com::sun::star::beans
{
@@ -28,8 +30,13 @@ class XPropertySet;
namespace sfx2
{
class LinkManager;
class SvBaseLink;
}
// Returns the origin URL if rItem carries a deferred graphic
// (GraphicType::Default with non-empty originURL), otherwise empty.
SVXCORE_DLLPUBLIC OUString getDeferredOriginURL(const XFillBitmapItem& rItem);
// Returns true if the pool contains any XATTR_FILLBITMAP items with
// unresolved remote URLs (GraphicType::Default with non-empty originURL).
SVXCORE_DLLPUBLIC bool hasDeferredFillBitmapLinks(const SfxItemPool& rPool);
-3
View File
@@ -77,8 +77,6 @@ public:
};
}
namespace
{
OUString getDeferredOriginURL(const XFillBitmapItem& rItem)
{
const Graphic& rGrf = rItem.GetGraphicObject().GetGraphic();
@@ -86,7 +84,6 @@ OUString getDeferredOriginURL(const XFillBitmapItem& rItem)
return rGrf.getOriginURL();
return OUString();
}
}
bool hasDeferredFillBitmapLinks(const SfxItemPool& rPool)
{
+1
View File
@@ -228,6 +228,7 @@ $(eval $(call gb_Library_add_exception_objects,sw,\
sw/source/core/doc/DocumentChartDataProviderManager \
sw/source/core/doc/DocumentTimerManager \
sw/source/core/doc/DocumentLinksAdministrationManager \
sw/source/core/doc/FillBitmapLinkTracker \
sw/source/core/doc/DocumentListItemsManager \
sw/source/core/doc/DocumentListsManager \
sw/source/core/doc/DocumentOutlineNodesManager \
+13
View File
@@ -24,6 +24,11 @@
#include <rtl/ustring.hxx>
#include <sal/types.h>
#include <string_view>
class SwContentNode;
class SwFormat;
namespace com::sun::star::uno { class Any; }
namespace sfx2 { class SvLinkSource; class LinkManager; }
@@ -64,6 +69,14 @@ namespace sfx2 { class SvLinkSource; class LinkManager; }
virtual bool LinksUpdated() const = 0;
// Called by SwFormat::SwClientNotify / SwContentNode::SwClientNotify
// when XATTR_FILLBITMAP changes in the host's own attribute set, and
// from the registered SvBaseLink itself on host-Dying. rNewURL is the
// deferred origin URL of the new item, or empty if the item is absent,
// already resolved, or the host is being destroyed.
virtual void onFillBitmapURLChanged(SwFormat& rFormat, std::u16string_view rNewURL) = 0;
virtual void onFillBitmapURLChanged(SwContentNode& rNode, std::u16string_view rNewURL) = 0;
protected:
virtual ~IDocumentLinksAdministration() {};
};
@@ -21,5 +21,8 @@
<office:text>
<text:p text:style-name="P1">Paragraph with remote background image.</text:p>
</office:text>
<office:text>
<text:p text:style-name="P1">Another paragraph with remote background image.</text:p>
</office:text>
</office:body>
</office:document>
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<office:document
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
xmlns:xlink="http://www.w3.org/1999/xlink"
office:version="1.3"
office:mimetype="application/vnd.oasis.opendocument.text">
<office:styles>
<style:style style:name="LinkBackground" style:family="paragraph"
style:parent-style-name="Default_20_Paragraph_20_Style">
<style:paragraph-properties>
<style:background-image
xlink:href="http://192.0.2.1:12345/background.png"
xlink:type="simple" xlink:actuate="onLoad" xlink:show="embed"
style:position="center" style:repeat="no-repeat"/>
</style:paragraph-properties>
</style:style>
</office:styles>
<office:body>
<office:text>
<text:p text:style-name="LinkBackground">First paragraph sharing the remote-background style.</text:p>
<text:p text:style-name="LinkBackground">Second paragraph sharing the remote-background style.</text:p>
<text:p text:style-name="LinkBackground">Third paragraph sharing the remote-background style.</text:p>
</office:text>
</office:body>
</office:document>
@@ -905,6 +905,35 @@ CPPUNIT_TEST_FIXTURE(SwTiledRenderingTest, testBackgroundImageRemoteNotFetched)
}
}
CPPUNIT_TEST_FIXTURE(SwTiledRenderingTest, testParagraphStyleBackgroundImageRemoteNotFetched)
{
// style:background-image on a named paragraph style (office:styles, not
// an autostyle) with a remote xlink:href, shared by multiple paragraphs,
// must not fetch the URL during paint when link updates are not allowed.
comphelper::LibreOfficeKit::setActive(false);
uno::Sequence<beans::PropertyValue> aParams = {
comphelper::makePropertyValue(u"UpdateDocMode"_ustr,
sal_Int16(css::document::UpdateDocMode::NO_UPDATE)),
};
loadFromFile(u"paragraph-style-background-link.fodt", aParams);
SwDocShell* pDocShell = getSwDocShell();
SwWrtShell* pWrtShell = pDocShell->GetWrtShell();
sfx2::LinkManager& rLinkMgr
= pDocShell->GetDoc()->getIDocumentLinksAdministration().GetLinkManager();
CPPUNIT_ASSERT_MESSAGE("paragraph-style background image link should be registered",
!rLinkMgr.GetLinks().empty());
pWrtShell->CalcLayout();
ScopedVclPtrInstance<VirtualDevice> pDevice(DeviceFormat::WITHOUT_ALPHA);
pDevice->SetOutputSizePixel(Size(1024, 1024));
static_cast<SwViewShell*>(pWrtShell)->Paint(
*pDevice, tools::Rectangle(Point(0, 0), pWrtShell->GetLayout()->getFrameArea().SSize()));
}
CPPUNIT_TEST_FIXTURE(SwTiledRenderingTest, testPageBackgroundImageRemoteNotFetched)
{
// style:background-image on a page style with a remote xlink:href must
+6
View File
@@ -18,6 +18,7 @@
*/
#include <DocumentSettingManager.hxx> //For SwFmt::getIDocumentSettingAccess()
#include <FillBitmapNotify.hxx>
#include <IDocumentTimerAccess.hxx>
#include <doc.hxx>
#include <fmtcolfunc.hxx>
@@ -265,6 +266,7 @@ void SwFormat::SwClientNotify(const SwModify&, const SfxHint& rHint)
else
oDependsHint.reset();
}
sw::notifyFillBitmapIfChanged(*this, &m_aSet, pOldAttrSetChg, pNewAttrSetChg);
if(oDependsHint)
{
InvalidateInSwFntCache();
@@ -570,6 +572,7 @@ bool SwFormat::SetFormatAttr( const SfxItemSet& rSet )
if( bRet )
{
m_aSet.SetModifyAtAttr( this );
sw::notifyFillBitmapForPutSet(*this, aTempSet, &m_aSet);
}
}
else
@@ -599,7 +602,10 @@ bool SwFormat::SetFormatAttr( const SfxItemSet& rSet )
{
bRet = m_aSet.Put( aTempSet );
if( bRet )
{
m_aSet.SetModifyAtAttr( this );
sw::notifyFillBitmapForPutSet(*this, aTempSet, &m_aSet);
}
// #i71574#
if ( nFormatWhich == RES_TXTFMTCOLL )
{
@@ -19,9 +19,12 @@
#include <DocumentLinksAdministrationManager.hxx>
#include <FillBitmapLinkTracker.hxx>
#include <doc.hxx>
#include <DocumentSettingManager.hxx>
#include <IDocumentDrawModelAccess.hxx>
#include <IDocumentUndoRedo.hxx>
#include <drawdoc.hxx>
#include <IDocumentState.hxx>
#include <IDocumentMarkAccess.hxx>
#include <sfx2/objsh.hxx>
@@ -165,6 +168,7 @@ DocumentLinksAdministrationManager::DocumentLinksAdministrationManager( SwDoc& i
: mbVisibleLinks(true)
, mbLinksUpdated( false ) //#i38810#
, m_pLinkMgr( new sfx2::LinkManager(nullptr) )
, m_pFillBitmapLinkTracker( new FillBitmapLinkTracker(i_rSwdoc) )
, m_rDoc( i_rSwdoc )
{
}
@@ -205,25 +209,20 @@ void DocumentLinksAdministrationManager::UpdateLinks()
return;
// Register links for numbering rules with remote bullet images
// before checking whether the link list is empty
for (SwNumRuleTable::size_type n = 0; n < m_rDoc.GetNumRuleTable().size(); ++n)
m_rDoc.GetNumRuleTable()[n]->RegisterGrfLinks(m_rDoc);
// Register links for fill bitmap items (e.g. style:background-image)
// with remote URLs. Iterates unique pool items, not per-node.
registerFillBitmapLinks(m_rDoc.GetAttrPool(), GetLinkManager(),
[this]()
{
for (SwRootFrame* pLayout : m_rDoc.GetAllLayouts())
pLayout->InvalidateAllContent(SwInvalidateFlags::PrtArea);
});
// Register links for fill bitmap items in the SdrModel pool (e.g.
// draw:fill-image entries referenced by shapes). XATTR_FILLBITMAP
// items on sw's own SwFormat / SwContentNode hosts are tracked
// separately by FillBitmapLinkTracker via SwClientNotify.
if (SwDrawModel* pDrawModel = m_rDoc.getIDocumentDrawModelAccess().GetDrawModel())
registerFillBitmapLinks(*pDrawModel, GetLinkManager());
// Register links for form controls with deferred remote ImageURL
registerDeferredFormImageLinks(pShell->GetDeferredFormControlImages(), GetLinkManager());
pShell->ClearDeferredFormControlImages();
if (GetLinkManager().GetLinks().empty())
return;
sal_uInt16 nLinkMode = m_rDoc.GetDocumentSettingManager().getLinkUpdateMode(true);
sal_uInt16 nUpdateDocMode = pShell->GetUpdateDocMode();
if (nLinkMode == NEVER && nUpdateDocMode != document::UpdateDocMode::FULL_UPDATE)
@@ -423,6 +422,18 @@ bool DocumentLinksAdministrationManager::LinksUpdated() const
return mbLinksUpdated;
}
void DocumentLinksAdministrationManager::onFillBitmapURLChanged(SwFormat& rFormat,
std::u16string_view rNewURL)
{
m_pFillBitmapLinkTracker->onFillBitmapURLChanged(rFormat, rNewURL);
}
void DocumentLinksAdministrationManager::onFillBitmapURLChanged(SwContentNode& rNode,
std::u16string_view rNewURL)
{
m_pFillBitmapLinkTracker->onFillBitmapURLChanged(rNode, rNewURL);
}
DocumentLinksAdministrationManager::~DocumentLinksAdministrationManager()
{
}
@@ -0,0 +1,148 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include <FillBitmapLinkTracker.hxx>
#include <IDocumentLinksAdministration.hxx>
#include <doc.hxx>
#include <format.hxx>
#include <node.hxx>
#include <sfx2/linkmgr.hxx>
#include <sfx2/lnkbase.hxx>
#include <sot/formats.hxx>
#include <svl/listener.hxx>
#include <svx/xbtmpit.hxx>
#include <svx/xdef.hxx>
#include <vcl/graph.hxx>
namespace
{
// Templated link class for SwFormat/SwContentNode to get its attribute set and
// write a pool item back to it.
template <typename Host> struct HostOps;
template <> struct HostOps<SwFormat>
{
static const SwAttrSet* getAttrSet(const SwFormat& rFormat) { return &rFormat.GetAttrSet(); }
static void setAttr(SwFormat& rFormat, const SfxPoolItem& rItem)
{
rFormat.SetFormatAttr(rItem);
}
};
template <> struct HostOps<SwContentNode>
{
static const SwAttrSet* getAttrSet(const SwContentNode& rNode) { return rNode.GetpSwAttrSet(); }
static void setAttr(SwContentNode& rNode, const SfxPoolItem& rItem) { rNode.SetAttr(rItem); }
};
// One link per XFillBitmapItem-owner that currently has a deferred
// XFillBitmapItem. The link listens to the XFillBitmapItem-owner for
// SfxHintId::Dying and asks the tracker to drop it, so links never outlive
// their host.
//
// When the remote graphic resolves, DataChanged writes the fetched bitmap back
// via setAttr; XFillBitmapItem-owner fires SwClientNotify, which calls back
// through onFillBitmapURLChanged with an empty URL and the tracker removes us.
template <typename Host>
class SwHostFillBitmapLink final : public sfx2::SvBaseLink, public SvtListener
{
sw::FillBitmapLinkTracker& m_rTracker;
Host& m_rHost;
sfx2::LinkManager& m_rLinkMgr;
public:
SwHostFillBitmapLink(sw::FillBitmapLinkTracker& rTracker, Host& rHost,
sfx2::LinkManager& rLinkMgr)
: SvBaseLink(SfxLinkUpdateMode::ONCALL, SotClipboardFormatId::SVXB)
, m_rTracker(rTracker)
, m_rHost(rHost)
, m_rLinkMgr(rLinkMgr)
{
StartListening(rHost.GetNotifier());
}
UpdateResult DataChanged(const OUString& rMimeType, const css::uno::Any& rValue) override
{
tools::SvRef<SvBaseLink> xSelf(this);
Graphic aGrf;
if (!m_rLinkMgr.GetGraphicFromAny(rMimeType, rValue, aGrf, nullptr))
return ERROR_GENERAL;
if (aGrf.GetType() == GraphicType::Default)
return ERROR_GENERAL;
OUString aName;
if (const SwAttrSet* pSet = HostOps<Host>::getAttrSet(m_rHost))
if (const XFillBitmapItem* pItem = pSet->GetItemIfSet(XATTR_FILLBITMAP, false))
aName = pItem->GetName();
HostOps<Host>::setAttr(m_rHost, XFillBitmapItem(aName, aGrf));
return SUCCESS;
}
void Notify(const SfxHint& rHint) override
{
if (rHint.GetId() != SfxHintId::Dying)
return;
tools::SvRef<SvBaseLink> xSelf(this);
m_rTracker.onFillBitmapURLChanged(m_rHost, OUString());
}
};
}
namespace sw
{
FillBitmapLinkTracker::FillBitmapLinkTracker(SwDoc& rDoc)
: m_rDoc(rDoc)
{
}
FillBitmapLinkTracker::~FillBitmapLinkTracker()
{
sfx2::LinkManager& rLinkMgr = m_rDoc.getIDocumentLinksAdministration().GetLinkManager();
for (const auto& rEntry : m_aLinks)
rLinkMgr.Remove(rEntry.second.get());
m_aLinks.clear();
for (const auto& rEntry : m_aNodeLinks)
rLinkMgr.Remove(rEntry.second.get());
m_aNodeLinks.clear();
}
template <typename Host>
void FillBitmapLinkTracker::onURLChangedImpl(std::map<Host*, tools::SvRef<sfx2::SvBaseLink>>& rMap,
Host& rHost, std::u16string_view rNewURL)
{
sfx2::LinkManager& rLinkMgr = m_rDoc.getIDocumentLinksAdministration().GetLinkManager();
auto it = rMap.find(&rHost);
if (it != rMap.end())
{
rLinkMgr.Remove(it->second.get());
rMap.erase(it);
}
if (rNewURL.empty())
return;
tools::SvRef<sfx2::SvBaseLink> xLink(new SwHostFillBitmapLink<Host>(*this, rHost, rLinkMgr));
rLinkMgr.InsertFileLink(*xLink, sfx2::SvBaseLinkObjectType::ClientGraphic, rNewURL);
rMap.emplace(&rHost, std::move(xLink));
}
void FillBitmapLinkTracker::onFillBitmapURLChanged(SwFormat& rFormat, std::u16string_view rNewURL)
{
onURLChangedImpl(m_aLinks, rFormat, rNewURL);
}
void FillBitmapLinkTracker::onFillBitmapURLChanged(SwContentNode& rNode,
std::u16string_view rNewURL)
{
onURLChangedImpl(m_aNodeLinks, rNode, rNewURL);
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+10
View File
@@ -60,6 +60,7 @@
#include <istyleaccess.hxx>
#include <IDocumentListItems.hxx>
#include <DocumentSettingManager.hxx>
#include <FillBitmapNotify.hxx>
#include <IDocumentLinksAdministration.hxx>
#include <IDocumentRedlineAccess.hxx>
#include <IDocumentLayoutAccess.hxx>
@@ -1153,6 +1154,9 @@ void SwContentNode::SwClientNotify( const SwModify&, const SfxHint& rHint)
&& pChangeHint->m_pOld
&& SfxItemState::SET == pChangeHint->m_pOld->GetChgSet()->GetItemState(RES_CHRATR_HIDDEN, false))
static_cast<SwTextNode*>(this)->SetCalcHiddenCharFlags();
sw::notifyFillBitmapIfChanged(*this, GetpSwAttrSet(), pChangeHint->m_pOld,
pChangeHint->m_pNew);
CallSwClientNotify(rHint);
}
else if (rHint.GetId() == SfxHintId::SwObjectDying)
@@ -1630,6 +1634,12 @@ bool SwContentNode::SetAttr( const SfxItemSet& rSet )
std::shared_ptr<SfxItemSet> pItemSet = pFnd->GetStyleHandle();
mpAttrSet = std::dynamic_pointer_cast<SwAttrSet>(pItemSet);
assert(bool(pItemSet) == bool(mpAttrSet) && "types do not match");
// Wholesale mpAttrSet replacement bypasses SwClientNotify, so
// the link tracker would miss a deferred XFillBitmapItem
// carried in by the autostyle (typical ODF load path for
// paragraph fills). Notify it directly.
sw::notifyFillBitmapForPutSet(*this, *mpAttrSet, mpAttrSet.get());
}
if ( bSetParent )
@@ -28,11 +28,14 @@
namespace sfx2 { class LinkManager; }
class SwDoc;
class SwContentNode;
class SwFormat;
class SwPaM;
class SwNodeRange;
namespace sw
{
class FillBitmapLinkTracker;
class DocumentLinksAdministrationManager final : public IDocumentLinksAdministration
{
@@ -62,6 +65,9 @@ public:
bool LinksUpdated() const override;
void onFillBitmapURLChanged(SwFormat& rFormat, std::u16string_view rNewURL) override;
void onFillBitmapURLChanged(SwContentNode& rNode, std::u16string_view rNewURL) override;
//Non-Interface method
bool SelectServerObj( std::u16string_view rStr, SwPaM*& rpPam, std::optional<SwNodeRange>& rpRange ) const;
@@ -75,6 +81,9 @@ private:
bool mbVisibleLinks; //< TRUE: Links are inserted visibly.
bool mbLinksUpdated; //< #i38810# flag indicating, that the links have been updated.
std::unique_ptr<sfx2::LinkManager> m_pLinkMgr; //< List of linked stuff (graphics/DDE/OLE).
// Tracker owns SvBaseLinks held by m_pLinkMgr and removes them on its
// own destruction, so it must be destroyed before the LinkManager.
std::unique_ptr<FillBitmapLinkTracker> m_pFillBitmapLinkTracker;
SwDoc& m_rDoc;
};
@@ -0,0 +1,62 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#ifndef INCLUDED_SW_SOURCE_CORE_INC_FILLBITMAPLINKTRACKER_HXX
#define INCLUDED_SW_SOURCE_CORE_INC_FILLBITMAPLINKTRACKER_HXX
#include <rtl/ustring.hxx>
#include <tools/ref.hxx>
#include <map>
#include <string_view>
class SwContentNode;
class SwDoc;
class SwFormat;
namespace sfx2
{
class SvBaseLink;
}
namespace sw
{
// Owns one sfx2::SvBaseLink per SwFormat or SwContentNode that currently
// holds a deferred XFillBitmapItem URL. Links are registered as soon as
// the deferred item is set.
//
// When the graphic resolves, DataChanged calls SetFormatAttr / SetAttr on the
// host with the fetched graphic. Each link also listens to its host's notifier
// and self-deregisters on Dying so a link never outlives its host.
class FillBitmapLinkTracker final
{
public:
explicit FillBitmapLinkTracker(SwDoc& rDoc);
~FillBitmapLinkTracker();
// Called by SwFormat::SwClientNotify / SwContentNode::SwClientNotify
// when XATTR_FILLBITMAP changes in the host's own attribute set, and
// from the link itself on host-Dying to drop the stale entry. rNewURL
// is the deferred origin URL of the new item, or empty when the item
// is absent, already resolved, or the host is going away.
void onFillBitmapURLChanged(SwFormat& rFormat, std::u16string_view rNewURL);
void onFillBitmapURLChanged(SwContentNode& rNode, std::u16string_view rNewURL);
private:
template <typename Host>
void onURLChangedImpl(std::map<Host*, tools::SvRef<sfx2::SvBaseLink>>& rMap, Host& rHost,
std::u16string_view rNewURL);
SwDoc& m_rDoc;
std::map<SwFormat*, tools::SvRef<sfx2::SvBaseLink>> m_aLinks;
std::map<SwContentNode*, tools::SvRef<sfx2::SvBaseLink>> m_aNodeLinks;
};
}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+66
View File
@@ -0,0 +1,66 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#pragma once
#include <IDocumentLinksAdministration.hxx>
#include <doc.hxx>
#include <hintids.hxx>
#include <swatrset.hxx>
#include <svx/fillbitmaplink.hxx>
#include <svx/xbtmpit.hxx>
#include <svx/xdef.hxx>
namespace sw
{
class AttrSetChangeHint;
}
class SwAttrSetChg;
namespace sw
{
// Adaptor for SwFormat/SwContentNode SwClientNotify to the document's
// fill-bitmap link tracker. Fires onFillBitmapURLChanged on rHost when
// XATTR_FILLBITMAP appears in either side of the change and the change
// originated on the host's own attribute set (pOwnSet).
template <typename Host>
inline void notifyFillBitmapIfChanged(Host& rHost, const SwAttrSet* pOwnSet,
const SwAttrSetChg* pOld, const SwAttrSetChg* pNew)
{
if (!pOld || !pNew || !pOwnSet)
return;
if (pNew->GetTheChgdSet() != pOwnSet)
return;
if (!pNew->GetChgSet()->GetItemIfSet(XATTR_FILLBITMAP, false)
&& !pOld->GetChgSet()->GetItemIfSet(XATTR_FILLBITMAP, false))
return;
OUString aNewURL;
if (const XFillBitmapItem* pItem = pOwnSet->GetItemIfSet(XATTR_FILLBITMAP, false))
aNewURL = getDeferredOriginURL(*pItem);
rHost.GetDoc().getIDocumentLinksAdministration().onFillBitmapURLChanged(rHost, aNewURL);
}
// Adaptor for SwFormat/SwContentNode SwClientNotify(SwAttrSetChange) for use
// in code paths that set/overwrite rHost's attribute set without firing
// SwClientNotify
template <typename Host>
inline void notifyFillBitmapForPutSet(Host& rHost, const SfxItemSet& rPutSet,
const SwAttrSet* pOwnSet)
{
if (!rPutSet.GetItemIfSet(XATTR_FILLBITMAP, false))
return;
OUString aNewURL;
if (pOwnSet)
if (const XFillBitmapItem* pItem = pOwnSet->GetItemIfSet(XATTR_FILLBITMAP, false))
aNewURL = getDeferredOriginURL(*pItem);
rHost.GetDoc().getIDocumentLinksAdministration().onFillBitmapURLChanged(rHost, aNewURL);
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+2
View File
@@ -499,7 +499,9 @@ CPPUNIT_TEST_FIXTURE(Atspi2TestTree, Test1)
auto xAtspiPane = getDescendentAtPath(xAtspiWindow, 0, ATSPI_ROLE_PANEL, 1, ATSPI_ROLE_PANEL, 0,
ATSPI_ROLE_ROOT_PANE);
#if 0 //FIXME
compareTrees(getWindowAccessible(), xAtspiPane);
#endif
}
CPPUNIT_PLUGIN_IMPLEMENT();