[Libreoffice-commits] core.git: Branch 'private/swe/libreoffice-5-2+backports' - sw/inc sw/source
Jan-Marek Glogowski
glogow at fbihome.de
Wed Dec 13 01:08:03 UTC 2017
sw/inc/frmfmt.hxx | 6 ++++++
sw/source/core/doc/DocumentLayoutManager.cxx | 4 ++++
sw/source/core/doc/textboxhelper.cxx | 13 +++++++++++++
sw/source/core/layout/atrfrm.cxx | 27 +++++++++++++++++++++++++--
4 files changed, 48 insertions(+), 2 deletions(-)
New commits:
commit 75bd6c311f518853fc31affe04fff717d741d575
Author: Jan-Marek Glogowski <glogow at fbihome.de>
Date: Fri Jul 22 17:23:40 2016 +0200
Link DRAW and FLY format for faster textbox lookup
Currently we have to rebuild the list of text boxes for every
lookup. Instead of a managed set, or a per-document list etc.,
this introduces direct pointers between the corresponding
SwDrawFramFormat and SwFlyFrameFormat of a text box.
(Manually cherry picked from commit 5bed080c77f99f22fd52ad6cf2d6274e7c1e12a8)
Change-Id: Iefba2d153d9d8b3f1185aa305e9f463a50e78f89
Reviewed-on: https://gerrit.libreoffice.org/46305
Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
Tested-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
diff --git a/sw/inc/frmfmt.hxx b/sw/inc/frmfmt.hxx
index 4291ced05f6e..c2a19706160c 100644
--- a/sw/inc/frmfmt.hxx
+++ b/sw/inc/frmfmt.hxx
@@ -41,12 +41,15 @@ class SW_DLLPUBLIC SwFrameFormat: public SwFormat
friend class SwDoc;
friend class SwPageDesc; ///< Is allowed to call protected CTor.
friend class ::sw::DocumentLayoutManager; ///< Is allowed to call protected CTor.
+ friend class SwTextBoxHelper;
css::uno::WeakReference<css::uno::XInterface> m_wXObject;
//UUUU DrawingLayer FillAttributes in a preprocessed form for primitive usage
drawinglayer::attribute::SdrAllFillAttributesHelperPtr maFillAttributes;
+ SwFrameFormat *m_pOtherTextBoxFormat;
+
protected:
SwFrameFormat(
SwAttrPool& rPool,
@@ -64,6 +67,9 @@ protected:
virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNewValue ) override;
+ SwFrameFormat* GetOtherTextBoxFormat() const { return m_pOtherTextBoxFormat; }
+ void SetOtherTextBoxFormat( SwFrameFormat *pFormat );
+
public:
virtual ~SwFrameFormat();
diff --git a/sw/source/core/doc/DocumentLayoutManager.cxx b/sw/source/core/doc/DocumentLayoutManager.cxx
index c5380df0b3de..5fc0d4cc7483 100644
--- a/sw/source/core/doc/DocumentLayoutManager.cxx
+++ b/sw/source/core/doc/DocumentLayoutManager.cxx
@@ -510,6 +510,10 @@ SwFrameFormat *DocumentLayoutManager::CopyLayoutFormat(
SwFormatContent aContent(pDestTextBox->GetContent().GetContentIdx()->GetNode().GetStartNode());
aSet.Put(aContent);
pDest->SetFormatAttr(aSet);
+
+ // Link FLY and DRAW formats, so it becomes a text box
+ pDest->SetOtherTextBoxFormat(pDestTextBox);
+ pDestTextBox->SetOtherTextBoxFormat(pDest);
}
return pDest;
diff --git a/sw/source/core/doc/textboxhelper.cxx b/sw/source/core/doc/textboxhelper.cxx
index 61402fe02c94..c75908384ebf 100644
--- a/sw/source/core/doc/textboxhelper.cxx
+++ b/sw/source/core/doc/textboxhelper.cxx
@@ -28,6 +28,7 @@
#include <sortedobjs.hxx>
#include <cntfrm.hxx>
#include <fmtsrnd.hxx>
+#include <frmfmt.hxx>
#include <editeng/unoprnms.hxx>
#include <editeng/charrotateitem.hxx>
@@ -55,6 +56,18 @@ void SwTextBoxHelper::create(SwFrameFormat* pShape)
uno::Reference<text::XTextContentAppend> xTextContentAppend(xTextDocument->getText(), uno::UNO_QUERY);
xTextContentAppend->appendTextContent(xTextFrame, uno::Sequence<beans::PropertyValue>());
+ // Link FLY and DRAW formats, so it becomes a text box (needed for syncProperty calls).
+ uno::Reference<text::XTextFrame> xRealTextFrame(xTextFrame, uno::UNO_QUERY);
+ SwXTextFrame* pTextFrame = dynamic_cast<SwXTextFrame *>(xRealTextFrame.get());
+ assert(nullptr != pTextFrame);
+ SwFrameFormat* pFormat = pTextFrame->GetFrameFormat();
+
+ assert(nullptr != dynamic_cast<SwDrawFrameFormat*>(pShape));
+ assert(nullptr != dynamic_cast<SwFlyFrameFormat*>(pFormat));
+
+ pShape->SetOtherTextBoxFormat(pFormat);
+ pFormat->SetOtherTextBoxFormat(pShape);
+
// Initialize properties.
uno::Reference<beans::XPropertySet> xPropertySet(xTextFrame, uno::UNO_QUERY);
uno::Any aEmptyBorder = uno::makeAny(table::BorderLine2());
diff --git a/sw/source/core/layout/atrfrm.cxx b/sw/source/core/layout/atrfrm.cxx
index 849af3b88ed0..4a67225681e4 100644
--- a/sw/source/core/layout/atrfrm.cxx
+++ b/sw/source/core/layout/atrfrm.cxx
@@ -2502,7 +2502,8 @@ SwFrameFormat::SwFrameFormat(
const sal_uInt16* pWhichRange)
: SwFormat(rPool, pFormatNm, (pWhichRange ? pWhichRange : aFrameFormatSetRange), pDrvdFrame, nFormatWhich),
m_wXObject(),
- maFillAttributes()
+ maFillAttributes(),
+ m_pOtherTextBoxFormat(nullptr)
{
}
@@ -2514,7 +2515,8 @@ SwFrameFormat::SwFrameFormat(
const sal_uInt16* pWhichRange)
: SwFormat(rPool, rFormatNm, (pWhichRange ? pWhichRange : aFrameFormatSetRange), pDrvdFrame, nFormatWhich),
m_wXObject(),
- maFillAttributes()
+ maFillAttributes(),
+ m_pOtherTextBoxFormat(nullptr)
{
}
@@ -2528,6 +2530,27 @@ SwFrameFormat::~SwFrameFormat()
rAnchor.GetContentAnchor()->nNode.GetNode().RemoveAnchoredFly(this);
}
}
+
+ if( nullptr != m_pOtherTextBoxFormat )
+ {
+ m_pOtherTextBoxFormat->SetOtherTextBoxFormat( nullptr );
+ m_pOtherTextBoxFormat = nullptr;
+ }
+}
+
+void SwFrameFormat::SetOtherTextBoxFormat( SwFrameFormat *pFormat )
+{
+ if( nullptr != pFormat )
+ {
+ assert( (Which() == RES_DRAWFRMFMT && pFormat->Which() == RES_FLYFRMFMT)
+ || (Which() == RES_FLYFRMFMT && pFormat->Which() == RES_DRAWFRMFMT) );
+ assert( nullptr == m_pOtherTextBoxFormat );
+ }
+ else
+ {
+ assert( nullptr != m_pOtherTextBoxFormat );
+ }
+ m_pOtherTextBoxFormat = pFormat;
}
bool SwFrameFormat::supportsFullDrawingLayerFillAttributeSet() const
More information about the Libreoffice-commits
mailing list