sw/source/uibase/utlui/content.cxx |   95 +++++++++----------------------------
 1 file changed, 25 insertions(+), 70 deletions(-)

New commits:
commit fb307b3ac5962a1550219671df8ff1493d3c7cd1
Author:     Jim Raykowski <rayk...@gmail.com>
AuthorDate: Sat Jan 29 17:23:17 2022 -0900
Commit:     Jim Raykowski <rayk...@gmail.com>
CommitDate: Thu Feb 10 08:08:02 2022 +0100

    SwNavigator: rework entry reselection in Display function
    
    Eliminates duplicate code for entry reselection in the
    SwContentTree::Display function. Behavior change: Pre-patch, when there
    is no selected entry the first entry is selected. With this patch, no
    entry is reselected in this case.
    
    Change-Id: Ief54961c27336f6b46cc0b2bb8dd76dd2c5890ff
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129188
    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 67c5bfd4e24c..b93c5a005132 100644
--- a/sw/source/uibase/utlui/content.cxx
+++ b/sw/source/uibase/utlui/content.cxx
@@ -2209,7 +2209,7 @@ void SwContentTree::Display( bool bActive )
     if (pShell)
     {
         std::unique_ptr<weld::TreeIter> xEntry = m_xTreeView->make_iterator();
-        std::unique_ptr<weld::TreeIter> xSelEntry;
+        std::unique_ptr<weld::TreeIter> xCntTypeEntry;
         std::vector<std::unique_ptr<weld::TreeIter>> aNodesToExpand;
         // all content navigation view
         if(m_nRootType == ContentTypeId::UNKNOWN)
@@ -2233,7 +2233,8 @@ void SwContentTree::Display( bool bActive )
                 m_xTreeView->set_sensitive(*xEntry, bChOnDemand);
 
                 if (nCntType == m_nLastSelType)
-                    xSelEntry = m_xTreeView->make_iterator(xEntry.get());
+                    xCntTypeEntry = m_xTreeView->make_iterator(xEntry.get());
+
                 sal_Int32 nExpandOptions = (State::HIDDEN == m_eState)
                                             ? m_nHiddenBlock
                                             : m_nActiveBlock;
@@ -2250,57 +2251,6 @@ void SwContentTree::Display( bool bActive )
             // restore visual expanded tree state
             for (const auto& rNode : aNodesToExpand)
                 m_xTreeView->expand_row(*rNode);
-
-            // reselect the old selected entry if it is available, else select 
the entry that is at
-            // the position of the old selected entry
-            if (xOldSelEntry)
-            {
-                (void)m_xTreeView->get_iter_first(*xEntry);
-                for (ContentTypeId nCntType : o3tl::enumrange<ContentTypeId>())
-                {
-                    if (nCntType == m_nLastSelType)
-                    {
-                        // nEntryRelPos == 0 means the old selected entry was 
a content type
-                        if (nEntryRelPos)
-                        {
-                            std::unique_ptr<weld::TreeIter> 
xIter(m_xTreeView->make_iterator(xEntry.get()));
-                            std::unique_ptr<weld::TreeIter> 
xTemp(m_xTreeView->make_iterator(xIter.get()));
-                            sal_uLong nPos = 1;
-                            while (m_xTreeView->iter_next(*xIter) &&
-                                   lcl_IsContent(*xIter, *m_xTreeView))
-                            {
-                                if (m_xTreeView->get_id(*xIter) == 
sOldSelEntryId ||
-                                        nPos == nEntryRelPos)
-                                {
-                                    m_xTreeView->copy_iterator(*xIter, 
*xSelEntry);
-                                    break;
-                                }
-                                xTemp = 
m_xTreeView->make_iterator(xIter.get()); // note previous entry
-                                nPos++;
-                            }
-                            if (!xSelEntry || lcl_IsContentType(*xSelEntry, 
*m_xTreeView))
-                                xSelEntry = std::move(xTemp);
-                        }
-                        else
-                            m_xTreeView->copy_iterator(*xEntry, *xSelEntry);
-                        break;
-                    }
-                    (void)m_xTreeView->iter_next_sibling(*xEntry);
-                }
-            }
-            // select the first entry in the tree when there is no selected 
entry
-            if (!xSelEntry)
-            {
-                nOldScrollPos = 0;
-                xSelEntry = m_xTreeView->make_iterator();
-                if (!m_xTreeView->get_iter_first(*xSelEntry))
-                    xSelEntry.reset();
-            }
-            if (xSelEntry)
-            {
-                m_xTreeView->set_cursor(*xSelEntry);
-                Select();
-            }
         }
         // root content navigation view
         else
@@ -2318,6 +2268,8 @@ void SwContentTree::Display( bool bActive )
             insert(nullptr, rpRootContentT->GetName(), sId, bChOnDemand, 
xEntry.get());
             m_xTreeView->set_image(*xEntry, aImage);
 
+            xCntTypeEntry = m_xTreeView->make_iterator(xEntry.get());
+
             if (!bChOnDemand)
             {
                 bool bRegion = rpRootContentT->GetType() == 
ContentTypeId::REGION;
@@ -2358,34 +2310,36 @@ void SwContentTree::Display( bool bActive )
             }
             else
                 m_xTreeView->expand_row(*xEntry);
+        }
 
-            // reselect the old selected entry if it is available, else select 
the entry that is at
-            // the position of the old selected entry
+        // Reselect the old selected entry. If it is not available, select the 
entry at the old
+        // selected entry position unless that entry position is now a content 
type or is past the
+        // end of the member list then select the entry at the previous entry 
position.
+        if (xOldSelEntry)
+        {
+            std::unique_ptr<weld::TreeIter> xSelEntry = 
m_xTreeView->make_iterator(xCntTypeEntry.get());
             if (nEntryRelPos)
             {
-                std::unique_ptr<weld::TreeIter> 
xChild(m_xTreeView->make_iterator(xEntry.get()));
+                std::unique_ptr<weld::TreeIter> 
xIter(m_xTreeView->make_iterator(xCntTypeEntry.get()));
+                std::unique_ptr<weld::TreeIter> 
xTemp(m_xTreeView->make_iterator(xIter.get()));
                 sal_uLong nPos = 1;
-                while (m_xTreeView->iter_next(*xChild))
+                bool bNext;
+                while ((bNext = m_xTreeView->iter_next(*xIter) && 
lcl_IsContent(*xIter, *m_xTreeView)))
                 {
-                    if (m_xTreeView->get_id(*xChild) == sOldSelEntryId || nPos 
== nEntryRelPos)
+                    if (m_xTreeView->get_id(*xIter) == sOldSelEntryId || nPos 
== nEntryRelPos)
                     {
-                        xSelEntry = std::move(xChild);
+                        m_xTreeView->copy_iterator(*xIter, *xSelEntry);
                         break;
                     }
+                    m_xTreeView->copy_iterator(*xIter, *xTemp); // note 
previous entry
                     nPos++;
                 }
-                if (xSelEntry)
-                {
-                    // set_cursor unselects all entries, makes passed entry 
visible, and selects it
-                    m_xTreeView->set_cursor(*xSelEntry);
-                    Select();
-                }
-            }
-            else
-            {
-                m_xTreeView->set_cursor(*xEntry);
-                Select();
+                if (!bNext)
+                    xSelEntry = std::move(xTemp);
             }
+            // set_cursor unselects all entries, makes passed entry visible, 
and selects it
+            m_xTreeView->set_cursor(*xSelEntry);
+            Select();
         }
     }
 
@@ -3773,6 +3727,7 @@ void SwContentTree::UpdateTracking()
         if (m_xTreeView->count_selected_rows() > 0)
         {
             m_xTreeView->unselect_all();
+            m_xTreeView->set_cursor(-1);
             Select();
         }
     }

Reply via email to