officecfg/registry/schema/org/openoffice/Office/Writer.xcs |    7 +++
 sw/source/uibase/inc/navicfg.hxx                           |   12 ++++++
 sw/source/uibase/utlui/content.cxx                         |   23 +++++++++++--
 sw/source/uibase/utlui/navicfg.cxx                         |    5 ++
 4 files changed, 43 insertions(+), 4 deletions(-)

New commits:
commit bb0a2be91930fbae07657f214b53117b9e8cc204
Author:     Jim Raykowski <[email protected]>
AuthorDate: Fri Nov 24 00:40:30 2023 -0900
Commit:     Jim Raykowski <[email protected]>
CommitDate: Wed Dec 13 07:23:38 2023 +0100

    tdf#158276 tdf#86395 Make alphabetical sort setting persist
    
    by using a bitwise storage approach inspired by the ActiveBlock
    setting where each content type corresponds to one bit position of
    the stored integer, e.g., bookmarks content type corresponds to bit
    5.
    
    Change-Id: I50de26e44a8d2afb917f3a651eef9a8f704b751f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159916
    Tested-by: Jenkins
    Reviewed-by: Jim Raykowski <[email protected]>

diff --git a/officecfg/registry/schema/org/openoffice/Office/Writer.xcs 
b/officecfg/registry/schema/org/openoffice/Office/Writer.xcs
index 61054ae8eca9..2bd5995a1e5d 100644
--- a/officecfg/registry/schema/org/openoffice/Office/Writer.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/Writer.xcs
@@ -5197,6 +5197,13 @@
         </info>
         <value>false</value>
       </prop>
+      <prop oor:name="SortAlphabeticallyBlock" oor:type="xs:int" 
oor:nillable="false">
+        <!-- UIHints: Navigator -->
+        <info>
+          <desc>Specifies whether the contents of a content type are 
alphabetically sorted in the Navigator list box. Each content type corresponds 
to one bit position of the stored int. A bit with value 1 indicates 
alphabetical sorting for the corresponding content type.</desc>
+        </info>
+        <value>0</value>
+      </prop>
     </group>
     <group oor:name="Envelope">
       <info>
diff --git a/sw/source/uibase/inc/navicfg.hxx b/sw/source/uibase/inc/navicfg.hxx
index ad4bb10afb70..b39614f9f63f 100644
--- a/sw/source/uibase/inc/navicfg.hxx
+++ b/sw/source/uibase/inc/navicfg.hxx
@@ -37,6 +37,8 @@ class SwNavigationConfig final : public utl::ConfigItem
 
     o3tl::enumarray<ContentTypeId, bool> mContentTypeTrack;
 
+    sal_Int32 m_nSortAlphabeticallyBlock = 0; // persists content type 
alphabetical sort setting
+
     static css::uno::Sequence<OUString> GetPropertyNames();
 
     virtual void ImplCommit() override;
@@ -125,6 +127,16 @@ public:
     }
 
     bool    IsNavigateOnSelect() const {return m_bIsNavigateOnSelect;}
+
+    sal_Int32 GetSortAlphabeticallyBlock() const {return 
m_nSortAlphabeticallyBlock;}
+    void SetSortAlphabeticallyBlock(sal_Int32 nSet)
+    {
+        if(m_nSortAlphabeticallyBlock != nSet)
+        {
+            SetModified();
+            m_nSortAlphabeticallyBlock = nSet;
+        }
+    }
 };
 
 #endif
diff --git a/sw/source/uibase/utlui/content.cxx 
b/sw/source/uibase/utlui/content.cxx
index 8d46ef52303a..72fd76cbe1ce 100644
--- a/sw/source/uibase/utlui/content.cxx
+++ b/sw/source/uibase/utlui/content.cxx
@@ -431,6 +431,13 @@ SwContentType::SwContentType(SwWrtShell* pShell, 
ContentTypeId nType, sal_uInt8
         break;
         default: break;
     }
+
+    const int nShift = static_cast<int>(m_nContentType);
+    assert(nShift > -1);
+    const sal_Int32 nMask = 1 << nShift;
+    const sal_Int32 nBlock = 
SW_MOD()->GetNavigationConfig()->GetSortAlphabeticallyBlock();
+    m_bAlphabeticSort = nBlock & nMask;
+
     FillMemberList();
 }
 
@@ -1739,10 +1746,12 @@ IMPL_LINK(SwContentTree, CommandHdl, const 
CommandEvent&, rCEvt, bool)
         const ContentTypeId nContentType = pType->GetType();
 
         if (nContentType != ContentTypeId::FOOTNOTE && nContentType != 
ContentTypeId::ENDNOTE
-            && nContentType != ContentTypeId::POSTIT)
+            && nContentType != ContentTypeId::POSTIT && nContentType != 
ContentTypeId::UNKNOWN)
         {
             bRemoveSortEntry = false;
-            xPop->set_active("sort", pType->IsAlphabeticSort());
+            const sal_Int32 nMask = 1 << static_cast<int>(nContentType);
+            sal_uInt64 nSortAlphabeticallyBlock = 
m_pConfig->GetSortAlphabeticallyBlock();
+            xPop->set_active("sort", nSortAlphabeticallyBlock & nMask);
         }
 
         OUString aIdent;
@@ -4960,7 +4969,15 @@ void SwContentTree::ExecuteContextMenuAction(const 
OUString& rSelectedPopupEntry
             pCntType = weld::fromId<SwContentType*>(rId);
         else
             pCntType = 
const_cast<SwContentType*>(weld::fromId<SwContent*>(rId)->GetParent());
-        pCntType->SetAlphabeticSort(!pCntType->IsAlphabeticSort());
+
+        // toggle and persist alphabetical sort setting
+        const int nShift = static_cast<int>(pCntType->GetType());
+        assert(nShift > -1);
+        const sal_Int32 nMask = 1 << nShift;
+        const sal_Int32 nBlock = m_pConfig->GetSortAlphabeticallyBlock();
+        pCntType->SetAlphabeticSort(~nBlock & nMask);
+        m_pConfig->SetSortAlphabeticallyBlock(nBlock ^ nMask);
+
         pCntType->FillMemberList();
         Display(true);
         return;
diff --git a/sw/source/uibase/utlui/navicfg.cxx 
b/sw/source/uibase/utlui/navicfg.cxx
index 0170a8f68a97..dfda8827292f 100644
--- a/sw/source/uibase/utlui/navicfg.cxx
+++ b/sw/source/uibase/utlui/navicfg.cxx
@@ -74,7 +74,8 @@ Sequence<OUString> SwNavigationConfig::GetPropertyNames()
         OUString("FieldTracking"),
         OUString("FootnoteTracking"),
         OUString("EndnoteTracking"),
-        OUString("NavigateOnSelect")};
+        OUString("NavigateOnSelect"),
+        OUString("SortAlphabeticallyBlock")};
 }
 
 SwNavigationConfig::SwNavigationConfig() :
@@ -146,6 +147,7 @@ void SwNavigationConfig::Load()
                     break;
                 }
                 case 22: m_bIsNavigateOnSelect = 
*o3tl::doAccess<bool>(pValues[nProp]); break;
+                case 23: pValues[nProp] >>= m_nSortAlphabeticallyBlock; break;
             }
         }
     }
@@ -180,6 +182,7 @@ void SwNavigationConfig::ImplCommit()
                 break;
             }
             case 22: pValues[nProp] <<= m_bIsNavigateOnSelect; break;
+            case 23: pValues[nProp] <<= m_nSortAlphabeticallyBlock; break;
         }
     }
     PutProperties(aNames, aValues);

Reply via email to