diff options
Diffstat (limited to 'basic')
-rw-r--r-- | basic/source/classes/sb.cxx | 16 | ||||
-rw-r--r-- | basic/source/inc/sbunoobj.hxx | 2 | ||||
-rw-r--r-- | basic/source/sbx/sbxvar.cxx | 9 |
3 files changed, 18 insertions, 9 deletions
diff --git a/basic/source/classes/sb.cxx b/basic/source/classes/sb.cxx index 5c99408847b6..902f7adfd91f 100644 --- a/basic/source/classes/sb.cxx +++ b/basic/source/classes/sb.cxx @@ -2065,26 +2065,26 @@ sal_Int32 BasicCollection::implGetIndex( SbxVariable const * pIndexVar ) return nIndex; } -sal_Int32 BasicCollection::implGetIndexForName(std::u16string_view rName) +sal_Int32 BasicCollection::implGetIndexForName(const OUString& rName) { - sal_Int32 nIndex = -1; sal_Int32 nCount = xItemArray->Count(); sal_Int32 nNameHash = MakeHashCode( rName ); // tdf#144245 - case-insensitive operation for non-ASCII characters - utl::TransliterationWrapper& rTransliteration = SbGlobal::GetTransliteration(); + OUString aNameCI; // Only initialize when matching hash found for( sal_Int32 i = 0 ; i < nCount ; i++ ) { SbxVariable* pVar = xItemArray->Get(i); - if (pVar->GetHashCode() == nNameHash - && rTransliteration.isEqual(pVar->GetName(), OUString(rName))) + if (pVar->GetHashCode() == nNameHash) { - nIndex = i; - break; + if (aNameCI.isEmpty() && !rName.isEmpty()) + aNameCI = SbGlobal::GetTransliteration().transliterate(rName, 0, rName.getLength()); + if (aNameCI == pVar->GetName(SbxNameType::CaseInsensitive)) + return i; } } - return nIndex; + return -1; } void BasicCollection::CollAdd( SbxArray* pPar_ ) diff --git a/basic/source/inc/sbunoobj.hxx b/basic/source/inc/sbunoobj.hxx index 1f3042951e51..1fc8ebe4e6c1 100644 --- a/basic/source/inc/sbunoobj.hxx +++ b/basic/source/inc/sbunoobj.hxx @@ -350,7 +350,7 @@ class BasicCollection final : public SbxObject virtual ~BasicCollection() override; virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; sal_Int32 implGetIndex( SbxVariable const * pIndexVar ); - sal_Int32 implGetIndexForName(std::u16string_view rName); + sal_Int32 implGetIndexForName(const OUString& rName); void CollAdd( SbxArray* pPar_ ); void CollItem( SbxArray* pPar_ ); void CollRemove( SbxArray* pPar_ ); diff --git a/basic/source/sbx/sbxvar.cxx b/basic/source/sbx/sbxvar.cxx index 8fb11bf9f2a2..a08122961b66 100644 --- a/basic/source/sbx/sbxvar.cxx +++ b/basic/source/sbx/sbxvar.cxx @@ -30,6 +30,8 @@ #include <sbunoobj.hxx> #include <rtl/ustrbuf.hxx> #include <sal/log.hxx> +#include <global.hxx> +#include <unotools/transliterationwrapper.hxx> #include <com/sun/star/uno/XInterface.hpp> using namespace com::sun::star::uno; @@ -183,6 +185,7 @@ void SbxVariable::SetName( const OUString& rName ) { maName = rName; nHash = MakeHashCode( rName ); + maNameCI.clear(); } const OUString& SbxVariable::GetName( SbxNameType t ) const @@ -192,6 +195,12 @@ const OUString& SbxVariable::GetName( SbxNameType t ) const { return maName; } + if (t == SbxNameType::CaseInsensitive) + { + if (maNameCI.isEmpty() && !maName.isEmpty()) + maNameCI = SbGlobal::GetTransliteration().transliterate(maName, 0, maName.getLength()); + return maNameCI; + } // Request parameter-information (not for objects) const_cast<SbxVariable*>(this)->GetInfo(); // Append nothing, if it is a simple property (no empty brackets) |