[Libreoffice-commits] core.git: 2 commits - include/svtools include/svx svtools/source svx/source
Eike Rathke
erack at redhat.com
Tue Mar 14 11:49:07 UTC 2017
include/svtools/langtab.hxx | 2
include/svx/langbox.hxx | 2
svtools/source/misc/langtab.cxx | 15 ++++++-
svx/source/dialog/langbox.cxx | 82 ++++++++++++++++++++++++++++++----------
4 files changed, 79 insertions(+), 22 deletions(-)
New commits:
commit bde834ee6b0cb43cebece47cac55cc9b80aadc24
Author: Eike Rathke <erack at redhat.com>
Date: Tue Mar 14 11:52:52 2017 +0100
display raw language tags in curly brackets
Place raw language tags in curly brackets {}, so all on-the-fly tags are
grouped together at the top of a listbox (but behind the "[None]"
entry).
Change-Id: I01d388150241a8482a1f39f8eda26cdd5bb1d832
diff --git a/include/svtools/langtab.hxx b/include/svtools/langtab.hxx
index 56d0618..5cfe392 100644
--- a/include/svtools/langtab.hxx
+++ b/include/svtools/langtab.hxx
@@ -48,7 +48,7 @@ public:
@param rString
UI visible description string. If empty, the rLanguageTag Bcp47
- string is used instead.
+ string placed in curly brackets is used instead, e.g. "{en-DK}"
*/
static sal_uInt32 AddLanguageTag( const LanguageTag& rLanguageTag, const OUString& rString );
};
diff --git a/svtools/source/misc/langtab.cxx b/svtools/source/misc/langtab.cxx
index 1c303f9..9214780 100644
--- a/svtools/source/misc/langtab.cxx
+++ b/svtools/source/misc/langtab.cxx
@@ -175,6 +175,17 @@ bool SvtLanguageTable::HasLanguageType( const LanguageType eType )
return theLanguageTable::get().HasType( eType );
}
+OUString lcl_getDescription( const OUString& rBcp47 )
+{
+ // Place in curly brackets, so all on-the-fly tags are grouped together at
+ // the top of a listbox (but behind the "[None]" entry), and not sprinkled
+ // all over, which alphabetically might make sense in an English UI only
+ // anyway. Also a visual indicator that it is a programmatical name, IMHO.
+ /* TODO: pulling descriptive names (language, script, country, subtags)
+ * from liblangtag or ISO databases might be nice, but those are English
+ * only. Maybe ICU, that has translations for language and country. */
+ return "{" + rBcp47 + "}";
+}
const OUString SvtLanguageTableImpl::GetString( const LanguageType eType, bool bUserInterfaceSelection ) const
{
@@ -185,7 +196,7 @@ const OUString SvtLanguageTableImpl::GetString( const LanguageType eType, bool b
return ResStringArray::GetString( nPos );
//Rather than return a fairly useless "Unknown" name, return a geeky but usable-in-a-pinch lang-tag
- OUString sLangTag(LanguageTag::convertToBcp47(eType));
+ OUString sLangTag( lcl_getDescription( LanguageTag::convertToBcp47(eType)));
SAL_WARN("svtools.misc", "Language: 0x"
<< std::hex << eType
<< " with unknown name, so returning lang-tag of: "
@@ -259,7 +270,7 @@ LanguageType SvtLanguageTable::GetLanguageTypeAtIndex( sal_uInt32 nIndex )
sal_uInt32 SvtLanguageTable::AddLanguageTag( const LanguageTag& rLanguageTag, const OUString& rString )
{
- return theLanguageTable::get().AddItem( (rString.isEmpty() ? rLanguageTag.getBcp47() : rString),
+ return theLanguageTable::get().AddItem( (rString.isEmpty() ? lcl_getDescription(rLanguageTag.getBcp47()) : rString),
rLanguageTag.getLanguageType());
}
commit bf63e5a3a6ae458ffe10061c1bcf969a534760c5
Author: Eike Rathke <erack at redhat.com>
Date: Tue Mar 14 00:03:16 2017 +0100
tdf#100462 inject language tags provided by spell-checkers to language list
... so they are available already at the first instanciation without having to
be added manually, depending on which listing is requested.
Change-Id: Idcb8f7fcbc82c757a2b06b8f04b81e88197a0a5b
diff --git a/include/svx/langbox.hxx b/include/svx/langbox.hxx
index 4a309e2..9292ab5 100644
--- a/include/svx/langbox.hxx
+++ b/include/svx/langbox.hxx
@@ -68,6 +68,8 @@ public:
bool bHasLangNone, bool bLangNoneIsLangAll = false,
bool bCheckSpellAvail = false );
+ void AddLanguages( const css::uno::Sequence< sal_Int16 >& rLanguageTypes, SvxLanguageListFlags nLangList );
+
sal_Int32 InsertLanguage( const LanguageType eLangType );
void InsertDefaultLanguage( sal_Int16 nType );
void InsertSystemLanguage();
diff --git a/svx/source/dialog/langbox.cxx b/svx/source/dialog/langbox.cxx
index 60e5278..8839c45 100644
--- a/svx/source/dialog/langbox.cxx
+++ b/svx/source/dialog/langbox.cxx
@@ -174,6 +174,50 @@ SvxLanguageBoxBase::~SvxLanguageBoxBase()
}
+bool lcl_isPrerequisite( LanguageType nLangType, SvxLanguageListFlags nLangList )
+{
+ return
+ nLangType != LANGUAGE_DONTKNOW &&
+ nLangType != LANGUAGE_SYSTEM &&
+ nLangType != LANGUAGE_NONE &&
+ !MsLangId::isLegacy( nLangType) &&
+ (MsLangId::getSubLanguage( nLangType) ||
+ bool(nLangList & SvxLanguageListFlags::ALSO_PRIMARY_ONLY));
+}
+
+bool lcl_isScriptTypeRequested( LanguageType nLangType, SvxLanguageListFlags nLangList )
+{
+ return
+ bool(nLangList & SvxLanguageListFlags::ALL) ||
+ (bool(nLangList & SvxLanguageListFlags::WESTERN) &&
+ (SvtLanguageOptions::GetScriptTypeOfLanguage(nLangType) == SvtScriptType::LATIN)) ||
+ (bool(nLangList & SvxLanguageListFlags::CTL) &&
+ (SvtLanguageOptions::GetScriptTypeOfLanguage(nLangType) == SvtScriptType::COMPLEX)) ||
+ (bool(nLangList & SvxLanguageListFlags::CJK) &&
+ (SvtLanguageOptions::GetScriptTypeOfLanguage(nLangType) == SvtScriptType::ASIAN));
+}
+
+void SvxLanguageBoxBase::AddLanguages( const css::uno::Sequence< sal_Int16 >& rLanguageTypes,
+ SvxLanguageListFlags nLangList )
+{
+ sal_Int16 const * pLang = rLanguageTypes.getConstArray();
+ sal_Int16 const * const pStop = pLang + rLanguageTypes.getLength();
+ for ( ; pLang < pStop; ++pLang )
+ {
+ LanguageType nLangType = static_cast<LanguageType>(*pLang);
+ if (lcl_isPrerequisite( nLangType, nLangList))
+ {
+ LanguageType nLang = MsLangId::getReplacementForObsoleteLanguage( nLangType );
+ if (lcl_isScriptTypeRequested( nLang, nLangList))
+ {
+ sal_Int32 nAt = ImplTypeToPos( nLang );
+ if (nAt == LISTBOX_ENTRY_NOTFOUND)
+ InsertLanguage( nLang );
+ }
+ }
+ }
+}
+
void SvxLanguageBoxBase::SetLanguageList( SvxLanguageListFlags nLangList,
bool bHasLangNone, bool bLangNoneIsLangAll, bool bCheckSpellAvail )
{
@@ -186,6 +230,11 @@ void SvxLanguageBoxBase::SetLanguageList( SvxLanguageListFlags nLangList,
if ( SvxLanguageListFlags::EMPTY != nLangList )
{
+ bool bAddAvailable = (!(nLangList & SvxLanguageListFlags::ONLY_KNOWN) &&
+ ((nLangList & SvxLanguageListFlags::ALL) ||
+ (nLangList & SvxLanguageListFlags::WESTERN) ||
+ (nLangList & SvxLanguageListFlags::CTL) ||
+ (nLangList & SvxLanguageListFlags::CJK)));
Sequence< sal_Int16 > aSpellAvailLang;
Sequence< sal_Int16 > aHyphAvailLang;
Sequence< sal_Int16 > aThesAvailLang;
@@ -197,17 +246,17 @@ void SvxLanguageBoxBase::SetLanguageList( SvxLanguageListFlags nLangList,
{
Sequence< css::lang::Locale > aTmp;
- if (SvxLanguageListFlags::SPELL_AVAIL & nLangList)
+ if (bAddAvailable || (SvxLanguageListFlags::SPELL_AVAIL & nLangList))
{
aTmp = xAvail->getAvailableLocales( SN_SPELLCHECKER );
aSpellAvailLang = lcl_LocaleSeqToLangSeq( aTmp );
}
- if (SvxLanguageListFlags::HYPH_AVAIL & nLangList)
+ if (bAddAvailable || (SvxLanguageListFlags::HYPH_AVAIL & nLangList))
{
aTmp = xAvail->getAvailableLocales( SN_HYPHENATOR );
aHyphAvailLang = lcl_LocaleSeqToLangSeq( aTmp );
}
- if (SvxLanguageListFlags::THES_AVAIL & nLangList)
+ if (bAddAvailable || (SvxLanguageListFlags::THES_AVAIL & nLangList))
{
aTmp = xAvail->getAvailableLocales( SN_THESAURUS );
aThesAvailLang = lcl_LocaleSeqToLangSeq( aTmp );
@@ -257,22 +306,8 @@ void SvxLanguageBoxBase::SetLanguageList( SvxLanguageListFlags nLangList,
nLangType = pKnown[i];
else
nLangType = SvtLanguageTable::GetLanguageTypeAtIndex( i );
- if ( nLangType != LANGUAGE_DONTKNOW &&
- nLangType != LANGUAGE_SYSTEM &&
- nLangType != LANGUAGE_NONE &&
- !MsLangId::isLegacy( nLangType) &&
- (MsLangId::getSubLanguage( nLangType) ||
- bool(nLangList & SvxLanguageListFlags::ALSO_PRIMARY_ONLY)) &&
- (bool(nLangList & SvxLanguageListFlags::ALL) ||
- (bool(nLangList & SvxLanguageListFlags::WESTERN) &&
- (SvtLanguageOptions::GetScriptTypeOfLanguage(nLangType) ==
- SvtScriptType::LATIN)) ||
- (bool(nLangList & SvxLanguageListFlags::CTL) &&
- (SvtLanguageOptions::GetScriptTypeOfLanguage(nLangType) ==
- SvtScriptType::COMPLEX)) ||
- (bool(nLangList & SvxLanguageListFlags::CJK) &&
- (SvtLanguageOptions::GetScriptTypeOfLanguage(nLangType) ==
- SvtScriptType::ASIAN)) ||
+ if ( lcl_isPrerequisite( nLangType, nLangList) &&
+ (lcl_isScriptTypeRequested( nLangType, nLangList) ||
(bool(nLangList & SvxLanguageListFlags::FBD_CHARS) &&
MsLangId::hasForbiddenCharacters(nLangType)) ||
(bool(nLangList & SvxLanguageListFlags::SPELL_AVAIL) &&
@@ -290,6 +325,15 @@ void SvxLanguageBoxBase::SetLanguageList( SvxLanguageListFlags nLangList,
InsertLanguage( nLangType );
}
+ if (bAddAvailable)
+ {
+ // Spell checkers, hyphenators and thesauri may add language tags
+ // unknown so far.
+ AddLanguages( aSpellAvailLang, nLangList);
+ AddLanguages( aHyphAvailLang, nLangList);
+ AddLanguages( aThesAvailLang, nLangList);
+ }
+
if (bHasLangNone)
InsertLanguage( LANGUAGE_NONE );
}
More information about the Libreoffice-commits
mailing list