sc/inc/funcdesc.hxx              |    3 ++
 sc/source/core/data/funcdesc.cxx |    3 +-
 sc/source/ui/app/inputhdl.cxx    |   48 ++++++++++++++++++++++++---------------
 sc/source/ui/inc/inputhdl.hxx    |   16 +++++++++----
 4 files changed, 47 insertions(+), 23 deletions(-)

New commits:
commit 1581a631464254bbc428649c35b23c79df837ed2
Author:     Eike Rathke <er...@redhat.com>
AuthorDate: Sat Aug 27 01:10:36 2022 +0200
Commit:     Eike Rathke <er...@redhat.com>
CommitDate: Sat Aug 27 02:57:46 2022 +0200

    Do not gather function data over and over again for each formula input
    
    The function list changes only if switched to/from English
    function names or if reset for AddIn config and only then needs to
    be rebuilt. In all other cases simply reuse a once obtained data
    set and only append the dynamic document content.
    
    Change-Id: I5b1d14205e2933010a1b4382c985594d75802742
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138890
    Reviewed-by: Eike Rathke <er...@redhat.com>
    Tested-by: Jenkins

diff --git a/sc/inc/funcdesc.hxx b/sc/inc/funcdesc.hxx
index 0f37e924d941..01829417e485 100644
--- a/sc/inc/funcdesc.hxx
+++ b/sc/inc/funcdesc.hxx
@@ -253,9 +253,12 @@ public:
 
     const ScFuncDesc* GetFunction( sal_uInt32 nIndex ) const;
 
+    bool IsEnglishFunctionNames() const { return mbEnglishFunctionNames; }
+
 private:
     ::std::vector<const ScFuncDesc*> aFunctionList; /**< List of functions */
     ::std::vector<const ScFuncDesc*>::iterator aFunctionListIter; /**< 
position in function list */
+    bool mbEnglishFunctionNames;
 };
 
 /**
diff --git a/sc/source/core/data/funcdesc.cxx b/sc/source/core/data/funcdesc.cxx
index c8045e6c1abf..1fa47a5db718 100644
--- a/sc/source/core/data/funcdesc.cxx
+++ b/sc/source/core/data/funcdesc.cxx
@@ -398,6 +398,7 @@ bool ScFuncDesc::compareByName(const ScFuncDesc* a, const 
ScFuncDesc* b)
 #define ENTRY(CODE) CODE, SAL_N_ELEMENTS(CODE)
 
 ScFunctionList::ScFunctionList( bool bEnglishFunctionNames )
+    : mbEnglishFunctionNames( bEnglishFunctionNames )
 {
     sal_Int32  nMaxFuncNameLen = 0; // Length of longest function name
 
@@ -958,7 +959,7 @@ ScFunctionList::ScFunctionList( bool bEnglishFunctionNames )
         pDesc = new ScFuncDesc;
         pDesc->nFIndex = nNextId++;
 
-        if ( pUnoAddIns->FillFunctionDesc( nFunc, *pDesc, 
bEnglishFunctionNames ) )
+        if ( pUnoAddIns->FillFunctionDesc( nFunc, *pDesc, 
mbEnglishFunctionNames ) )
         {
             tmpFuncVector.push_back(pDesc);
             nStrLen = pDesc->mxFuncName->getLength();
diff --git a/sc/source/ui/app/inputhdl.cxx b/sc/source/ui/app/inputhdl.cxx
index de0a49e692bb..8f095d4ecaa7 100644
--- a/sc/source/ui/app/inputhdl.cxx
+++ b/sc/source/ui/app/inputhdl.cxx
@@ -1020,30 +1020,42 @@ void ScInputHandler::GetFormulaData()
     else
         pFormulaDataPara.reset( new ScTypedCaseStrSet );
 
-    const CharClass* pCharClass = 
(SC_MOD()->GetFormulaOptions().GetUseEnglishFuncName()
-                                       ? ScCompiler::GetCharClassEnglish()
-                                       : ScCompiler::GetCharClassLocalized());
-
     const OUString aParenthesesReplacement( cParenthesesReplacement);
     const ScFunctionList* pFuncList = ScGlobal::GetStarCalcFunctionList();
-    sal_uInt32 nListCount = pFuncList->GetCount();
-    for(sal_uInt32 i=0;i<nListCount;i++)
-    {
-        const ScFuncDesc* pDesc = pFuncList->GetFunction( i );
-        if ( pDesc->mxFuncName )
+    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)
         {
-            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++)
-                maFormulaChar.insert(aFuncName[j]);
-            pFormulaData->insert(ScTypedStrData(*(pDesc->mxFuncName) + 
aParenthesesReplacement, 0.0, 0.0,
-                                                ScTypedStrData::Standard));
-            pDesc->initArgumentInfo();
-            OUString aEntry = pDesc->getSignature();
-            pFormulaDataPara->insert(ScTypedStrData(aEntry, 0.0, 0.0, 
ScTypedStrData::Standard));
+            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;
+
     // Increase suggestion priority of MRU formulas
     const ScAppOptions& rOpt = SC_MOD()->GetAppOptions();
     const sal_uInt16 nMRUCount = rOpt.GetLRUFuncListCount();
diff --git a/sc/source/ui/inc/inputhdl.hxx b/sc/source/ui/inc/inputhdl.hxx
index 353a94167a37..ba0d9f81a42e 100644
--- a/sc/source/ui/inc/inputhdl.hxx
+++ b/sc/source/ui/inc/inputhdl.hxx
@@ -63,11 +63,21 @@ 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;
-    ScTypedCaseStrSet::const_iterator miAutoPosColumn;
-    ScTypedCaseStrSet::const_iterator miAutoPosFormula;
+    ScTypedCaseStrSet::const_iterator  miAutoPosColumn;
+    ScTypedCaseStrSet::const_iterator  miAutoPosFormula;
+    std::set<sal_Unicode>              maFormulaChar;
 
     VclPtr<vcl::Window>     pTipVisibleParent;
     void*                   nTipVisible;
@@ -127,8 +137,6 @@ private:
     std::unique_ptr<ScRangeFindList>
                             pRangeFindList;
 
-    ::std::set< sal_Unicode >    maFormulaChar;  //fdo 75264
-
 private:
     void            UpdateActiveView();
     void            SyncViews( const EditView* pSourceView = nullptr );

Reply via email to