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;

Reply via email to