editeng/source/editeng/impedit.hxx | 14 ++++++-------- editeng/source/editeng/impedit2.cxx | 8 ++++---- editeng/source/editeng/impedit3.cxx | 22 +++++++++++----------- 3 files changed, 21 insertions(+), 23 deletions(-)
New commits: commit 80e7e76b25881ca500c51ee91cfba3687a49b1f6 Author: Oliver Specht <oliver.spe...@cib.de> AuthorDate: Wed Mar 26 11:37:59 2025 +0100 Commit: Gabor Kelemen <gabor.kelemen.ext...@allotropia.de> CommitDate: Thu Mar 27 22:34:15 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/+/183341 Reviewed-by: Gabor Kelemen <gabor.kelemen.ext...@allotropia.de> Tested-by: Jenkins Tested-by: Gabor Kelemen <gabor.kelemen.ext...@allotropia.de> diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx index f99e6d7cc469..d105afc6e269 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; @@ -653,8 +651,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(); @@ -685,13 +683,13 @@ private: void Clear(); EditPaM RemoveText(); - bool createLinesForEmptyParagraph(ParaPortion& rParaPortion); + bool createLinesForEmptyParagraph(ParaPortion& rParaPortion, bool bIsScaling = false); tools::Long calculateMaxLineWidth(tools::Long nStartX, SvxLRSpaceItem const& rLRItem, const SvxFontUnitMetrics& rMetrics); - bool CreateLines(sal_Int32 nPara, sal_uInt32 nStartPosY); + 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); @@ -982,7 +980,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 fee808e6bc39..df966ba85c3e 100644 --- a/editeng/source/editeng/impedit2.cxx +++ b/editeng/source/editeng/impedit2.cxx @@ -4407,7 +4407,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); @@ -4422,7 +4422,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; @@ -4432,12 +4432,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 fd214f2cc1c7..eafcab1673a1 100644 --- a/editeng/source/editeng/impedit3.cxx +++ b/editeng/source/editeng/impedit3.cxx @@ -317,7 +317,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; @@ -329,7 +329,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()) { @@ -388,7 +388,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; @@ -407,7 +407,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 @@ -439,7 +439,7 @@ void ImpEditEngine::FormatDoc() if (maStatus.DoStretch()) ScaleContentToFitWindow(aRepaintParagraphList); else - FormatParagraphs(aRepaintParagraphList); + FormatParagraphs(aRepaintParagraphList, false); maInvalidRect = tools::Rectangle(); // make empty @@ -593,7 +593,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()) @@ -602,7 +602,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, @@ -627,7 +627,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); @@ -644,7 +644,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, @@ -1936,12 +1936,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;