sc/inc/compiler.hxx              |    2 -
 sc/inc/funcdesc.hxx              |    3 ++
 sc/inc/global.hxx                |   15 ++++++++++++
 sc/source/core/data/funcdesc.cxx |    3 +-
 sc/source/core/data/global.cxx   |   37 ++++++++++++++++++++++++++++++
 sc/source/core/tool/compiler.cxx |    8 ++++--
 sc/source/ui/app/inputhdl.cxx    |   47 +++++++++++++++------------------------
 sc/source/ui/inc/inputhdl.hxx    |    7 ++---
 8 files changed, 86 insertions(+), 36 deletions(-)

New commits:
commit bbd08d1dcdbb2dd8c30f590b2a8b785b64d01564
Author:     Andreas Heinisch <andreas.heini...@yahoo.de>
AuthorDate: Mon Aug 22 19:04:40 2022 +0200
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Wed Sep 7 08:22:23 2022 +0200

    tdf#142031 - Collect all the characters for the formula suggestion auto 
input
    
    This is a combination of 5 commits.
    
    tdf#142031 - Collect all the characters for the formula suggestion auto 
input
    
    Change-Id: Idec350b09279f42f2ca42a1c02082d8e9e4207b8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138702
    Tested-by: Jenkins
    Reviewed-by: Eike Rathke <er...@redhat.com>
    Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org>
    
    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
    Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org>
    
    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
    Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org>
    
    Use ScFunctionList::IsEnglishFunctionNames()
    
    Change-Id: I21a7bf18c2117187b2e8c770b9367f46323b2c2d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139054
    Reviewed-by: Eike Rathke <er...@redhat.com>
    Tested-by: Jenkins
    Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org>
    
    Make static ScCompiler::GetCharClassLocalized() public as well
    
    ... and mutex guard it.
    
    Change-Id: Ief9c6deaf7974ac43c7ae439a0fb73c29eced283
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138733
    Reviewed-by: Eike Rathke <er...@redhat.com>
    Tested-by: Jenkins
    Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139443

diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx
index cb60e1f96acb..b7896c26c0e3 100644
--- a/sc/inc/compiler.hxx
+++ b/sc/inc/compiler.hxx
@@ -378,8 +378,8 @@ private:
 
     bool HasPossibleNamedRangeConflict(SCTAB nTab) const;
 
-    static const CharClass* GetCharClassLocalized();
 public:
+    static const CharClass* GetCharClassLocalized();
     static const CharClass* GetCharClassEnglish();
 
 public:
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/inc/global.hxx b/sc/inc/global.hxx
index 47b93c845296..6c43f0328da6 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/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/core/data/global.cxx b/sc/source/core/data/global.cxx
index 46277a807db0..a7b63ce1eb40 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 = (pFuncList->IsEnglishFunctionNames()
+                ? 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/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index 580c7ef44666..7bcb949c8fe5 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -242,8 +242,12 @@ const CharClass* ScCompiler::GetCharClassLocalized()
     {
         // Switching UI language requires restart; if not, we would have to
         // keep track of that.
-        pCharClassLocalized = new CharClass(
-                ::comphelper::getProcessComponentContext(), 
Application::GetSettings().GetUILanguageTag());
+        osl::MutexGuard aGuard(maMutex);
+        if (!pCharClassLocalized)
+        {
+            pCharClassLocalized = new CharClass( 
::comphelper::getProcessComponentContext(),
+                    Application::GetSettings().GetUILanguageTag());
+        }
     }
     return pCharClassLocalized;
 }
diff --git a/sc/source/ui/app/inputhdl.cxx b/sc/source/ui/app/inputhdl.cxx
index 9ad38d7d321d..b837cb2d089b 100644
--- a/sc/source/ui/app/inputhdl.cxx
+++ b/sc/source/ui/app/inputhdl.cxx
@@ -67,6 +67,7 @@
 #include <tabvwsh.hxx>
 #include <docsh.hxx>
 #include <scmod.hxx>
+#include <formulaopt.hxx>
 #include <uiitems.hxx>
 #include <global.hxx>
 #include <sc.hrc>
@@ -99,11 +100,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)
@@ -1020,27 +1016,11 @@ void ScInputHandler::GetFormulaData()
 
     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_Unicode* pName = pDesc->mxFuncName->getStr();
-            const sal_Int32 nLen = pDesc->mxFuncName->getLength();
-            // fdo#75264 fill maFormulaChar with all characters used in 
formula names
-            for ( sal_Int32 j = 0; j < nLen; j++ )
-            {
-                sal_Unicode c = pName[ j ];
-                maFormulaChar.insert( c );
-            }
-            OUString aFuncName = *pDesc->mxFuncName + aParenthesesReplacement;
-            pFormulaData->insert(ScTypedStrData(aFuncName, 0.0, 0.0, 
ScTypedStrData::Standard));
-            pDesc->initArgumentInfo();
-            OUString aEntry = pDesc->getSignature();
-            pFormulaDataPara->insert(ScTypedStrData(aEntry, 0.0, 0.0, 
ScTypedStrData::Standard));
-        }
-    }
+    const sal_uInt32 nListCount = pFuncList->GetCount();
+    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();
@@ -1065,8 +1045,19 @@ void ScInputHandler::GetFormulaData()
         }
     }
     miAutoPosFormula = pFormulaData->end();
-    rDoc.GetFormulaEntries( *pFormulaData );
-    rDoc.GetFormulaEntries( *pFormulaDataPara );
+
+    // tdf#142031 - collect all the characters for the formula suggestion auto 
input
+    ScTypedCaseStrSet aStrSet;
+    rDoc.GetFormulaEntries( aStrSet );
+    for (auto iter = aStrSet.begin(); iter != aStrSet.end(); ++iter)
+    {
+        const OUString aFuncName = 
ScGlobal::getCharClass().uppercase((*iter).GetString());
+        // 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(aStrSet.begin(), aStrSet.end());
+    pFormulaDataPara->insert(aStrSet.begin(), aStrSet.end());
 }
 
 IMPL_LINK( ScInputHandler, ShowHideTipVisibleParentListener, VclWindowEvent&, 
rEvent, void )
diff --git a/sc/source/ui/inc/inputhdl.hxx b/sc/source/ui/inc/inputhdl.hxx
index 765c32522b29..ca70287ef354 100644
--- a/sc/source/ui/inc/inputhdl.hxx
+++ b/sc/source/ui/inc/inputhdl.hxx
@@ -66,8 +66,9 @@ private:
     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 +128,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