summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2022-08-02 21:39:56 +0200
committerEike Rathke <erack@redhat.com>2022-08-02 22:32:54 +0200
commit8dc76b13458fac1a30787f8bbab117a4a9508ab5 (patch)
tree5bf35de6e67abea3df4f299d78e19f2e61d635c9
parente49156aff90861cb5e488bab5e83cb7a00f109df (diff)
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 <erack@redhat.com> Tested-by: Jenkins
-rw-r--r--sc/inc/addincol.hxx4
-rw-r--r--sc/source/core/tool/addincol.cxx57
2 files changed, 52 insertions, 9 deletions
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() )