starmath/inc/cfgitem.hxx    |   19 +++-
 starmath/source/cfgitem.cxx |  204 +++++++++++++++++++++++++++++++++-----------
 2 files changed, 174 insertions(+), 49 deletions(-)

New commits:
commit a5808c6446f6de536c44cf5bfba6566ad398fb8c
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Tue Nov 30 10:05:57 2021 +0200
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Tue Nov 30 12:03:53 2021 +0100

    tdf#132145: Synchronize SmMathConfig with configuration
    
    Change-Id: I690aa2f47afcd45eda3fb74ecead970b9e1513c1
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/126095
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/starmath/inc/cfgitem.hxx b/starmath/inc/cfgitem.hxx
index 6342d740c35c..16c65fd7f58f 100644
--- a/starmath/inc/cfgitem.hxx
+++ b/starmath/inc/cfgitem.hxx
@@ -103,6 +103,7 @@ class SmMathConfig final : public utl::ConfigItem, public 
SfxBroadcaster
     bool bIsOtherModified;
     bool bIsFormatModified;
     SmFontPickList vFontPickList[7];
+    sal_Int32 m_nCommitLock = 0;
 
     SmMathConfig(const SmMathConfig&) = delete;
     SmMathConfig& operator=(const SmMathConfig&) = delete;
@@ -116,7 +117,7 @@ class SmMathConfig final : public utl::ConfigItem, public 
SfxBroadcaster
     void ReadFontFormat(SmFontFormat& rFontFormat, std::u16string_view 
rSymbolName,
                         std::u16string_view rBaseNode) const;
 
-    void SetOtherIfNotEqual(bool& rbItem, bool bNewVal);
+    bool SetOtherIfNotEqual(bool& rbItem, bool bNewVal);
 
     void LoadOther();
     void SaveOther();
@@ -137,6 +138,22 @@ class SmMathConfig final : public utl::ConfigItem, public 
SfxBroadcaster
     }
 
     virtual void ImplCommit() override;
+    void LockCommit() { ++m_nCommitLock; }
+    void UnlockCommit();
+    // Used to avoid tens of atomic commits in e.g. ItemSetToConfig that calls 
individual setters
+    friend struct CommitLocker;
+    struct CommitLocker
+    {
+        SmMathConfig& m_rConfig;
+        CommitLocker(SmMathConfig& rConfig)
+            : m_rConfig(rConfig)
+        {
+            m_rConfig.LockCommit();
+        }
+        ~CommitLocker() { m_rConfig.UnlockCommit(); }
+    };
+
+    void Clear();
 
 public:
     SmMathConfig();
diff --git a/starmath/source/cfgitem.cxx b/starmath/source/cfgitem.cxx
index 233b5fb7f351..efa994e2fa8a 100644
--- a/starmath/source/cfgitem.cxx
+++ b/starmath/source/cfgitem.cxx
@@ -32,7 +32,6 @@
 
 #include <com/sun/star/beans/PropertyValue.hpp>
 
-#include <officecfg/Office/Math.hxx>
 #include <cfgitem.hxx>
 
 #include <starmath.hrc>
@@ -68,6 +67,23 @@ static Sequence< OUString > lcl_GetSymbolPropertyNames()
                     };
 }
 
+static Sequence<OUString> lcl_GetOtherPropertyNames()
+{
+    return Sequence<OUString>{ "LoadSave/IsSaveOnlyUsedSymbols",
+                               "Misc/AutoCloseBrackets",
+                               "Misc/DefaultSmSyntaxVersion",
+                               "Misc/IgnoreSpacesRight",
+                               "Misc/SmEditWindowZoomFactor",
+                               "Print/FormulaText",
+                               "Print/Frame",
+                               "Print/Size:",
+                               "Print/Title",
+                               "Print/ZoomFactor",
+                               "View/AutoRedraw",
+                               "View/FormulaCursor",
+                               "View/ToolboxVisible" };
+}
+
 static Sequence< OUString > lcl_GetFormatPropertyNames()
 {
     //! Beware of order according to *_BEGIN *_END defines in format.hxx !
@@ -343,6 +359,7 @@ SmMathConfig::SmMathConfig() :
     , bIsOtherModified(false)
     , bIsFormatModified(false)
 {
+    EnableNotification({ {} }); // Listen to everything under the node
 }
 
 
@@ -470,6 +487,22 @@ void SmMathConfig::Save()
 }
 
 
+void SmMathConfig::UnlockCommit()
+{
+    if (--m_nCommitLock == 0)
+        Commit();
+}
+
+
+void SmMathConfig::Clear()
+{
+    // Re-read data on next request
+    pOther.reset();
+    pFormat.reset();
+    pFontFormatList.reset();
+}
+
+
 void SmMathConfig::GetSymbols( std::vector< SmSym > &rSymbols ) const
 {
     Sequence< OUString > 
aNodes(const_cast<SmMathConfig*>(this)->GetNodeNames(SYMBOL_LIST));
@@ -486,6 +519,7 @@ void SmMathConfig::GetSymbols( std::vector< SmSym > 
&rSymbols ) const
 
 void SmMathConfig::SetSymbols( const std::vector< SmSym > &rNewSymbols )
 {
+    CommitLocker aLock(*this);
     auto nCount = sal::static_int_cast<sal_Int32>(rNewSymbols.size());
 
     Sequence< OUString > aNames = lcl_GetSymbolPropertyNames();
@@ -537,7 +571,6 @@ void SmMathConfig::SetSymbols( const std::vector< SmSym > 
&rNewSymbols )
     ReplaceSetProperties( SYMBOL_LIST, aValues );
 
     StripFontFormatList( rNewSymbols );
-    SaveFontFormatList();
 }
 
 
@@ -740,20 +773,68 @@ void SmMathConfig::LoadOther()
     if (!pOther)
         pOther.reset(new SmCfgOther);
 
-    pOther->bPrintTitle = officecfg::Office::Math::Print::Title::get();
-    pOther->bPrintFormulaText = 
officecfg::Office::Math::Print::FormulaText::get();
-    pOther->bPrintFrame = officecfg::Office::Math::Print::Frame::get();
-    pOther->ePrintSize = 
static_cast<SmPrintSize>(officecfg::Office::Math::Print::Size::get());
-    pOther->nSmEditWindowZoomFactor = 
officecfg::Office::Math::Misc::SmEditWindowZoomFactor::get();
-    pOther->bIsSaveOnlyUsedSymbols = 
officecfg::Office::Math::LoadSave::IsSaveOnlyUsedSymbols::get();
-    pOther->nPrintZoomFactor = 
officecfg::Office::Math::Print::ZoomFactor::get();
-    pOther->bIsSaveOnlyUsedSymbols = 
officecfg::Office::Math::LoadSave::IsSaveOnlyUsedSymbols::get();
-    pOther->bIsAutoCloseBrackets = 
officecfg::Office::Math::Misc::AutoCloseBrackets::get();
-    pOther->nSmSyntaxVersion = 
officecfg::Office::Math::Misc::DefaultSmSyntaxVersion::get();
-    pOther->bIgnoreSpacesRight = 
officecfg::Office::Math::Misc::IgnoreSpacesRight::get();
-    pOther->bToolboxVisible = 
officecfg::Office::Math::View::ToolboxVisible::get();
-    pOther->bAutoRedraw = officecfg::Office::Math::View::AutoRedraw::get();
-    pOther->bFormulaCursor = 
officecfg::Office::Math::View::FormulaCursor::get();
+    const Sequence<OUString> aNames(lcl_GetOtherPropertyNames());
+    const Sequence<Any> aValues(GetProperties(aNames));
+    if (aNames.getLength() != aValues.getLength())
+        return;
+
+    const Any* pValues = aValues.getConstArray();
+    const Any* pVal = pValues;
+
+    // LoadSave/IsSaveOnlyUsedSymbols
+    if (bool bTmp; pVal->hasValue() && (*pVal >>= bTmp))
+        pOther->bIsSaveOnlyUsedSymbols = bTmp;
+    ++pVal;
+    // Misc/AutoCloseBrackets
+    if (bool bTmp; pVal->hasValue() && (*pVal >>= bTmp))
+        pOther->bIsAutoCloseBrackets = bTmp;
+    ++pVal;
+    // Misc/DefaultSmSyntaxVersion
+    if (sal_Int16 nTmp; pVal->hasValue() && (*pVal >>= nTmp))
+        pOther->nSmSyntaxVersion = nTmp;
+    ++pVal;
+    // Misc/IgnoreSpacesRight
+    if (bool bTmp; pVal->hasValue() && (*pVal >>= bTmp))
+        pOther->bIgnoreSpacesRight = bTmp;
+    ++pVal;
+    // Misc/SmEditWindowZoomFactor
+    if (sal_Int16 nTmp; pVal->hasValue() && (*pVal >>= nTmp))
+        pOther->nSmEditWindowZoomFactor = nTmp;
+    ++pVal;
+    // Print/FormulaText
+    if (bool bTmp; pVal->hasValue() && (*pVal >>= bTmp))
+        pOther->bPrintFormulaText = bTmp;
+    ++pVal;
+    // Print/Frame
+    if (bool bTmp; pVal->hasValue() && (*pVal >>= bTmp))
+        pOther->bPrintFrame = bTmp;
+    ++pVal;
+    // Print/Size:
+    if (sal_Int16 nTmp; pVal->hasValue() && (*pVal >>= nTmp))
+        pOther->ePrintSize = static_cast<SmPrintSize>(nTmp);
+    ++pVal;
+    // Print/Title
+    if (bool bTmp; pVal->hasValue() && (*pVal >>= bTmp))
+        pOther->bPrintTitle = bTmp;
+    ++pVal;
+    // Print/ZoomFactor
+    if (sal_Int16 nTmp; pVal->hasValue() && (*pVal >>= nTmp))
+        pOther->nPrintZoomFactor = nTmp;
+    ++pVal;
+    // View/AutoRedraw
+    if (bool bTmp; pVal->hasValue() && (*pVal >>= bTmp))
+        pOther->bAutoRedraw = bTmp;
+    ++pVal;
+    // View/FormulaCursor
+    if (bool bTmp; pVal->hasValue() && (*pVal >>= bTmp))
+        pOther->bFormulaCursor = bTmp;
+    ++pVal;
+    // View/ToolboxVisible
+    if (bool bTmp; pVal->hasValue() && (*pVal >>= bTmp))
+        pOther->bToolboxVisible = bTmp;
+    ++pVal;
+
+    OSL_ENSURE(pVal - pValues == aNames.getLength(), "property mismatch");
     SetOtherModified( false );
 }
 
@@ -763,23 +844,42 @@ void SmMathConfig::SaveOther()
     if (!pOther || !IsOtherModified())
         return;
 
-    std::shared_ptr<comphelper::ConfigurationChanges> 
batch(comphelper::ConfigurationChanges::create());
-
-    officecfg::Office::Math::Print::Title::set(pOther->bPrintTitle, batch);
-    
officecfg::Office::Math::Print::FormulaText::set(pOther->bPrintFormulaText, 
batch);
-    officecfg::Office::Math::Print::Frame::set(pOther->bPrintFrame, batch);
-    officecfg::Office::Math::Print::Size::set(pOther->ePrintSize, batch);
-    officecfg::Office::Math::Print::ZoomFactor::set(pOther->nPrintZoomFactor, 
batch);
-    
officecfg::Office::Math::Misc::SmEditWindowZoomFactor::set(pOther->nSmEditWindowZoomFactor,
 batch);
-    
officecfg::Office::Math::LoadSave::IsSaveOnlyUsedSymbols::set(pOther->bIsSaveOnlyUsedSymbols,
 batch);
-    
officecfg::Office::Math::Misc::AutoCloseBrackets::set(pOther->bIsAutoCloseBrackets,
 batch);
-    
officecfg::Office::Math::Misc::DefaultSmSyntaxVersion::set(pOther->nSmSyntaxVersion,
 batch);
-    
officecfg::Office::Math::Misc::IgnoreSpacesRight::set(pOther->bIgnoreSpacesRight,
 batch);
-    
officecfg::Office::Math::View::ToolboxVisible::set(pOther->bToolboxVisible, 
batch);
-    officecfg::Office::Math::View::AutoRedraw::set(pOther->bAutoRedraw, batch);
-    officecfg::Office::Math::View::FormulaCursor::set(pOther->bFormulaCursor, 
batch);
-
-    batch->commit();
+    const Sequence<OUString> aNames(lcl_GetOtherPropertyNames());
+    Sequence<Any> aValues(aNames.getLength());
+
+    Any* pValues = aValues.getArray();
+    Any* pVal = pValues;
+
+    // LoadSave/IsSaveOnlyUsedSymbols
+    *pVal++ <<= pOther->bIsSaveOnlyUsedSymbols;
+    // Misc/AutoCloseBrackets
+    *pVal++ <<= pOther->bIsAutoCloseBrackets;
+    // Misc/DefaultSmSyntaxVersion
+    *pVal++ <<= pOther->nSmSyntaxVersion;
+    // Misc/IgnoreSpacesRight
+    *pVal++ <<= pOther->bIgnoreSpacesRight;
+    // Misc/SmEditWindowZoomFactor
+    *pVal++ <<= pOther->nSmEditWindowZoomFactor;
+    // Print/FormulaText
+    *pVal++ <<= pOther->bPrintFormulaText;
+    // Print/Frame
+    *pVal++ <<= pOther->bPrintFrame;
+    // Print/Size:
+    *pVal++ <<= static_cast<sal_Int16>(pOther->ePrintSize);
+    // Print/Title
+    *pVal++ <<= pOther->bPrintTitle;
+    // Print/ZoomFactor
+    *pVal++ <<= pOther->nPrintZoomFactor;
+    // View/AutoRedraw
+    *pVal++ <<= pOther->bAutoRedraw;
+    // View/FormulaCursor
+    *pVal++ <<= pOther->bFormulaCursor;
+    // View/ToolboxVisible
+    *pVal++ <<= pOther->bToolboxVisible;
+
+    OSL_ENSURE(pVal - pValues == aNames.getLength(), "property mismatch");
+    PutProperties(aNames, aValues);
+
     SetOtherModified( false );
 }
 
@@ -1005,16 +1105,15 @@ void SmMathConfig::SetStandardFormat( const SmFormat 
&rFormat, bool bSaveFontFor
     if (rFormat == *pFormat)
         return;
 
+    CommitLocker aLock(*this);
     *pFormat = rFormat;
     SetFormatModified( true );
-    SaveFormat();
 
     if (bSaveFontFormatList)
     {
         // needed for SmFontTypeDialog's DefaultButtonClickHdl
         if (pFontFormatList)
             pFontFormatList->SetModified( true );
-        SaveFontFormatList();
     }
 }
 
@@ -1033,6 +1132,7 @@ void SmMathConfig::SetPrintSize( SmPrintSize eSize )
         LoadOther();
     if (eSize != pOther->ePrintSize)
     {
+        CommitLocker aLock(*this);
         pOther->ePrintSize = eSize;
         SetOtherModified( true );
     }
@@ -1053,6 +1153,7 @@ void SmMathConfig::SetPrintZoomFactor( sal_uInt16 nVal )
         LoadOther();
     if (nVal != pOther->nPrintZoomFactor)
     {
+        CommitLocker aLock(*this);
         pOther->nPrintZoomFactor = nVal;
         SetOtherModified( true );
     }
@@ -1075,19 +1176,23 @@ void SmMathConfig::SetSmEditWindowZoomFactor( 
sal_uInt16 nVal )
         LoadOther();
     if (nVal != pOther->nSmEditWindowZoomFactor)
     {
+        CommitLocker aLock(*this);
         pOther->nSmEditWindowZoomFactor = nVal;
         SetOtherModified( true );
     }
 }
 
 
-void SmMathConfig::SetOtherIfNotEqual( bool &rbItem, bool bNewVal )
+bool SmMathConfig::SetOtherIfNotEqual( bool &rbItem, bool bNewVal )
 {
     if (bNewVal != rbItem)
     {
+        CommitLocker aLock(*this);
         rbItem = bNewVal;
         SetOtherModified( true );
+        return true;
     }
+    return false;
 }
 
 
@@ -1182,6 +1287,7 @@ void SmMathConfig::SetDefaultSmSyntaxVersion( sal_uInt16 
nVal )
         LoadOther();
     if (nVal != pOther->nSmSyntaxVersion)
     {
+        CommitLocker aLock(*this);
         pOther->nSmSyntaxVersion = nVal;
         SetOtherModified( true );
     }
@@ -1201,7 +1307,12 @@ void SmMathConfig::SetIgnoreSpacesRight( bool bVal )
 {
     if (!pOther)
         LoadOther();
-    SetOtherIfNotEqual( pOther->bIgnoreSpacesRight, bVal );
+    if (SetOtherIfNotEqual( pOther->bIgnoreSpacesRight, bVal ))
+    {
+        // reformat (displayed) formulas accordingly
+        Broadcast(SfxHint(SfxHintId::MathFormatChanged));
+    }
+
 }
 
 
@@ -1236,12 +1347,17 @@ void SmMathConfig::SetShowFormulaCursor( bool bVal )
     SetOtherIfNotEqual( pOther->bFormulaCursor, bVal );
 }
 
-void SmMathConfig::Notify( const css::uno::Sequence< OUString >& )
-{}
+void SmMathConfig::Notify( const css::uno::Sequence< OUString >& rNames )
+{
+    Clear();
+    if (std::find(rNames.begin(), rNames.end(), "Misc/IgnoreSpacesRight") != 
rNames.end())
+        Broadcast(SfxHint(SfxHintId::MathFormatChanged));
+}
 
 
 void SmMathConfig::ItemSetToConfig(const SfxItemSet &rSet)
 {
+    CommitLocker aLock(*this);
     const SfxPoolItem *pItem     = nullptr;
 
     sal_uInt16 nU16;
@@ -1276,13 +1392,7 @@ void SmMathConfig::ItemSetToConfig(const SfxItemSet 
&rSet)
     }
     if (rSet.GetItemState(SID_NO_RIGHT_SPACES, true, &pItem) == 
SfxItemState::SET)
     {   bVal = static_cast<const SfxBoolItem *>(pItem)->GetValue();
-        if (IsIgnoreSpacesRight() != bVal)
-        {
-            SetIgnoreSpacesRight( bVal );
-
-            // reformat (displayed) formulas accordingly
-            Broadcast(SfxHint(SfxHintId::MathFormatChanged));
-        }
+        SetIgnoreSpacesRight( bVal );
     }
     if (rSet.GetItemState(SID_SAVE_ONLY_USED_SYMBOLS, true, &pItem) == 
SfxItemState::SET)
     {   bVal = static_cast<const SfxBoolItem *>(pItem)->GetValue();
@@ -1300,8 +1410,6 @@ void SmMathConfig::ItemSetToConfig(const SfxItemSet &rSet)
         nU16 = static_cast<const SfxUInt16Item *>(pItem)->GetValue();
         SetDefaultSmSyntaxVersion( nU16 );
     }
-
-    SaveOther();
 }
 
 

Reply via email to