Optionally use case-insensitive comparison in CompareStrings()
Harmonize Mac and MSW versions by using case-sensitive comparison in both of them by default, but allowing to use a flag to use case-insensitive comparison instead.
This commit is contained in:
@@ -19,6 +19,13 @@
|
|||||||
|
|
||||||
class wxUILocaleImpl;
|
class wxUILocaleImpl;
|
||||||
|
|
||||||
|
// Flags for wxUILocale::CompareStrings().
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
wxCompare_CaseSensitive = 0,
|
||||||
|
wxCompare_CaseInsensitive = 1
|
||||||
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxUILocale allows to use the default UI locale and get information about it
|
// wxUILocale allows to use the default UI locale and get information about it
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -47,7 +54,8 @@ public:
|
|||||||
|
|
||||||
// Compares two strings, for a locale specified by wxLocaleIdent.
|
// Compares two strings, for a locale specified by wxLocaleIdent.
|
||||||
static int CompareStrings(const wxString& lhs, const wxString& rhs,
|
static int CompareStrings(const wxString& lhs, const wxString& rhs,
|
||||||
const wxLocaleIdent& localeId = wxLocaleIdent());
|
const wxLocaleIdent& localeId = wxLocaleIdent(),
|
||||||
|
int flags = wxCompare_CaseSensitive);
|
||||||
|
|
||||||
// Note that this class is not supposed to be used polymorphically, hence
|
// Note that this class is not supposed to be used polymorphically, hence
|
||||||
// its dtor is not virtual.
|
// its dtor is not virtual.
|
||||||
|
@@ -7,6 +7,20 @@
|
|||||||
// Licence: wxWindows licence
|
// Licence: wxWindows licence
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/**
|
||||||
|
Flags for wxUILocale::CompareStrings() function.
|
||||||
|
|
||||||
|
@since 3.1.6
|
||||||
|
*/
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
/// Compare strings case-sensitively, this is the default.
|
||||||
|
wxCompare_CaseSensitive = 0,
|
||||||
|
|
||||||
|
/// Ignore strings case when comparing.
|
||||||
|
wxCompare_CaseInsensitive = 1
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Query and modify locale used for the UI by the current platform.
|
Query and modify locale used for the UI by the current platform.
|
||||||
|
|
||||||
@@ -90,13 +104,17 @@ public:
|
|||||||
@param localeId
|
@param localeId
|
||||||
Represents platform dependent language name.
|
Represents platform dependent language name.
|
||||||
@see wxLocaleIdent for details.
|
@see wxLocaleIdent for details.
|
||||||
|
@param flags
|
||||||
|
Can be used to specify whether to compare strings case-sensitively
|
||||||
|
(default) or not, by specifying ::wxCompare_CaseInsensitive.
|
||||||
@return
|
@return
|
||||||
-1 if lhs less than rhs.
|
-1 if lhs less than rhs.
|
||||||
0 if lhs equal to rhs.
|
0 if lhs equal to rhs.
|
||||||
1 if lhs greater than rhs.
|
1 if lhs greater than rhs.
|
||||||
*/
|
*/
|
||||||
static int CompareStrings(const wxString& lhs, const wxString& rhs,
|
static int CompareStrings(const wxString& lhs, const wxString& rhs,
|
||||||
const wxLocaleIdent& localeId = wxLocaleIdent());
|
const wxLocaleIdent& localeId = wxLocaleIdent(),
|
||||||
|
int flags = wxCompare_CaseSensitive);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get the platform-dependent name of the current locale.
|
Get the platform-dependent name of the current locale.
|
||||||
|
@@ -205,12 +205,21 @@ wxUILocaleImpl* wxUILocaleImpl::CreateForLanguage(const wxLanguageInfo& info)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* static */
|
/* static */
|
||||||
int wxUILocale::CompareStrings(const wxString& lhs, const wxString& rhs, const wxLocaleIdent& localeId)
|
int
|
||||||
|
wxUILocale::CompareStrings(const wxString& lhs,
|
||||||
|
const wxString& rhs,
|
||||||
|
const wxLocaleIdent& localeId,
|
||||||
|
int flags)
|
||||||
{
|
{
|
||||||
|
DWORD dwFlags = 0;
|
||||||
|
|
||||||
|
if ( flags & wxCompare_CaseInsensitive )
|
||||||
|
dwFlags |= NORM_IGNORECASE;
|
||||||
|
|
||||||
int ret = wxMSWCompareStringEx(
|
int ret = wxMSWCompareStringEx(
|
||||||
localeId.IsDefault() ? LOCALE_NAME_USER_DEFAULT
|
localeId.IsDefault() ? LOCALE_NAME_USER_DEFAULT
|
||||||
: static_cast<LPCWSTR>(localeId.GetName().wc_str()),
|
: static_cast<LPCWSTR>(localeId.GetName().wc_str()),
|
||||||
0, // Maybe we need LINGUISTIC_IGNORECASE here
|
dwFlags,
|
||||||
static_cast<LPCWSTR>(lhs.wc_str()), -1,
|
static_cast<LPCWSTR>(lhs.wc_str()), -1,
|
||||||
static_cast<LPCWSTR>(rhs.wc_str()), -1,
|
static_cast<LPCWSTR>(rhs.wc_str()), -1,
|
||||||
NULL, // [out] version information -- not needed
|
NULL, // [out] version information -- not needed
|
||||||
|
@@ -133,7 +133,11 @@ wxUILocaleImpl* wxUILocaleImpl::CreateForLanguage(const wxLanguageInfo& info)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* static */
|
/* static */
|
||||||
int wxUILocale::CompareStrings(const wxString& lhs, const wxString& rhs, const wxLocaleIdent& localeId)
|
int
|
||||||
|
wxUILocale::CompareStrings(const wxString& lhs,
|
||||||
|
const wxString& rhs,
|
||||||
|
const wxLocaleIdent& localeId,
|
||||||
|
int flags)
|
||||||
{
|
{
|
||||||
NSString *ns_lhs = [NSString stringWithCString:lhs.ToStdString(wxConvUTF8).c_str()
|
NSString *ns_lhs = [NSString stringWithCString:lhs.ToStdString(wxConvUTF8).c_str()
|
||||||
encoding:NSUTF8StringEncoding];
|
encoding:NSUTF8StringEncoding];
|
||||||
@@ -141,7 +145,10 @@ int wxUILocale::CompareStrings(const wxString& lhs, const wxString& rhs, const w
|
|||||||
encoding:NSUTF8StringEncoding];
|
encoding:NSUTF8StringEncoding];
|
||||||
NSString *ns_locale_id = [NSString stringWithCString:localeId.GetName().ToStdString(wxConvUTF8).c_str()
|
NSString *ns_locale_id = [NSString stringWithCString:localeId.GetName().ToStdString(wxConvUTF8).c_str()
|
||||||
encoding:NSUTF8StringEncoding];
|
encoding:NSUTF8StringEncoding];
|
||||||
NSInteger options = NSCaseInsensitiveSearch; // Maybe also NSDiacriticInsensitiveSearch?
|
NSInteger options = 0;
|
||||||
|
if ( flags & wxCompare_CaseInsensitive )
|
||||||
|
options |= NSCaseInsensitiveSearch;
|
||||||
|
|
||||||
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:ns_locale_id];
|
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:ns_locale_id];
|
||||||
|
|
||||||
NSComparisonResult ret = [ns_lhs compare:ns_rhs
|
NSComparisonResult ret = [ns_lhs compare:ns_rhs
|
||||||
|
@@ -253,6 +253,9 @@ TEST_CASE("wxUILocale::GetInfo", "[.][uilocale]")
|
|||||||
CHECK( loc.GetInfo(wxLOCALE_DECIMAL_POINT) == "." );
|
CHECK( loc.GetInfo(wxLOCALE_DECIMAL_POINT) == "." );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Just a small helper to make the test below shorter.
|
||||||
|
static inline wxString u8(const char* s) { return wxString::FromUTF8(s); }
|
||||||
|
|
||||||
TEST_CASE("wxUILocale::CompareStrings", "[uilocale]")
|
TEST_CASE("wxUILocale::CompareStrings", "[uilocale]")
|
||||||
{
|
{
|
||||||
SECTION("English")
|
SECTION("English")
|
||||||
@@ -269,9 +272,11 @@ TEST_CASE("wxUILocale::CompareStrings", "[uilocale]")
|
|||||||
CHECK( wxUILocale::CompareStrings("", "a", l) == -1 );
|
CHECK( wxUILocale::CompareStrings("", "a", l) == -1 );
|
||||||
|
|
||||||
// And for case handling.
|
// And for case handling.
|
||||||
CHECK( wxUILocale::CompareStrings("a", "A", l) == 0 );
|
CHECK( wxUILocale::CompareStrings("a", "A", l) == -1 );
|
||||||
CHECK( wxUILocale::CompareStrings("b", "A", l) == 1 );
|
CHECK( wxUILocale::CompareStrings("a", "A", l,
|
||||||
CHECK( wxUILocale::CompareStrings("B", "a", l) == 1 );
|
wxCompare_CaseInsensitive) == 0 );
|
||||||
|
CHECK( wxUILocale::CompareStrings("b", "A", l) == 1 );
|
||||||
|
CHECK( wxUILocale::CompareStrings("B", "a", l) == 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("German")
|
SECTION("German")
|
||||||
@@ -280,9 +285,10 @@ TEST_CASE("wxUILocale::CompareStrings", "[uilocale]")
|
|||||||
|
|
||||||
// This is more interesting and shows that CompareStrings() uses German
|
// This is more interesting and shows that CompareStrings() uses German
|
||||||
// dictionary rules (DIN 5007-1 variant 1).
|
// dictionary rules (DIN 5007-1 variant 1).
|
||||||
CHECK( wxUILocale::CompareStrings(L"a", L"ä", l) == -1 );
|
CHECK( wxUILocale::CompareStrings("a", u8("ä"), l) == -1 );
|
||||||
CHECK( wxUILocale::CompareStrings(L"ä", "ae", l) == -1 );
|
CHECK( wxUILocale::CompareStrings(u8("ä"), "ae", l) == -1 );
|
||||||
CHECK( wxUILocale::CompareStrings(L"ß", "ss", l) == 0 );
|
CHECK( wxUILocale::CompareStrings(u8("ß"), "ss", l,
|
||||||
|
wxCompare_CaseInsensitive) == 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("Swedish")
|
SECTION("Swedish")
|
||||||
@@ -290,8 +296,8 @@ TEST_CASE("wxUILocale::CompareStrings", "[uilocale]")
|
|||||||
const wxLocaleIdent l("sv");
|
const wxLocaleIdent l("sv");
|
||||||
|
|
||||||
// And this shows that sort order really depends on the language.
|
// And this shows that sort order really depends on the language.
|
||||||
CHECK( wxUILocale::CompareStrings(L"ä", "ae", l) == 1 );
|
CHECK( wxUILocale::CompareStrings(u8("ä"), "ae", l) == 1 );
|
||||||
CHECK( wxUILocale::CompareStrings(L"ö", "z" , l) == 1 );
|
CHECK( wxUILocale::CompareStrings(u8("ö"), "z" , l) == 1 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user