sc/inc/addincol.hxx | 4 ++ sc/source/core/tool/addincol.cxx | 57 +++++++++++++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 9 deletions(-)
New commits: commit 8dc76b13458fac1a30787f8bbab117a4a9508ab5 Author: Eike Rathke <er...@redhat.com> AuthorDate: Tue Aug 2 21:39:56 2022 +0200 Commit: Eike Rathke <er...@redhat.com> CommitDate: Tue Aug 2 22:32:54 2022 +0200 Resolves: tdf#150203 Gather AddIn English names and provide for FunctionAccess This works at least for the bundled AddIns from scaddins/. It may for others if en-US compatibility function names are provided, if not the local name will be continued to be used. Change-Id: I09e23f731c0f3d9753ef355ab59c2005bc567464 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137708 Reviewed-by: Eike Rathke <er...@redhat.com> Tested-by: Jenkins diff --git a/sc/inc/addincol.hxx b/sc/inc/addincol.hxx index 9366e31b68ff..2602624da287 100644 --- a/sc/inc/addincol.hxx +++ b/sc/inc/addincol.hxx @@ -123,7 +123,8 @@ public: const OString& GetHelpId() const { return sHelpId; } const ::std::vector< LocalizedName >& GetCompNames() const; - bool GetExcelName( LanguageType eDestLang, OUString& rRetExcelName ) const; + bool GetExcelName( LanguageType eDestLang, OUString& rRetExcelName, + bool bFallbackToAny = true ) const; void SetFunction( const css::uno::Reference< css::reflection::XIdlMethod>& rNewFunc, const css::uno::Any& rNewObj ); @@ -140,6 +141,7 @@ private: std::unique_ptr<ScAddInHashMap> pExactHashMap; ///< exact internal name std::unique_ptr<ScAddInHashMap> pNameHashMap; ///< internal name upper std::unique_ptr<ScAddInHashMap> pLocalHashMap; ///< localized name upper + std::unique_ptr<ScAddInHashMap> pEnglishHashMap; ///< English name upper bool bInitialized; void Initialize(); diff --git a/sc/source/core/tool/addincol.cxx b/sc/source/core/tool/addincol.cxx index addb1512806f..7ccf8b6c5c32 100644 --- a/sc/source/core/tool/addincol.cxx +++ b/sc/source/core/tool/addincol.cxx @@ -138,7 +138,7 @@ void ScUnoAddInFuncData::SetCompNames( ::std::vector< ScUnoAddInFuncData::Locali bCompInitialized = true; } -bool ScUnoAddInFuncData::GetExcelName( LanguageType eDestLang, OUString& rRetExcelName ) const +bool ScUnoAddInFuncData::GetExcelName( LanguageType eDestLang, OUString& rRetExcelName, bool bFallbackToAny ) const { const ::std::vector<LocalizedName>& rCompNames = GetCompNames(); if ( !rCompNames.empty() ) @@ -180,9 +180,12 @@ bool ScUnoAddInFuncData::GetExcelName( LanguageType eDestLang, OUString& rRetExc } } - // Third, last resort, use first (default) entry. - rRetExcelName = rCompNames[0].maName; - return true; + if (bFallbackToAny) + { + // Third, last resort, use first (default) entry. + rRetExcelName = rCompNames[0].maName; + return true; + } } return false; } @@ -226,6 +229,7 @@ void ScUnoAddInCollection::Clear() pExactHashMap.reset(); pNameHashMap.reset(); pLocalHashMap.reset(); + pEnglishHashMap.reset(); ppFuncData.reset(); nFuncCount = 0; @@ -380,6 +384,8 @@ void ScUnoAddInCollection::ReadConfiguration() pNameHashMap.reset( new ScAddInHashMap ); if ( !pLocalHashMap ) pLocalHashMap.reset( new ScAddInHashMap ); + if ( !pEnglishHashMap ) + pEnglishHashMap.reset( new ScAddInHashMap ); //TODO: get the function information in a single call for all functions? @@ -395,6 +401,7 @@ void ScUnoAddInCollection::ReadConfiguration() if ( pExactHashMap->find( aFuncName ) == pExactHashMap->end() ) { + OUString aEnglishName; OUString aLocalName; OUString aDescription; sal_uInt16 nCategory = ID_FUNCTION_GRP_ADDINS; @@ -441,6 +448,11 @@ void ScUnoAddInCollection::ReadConfiguration() OUString aName; rConfig.Value >>= aName; aCompNames.emplace_back( aLocale, aName); + // Accept 'en' and 'en-...' but prefer 'en-US'. + if (aLocale == "en-US") + aEnglishName = aName; + else if (aEnglishName.isEmpty() && (aLocale == "en" || aLocale.startsWith("en-"))) + aEnglishName = aName; } } } @@ -527,6 +539,15 @@ void ScUnoAddInCollection::ReadConfiguration() pLocalHashMap->emplace( pData->GetUpperLocal(), pData ); + + if (aEnglishName.isEmpty()) + SAL_WARN("sc.core", "no English name for " << aLocalName << " " << aFuncName); + else + { + pEnglishHashMap->emplace( + aEnglishName.toAsciiUpperCase(), + pData ); + } } } } @@ -746,6 +767,8 @@ void ScUnoAddInCollection::ReadFromAddIn( const uno::Reference<uno::XInterface>& pNameHashMap.reset( new ScAddInHashMap ); if ( !pLocalHashMap ) pLocalHashMap.reset( new ScAddInHashMap ); + if ( !pEnglishHashMap ) + pEnglishHashMap.reset( new ScAddInHashMap ); const uno::Reference<reflection::XIdlMethod>* pArray = aMethods.getConstArray(); for (tools::Long nFuncPos=0; nFuncPos<nNewCount; nFuncPos++) @@ -907,6 +930,16 @@ void ScUnoAddInCollection::ReadFromAddIn( const uno::Reference<uno::XInterface>& pLocalHashMap->emplace( pData->GetUpperLocal(), pData ); + + OUString aEnglishName; + if (!pData->GetExcelName( LANGUAGE_ENGLISH_US, aEnglishName, false /*bFallbackToAny*/)) + SAL_WARN("sc.core", "no English name for " << aLocalName << " " << aFuncName); + else + { + pEnglishHashMap->emplace( + aEnglishName.toAsciiUpperCase(), + pData ); + } } } } @@ -1076,7 +1109,7 @@ OUString ScUnoAddInCollection::FindFunction( const OUString& rUpperName, bool bL if ( bLocalFirst ) { - // first scan all local names (used for entering formulas) + // Only scan local names (used for entering formulas). ScAddInHashMap::const_iterator iLook( pLocalHashMap->find( rUpperName ) ); if ( iLook != pLocalHashMap->end() ) @@ -1084,14 +1117,22 @@ OUString ScUnoAddInCollection::FindFunction( const OUString& rUpperName, bool bL } else { - // first scan international names (used when calling a function) - //TODO: before that, check for exact match??? + // First scan international programmatic names (used when calling a + // function). ScAddInHashMap::const_iterator iLook( pNameHashMap->find( rUpperName ) ); if ( iLook != pNameHashMap->end() ) return iLook->second->GetOriginalName(); - // after that, scan all local names (to allow replacing old AddIns with Uno) + // Then scan English names (as FunctionAccess API could expect). + + iLook = pEnglishHashMap->find( rUpperName ); + if ( iLook != pEnglishHashMap->end() ) + return iLook->second->GetOriginalName(); + + // After that, scan all local names; either to allow replacing old + // AddIns with Uno, or for functions where the AddIn did not provide an + // English name. iLook = pLocalHashMap->find( rUpperName ); if ( iLook != pLocalHashMap->end() )