diff options
author | Justin Luth <jluth@mail.com> | 2024-08-29 17:44:20 -0400 |
---|---|---|
committer | Justin Luth <jluth@mail.com> | 2024-09-04 14:32:46 +0200 |
commit | 309aded3145f8ecec9e9af61a3c64804258f8336 (patch) | |
tree | db75aab379e70cdffe868ec4d44ed27008e31e3f /sw | |
parent | f2d096099a220e4caa2d532a5230785cbdb91eed (diff) |
NFC prep for tdf#143899: move TextBoxIsFramePr into SwTextBoxHelper
Now that writerfilter is part of sw,
this helper function can be moved into a generic location
so it can be used elsewhere.
It will be needed for a layout exception,
where floating tables and framePr frames
are laid out differently from all other floating objects
thanks to some new Microsoft inconsistencies.
Change-Id: Ibb30a8831426b9dfd3e86ed082ecef22476fe018
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172620
Tested-by: Jenkins
Reviewed-by: Justin Luth <jluth@mail.com>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/inc/textboxhelper.hxx | 3 | ||||
-rw-r--r-- | sw/source/core/doc/textboxhelper.cxx | 26 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.cxx | 29 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.hxx | 1 |
4 files changed, 31 insertions, 28 deletions
diff --git a/sw/inc/textboxhelper.hxx b/sw/inc/textboxhelper.hxx index 4afd6fa9960c..a43777c2e519 100644 --- a/sw/inc/textboxhelper.hxx +++ b/sw/inc/textboxhelper.hxx @@ -187,6 +187,9 @@ public: // Compares the anchor of the first and second given formats, and decides whether sync needed. static bool isAnchorSyncNeeded(const SwFrameFormat* pFirst, const SwFrameFormat* pSecond); + + /// Was the textbox created from a Microsoft import by a paragraph frame property (framePr) + static bool TextBoxIsFramePr(const SwFrameFormat& rFrameFormat); }; /// Textboxes are basically textframe + shape pairs. This means one shape has one frame. diff --git a/sw/source/core/doc/textboxhelper.cxx b/sw/source/core/doc/textboxhelper.cxx index 8e10623b445d..ebb380ae6d39 100644 --- a/sw/source/core/doc/textboxhelper.cxx +++ b/sw/source/core/doc/textboxhelper.cxx @@ -1723,6 +1723,32 @@ bool SwTextBoxHelper::isAnchorSyncNeeded(const SwFrameFormat* pFirst, const SwFr return false; } +bool SwTextBoxHelper::TextBoxIsFramePr(const SwFrameFormat& rFrameFormat) +{ + SdrObject* pSdrObj = const_cast<SdrObject*>(rFrameFormat.FindRealSdrObject()); + if (!pSdrObj) + return false; + + uno::Reference<beans::XPropertySet> xPropertySet(pSdrObj->getUnoShape(), uno::UNO_QUERY); + if (!xPropertySet.is()) + return false; + + uno::Reference<beans::XPropertySetInfo> xPropSetInfo(xPropertySet->getPropertySetInfo()); + if (!xPropSetInfo.is() || !xPropSetInfo->hasPropertyByName(u"FrameInteropGrabBag"_ustr)) + return false; + + bool bRet = false; + uno::Sequence<beans::PropertyValue> propList; + xPropertySet->getPropertyValue(u"FrameInteropGrabBag"_ustr) >>= propList; + auto pProp = std::find_if( + std::cbegin(propList), std::cend(propList), + [](const beans::PropertyValue& rProp) { return rProp.Name == "ParaFrameProperties"; }); + if (pProp != std::cend(propList)) + pProp->Value >>= bRet; + + return bRet; +} + SwTextBoxNode::SwTextBoxNode(SwFrameFormat* pOwnerShape) { assert(pOwnerShape); diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 2a684a266f84..e3b2d9869b4e 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -1100,31 +1100,6 @@ void DocxAttributeOutput::PopulateFrameProperties(const SwFrameFormat* pFrameFor m_pSerializer->singleElementNS( XML_w, XML_framePr, attrList ); } -bool DocxAttributeOutput::TextBoxIsFramePr(const SwFrameFormat& rFrameFormat) -{ - SdrObject* pSdrObj = const_cast<SdrObject*>(rFrameFormat.FindRealSdrObject()); - if (!pSdrObj) - return false; - - uno::Reference<beans::XPropertySet> xPropertySet(pSdrObj->getUnoShape(), uno::UNO_QUERY); - if (!xPropertySet.is()) - return false; - - uno::Reference<beans::XPropertySetInfo> xPropSetInfo(xPropertySet->getPropertySetInfo()); - if (!xPropSetInfo.is() || !xPropSetInfo->hasPropertyByName(u"FrameInteropGrabBag"_ustr)) - return false; - - bool bRet = false; - uno::Sequence<beans::PropertyValue> propList; - xPropertySet->getPropertyValue(u"FrameInteropGrabBag"_ustr) >>= propList; - auto pProp = std::find_if(std::cbegin(propList), std::cend(propList), - [](const beans::PropertyValue& rProp) { return rProp.Name == "ParaFrameProperties"; }); - if (pProp != std::cend(propList)) - pProp->Value >>= bRet; - - return bRet; -} - void DocxAttributeOutput::EndParagraph( const ww8::WW8TableNodeInfoInner::Pointer_t& pTextNodeInfoInner ) { // write the paragraph properties + the run, already in the correct order @@ -1148,7 +1123,7 @@ void DocxAttributeOutput::EndParagraph( const ww8::WW8TableNodeInfoInner::Pointe ww8::Frame aFrame = m_aFramesOfParagraph.top()[nIndex]; const SwFrameFormat& rFrameFormat = aFrame.GetFrameFormat(); - if (!m_bWritingHeaderFooter && TextBoxIsFramePr(rFrameFormat)) + if (!m_bWritingHeaderFooter && SwTextBoxHelper::TextBoxIsFramePr(rFrameFormat)) { std::shared_ptr<ww8::Frame> pFramePr = std::make_shared<ww8::Frame>(aFrame); aFramePrTextbox.push_back(pFramePr); @@ -1666,7 +1641,7 @@ void DocxAttributeOutput::EndParagraphProperties(const SfxItemSet& rParagraphMar if (!m_bWritingHeaderFooter && m_aFramePr.Frame()) { const SwFrameFormat& rFrameFormat = m_aFramePr.Frame()->GetFrameFormat(); - assert(TextBoxIsFramePr(rFrameFormat) && "by definition, because Frame()"); + assert(SwTextBoxHelper::TextBoxIsFramePr(rFrameFormat) && "by definition, because Frame()"); const Size aSize = m_aFramePr.Frame()->GetSize(); PopulateFrameProperties(&rFrameFormat, aSize); diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx index 8fc216f973b5..1dd29a81dbe8 100644 --- a/sw/source/filter/ww8/docxattributeoutput.hxx +++ b/sw/source/filter/ww8/docxattributeoutput.hxx @@ -505,7 +505,6 @@ private: void EndTable(); void SyncNodelessCells(ww8::WW8TableNodeInfoInner::Pointer_t const & pInner, sal_Int32 nCell, sal_uInt32 nRow); void PopulateFrameProperties(const SwFrameFormat* pFrameFormat, const Size& rSize); - static bool TextBoxIsFramePr(const SwFrameFormat& rFrameFormat); /// End cell, row, and even the entire table if necessary. void FinishTableRowCell( ww8::WW8TableNodeInfoInner::Pointer_t const & pInner, bool bForceEmptyParagraph = false ); |