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;

Reply via email to