[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