summaryrefslogtreecommitdiff
path: root/sw/inc/txatbase.hxx
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2019-05-28 11:06:23 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2019-05-28 16:41:26 +0200
commit7ac940d278f9bb3fbb1988a74dfa4909960bd998 (patch)
tree68228a3de97842d00d67217b1e7736a6db94f355 /sw/inc/txatbase.hxx
parent7376a47680b65cbdfd747a736f288e06f51f7f2d (diff)
tdf#125372 writer, file with lots of hints very slow to open, part3
There were O(n^2) issues all over the places where we walk these lists. This takes the opening time from 10m+ to 4m. (*) Invalidate the sorting on a much less aggressive basis, by having the SwTextAttr objects tell the SwpHints object when start and end pos changes (*) Add a bool field to indicate when the maps become unsorted, so we can resort them only when we actually need sorted access (*) Add an API for walking the list of SwTextAttr* without triggering sorting, which is particularly important when the RedlineManager starts moving things around. (*) Add various asserts to catch code that tries to iterate over these sorted lists but triggers resorting during the loop. I also moved some of the logic around so that instead of update hint delete hint insert hint it now goes delete hint update hint insert hint which means that the needToSort flag does not get set because the hint is disconnected while it is being updated. Change-Id: Ie153ddafc9ef9e3470d588db2be2457c676232a8 Reviewed-on: https://gerrit.libreoffice.org/73090 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'sw/inc/txatbase.hxx')
-rw-r--r--sw/inc/txatbase.hxx18
1 files changed, 12 insertions, 6 deletions
diff --git a/sw/inc/txatbase.hxx b/sw/inc/txatbase.hxx
index 4be53ba7a408..0e2aebdb846f 100644
--- a/sw/inc/txatbase.hxx
+++ b/sw/inc/txatbase.hxx
@@ -30,11 +30,13 @@
#include "fmtftn.hxx"
#include "fchrfmt.hxx"
#include "tox.hxx"
+#include "ndhints.hxx"
class SfxItemPool;
class SAL_DLLPUBLIC_RTTI SwTextAttr
{
+friend class SwpHints;
private:
SfxPoolItem * const m_pAttr;
sal_Int32 m_nStart;
@@ -56,6 +58,8 @@ private:
SwTextAttr& operator=(SwTextAttr const&) = delete;
protected:
+ SwpHints * m_pHints = nullptr; // the SwpHints holds a pointer to this, and needs to be notified if the start/end changes
+
SwTextAttr( SfxPoolItem& rAttr, sal_Int32 nStart );
virtual ~SwTextAttr() COVERITY_NOEXCEPT_FALSE;
@@ -74,11 +78,12 @@ public:
static void Destroy( SwTextAttr * pToDestroy, SfxItemPool& rPool );
/// start position
- sal_Int32& GetStart() { return m_nStart; }
- const sal_Int32& GetStart() const { return m_nStart; }
+ void SetStart(sal_Int32 n) { m_nStart = n; if (m_pHints) m_pHints->StartPosChanged(); }
+ sal_Int32 GetStart() const { return m_nStart; }
/// end position
- virtual sal_Int32* GetEnd(); // also used to change the end position
+ virtual const sal_Int32* GetEnd() const;
+ virtual void SetEnd(sal_Int32);
inline const sal_Int32* End() const;
/// end (if available), else start
inline const sal_Int32* GetAnyEnd() const;
@@ -127,7 +132,8 @@ protected:
public:
SwTextAttrEnd( SfxPoolItem& rAttr, sal_Int32 nStart, sal_Int32 nEnd );
- virtual sal_Int32* GetEnd() override;
+ virtual const sal_Int32* GetEnd() const override;
+ virtual void SetEnd(sal_Int32) override;
};
// attribute that must not overlap others
@@ -141,13 +147,13 @@ protected:
inline const sal_Int32* SwTextAttr::End() const
{
- return const_cast<SwTextAttr * >(this)->GetEnd();
+ return GetEnd();
}
inline const sal_Int32* SwTextAttr::GetAnyEnd() const
{
const sal_Int32* pEnd = End();
- return pEnd ? pEnd : &GetStart();
+ return pEnd ? pEnd : &m_nStart;
}
inline const SfxPoolItem& SwTextAttr::GetAttr() const