editeng/source/editeng/impedit.hxx | 16 +++++++--------- editeng/source/editeng/impedit2.cxx | 8 ++++---- editeng/source/editeng/impedit3.cxx | 22 +++++++++++----------- 3 files changed, 22 insertions(+), 24 deletions(-)
New commits: commit 7fb01422bf103fd3be4b3b0a08a45d7599e905e8 Author: Oliver Specht <[email protected]> AuthorDate: Wed Mar 26 11:37:59 2025 +0100 Commit: Thorsten Behrens <[email protected]> CommitDate: Fri Mar 28 00:39:24 2025 +0100 tdf#165329 Improve fix of tdf#163634 Broken loading of text boxes with relatives sizes is fixed here. Change-Id: I180850d746aa9e92d0de13b3eb594f3bb754899e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183372 Tested-by: allotropia jenkins <[email protected]> Reviewed-by: Thorsten Behrens <[email protected]> diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx index e1f2c3513df6..29cd6cc61f1f 100644 --- a/editeng/source/editeng/impedit.hxx +++ b/editeng/source/editeng/impedit.hxx @@ -250,8 +250,6 @@ private: LOKSpecialFlags meFlags; }; - - class ImpEditView : public vcl::unohelper::DragAndDropClient { friend class EditView; @@ -657,8 +655,8 @@ private: void ParaAttribsChanged( ContentNode const * pNode, bool bIgnoreUndoCheck = false ); void TextModified(); - void CalcHeight(ParaPortion& rParaPortion); - bool isInEmptyClusterAtTheEnd(ParaPortion& rParaPortion); + void CalcHeight(ParaPortion& rParaPortion, bool bIsScaling = false); + bool isInEmptyClusterAtTheEnd(ParaPortion& rParaPortion, bool bIsScaling); void InsertUndo( std::unique_ptr<EditUndo> pUndo, bool bTryMerge = false ); void ResetUndoManager(); @@ -689,12 +687,12 @@ private: void Clear(); EditPaM RemoveText(); - bool createLinesForEmptyParagraph(ParaPortion& rParaPortion); - tools::Long calculateMaxLineWidth(tools::Long nStartX, SvxLRSpaceItem const& rLRItem); - bool CreateLines(sal_Int32 nPara, sal_uInt32 nStartPosY); + bool createLinesForEmptyParagraph(ParaPortion& rParaPortion, bool bIsScaling = false); + tools::Long calculateMaxLineWidth(tools::Long nStartX, SvxLRSpaceItem const& rLRItem ); + bool CreateLines(sal_Int32 nPara, sal_uInt32 nStartPosY, bool bIsScaling = false); void CreateAndInsertEmptyLine(ParaPortion& rParaPortion); - bool FinishCreateLines(ParaPortion& rParaPortion); + bool FinishCreateLines(ParaPortion& rParaPortion, bool bIsScaling = false); void CreateTextPortions(ParaPortion& rParaPortion, sal_Int32& rStartPos); void RecalcTextPortion(ParaPortion& rParaPortion, sal_Int32 nStartPos, sal_Int32 nNewChars); sal_Int32 SplitTextPortion(ParaPortion& rParaPortion, sal_Int32 nPos, EditLine* pCurLine = nullptr); @@ -980,7 +978,7 @@ public: void SetMinColumnWrapHeight(tools::Long nVal) { mnMinColumnWrapHeight = nVal; } - tools::Long FormatParagraphs(o3tl::sorted_vector<sal_Int32>& rRepaintParagraphs); + tools::Long FormatParagraphs(o3tl::sorted_vector<sal_Int32>& rRepaintParagraphs, bool bIsScaling); void ScaleContentToFitWindow(o3tl::sorted_vector<sal_Int32>& rRepaintParagraphs); void FormatDoc(); void FormatFullDoc(); diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx index d05648aa732d..c71d9bd3b2bc 100644 --- a/editeng/source/editeng/impedit2.cxx +++ b/editeng/source/editeng/impedit2.cxx @@ -4389,7 +4389,7 @@ tools::Long ImpEditEngine::GetXPos(ParaPortion const& rParaPortion, EditLine con } /** Is true if paragraph is in the empty cluster of paragraphs at the end */ -bool ImpEditEngine::isInEmptyClusterAtTheEnd(ParaPortion& rPortion) +bool ImpEditEngine::isInEmptyClusterAtTheEnd(ParaPortion& rPortion, bool bIsScaling) { sal_Int32 nPortion = GetParaPortions().GetPos(&rPortion); @@ -4404,7 +4404,7 @@ bool ImpEditEngine::isInEmptyClusterAtTheEnd(ParaPortion& rPortion) if (nCurrent == nPortion) { OutlinerEditEng* pOutlEditEng{ dynamic_cast<OutlinerEditEng*>(mpEditEngine)}; - if (pOutlEditEng) + if (!bIsScaling && pOutlEditEng) return pOutlEditEng->GetDepth(nCurrent) < 0; else return true; @@ -4414,12 +4414,12 @@ bool ImpEditEngine::isInEmptyClusterAtTheEnd(ParaPortion& rPortion) return false; } -void ImpEditEngine::CalcHeight(ParaPortion& rPortion) +void ImpEditEngine::CalcHeight(ParaPortion& rPortion, bool bIsScaling) { rPortion.mnHeight = 0; rPortion.mnFirstLineOffset = 0; - if (!rPortion.IsVisible() || isInEmptyClusterAtTheEnd(rPortion)) + if (!rPortion.IsVisible() || isInEmptyClusterAtTheEnd(rPortion, bIsScaling)) return; OSL_ENSURE(rPortion.GetLines().Count(), "Paragraph with no lines in ParaPortion::CalcHeight"); diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx index cd5360bf997e..ebd8603df767 100644 --- a/editeng/source/editeng/impedit3.cxx +++ b/editeng/source/editeng/impedit3.cxx @@ -398,7 +398,7 @@ void ImpEditEngine::FormatFullDoc() FormatDoc(); } -tools::Long ImpEditEngine::FormatParagraphs(o3tl::sorted_vector<sal_Int32>& aRepaintParagraphList) +tools::Long ImpEditEngine::FormatParagraphs(o3tl::sorted_vector<sal_Int32>& aRepaintParagraphList, bool bIsScaling) { sal_Int32 nParaCount = GetParaPortions().Count(); tools::Long nY = 0; @@ -410,7 +410,7 @@ tools::Long ImpEditEngine::FormatParagraphs(o3tl::sorted_vector<sal_Int32>& aRep if (rParaPortion.MustRepaint() || (rParaPortion.IsInvalid() && rParaPortion.IsVisible())) { // No formatting should be necessary for MustRepaint()! - if (CreateLines(nParagraph, nY)) + if (CreateLines(nParagraph, nY, bIsScaling)) { if (!bGrow && GetTextRanger()) { @@ -469,7 +469,7 @@ void ImpEditEngine::ScaleContentToFitWindow(o3tl::sorted_vector<sal_Int32>& aRep if (!maCustomScalingParameters.areValuesDefault()) maScalingParameters = maCustomScalingParameters; - tools::Long nHeight = FormatParagraphs(aRepaintParagraphList); + tools::Long nHeight = FormatParagraphs(aRepaintParagraphList, true); bool bOverflow = nHeight > (maMaxAutoPaperSize.Height() * mnColumns); size_t nCurrentScaleLevel = 0; @@ -488,7 +488,7 @@ void ImpEditEngine::ScaleContentToFitWindow(o3tl::sorted_vector<sal_Int32>& aRep maScalingParameters = constScaleLevels[nCurrentScaleLevel]; // Try again with different scaling factor - nHeight = FormatParagraphs(aRepaintParagraphList); + nHeight = FormatParagraphs(aRepaintParagraphList, true); bOverflow = nHeight > (maMaxAutoPaperSize.Height() * mnColumns); // Increase scale level @@ -514,7 +514,7 @@ void ImpEditEngine::FormatDoc() if (maStatus.DoStretch()) ScaleContentToFitWindow(aRepaintParagraphList); else - FormatParagraphs(aRepaintParagraphList); + FormatParagraphs(aRepaintParagraphList, false); maInvalidRect = tools::Rectangle(); // make empty @@ -667,7 +667,7 @@ tools::Long ImpEditEngine::GetColumnWidth(const Size& rPaperSize) const return (nWidth - mnColumnSpacing * (mnColumns - 1)) / mnColumns; } -bool ImpEditEngine::createLinesForEmptyParagraph(ParaPortion& rParaPortion) +bool ImpEditEngine::createLinesForEmptyParagraph(ParaPortion& rParaPortion, bool bIsScaling) { // fast special treatment... if (rParaPortion.GetTextPortions().Count()) @@ -676,7 +676,7 @@ bool ImpEditEngine::createLinesForEmptyParagraph(ParaPortion& rParaPortion) rParaPortion.GetLines().Reset(); CreateAndInsertEmptyLine(rParaPortion); - return FinishCreateLines(rParaPortion); + return FinishCreateLines(rParaPortion, bIsScaling); } tools::Long ImpEditEngine::calculateMaxLineWidth(tools::Long nStartX, SvxLRSpaceItem const& rLRItem) @@ -699,7 +699,7 @@ tools::Long ImpEditEngine::calculateMaxLineWidth(tools::Long nStartX, SvxLRSpace return nMaxLineWidth; } -bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) +bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY, bool bIsScaling ) { assert(GetParaPortions().exists(nPara) && "Portion paragraph index is not valid"); ParaPortion& rParaPortion = GetParaPortions().getRef(nPara); @@ -716,7 +716,7 @@ bool ImpEditEngine::CreateLines( sal_Int32 nPara, sal_uInt32 nStartPosY ) // Fast special treatment for empty paragraphs... bool bEmptyParagraph = rParaPortion.GetNode()->Len() == 0 && !GetTextRanger(); if (bEmptyParagraph) - return createLinesForEmptyParagraph(rParaPortion); + return createLinesForEmptyParagraph(rParaPortion, bIsScaling); sal_Int64 nCurrentPosY = nStartPosY; // If we're allowed to skip parts outside and this cannot possibly fit in the given height, @@ -1997,12 +1997,12 @@ void ImpEditEngine::CreateAndInsertEmptyLine(ParaPortion& rParaPortion) } } -bool ImpEditEngine::FinishCreateLines(ParaPortion& rParaPortion) +bool ImpEditEngine::FinishCreateLines(ParaPortion& rParaPortion, bool bIsScaling) { // CalcCharPositions( pParaPortion ); rParaPortion.SetValid(); tools::Long nOldHeight = rParaPortion.GetHeight(); - CalcHeight(rParaPortion); + CalcHeight(rParaPortion, bIsScaling); DBG_ASSERT(rParaPortion.GetTextPortions().Count(), "FinishCreateLines: No Text-Portion?"); bool bRet = rParaPortion.GetHeight() != nOldHeight;
