sc/inc/global.hxx              |   15 +++++++++++++++
 sc/source/core/data/global.cxx |   37 +++++++++++++++++++++++++++++++++++++
 sc/source/ui/app/inputhdl.cxx  |   41 ++++-------------------------------------
 sc/source/ui/inc/inputhdl.hxx  |    9 ---------
 4 files changed, 56 insertions(+), 46 deletions(-)

New commits:
commit 5a16cd1123003d6f72d84983292cf96c7fb49d60
Author:     Eike Rathke <er...@redhat.com>
AuthorDate: Mon Aug 29 21:39:19 2022 +0200
Commit:     Eike Rathke <er...@redhat.com>
CommitDate: Tue Aug 30 11:48:54 2022 +0200

    Move input handler function names to ScGlobal static
    
    ... as there is only one function list and
    InputHandlerFunctionNames can be shared instead of each
    ScInputHandler holding their own copy.
    
    Change-Id: Id82b2020f8846456ce7464daa83feb6915792aa2
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139012
    Reviewed-by: Eike Rathke <er...@redhat.com>
    Tested-by: Jenkins

diff --git a/sc/inc/global.hxx b/sc/inc/global.hxx
index 8401ca4c6f7e..3be19f89dcc1 100644
--- a/sc/inc/global.hxx
+++ b/sc/inc/global.hxx
@@ -20,6 +20,7 @@
 #pragma once
 
 #include "address.hxx"
+#include "typedstrdata.hxx"
 #include <i18nlangtag/lang.h>
 #include <svx/svdtypes.hxx>
 #include <tools/ref.hxx>
@@ -455,6 +456,17 @@ struct ScImportParam
     bool            operator==  ( const ScImportParam& r ) const;
 };
 
+// Formula data replacement character for a pair of parentheses at end of
+// function name, to force sorting parentheses before all other characters.
+// Collation may treat parentheses differently.
+constexpr sal_Unicode cParenthesesReplacement = 0x0001;
+struct InputHandlerFunctionNames
+{
+    ScTypedCaseStrSet       maFunctionData;
+    ScTypedCaseStrSet       maFunctionDataPara;
+    std::set<sal_Unicode>   maFunctionChar;
+};
+
 class ScDocShell;
 class SvxSearchItem;
 class ScAutoFormat;
@@ -523,6 +535,8 @@ class ScGlobal
 
     static std::atomic<sc::SharedStringPoolPurge*> pSharedStringPoolPurge;
 
+    static InputHandlerFunctionNames maInputHandlerFunctionNames;
+
     static void                 InitPPT();
 
 public:
@@ -595,6 +609,7 @@ public:
     static ScFunctionList*  GetStarCalcFunctionList();
     static ScFunctionMgr*   GetStarCalcFunctionMgr();
     static void             ResetFunctionList();
+    static const InputHandlerFunctionNames& GetInputHandlerFunctionNames();
 
     static OUString         GetErrorString(FormulaError nErrNumber);
     static OUString         GetLongErrorString(FormulaError nErrNumber);
diff --git a/sc/source/core/data/global.cxx b/sc/source/core/data/global.cxx
index 46277a807db0..58b3a1e70281 100644
--- a/sc/source/core/data/global.cxx
+++ b/sc/source/core/data/global.cxx
@@ -119,6 +119,9 @@ sal_uInt16 nScFillModeMouseModifier = 0; //FIXME: And this
 
 bool ScGlobal::bThreadedGroupCalcInProgress = false;
 
+InputHandlerFunctionNames ScGlobal::maInputHandlerFunctionNames;
+
+
 // Static functions
 
 bool ScGlobal::HasAttrChanged( const SfxItemSet&  rNewAttrs,
@@ -641,6 +644,40 @@ void ScGlobal::ResetFunctionList()
     // FunctionMgr has pointers into FunctionList, must also be updated
     xStarCalcFunctionMgr.reset();
     xStarCalcFunctionList.reset();
+    // Building new names also needs InputHandler data to be refreshed.
+    maInputHandlerFunctionNames = InputHandlerFunctionNames();
+}
+
+const InputHandlerFunctionNames& ScGlobal::GetInputHandlerFunctionNames()
+{
+    if (maInputHandlerFunctionNames.maFunctionData.empty())
+    {
+        const OUString aParenthesesReplacement( cParenthesesReplacement);
+        const ScFunctionList* pFuncList = GetStarCalcFunctionList();
+        const sal_uInt32 nListCount = pFuncList->GetCount();
+        const CharClass* pCharClass = 
(SC_MOD()->GetFormulaOptions().GetUseEnglishFuncName()
+                ? ScCompiler::GetCharClassEnglish()
+                : ScCompiler::GetCharClassLocalized());
+        for (sal_uInt32 i=0; i < nListCount; ++i)
+        {
+            const ScFuncDesc* pDesc = pFuncList->GetFunction( i );
+            if ( pDesc->mxFuncName )
+            {
+                OUString 
aFuncName(pCharClass->uppercase(*(pDesc->mxFuncName)));
+                // fdo#75264 fill maFormulaChar with all characters used in 
formula names
+                for (sal_Int32 j = 0; j < aFuncName.getLength(); j++)
+                    
maInputHandlerFunctionNames.maFunctionChar.insert(aFuncName[j]);
+                maInputHandlerFunctionNames.maFunctionData.insert(
+                        ScTypedStrData(*(pDesc->mxFuncName) + 
aParenthesesReplacement, 0.0, 0.0,
+                            ScTypedStrData::Standard));
+                pDesc->initArgumentInfo();
+                OUString aEntry = pDesc->getSignature();
+                maInputHandlerFunctionNames.maFunctionDataPara.insert(
+                        ScTypedStrData(aEntry, 0.0, 0.0, 
ScTypedStrData::Standard));
+            }
+        }
+    }
+    return maInputHandlerFunctionNames;
 }
 
 ScUnitConverter* ScGlobal::GetUnitConverter()
diff --git a/sc/source/ui/app/inputhdl.cxx b/sc/source/ui/app/inputhdl.cxx
index 8f095d4ecaa7..a8dc8a5d7a76 100644
--- a/sc/source/ui/app/inputhdl.cxx
+++ b/sc/source/ui/app/inputhdl.cxx
@@ -101,11 +101,6 @@ using namespace formula;
 
 namespace {
 
-// Formula data replacement character for a pair of parentheses at end of
-// function name, to force sorting parentheses before all other characters.
-// Collation may treat parentheses differently.
-const sal_Unicode cParenthesesReplacement = 0x0001;
-
 ScTypedCaseStrSet::const_iterator findText(
     const ScTypedCaseStrSet& rDataSet, ScTypedCaseStrSet::const_iterator const 
& itPos,
     const OUString& rStart, OUString& rResult, bool bBack)
@@ -1023,38 +1018,10 @@ void ScInputHandler::GetFormulaData()
     const OUString aParenthesesReplacement( cParenthesesReplacement);
     const ScFunctionList* pFuncList = ScGlobal::GetStarCalcFunctionList();
     const sal_uInt32 nListCount = pFuncList->GetCount();
-    if (maFunctionNames.mnListCount != nListCount
-            || maFunctionNames.mbEnglishFunctionNames != 
pFuncList->IsEnglishFunctionNames())
-    {
-        if (maFunctionNames.mnListCount)
-            maFunctionNames = FunctionNames();
-        maFunctionNames.mnListCount = nListCount;
-        maFunctionNames.mbEnglishFunctionNames = 
pFuncList->IsEnglishFunctionNames();
-        const CharClass* pCharClass = (maFunctionNames.mbEnglishFunctionNames
-                ? ScCompiler::GetCharClassEnglish()
-                : ScCompiler::GetCharClassLocalized());
-        for (sal_uInt32 i=0; i < nListCount; ++i)
-        {
-            const ScFuncDesc* pDesc = pFuncList->GetFunction( i );
-            if ( pDesc->mxFuncName )
-            {
-                OUString 
aFuncName(pCharClass->uppercase(*(pDesc->mxFuncName)));
-                // fdo#75264 fill maFormulaChar with all characters used in 
formula names
-                for (sal_Int32 j = 0; j < aFuncName.getLength(); j++)
-                    maFunctionNames.maFunctionChar.insert(aFuncName[j]);
-                maFunctionNames.maFunctionData.insert(
-                        ScTypedStrData(*(pDesc->mxFuncName) + 
aParenthesesReplacement, 0.0, 0.0,
-                            ScTypedStrData::Standard));
-                pDesc->initArgumentInfo();
-                OUString aEntry = pDesc->getSignature();
-                
maFunctionNames.maFunctionDataPara.insert(ScTypedStrData(aEntry, 0.0, 0.0, 
ScTypedStrData::Standard));
-            }
-        }
-    }
-
-    *pFormulaData     = maFunctionNames.maFunctionData;
-    *pFormulaDataPara = maFunctionNames.maFunctionDataPara;
-    maFormulaChar     = maFunctionNames.maFunctionChar;
+    const InputHandlerFunctionNames& rFunctionNames = 
ScGlobal::GetInputHandlerFunctionNames();
+    *pFormulaData     = rFunctionNames.maFunctionData;
+    *pFormulaDataPara = rFunctionNames.maFunctionDataPara;
+    maFormulaChar     = rFunctionNames.maFunctionChar;
 
     // Increase suggestion priority of MRU formulas
     const ScAppOptions& rOpt = SC_MOD()->GetAppOptions();
diff --git a/sc/source/ui/inc/inputhdl.hxx b/sc/source/ui/inc/inputhdl.hxx
index ba0d9f81a42e..067798b7cd8b 100644
--- a/sc/source/ui/inc/inputhdl.hxx
+++ b/sc/source/ui/inc/inputhdl.hxx
@@ -63,15 +63,6 @@ private:
     EditView*               pTableView;                 // associated active 
EditView
     EditView*               pTopView;                   // EditView in the 
input row
 
-    struct FunctionNames
-    {
-        ScTypedCaseStrSet     maFunctionData;
-        ScTypedCaseStrSet     maFunctionDataPara;
-        std::set<sal_Unicode> maFunctionChar;
-        sal_uInt32            mnListCount = 0;
-        bool                  mbEnglishFunctionNames = false;
-    } maFunctionNames;
-
     std::unique_ptr<ScTypedCaseStrSet> pColumnData;
     std::unique_ptr<ScTypedCaseStrSet> pFormulaData;
     std::unique_ptr<ScTypedCaseStrSet> pFormulaDataPara;

Reply via email to