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 );