sw/source/core/layout/layact.cxx |   23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

New commits:
commit 9c291ea8c63284fe5c344553fcb338e66c17c797
Author:     Michael Stahl <michael.st...@allotropia.de>
AuthorDate: Tue Aug 8 17:22:50 2023 +0200
Commit:     Michael Stahl <michael.st...@allotropia.de>
CommitDate: Tue Aug 8 19:29:15 2023 +0200

    tdf#147666 sw: layout: no IsShortCut() if fly was moved to page
    
    The problem was that the fly's anchor frame was moved to page 2, and
    then IsShortCut() returns true for the anchor frame, which means only
    the anchor frame itself is formatted, but not its fly.
    
    Thus the fly remains invalid and positioned on page 1 when its rectangle
    is passed to SwViewShell::VisPortChgd(), and only later it is properly
    positioned.
    
    (regression from commit eb85de8e6b61fb3fcb6c03ae0145f7fe5478bccf)
    
    Change-Id: I9e0554bd0d9751b47a11a3917575d382139ee93a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155461
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>

diff --git a/sw/source/core/layout/layact.cxx b/sw/source/core/layout/layact.cxx
index 21496e2237e1..ecce180eb336 100644
--- a/sw/source/core/layout/layact.cxx
+++ b/sw/source/core/layout/layact.cxx
@@ -1166,21 +1166,28 @@ bool SwLayAction::IsShortCut( SwPageFrame *&prPage )
                 }
                 // no shortcut, if at previous page
                 // an anchored object is registered, whose anchor is 
<pContent>.
-                else if ( prPage->GetPrev() )
+                else
                 {
-                    SwSortedObjs* pObjs =
-                        
static_cast<SwPageFrame*>(prPage->GetPrev())->GetSortedObjs();
-                    if ( pObjs )
+                    auto const CheckFlys = [&bRet,pContent](SwPageFrame & 
rPage)
                     {
-                        for (SwAnchoredObject* pObj : *pObjs)
+                        SwSortedObjs *const pObjs(rPage.GetSortedObjs());
+                        if (pObjs)
                         {
-                            if ( pObj->GetAnchorFrameContainingAnchPos() == 
pContent )
+                            for (SwAnchoredObject *const pObj : *pObjs)
                             {
-                                bRet = false;
-                                break;
+                                if (pObj->GetAnchorFrameContainingAnchPos() == 
pContent)
+                                {
+                                    bRet = false;
+                                    break;
+                                }
                             }
                         }
+                    };
+                    if (prPage->GetPrev())
+                    {
+                        
CheckFlys(*static_cast<SwPageFrame*>(prPage->GetPrev()));
                     }
+                    CheckFlys(*prPage); // tdf#147666 also check this page
                 }
             }
         }

Reply via email to