diff options
author | Eike Rathke <erack@redhat.com> | 2022-08-29 21:39:19 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2022-08-30 11:48:54 +0200 |
commit | 5a16cd1123003d6f72d84983292cf96c7fb49d60 (patch) | |
tree | d779c236bfef5557c3f85a735892381c9a7dec55 /sc | |
parent | ffe488c38741f4391b2f19440a8d20f4ed38a886 (diff) |
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 <erack@redhat.com>
Tested-by: Jenkins
Diffstat (limited to 'sc')
-rw-r--r-- | sc/inc/global.hxx | 15 | ||||
-rw-r--r-- | sc/source/core/data/global.cxx | 37 | ||||
-rw-r--r-- | sc/source/ui/app/inputhdl.cxx | 41 | ||||
-rw-r--r-- | sc/source/ui/inc/inputhdl.hxx | 9 |
4 files changed, 56 insertions, 46 deletions
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; |