[Libreoffice-commits] core.git: sw/inc sw/source
Bjoern Michaelsen (via logerrit)
logerrit at kemper.freedesktop.org
Tue Nov 17 06:49:28 UTC 2020
sw/inc/crsrsh.hxx | 2 -
sw/inc/hintids.hxx | 1
sw/inc/hints.hxx | 8 +++++
sw/inc/viewsh.hxx | 1
sw/source/core/crsr/crsrsh.cxx | 23 ++++++++------
sw/source/core/doc/notxtfrm.cxx | 61 +++++++++++++++------------------------
sw/source/core/graphic/ndgrf.cxx | 19 +-----------
sw/source/core/inc/notxtfrm.hxx | 1
sw/source/core/view/viewsh.cxx | 17 ++++++++++
9 files changed, 69 insertions(+), 64 deletions(-)
New commits:
commit 47527821f32f9b5890b39b4031f5962f5cb46646
Author: Bjoern Michaelsen <bjoern.michaelsen at libreoffice.org>
AuthorDate: Mon Nov 16 22:17:07 2020 +0100
Commit: Bjoern Michaelsen <bjoern.michaelsen at libreoffice.org>
CommitDate: Tue Nov 17 07:48:44 2020 +0100
SwGrfNode: Remove graphic arrived hack
Change-Id: Ib8fb5b223a1b3cc05a75ecfcc7c763bbb3928fae
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105965
Tested-by: Jenkins
Reviewed-by: Bjoern Michaelsen <bjoern.michaelsen at libreoffice.org>
diff --git a/sw/inc/crsrsh.hxx b/sw/inc/crsrsh.hxx
index 7eb1a2d0273b..572afdfd4f51 100644
--- a/sw/inc/crsrsh.hxx
+++ b/sw/inc/crsrsh.hxx
@@ -291,7 +291,7 @@ protected:
SAL_DLLPRIVATE void UpdateMarkedListLevel();
protected:
- virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew) override;
+ virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
public:
SwCursorShell( SwDoc& rDoc, vcl::Window *pWin, const SwViewOption *pOpt );
diff --git a/sw/inc/hintids.hxx b/sw/inc/hintids.hxx
index 1cfba494d9e6..04a162acd745 100644
--- a/sw/inc/hintids.hxx
+++ b/sw/inc/hintids.hxx
@@ -424,7 +424,6 @@ constexpr TypedWhichId<SwMsgPoolItem> RES_TBLHEADLINECHG (170);
constexpr TypedWhichId<SwAutoFormatGetDocNode> RES_AUTOFMT_DOCNODE (171);
constexpr TypedWhichId<SwMsgPoolItem> RES_SECTION_HIDDEN (172);
constexpr TypedWhichId<SwMsgPoolItem> RES_SECTION_NOT_HIDDEN (173);
-constexpr TypedWhichId<SwMsgPoolItem> RES_GRAPHIC_ARRIVED (174);
constexpr TypedWhichId<SwMsgPoolItem> RES_GRAPHIC_PIECE_ARRIVED (175);
constexpr TypedWhichId<SwMsgPoolItem> RES_HIDDENPARA_PRINT (176);
constexpr TypedWhichId<SwVirtPageNumInfo> RES_VIRTPAGENUM_INFO (178);
diff --git a/sw/inc/hints.hxx b/sw/inc/hints.hxx
index 68e783d919d2..51a048a271b7 100644
--- a/sw/inc/hints.hxx
+++ b/sw/inc/hints.hxx
@@ -139,6 +139,14 @@ public:
class GrfRereadAndInCacheHint final : public SfxHint
{
};
+
+class PreGraphicArrivedHint final : public SfxHint
+{
+};
+
+class PostGraphicArrivedHint final : public SfxHint
+{
+};
}
class SwUpdateAttr final : public SwMsgPoolItem
diff --git a/sw/inc/viewsh.hxx b/sw/inc/viewsh.hxx
index e5a6ae810a49..071c60d11bd3 100644
--- a/sw/inc/viewsh.hxx
+++ b/sw/inc/viewsh.hxx
@@ -566,6 +566,7 @@ public:
void setOutputToWindow(bool bOutputToWindow);
bool isOutputToWindow() const;
+ void OnGraphicArrived(const SwRect&);
virtual void dumpAsXml(xmlTextWriterPtr pWriter) const;
};
diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx
index 2ba78302aa28..cdb72eec46e9 100644
--- a/sw/source/core/crsr/crsrsh.cxx
+++ b/sw/source/core/crsr/crsrsh.cxx
@@ -73,6 +73,7 @@
#include <wrtsh.hxx>
#include <undobj.hxx>
#include <boost/property_tree/json_parser.hpp>
+#include <hints.hxx>
using namespace com::sun::star;
using namespace util;
@@ -2471,14 +2472,19 @@ SwContentFrame *SwCursorShell::GetCurrFrame( const bool bCalcFrame ) const
@param pOld ???
@param pNew ???
*/
-void SwCursorShell::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
+void SwCursorShell::SwClientNotify(const SwModify&, const SfxHint& rHint)
{
- const sal_uInt16 nWhich = pOld ?
- pOld->Which() :
- pNew ?
- pNew->Which() :
- sal::static_int_cast<sal_uInt16>(RES_MSG_BEGIN);
-
+ if(dynamic_cast<const sw::PostGraphicArrivedHint*>(&rHint) && m_aGrfArrivedLnk.IsSet())
+ {
+ m_aGrfArrivedLnk.Call(*this);
+ return;
+ }
+ auto pLegacy = dynamic_cast<const sw::LegacyModifyHint*>(&rHint);
+ if(!pLegacy)
+ return;
+ auto nWhich = pLegacy->GetWhich();
+ if(!nWhich)
+ nWhich = sal::static_int_cast<sal_uInt16>(RES_MSG_BEGIN);
if( m_bCallChgLnk &&
( nWhich < RES_MSG_BEGIN || nWhich >= RES_MSG_END ||
nWhich == RES_FMT_CHG || nWhich == RES_UPDATE_ATTR ||
@@ -2489,8 +2495,7 @@ void SwCursorShell::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
// not need to send the expensive RES_FMT_CHG in Insert.
CallChgLnk();
- if( m_aGrfArrivedLnk.IsSet() &&
- ( RES_GRAPHIC_ARRIVED == nWhich || RES_GRAPHIC_SWAPIN == nWhich ))
+ if(m_aGrfArrivedLnk.IsSet() && RES_GRAPHIC_SWAPIN == nWhich)
m_aGrfArrivedLnk.Call( *this );
}
diff --git a/sw/source/core/doc/notxtfrm.cxx b/sw/source/core/doc/notxtfrm.cxx
index 47054a8df949..8bf008297233 100644
--- a/sw/source/core/doc/notxtfrm.cxx
+++ b/sw/source/core/doc/notxtfrm.cxx
@@ -720,6 +720,21 @@ void SwNoTextFrame::ClearCache()
}
}
+void SwNoTextFrame::OnGraphicArrived()
+{
+ if(GetNode()->GetNodeType() != SwNodeType::Grf)
+ {
+ InvalidatePrt();
+ SetCompletePaint();
+ return;
+ }
+ SwGrfNode* pNd = static_cast<SwGrfNode*>(GetNode());
+ ClearCache();
+ auto pVSh = pNd->GetDoc().getIDocumentLayoutAccess().GetCurrentViewShell();
+ if(pVSh)
+ pVSh->OnGraphicArrived(getFrameArea());
+}
+
void SwNoTextFrame::SwClientNotify(const SwModify& rModify, const SfxHint& rHint)
{
if(dynamic_cast<const sw::GrfRereadAndInCacheHint*>(&rHint))
@@ -731,6 +746,11 @@ void SwNoTextFrame::SwClientNotify(const SwModify& rModify, const SfxHint& rHint
}
return;
}
+ if(dynamic_cast<const sw::PreGraphicArrivedHint*>(&rHint))
+ {
+ OnGraphicArrived();
+ return;
+ }
auto pLegacy = dynamic_cast<const sw::LegacyModifyHint*>(&rHint);
if(!pLegacy)
return;
@@ -739,7 +759,6 @@ void SwNoTextFrame::SwClientNotify(const SwModify& rModify, const SfxHint& rHint
// #i73788#
// no <SwContentFrame::Modify(..)> for RES_LINKED_GRAPHIC_STREAM_ARRIVED
if ( RES_GRAPHIC_PIECE_ARRIVED != nWhich &&
- RES_GRAPHIC_ARRIVED != nWhich &&
RES_LINKED_GRAPHIC_STREAM_ARRIVED != nWhich )
{
SwContentFrame::SwClientNotify(rModify, rHint);
@@ -749,6 +768,11 @@ void SwNoTextFrame::SwClientNotify(const SwModify& rModify, const SfxHint& rHint
switch( nWhich )
{
+ case RES_GRAPHIC_PIECE_ARRIVED:
+ case RES_LINKED_GRAPHIC_STREAM_ARRIVED:
+ OnGraphicArrived();
+ return;
+
case RES_OBJECTDYING:
break;
@@ -808,41 +832,6 @@ void SwNoTextFrame::SwClientNotify(const SwModify& rModify, const SfxHint& rHint
}
break;
- case RES_GRAPHIC_PIECE_ARRIVED:
- case RES_GRAPHIC_ARRIVED:
- // i73788# - handle RES_LINKED_GRAPHIC_STREAM_ARRIVED as RES_GRAPHIC_ARRIVED
- case RES_LINKED_GRAPHIC_STREAM_ARRIVED:
- if ( GetNode()->GetNodeType() == SwNodeType::Grf )
- {
- bComplete = false;
- SwGrfNode* pNd = static_cast<SwGrfNode*>( GetNode());
-
- ClearCache();
-
- SwRect aRect( getFrameArea() );
-
- SwViewShell *pVSh = pNd->GetDoc().getIDocumentLayoutAccess().GetCurrentViewShell();
- if( !pVSh )
- break;
-
- for(SwViewShell& rShell : pVSh->GetRingContainer())
- {
- CurrShell aCurr( &rShell );
- if( rShell.IsPreview() )
- {
- if( rShell.GetWin() )
- ::RepaintPagePreview( &rShell, aRect );
- }
- else if ( rShell.VisArea().IsOver( aRect ) &&
- OUTDEV_WINDOW == rShell.GetOut()->GetOutDevType() )
- {
- // invalidate instead of painting
- rShell.GetWin()->Invalidate( aRect.SVRect() );
- }
- }
- }
- break;
-
default:
if ( !pLegacy->m_pNew || !isGRFATR(nWhich) )
return;
diff --git a/sw/source/core/graphic/ndgrf.cxx b/sw/source/core/graphic/ndgrf.cxx
index bac1994401e4..ab4057eaebf9 100644
--- a/sw/source/core/graphic/ndgrf.cxx
+++ b/sw/source/core/graphic/ndgrf.cxx
@@ -362,23 +362,8 @@ void SwGrfNode::SetGraphic(const Graphic& rGraphic)
void SwGrfNode::TriggerGraphicArrived()
{
- const SwMsgPoolItem aMsgHint(RES_GRAPHIC_ARRIVED);
- // FIXME: instead of hacking the notification to only handle specific clients.
- // this should have been implemented cleanly with two hints, e.g.
- // RES_GRAPHIC_ARRIVED_PREP and RES_GRAPHIC_ARRIVED.
- LockModify();
- {
- SwIterator<sw::BroadcastingModify,SwGrfNode> aIter(*this);
- for(sw::BroadcastingModify* pLast = aIter.First(); pLast; pLast = aIter.Next())
- if(dynamic_cast<const SwContentFrame*>(pLast) == nullptr)
- pLast->SwClientNotifyCall(*this, sw::LegacyModifyHint(&aMsgHint, &aMsgHint));
- }
- {
- SwIterator<SwContentFrame,SwGrfNode> aIter(*this);
- for(SwContentFrame* pLast = aIter.First(); pLast; pLast = aIter.Next())
- pLast->SwClientNotifyCall(*this, sw::LegacyModifyHint(&aMsgHint, &aMsgHint));
- }
- UnlockModify();
+ CallSwClientNotify(sw::PreGraphicArrivedHint());
+ CallSwClientNotify(sw::PostGraphicArrivedHint());
}
const Graphic& SwGrfNode::GetGrf(bool bWait) const
diff --git a/sw/source/core/inc/notxtfrm.hxx b/sw/source/core/inc/notxtfrm.hxx
index 9300639ad6d2..4e67a5479561 100644
--- a/sw/source/core/inc/notxtfrm.hxx
+++ b/sw/source/core/inc/notxtfrm.hxx
@@ -55,6 +55,7 @@ private:
// MM02
std::unique_ptr<sdr::contact::ViewContact> mpViewContact;
sdr::contact::ViewContact& GetViewContact() const;
+ void OnGraphicArrived();
protected:
virtual void MakeAll(vcl::RenderContext* pRenderContext) override;
diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx
index 049ef9742cc1..12e67ef4e901 100644
--- a/sw/source/core/view/viewsh.cxx
+++ b/sw/source/core/view/viewsh.cxx
@@ -2531,6 +2531,23 @@ Size SwViewShell::GetPageSize( sal_uInt16 nPageNum, bool bSkipEmptyPages ) const
return aSize;
}
+void SwViewShell::OnGraphicArrived(const SwRect& rRect)
+{
+ for(SwViewShell& rShell : GetRingContainer())
+ {
+ CurrShell aCurr(&rShell);
+ if(rShell.IsPreview())
+ {
+ if(rShell.GetWin())
+ ::RepaintPagePreview(&rShell, rRect);
+ }
+ else if(rShell.VisArea().IsOver(rRect) && OUTDEV_WINDOW == rShell.GetOut()->GetOutDevType())
+ {
+ // invalidate instead of painting
+ rShell.GetWin()->Invalidate(rRect.SVRect());
+ }
+ }
+}
// #i12836# enhanced pdf export
sal_Int32 SwViewShell::GetPageNumAndSetOffsetForPDF( OutputDevice& rOut, const SwRect& rRect ) const
{
More information about the Libreoffice-commits
mailing list