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;