sw/source/uibase/utlui/content.cxx |   40 +++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

New commits:
commit 4c0939f900b862ae8abe585617d51898a7c0caf0
Author:     Jim Raykowski <rayk...@gmail.com>
AuthorDate: Tue Apr 19 22:02:22 2022 -0800
Commit:     Jim Raykowski <rayk...@gmail.com>
CommitDate: Thu Apr 28 04:41:47 2022 +0200

    SwNavigator: Improve ordering of hyperlinks in text frames
    
    This patch improves ordering of the Navigator content tree Hyperlinks
    members that are in text frames by placing them in the order of
    document layout appearance. This is done by doing a second sort using
    the text frame anchor position. Previous to this patch only a sort
    using the node index of the node that contains the hyperlink and the
    start position of the hyperlink in the node text are used to determine
    sort order. This results in hyperlink entries being placed in document
    model order in which hyperlinks in text frames are placed before all
    hyperlink entries in the regular document nodes section. This sort is
    still always done initially with the additional anchor position sort
    only being done if needed.
    
    Change-Id: I26f1a12657748a09c2cccd54e89c75ea42ee2ffe
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133342
    Tested-by: Jenkins
    Reviewed-by: Jim Raykowski <rayk...@gmail.com>

diff --git a/sw/source/uibase/utlui/content.cxx 
b/sw/source/uibase/utlui/content.cxx
index 5f1b0c614040..44c02ffe2447 100644
--- a/sw/source/uibase/utlui/content.cxx
+++ b/sw/source/uibase/utlui/content.cxx
@@ -804,9 +804,25 @@ void SwContentType::FillMemberList(bool* pbContentChanged)
             }
 
             // use stable sort array to list hyperlinks in document order
+            const SwNodeOffset nEndOfExtrasIndex = 
m_pWrtShell->GetNodes().GetEndOfExtras().GetIndex();
+            bool bHasEntryInFly = false;
             std::vector<SwGetINetAttr*> aStableSortINetAttrsArray;
+
             for (SwGetINetAttr& r : aArr)
+            {
                 aStableSortINetAttrsArray.emplace_back(&r);
+                if (!bHasEntryInFly)
+                {
+                    if (nEndOfExtrasIndex >= 
r.rINetAttr.GetTextNode().GetIndex())
+                    {
+                        // Not a node of BodyText
+                        // Are we in a fly?
+                        if (r.rINetAttr.GetTextNode().GetFlyFormat())
+                            bHasEntryInFly = true;
+                    }
+                }
+            }
+
             std::stable_sort(aStableSortINetAttrsArray.begin(), 
aStableSortINetAttrsArray.end(),
                              [](const SwGetINetAttr* a, const SwGetINetAttr* 
b){
                 SwPosition 
aSwPos(const_cast<SwTextNode&>(a->rINetAttr.GetTextNode()),
@@ -815,6 +831,30 @@ void SwContentType::FillMemberList(bool* pbContentChanged)
                                   b->rINetAttr.GetStart());
                 return aSwPos < bSwPos;});
 
+            // When there are hyperlinks in text frames do an additional sort 
using the text frame
+            // anchor position to place entries in the order of document 
layout appearance.
+            if (bHasEntryInFly)
+            {
+                std::stable_sort(aStableSortINetAttrsArray.begin(), 
aStableSortINetAttrsArray.end(),
+                                 [nEndOfExtrasIndex](const SwGetINetAttr* a, 
const SwGetINetAttr* b){
+                    const SwTextNode& aTextNode = a->rINetAttr.GetTextNode();
+                    const SwTextNode& bTextNode = b->rINetAttr.GetTextNode();
+                    SwPosition aPos(const_cast<SwTextNode&>(aTextNode), 
a->rINetAttr.GetStart());
+                    SwPosition bPos(const_cast<SwTextNode&>(bTextNode), 
b->rINetAttr.GetStart());
+                    // use anchor position for entries that are located in flys
+                    if (nEndOfExtrasIndex >= aTextNode.GetIndex())
+                    {
+                        if (auto pFlyFormat = aTextNode.GetFlyFormat())
+                            aPos = *pFlyFormat->GetAnchor().GetContentAnchor();
+                    }
+                    if (nEndOfExtrasIndex >= bTextNode.GetIndex())
+                    {
+                        if (auto pFlyFormat = bTextNode.GetFlyFormat())
+                            bPos = *pFlyFormat->GetAnchor().GetContentAnchor();
+                    }
+                    return aPos < bPos;});
+            }
+
             SwGetINetAttrs::size_type n = 0;
             for (auto p : aStableSortINetAttrsArray)
             {

Reply via email to