[Libreoffice-commits] .: 7 commits - cui/source i18npool/source i18nutil/inc i18nutil/source reportdesign/source svtools/inc svtools/source svx/inc svx/source unusedcode.easy

Caolán McNamara caolan at kemper.freedesktop.org
Fri Oct 21 03:28:08 PDT 2011


 cui/source/tabpages/chardlg.cxx                     |   14 
 i18npool/source/breakiterator/breakiteratorImpl.cxx |   57 --
 i18nutil/inc/i18nutil/unicode.hxx                   |    4 
 i18nutil/source/utility/unicode.cxx                 |   57 ++
 reportdesign/source/ui/dlg/Condition.cxx            |    2 
 svtools/inc/svtools/sampletext.hxx                  |   16 
 svtools/source/control/ctrlbox.cxx                  |    8 
 svtools/source/misc/sampletext.cxx                  |  407 +++++++++++++-------
 svx/inc/svx/fntctrl.hxx                             |    6 
 svx/source/dialog/fntctrl.cxx                       |   63 +--
 unusedcode.easy                                     |    2 
 11 files changed, 400 insertions(+), 236 deletions(-)

New commits:
commit e076064d50b3f1be27f691720b78d49a506b612a
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Fri Oct 21 10:47:33 2011 +0100

    some CJK fonts semi-spuriosly claim extra script support

diff --git a/svtools/source/misc/sampletext.cxx b/svtools/source/misc/sampletext.cxx
index 03af11f..e1b52c9 100644
--- a/svtools/source/misc/sampletext.cxx
+++ b/svtools/source/misc/sampletext.cxx
@@ -1063,6 +1063,7 @@ namespace
         aMasked.set(vcl::UnicodeCoverage::CYRILLIC, false);
         aMasked.set(vcl::UnicodeCoverage::THAI, false);
         aMasked.set(vcl::UnicodeCoverage::DESERET, false);
+        aMasked.set(vcl::UnicodeCoverage::PHAGS_PA, false);
 
         //So, possibly a CJK font
         if (!aMasked.count())
commit 27ed4883f549fc7bdb1d2304430c719de9d3987b
Author: Andrew West <babelstone at gmail.com>
Date:   Fri Oct 21 10:33:45 2011 +0100

    Better Phags-Pa preview. mongxol tshi

diff --git a/svtools/source/misc/sampletext.cxx b/svtools/source/misc/sampletext.cxx
index ed4147a..03af11f 100644
--- a/svtools/source/misc/sampletext.cxx
+++ b/svtools/source/misc/sampletext.cxx
@@ -410,7 +410,8 @@ rtl::OUString makeShortRepresentativeTextForScript(UScriptCode eScript)
         case USCRIPT_PHAGS_PA:
         {
             const sal_Unicode aPhag[] = {
-                0xA84D, 0xA842, 0xA85B, 0xA84C
+                0xA84F, 0xA861, 0xA843, 0x0020, 0xA863, 0xA861, 0xA859, 0x0020,
+                0xA850, 0xA85C, 0xA85E
             };
             sSampleText = rtl::OUString(aPhag, SAL_N_ELEMENTS(aPhag));
             break;
commit 3c1fdebb970b04130a20983a180124c36cd9e245
Author: Pádraig Brady <pbrady at redhat.com>
Date:   Fri Oct 21 10:14:40 2011 +0100

    previews for Phags-Pa and Tai Le

diff --git a/svtools/source/misc/sampletext.cxx b/svtools/source/misc/sampletext.cxx
index 039c8fb..ed4147a 100644
--- a/svtools/source/misc/sampletext.cxx
+++ b/svtools/source/misc/sampletext.cxx
@@ -407,6 +407,23 @@ rtl::OUString makeShortRepresentativeTextForScript(UScriptCode eScript)
             sSampleText = rtl::OUString(aYiii, SAL_N_ELEMENTS(aYiii));
             break;
         }
+        case USCRIPT_PHAGS_PA:
+        {
+            const sal_Unicode aPhag[] = {
+                0xA84D, 0xA842, 0xA85B, 0xA84C
+            };
+            sSampleText = rtl::OUString(aPhag, SAL_N_ELEMENTS(aPhag));
+            break;
+        }
+        case USCRIPT_TAI_LE:
+        {
+            const sal_Unicode aTale[] = {
+                0x1956, 0x196D, 0x1970, 0x1956, 0x196C, 0x1973, 0x1951, 0x1968,
+                0x1952, 0x1970
+            };
+            sSampleText = rtl::OUString(aTale, SAL_N_ELEMENTS(aTale));
+            break;
+        }
         default:
             break;
     }
commit be5f319ce0668031b9fb1ee57a414d11edf6c6c9
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Fri Oct 21 10:10:25 2011 +0100

    use iso15924 script names

diff --git a/svtools/source/misc/sampletext.cxx b/svtools/source/misc/sampletext.cxx
index b0f554c..039c8fb 100644
--- a/svtools/source/misc/sampletext.cxx
+++ b/svtools/source/misc/sampletext.cxx
@@ -368,18 +368,18 @@ rtl::OUString makeShortRepresentativeTextForScript(UScriptCode eScript)
         }
         case USCRIPT_TRADITIONAL_HAN:
         {
-            const sal_Unicode aTraditionalChinese[] = {
+            const sal_Unicode aHant[] = {
                 0x7E41
             };
-            sSampleText = rtl::OUString(aTraditionalChinese, SAL_N_ELEMENTS(aTraditionalChinese));
+            sSampleText = rtl::OUString(aHant, SAL_N_ELEMENTS(aHant));
             break;
         }
         case USCRIPT_SIMPLIFIED_HAN:
         {
-            const sal_Unicode aSimplifiedChinese[] = {
+            const sal_Unicode aHans[] = {
                 0x7B80
             };
-            sSampleText = rtl::OUString(aSimplifiedChinese, SAL_N_ELEMENTS(aSimplifiedChinese));
+            sSampleText = rtl::OUString(aHans, SAL_N_ELEMENTS(aHans));
             break;
         }
         case USCRIPT_HAN:
@@ -387,23 +387,24 @@ rtl::OUString makeShortRepresentativeTextForScript(UScriptCode eScript)
             const sal_Unicode aSimplifiedAndTraditionalChinese[] = {
                 0x7B80, 0x7E41
             };
-            sSampleText = rtl::OUString(aSimplifiedAndTraditionalChinese, SAL_N_ELEMENTS(aSimplifiedAndTraditionalChinese));
+            sSampleText = rtl::OUString(aSimplifiedAndTraditionalChinese,
+                SAL_N_ELEMENTS(aSimplifiedAndTraditionalChinese));
             break;
         }
         case USCRIPT_JAPANESE:
         {
-            const sal_Unicode aJapanese[] = {
+            const sal_Unicode aJpan[] = {
                 0x65E5, 0x672C, 0x8A9E
             };
-            sSampleText = rtl::OUString(aJapanese, SAL_N_ELEMENTS(aJapanese));
+            sSampleText = rtl::OUString(aJpan, SAL_N_ELEMENTS(aJpan));
             break;
         }
         case USCRIPT_YI:
         {
-            const sal_Unicode aYi[] = {
+            const sal_Unicode aYiii[] = {
                 0xA188,  0xA320, 0xA071, 0xA0B7
             };
-            sSampleText = rtl::OUString(aYi, SAL_N_ELEMENTS(aYi));
+            sSampleText = rtl::OUString(aYiii, SAL_N_ELEMENTS(aYiii));
             break;
         }
         default:
commit e84482a38363004d5dc2fde24e57d4215b48797a
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Fri Oct 21 09:33:39 2011 +0100

    Use language/script specific CTL/CJK sample text in font preview
    
    i.e. font names are often typically in English, so fairly useless
    to take the English name to preview what effect the font will have
    in a CTL/CJK script.
    
    More languages and scripts need to be added, but this should be
    sufficient to bootstrap this up

diff --git a/cui/source/tabpages/chardlg.cxx b/cui/source/tabpages/chardlg.cxx
index 782af95..a92019e 100644
--- a/cui/source/tabpages/chardlg.cxx
+++ b/cui/source/tabpages/chardlg.cxx
@@ -493,12 +493,15 @@ void SvxCharNamePage::Initialize()
     m_pWestFontNameLB->SetModifyHdl( aLink );
     m_pWestFontStyleLB->SetModifyHdl( aLink );
     m_pWestFontSizeLB->SetModifyHdl( aLink );
+    m_pWestFontLanguageLB->SetSelectHdl( aLink );
     m_pEastFontNameLB->SetModifyHdl( aLink );
     m_pEastFontStyleLB->SetModifyHdl( aLink );
     m_pEastFontSizeLB->SetModifyHdl( aLink );
+    m_pEastFontLanguageLB->SetSelectHdl( aLink );
     m_pCTLFontNameLB->SetModifyHdl( aLink );
     m_pCTLFontStyleLB->SetModifyHdl( aLink );
     m_pCTLFontSizeLB->SetModifyHdl( aLink );
+    m_pCTLFontLanguageLB->SetSelectHdl( aLink );
 
     m_pImpl->m_aUpdateTimer.SetTimeoutHdl( LINK( this, SvxCharNamePage, UpdateHdl_Impl ) );
 
@@ -547,6 +550,7 @@ namespace
                     const FontNameBox* _pFontNameLB,
                     const FontStyleBox* _pFontStyleLB,
                     const FontSizeBox* _pFontSizeLB,
+                    const SvxLanguageBox* _pLanguageLB,
                     const FontList* _pFontList,
                     sal_uInt16 _nFontWhich,
                     sal_uInt16 _nFontHeightWhich)
@@ -556,7 +560,7 @@ namespace
         FontInfo aFontInfo;
         String sFontName(_pFontNameLB->GetText());
         sal_Bool bFontAvailable = _pFontList->IsAvailable( sFontName );
-        if(bFontAvailable  || _pFontNameLB->GetSavedValue() != sFontName)
+        if (bFontAvailable  || _pFontNameLB->GetSavedValue() != sFontName)
             aFontInfo = _pFontList->Get( sFontName, _pFontStyleLB->GetText() );
         else
         {
@@ -594,6 +598,8 @@ namespace
             aSize.Height() = 200;   // default 10pt
         aFontInfo.SetSize( aSize );
 
+        _rFont.SetLanguage(_pLanguageLB->GetSelectLanguage());
+
         _rFont.SetFamily( aFontInfo.GetFamily() );
         _rFont.SetName( aFontInfo.GetName() );
         _rFont.SetStyleName( aFontInfo.GetStyleName() );
@@ -624,11 +630,11 @@ void SvxCharNamePage::UpdatePreview_Impl()
     // Font
     const FontList* pFontList = GetFontList();
     FontInfo aFontInfo =
-        calcFontInfo(rFont,this,m_pWestFontNameLB,m_pWestFontStyleLB,m_pWestFontSizeLB,pFontList,GetWhich( SID_ATTR_CHAR_FONT ),GetWhich( SID_ATTR_CHAR_FONTHEIGHT ));
+        calcFontInfo(rFont,this,m_pWestFontNameLB,m_pWestFontStyleLB,m_pWestFontSizeLB,m_pWestFontLanguageLB,pFontList,GetWhich( SID_ATTR_CHAR_FONT ),GetWhich( SID_ATTR_CHAR_FONTHEIGHT ));
 
-    calcFontInfo(rCJKFont,this,m_pEastFontNameLB,m_pEastFontStyleLB,m_pEastFontSizeLB,pFontList,GetWhich( SID_ATTR_CHAR_CJK_FONT ),GetWhich( SID_ATTR_CHAR_CJK_FONTHEIGHT ));
+    calcFontInfo(rCJKFont,this,m_pEastFontNameLB,m_pEastFontStyleLB,m_pEastFontSizeLB,m_pEastFontLanguageLB,pFontList,GetWhich( SID_ATTR_CHAR_CJK_FONT ),GetWhich( SID_ATTR_CHAR_CJK_FONTHEIGHT ));
 
-    calcFontInfo(rCTLFont,this,m_pCTLFontNameLB,m_pCTLFontStyleLB,m_pCTLFontSizeLB,pFontList,GetWhich( SID_ATTR_CHAR_CTL_FONT ),GetWhich( SID_ATTR_CHAR_CTL_FONTHEIGHT ));
+    calcFontInfo(rCTLFont,this,m_pCTLFontNameLB,m_pCTLFontStyleLB,m_pCTLFontSizeLB,m_pCTLFontLanguageLB,pFontList,GetWhich( SID_ATTR_CHAR_CTL_FONT ),GetWhich( SID_ATTR_CHAR_CTL_FONTHEIGHT ));
 
     m_aPreviewWin.Invalidate();
     m_aFontTypeFT.SetText( pFontList->GetFontMapText( aFontInfo ) );
diff --git a/svtools/inc/svtools/sampletext.hxx b/svtools/inc/svtools/sampletext.hxx
index 09ba499..f7903d8 100644
--- a/svtools/inc/svtools/sampletext.hxx
+++ b/svtools/inc/svtools/sampletext.hxx
@@ -32,6 +32,7 @@
 #include <rtl/ustring.hxx>
 #include <unicode/uscript.h>
 #include <i18npool/lang.h>
+#include <com/sun/star/i18n/ScriptType.hpp>
 #include <vcl/fontcapabilities.hxx>
 
 class OutputDevice;
@@ -41,13 +42,24 @@ SVT_DLLPUBLIC UScriptCode otCoverageToScript(vcl::UnicodeCoverage::UnicodeCovera
 
 SVT_DLLPUBLIC bool isSymbolFont(const Font &rFont);
 SVT_DLLPUBLIC bool isOpenSymbolFont(const Font &rFont);
+
 SVT_DLLPUBLIC bool canRenderNameOfSelectedFont(OutputDevice &rDevice);
-SVT_DLLPUBLIC rtl::OUString makeRepresentativeSymbolTextForSelectedFont(OutputDevice &rDevice);
-SVT_DLLPUBLIC rtl::OUString makeRepresentativeTextForSelectedFont(OutputDevice &rDevice);
 
+//These ones are typically for use in the font dropdown box beside the
+//fontname, so say things roughly like "Script/Alphabet/Name-Of-Major-Language"
+SVT_DLLPUBLIC rtl::OUString makeShortRepresentativeSymbolTextForSelectedFont(OutputDevice &rDevice);
+SVT_DLLPUBLIC rtl::OUString makeShortRepresentativeTextForSelectedFont(OutputDevice &rDevice);
+SVT_DLLPUBLIC rtl::OUString makeShortRepresentativeTextForScript(UScriptCode eScript);
+//For the cases where the font doesn't fully support a script, but has partial support
+//for a useful subset
+SVT_DLLPUBLIC rtl::OUString makeShortMinimalTextForScript(UScriptCode eScript);
+
+//These ones are typically for use in the font preview window in format character
+SVT_DLLPUBLIC rtl::OUString makeRepresentativeTextForFont(sal_Int16 nScriptType, const Font &rFont);
 SVT_DLLPUBLIC rtl::OUString makeRepresentativeTextForLanguage(LanguageType eLang);
 SVT_DLLPUBLIC rtl::OUString makeRepresentativeTextForScript(UScriptCode eScript);
 SVT_DLLPUBLIC rtl::OUString makeMinimalTextForScript(UScriptCode eScript);
 
+
 #endif
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svtools/source/control/ctrlbox.cxx b/svtools/source/control/ctrlbox.cxx
index bf412d4..e602cef 100644
--- a/svtools/source/control/ctrlbox.cxx
+++ b/svtools/source/control/ctrlbox.cxx
@@ -1344,7 +1344,7 @@ void FontNameBox::UserDraw( const UserDrawEvent& rUDEvt )
             const bool bNameBeginsWithLatinText = rInfo.GetName().GetChar(0) <= 'z';
 
             if (bNameBeginsWithLatinText || !bUsingCorrectFont)
-                sSampleText = makeRepresentativeTextForSelectedFont(*rUDEvt.GetDevice());
+                sSampleText = makeShortRepresentativeTextForSelectedFont(*rUDEvt.GetDevice());
         }
 
         //If we're not a symbol font, but could neither render our own name and
@@ -1389,7 +1389,7 @@ void FontNameBox::UserDraw( const UserDrawEvent& rUDEvt )
 
             for (size_t i = 0; i < SAL_N_ELEMENTS(aScripts); ++i)
             {
-                rtl::OUString sText = makeRepresentativeTextForScript(aScripts[i]);
+                rtl::OUString sText = makeShortRepresentativeTextForScript(aScripts[i]);
                 if (!sText.isEmpty())
                 {
                     bool bHasSampleTextGlyphs = (STRING_LEN == rUDEvt.GetDevice()->HasGlyphs(aFont, sText));
@@ -1409,7 +1409,7 @@ void FontNameBox::UserDraw( const UserDrawEvent& rUDEvt )
 
             for (size_t i = 0; i < SAL_N_ELEMENTS(aMinimalScripts); ++i)
             {
-                rtl::OUString sText = makeMinimalTextForScript(aMinimalScripts[i]);
+                rtl::OUString sText = makeShortMinimalTextForScript(aMinimalScripts[i]);
                 if (!sText.isEmpty())
                 {
                     bool bHasSampleTextGlyphs = (STRING_LEN == rUDEvt.GetDevice()->HasGlyphs(aFont, sText));
@@ -1426,7 +1426,7 @@ void FontNameBox::UserDraw( const UserDrawEvent& rUDEvt )
         //render something representative of what it would like to render then
         //make up some semi-random text that it *can* display
         if (bSymbolFont || (!bUsingCorrectFont && sSampleText.isEmpty()))
-            sSampleText = makeRepresentativeSymbolTextForSelectedFont(*rUDEvt.GetDevice());
+            sSampleText = makeShortRepresentativeSymbolTextForSelectedFont(*rUDEvt.GetDevice());
 
         if (sSampleText.getLength())
         {
diff --git a/svtools/source/misc/sampletext.cxx b/svtools/source/misc/sampletext.cxx
index 45a6ba9..b0f554c 100644
--- a/svtools/source/misc/sampletext.cxx
+++ b/svtools/source/misc/sampletext.cxx
@@ -29,7 +29,9 @@
 #include <svtools/sampletext.hxx>
 #include <vcl/font.hxx>
 #include <vcl/outdev.hxx>
+#include <vcl/virdev.hxx>
 #include <vcl/metric.hxx>
+#include <i18nutil/unicode.hxx>
 
 bool isOpenSymbolFont(const Font &rFont)
 {
@@ -65,7 +67,7 @@ bool canRenderNameOfSelectedFont(OutputDevice &rDevice)
     return !isSymbolFont(rFont) && (STRING_LEN == rDevice.HasGlyphs(rFont, rFont.GetName()));
 }
 
-rtl::OUString makeRepresentativeSymbolTextForSelectedFont(OutputDevice &rDevice)
+rtl::OUString makeShortRepresentativeSymbolTextForSelectedFont(OutputDevice &rDevice)
 {
     const bool bOpenSymbol = isOpenSymbolFont(rDevice.GetFont());
 
@@ -127,7 +129,7 @@ rtl::OUString makeRepresentativeSymbolTextForSelectedFont(OutputDevice &rDevice)
 //readers of the minor languages, e.g. Yiddish is written with the HEBREW
 //script as well, the vast majority of Yiddish readers will be able to read
 //Hebrew as well.
-rtl::OUString makeRepresentativeTextForScript(UScriptCode eScript)
+rtl::OUString makeShortRepresentativeTextForScript(UScriptCode eScript)
 {
     rtl::OUString sSampleText;
     switch (eScript)
@@ -410,7 +412,54 @@ rtl::OUString makeRepresentativeTextForScript(UScriptCode eScript)
     return sSampleText;
 }
 
-rtl::OUString makeMinimalTextForScript(UScriptCode eScript)
+rtl::OUString makeRepresentativeTextForScript(UScriptCode eScript)
+{
+    rtl::OUString sSampleText;
+    switch (eScript)
+    {
+        case USCRIPT_TRADITIONAL_HAN:
+        case USCRIPT_SIMPLIFIED_HAN:
+        case USCRIPT_HAN:
+        {
+            //Three Character Classic
+            const sal_Unicode aZh[] = {
+                0x4EBA, 0x4E4B, 0x521D, 0x0020, 0x6027, 0x672C, 0x5584
+            };
+            sSampleText = rtl::OUString(aZh, SAL_N_ELEMENTS(aZh));
+            break;
+        }
+        case USCRIPT_JAPANESE:
+        {
+            //Iroha
+            const sal_Unicode aJa[] = {
+                0x8272, 0x306F, 0x5302, 0x3078, 0x3069, 0x0020, 0x6563,
+                0x308A, 0x306C, 0x308B, 0x3092
+            };
+            sSampleText = rtl::OUString(aJa, SAL_N_ELEMENTS(aJa));
+            break;
+        }
+        case USCRIPT_KOREAN:
+        case USCRIPT_HANGUL:
+        {
+            //The essential condition for...
+            const sal_Unicode aKo[] = {
+                0xD0A4, 0xC2A4, 0xC758, 0x0020, 0xACE0, 0xC720, 0xC870,
+                0xAC74, 0xC740
+            };
+            sSampleText = rtl::OUString(aKo, SAL_N_ELEMENTS(aKo));
+            break;
+        }
+        default:
+            break;
+    }
+
+    if (sSampleText.isEmpty())
+        sSampleText = makeShortRepresentativeTextForScript(eScript);
+    return sSampleText;
+
+}
+
+rtl::OUString makeShortMinimalTextForScript(UScriptCode eScript)
 {
     rtl::OUString sSampleText;
     switch (eScript)
@@ -437,34 +486,27 @@ rtl::OUString makeMinimalTextForScript(UScriptCode eScript)
     return sSampleText;
 }
 
+rtl::OUString makeMinimalTextForScript(UScriptCode eScript)
+{
+    return makeShortMinimalTextForScript(eScript);
+}
+
 //These ones are typically for use in the font preview window in format
 //character
 //
 //There we generally know the language. Though its possible for the language to
 //be "none".
 //
-//Currently we fall back to makeRepresentativeTextForScript as I don't have
-//suitable strings
+//Currently we fall back to makeShortRepresentativeTextForScript when we don't
+//have suitable strings
 rtl::OUString makeRepresentativeTextForLanguage(LanguageType eLang)
 {
-    switch( eLang )
-    {
-        case LANGUAGE_CHINESE:
-            return makeRepresentativeTextForScript(USCRIPT_HAN);
-
-        case LANGUAGE_CHINESE_TRADITIONAL:
-        case LANGUAGE_CHINESE_HONGKONG:
-        case LANGUAGE_CHINESE_MACAU:
-            return makeRepresentativeTextForScript(USCRIPT_TRADITIONAL_HAN);
-
-        case LANGUAGE_CHINESE_SIMPLIFIED:
-        case LANGUAGE_CHINESE_SINGAPORE:
-            return makeRepresentativeTextForScript(USCRIPT_SIMPLIFIED_HAN);
-    }
-
     rtl::OUString sRet;
     switch( eLang & LANGUAGE_MASK_PRIMARY )
     {
+        case LANGUAGE_CHINESE & LANGUAGE_MASK_PRIMARY:
+            sRet = makeRepresentativeTextForScript(USCRIPT_HAN);
+            break;
         case LANGUAGE_GREEK & LANGUAGE_MASK_PRIMARY:
             sRet = makeRepresentativeTextForScript(USCRIPT_GREEK);
             break;
@@ -893,47 +935,74 @@ namespace
     }
 #endif
 
+    boost::dynamic_bitset<sal_uInt32> getMaskByScriptType(sal_Int16 nScriptType)
+    {
+        boost::dynamic_bitset<sal_uInt32> aMask(vcl::UnicodeCoverage::MAX_UC_ENUM);
+        aMask.set();
+
+        for (size_t i = 0; i < vcl::UnicodeCoverage::MAX_UC_ENUM; ++i)
+        {
+            using vcl::UnicodeCoverage::UnicodeCoverageEnum;
+            UScriptCode eScriptCode = otCoverageToScript(static_cast<UnicodeCoverageEnum>(i));
+            if (unicode::getScriptClassFromUScriptCode(eScriptCode) == nScriptType)
+                aMask.set(i, false);
+        }
+
+        return aMask;
+    }
+
+    //false for all bits considered "Latin" by LibreOffice
+    boost::dynamic_bitset<sal_uInt32> getLatinMask()
+    {
+        static boost::dynamic_bitset<sal_uInt32> aMask(getMaskByScriptType(com::sun::star::i18n::ScriptType::LATIN));
+        return aMask;
+    }
+
+    //false for all bits considered "Asian" by LibreOffice
+    boost::dynamic_bitset<sal_uInt32> getCJKMask()
+    {
+        static boost::dynamic_bitset<sal_uInt32> aMask(getMaskByScriptType(com::sun::star::i18n::ScriptType::ASIAN));
+        return aMask;
+    }
+
+    //false for all bits considered "Complex" by LibreOffice
+    boost::dynamic_bitset<sal_uInt32> getCTLMask()
+    {
+        static boost::dynamic_bitset<sal_uInt32> aMask(getMaskByScriptType(com::sun::star::i18n::ScriptType::COMPLEX));
+        return aMask;
+    }
+
+    //false for all bits considered "WEAK" by LibreOffice
+    boost::dynamic_bitset<sal_uInt32> getWeakMask()
+    {
+        static boost::dynamic_bitset<sal_uInt32> aMask(getMaskByScriptType(com::sun::star::i18n::ScriptType::WEAK));
+        return aMask;
+    }
+
+    //Nearly every font supports some basic Latin
+    boost::dynamic_bitset<sal_uInt32> getCommonLatnSubsetMask()
+    {
+        boost::dynamic_bitset<sal_uInt32> aMask(vcl::UnicodeCoverage::MAX_UC_ENUM);
+        aMask.set();
+        aMask.set(vcl::UnicodeCoverage::BASIC_LATIN, false);
+        aMask.set(vcl::UnicodeCoverage::LATIN_1_SUPPLEMENT, false);
+        aMask.set(vcl::UnicodeCoverage::LATIN_EXTENDED_A, false);
+        aMask.set(vcl::UnicodeCoverage::LATIN_EXTENDED_B, false);
+        aMask.set(vcl::UnicodeCoverage::LATIN_EXTENDED_ADDITIONAL, false);
+        return aMask;
+    }
+
+    boost::dynamic_bitset<sal_uInt32> getGenericMask()
+    {
+        static boost::dynamic_bitset<sal_uInt32> aMask(getWeakMask() & getCommonLatnSubsetMask());
+        return aMask;
+    }
+
     UScriptCode getScript(const vcl::FontCapabilities &rFontCapabilities)
     {
         using vcl::UnicodeCoverage::UnicodeCoverageEnum;
 
-        boost::dynamic_bitset<sal_uInt32> aGenericMask(vcl::UnicodeCoverage::MAX_UC_ENUM);
-        aGenericMask.set();
-        aGenericMask.set(vcl::UnicodeCoverage::BASIC_LATIN, false);
-        aGenericMask.set(vcl::UnicodeCoverage::LATIN_1_SUPPLEMENT, false);
-        aGenericMask.set(vcl::UnicodeCoverage::LATIN_EXTENDED_A, false);
-        aGenericMask.set(vcl::UnicodeCoverage::LATIN_EXTENDED_B, false);
-        aGenericMask.set(vcl::UnicodeCoverage::IPA_EXTENSIONS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::SPACING_MODIFIER_LETTERS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::COMBINING_DIACRITICAL_MARKS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::COMBINING_DIACRITICAL_MARKS_FOR_SYMBOLS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::LATIN_EXTENDED_ADDITIONAL, false);
-        aGenericMask.set(vcl::UnicodeCoverage::GENERAL_PUNCTUATION, false);
-        aGenericMask.set(vcl::UnicodeCoverage::GEOMETRIC_SHAPES, false);
-        aGenericMask.set(vcl::UnicodeCoverage::SUPERSCRIPTS_AND_SUBSCRIPTS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::CURRENCY_SYMBOLS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::LETTERLIKE_SYMBOLS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::DINGBATS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::PRIVATE_USE_AREA_PLANE_0, false);
-        aGenericMask.set(vcl::UnicodeCoverage::ALPHABETIC_PRESENTATION_FORMS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::NUMBER_FORMS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::ARROWS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::MATHEMATICAL_OPERATORS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::MATHEMATICAL_ALPHANUMERIC_SYMBOLS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::MISCELLANEOUS_TECHNICAL, false);
-        aGenericMask.set(vcl::UnicodeCoverage::CONTROL_PICTURES, false);
-        aGenericMask.set(vcl::UnicodeCoverage::ENCLOSED_ALPHANUMERICS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::BOX_DRAWING, false);
-        aGenericMask.set(vcl::UnicodeCoverage::BLOCK_ELEMENTS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::MISCELLANEOUS_SYMBOLS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::SPECIALS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::NONPLANE_0, false);
-        aGenericMask.set(vcl::UnicodeCoverage::PRIVATE_USE_PLANE_15, false);
-        aGenericMask.set(vcl::UnicodeCoverage::CJK_SYMBOLS_AND_PUNCTUATION, false);
-        aGenericMask.set(vcl::UnicodeCoverage::VARIATION_SELECTORS, false);
-        aGenericMask.set(vcl::UnicodeCoverage::VERTICAL_FORMS, false);
-
-        boost::dynamic_bitset<sal_uInt32> aMasked = rFontCapabilities.maUnicodeRange & aGenericMask;
+        boost::dynamic_bitset<sal_uInt32> aMasked = rFontCapabilities.maUnicodeRange & getGenericMask();
 
         if (aMasked.count() == 1)
             return otCoverageToScript(static_cast<UnicodeCoverageEnum>(aMasked.find_first()));
@@ -970,29 +1039,13 @@ namespace
                 return USCRIPT_GEORGIAN;
         }
 
-        boost::dynamic_bitset<sal_uInt32> aCJKMask(vcl::UnicodeCoverage::MAX_UC_ENUM);
-        aCJKMask.set();
-        aCJKMask.set(vcl::UnicodeCoverage::CJK_SYMBOLS_AND_PUNCTUATION, false);
-        aCJKMask.set(vcl::UnicodeCoverage::HIRAGANA, false);
-        aCJKMask.set(vcl::UnicodeCoverage::KATAKANA, false);
-        aCJKMask.set(vcl::UnicodeCoverage::HANGUL_JAMO, false);
-        aCJKMask.set(vcl::UnicodeCoverage::HANGUL_SYLLABLES, false);
-        aCJKMask.set(vcl::UnicodeCoverage::HANGUL_COMPATIBILITY_JAMO, false);
-        aCJKMask.set(vcl::UnicodeCoverage::ENCLOSED_CJK_LETTERS_AND_MONTHS, false);
-        aCJKMask.set(vcl::UnicodeCoverage::CJK_COMPATIBILITY, false);
-        aCJKMask.set(vcl::UnicodeCoverage::CJK_UNIFIED_IDEOGRAPHS, false);
-        aCJKMask.set(vcl::UnicodeCoverage::CJK_STROKES, false);
-        aCJKMask.set(vcl::UnicodeCoverage::HALFWIDTH_AND_FULLWIDTH_FORMS, false);
-        aCJKMask.set(vcl::UnicodeCoverage::BOPOMOFO, false);
-        aCJKMask.set(vcl::UnicodeCoverage::SMALL_FORM_VARIANTS, false);
-        aCJKMask.set(vcl::UnicodeCoverage::PHAGS_PA, false);
-        aCJKMask.set(vcl::UnicodeCoverage::CYRILLIC, false);
-        aCJKMask.set(vcl::UnicodeCoverage::THAI, false);
-        aCJKMask.set(vcl::UnicodeCoverage::DESERET, false);
-
-        aMasked = aMasked & aCJKMask;
-
-        //So, apparently a CJK font
+        aMasked &= getCJKMask();
+
+        aMasked.set(vcl::UnicodeCoverage::CYRILLIC, false);
+        aMasked.set(vcl::UnicodeCoverage::THAI, false);
+        aMasked.set(vcl::UnicodeCoverage::DESERET, false);
+
+        //So, possibly a CJK font
         if (!aMasked.count())
         {
             boost::dynamic_bitset<sal_uInt32> aCJKCodePageMask(vcl::CodePageCoverage::MAX_CP_ENUM);
@@ -1022,14 +1075,60 @@ namespace
                     return USCRIPT_TRADITIONAL_HAN;
             }
 
-            return USCRIPT_HAN;
+            if (aMaskedCodePage.count())
+                return USCRIPT_HAN;
         }
 
         return USCRIPT_COMMON;
     }
 }
 
-rtl::OUString makeRepresentativeTextForSelectedFont(OutputDevice &rDevice)
+namespace
+{
+    UScriptCode attemptToDisambiguateHan(UScriptCode eScript, OutputDevice &rDevice)
+    {
+        //If we're a CJK font, see if we seem to be tuned for C, J or K
+        if (eScript == USCRIPT_HAN)
+        {
+            const Font &rFont = rDevice.GetFont();
+
+            bool bKore = false, bJpan = false, bHant = false, bHans = false;
+
+            const sal_Unicode aKorean[] = { 0x3131 };
+            rtl::OUString sKorean(aKorean, SAL_N_ELEMENTS(aKorean));
+            if (STRING_LEN == rDevice.HasGlyphs(rFont, sKorean))
+                bKore = true;
+
+            const sal_Unicode aJapanese[] = { 0x3007, 0x9F9D };
+            rtl::OUString sJapanese(aJapanese, SAL_N_ELEMENTS(aJapanese));
+            if (STRING_LEN == rDevice.HasGlyphs(rFont, sJapanese))
+                bJpan = true;
+
+            const sal_Unicode aTraditionalChinese[] = { 0x570B };
+            rtl::OUString sTraditionalChinese(aTraditionalChinese, SAL_N_ELEMENTS(aTraditionalChinese));
+            if (STRING_LEN == rDevice.HasGlyphs(rFont, sTraditionalChinese))
+                bHant = true;
+
+            const sal_Unicode aSimplifiedChinese[] = { 0x56FD };
+            rtl::OUString sSimplifiedChinese(aSimplifiedChinese, SAL_N_ELEMENTS(aSimplifiedChinese));
+            if (STRING_LEN == rDevice.HasGlyphs(rFont, sSimplifiedChinese))
+                bHans = true;
+
+            if (bKore && !bJpan && !bHans)
+                eScript = USCRIPT_KOREAN;
+            else if (bJpan && !bKore && !bHant)
+                eScript = USCRIPT_JAPANESE;
+            else if (bHant && !bHans && !bKore && !bJpan)
+                eScript = USCRIPT_TRADITIONAL_HAN;
+            else if (bHans && !bHant && !bKore && !bJpan)
+                eScript = USCRIPT_SIMPLIFIED_HAN;
+            //otherwise fall-through as USCRIPT_HAN and expect a combind Hant/Hans preview
+        }
+        return eScript;
+    }
+}
+
+rtl::OUString makeShortRepresentativeTextForSelectedFont(OutputDevice &rDevice)
 {
     vcl::FontCapabilities aFontCapabilities;
     if (!rDevice.GetFontCapabilities(aFontCapabilities))
@@ -1042,6 +1141,8 @@ rtl::OUString makeRepresentativeTextForSelectedFont(OutputDevice &rDevice)
     lcl_dump_codepage_coverage(aFontCapabilities.maCodePageRange);
 #endif
 
+    aFontCapabilities.maUnicodeRange &= getGenericMask();
+
     //If this font is probably tuned to display a single non-Latin
     //script and the font name is itself in Latin, then show a small
     //chunk of representative text for that script
@@ -1049,46 +1150,10 @@ rtl::OUString makeRepresentativeTextForSelectedFont(OutputDevice &rDevice)
     if (!eScript != USCRIPT_COMMON)
         return rtl::OUString();
 
-    const Font &rFont = rDevice.GetFont();
+    eScript = attemptToDisambiguateHan(eScript, rDevice);
 
-    //If we're a CJK font, see if we seem to be tuned for C, J or K
-    if (eScript == USCRIPT_HAN)
-    {
-        bool bKore = false, bJpan = false, bHant = false, bHans = false;
-
-        const sal_Unicode aKorean[] = { 0x3131 };
-        rtl::OUString sKorean(aKorean, SAL_N_ELEMENTS(aKorean));
-        if (STRING_LEN == rDevice.HasGlyphs(rFont, sKorean))
-            bKore = true;
-
-        const sal_Unicode aJapanese[] = { 0x3007, 0x9F9D };
-        rtl::OUString sJapanese(aJapanese, SAL_N_ELEMENTS(aJapanese));
-        if (STRING_LEN == rDevice.HasGlyphs(rFont, sJapanese))
-            bJpan = true;
-
-        const sal_Unicode aTraditionalChinese[] = { 0x570B };
-        rtl::OUString sTraditionalChinese(aTraditionalChinese, SAL_N_ELEMENTS(aTraditionalChinese));
-        if (STRING_LEN == rDevice.HasGlyphs(rFont, sTraditionalChinese))
-            bHant = true;
-
-        const sal_Unicode aSimplifiedChinese[] = { 0x56FD };
-        rtl::OUString sSimplifiedChinese(aSimplifiedChinese, SAL_N_ELEMENTS(aSimplifiedChinese));
-        if (STRING_LEN == rDevice.HasGlyphs(rFont, sSimplifiedChinese))
-            bHans = true;
-
-        if (bKore && !bJpan && !bHans)
-            eScript = USCRIPT_KOREAN;
-        else if (bJpan && !bKore && !bHant)
-            eScript = USCRIPT_JAPANESE;
-        else if (bHant && !bHans && !bKore && !bJpan)
-            eScript = USCRIPT_TRADITIONAL_HAN;
-        else if (bHans && !bHant && !bKore && !bJpan)
-            eScript = USCRIPT_SIMPLIFIED_HAN;
-        //otherwise fall-through as USCRIPT_HAN and expect a combind Hant/Hans preview
-    }
-
-    rtl::OUString sSampleText = makeRepresentativeTextForScript(eScript);
-    bool bHasSampleTextGlyphs = (STRING_LEN == rDevice.HasGlyphs(rFont, sSampleText));
+    rtl::OUString sSampleText = makeShortRepresentativeTextForScript(eScript);
+    bool bHasSampleTextGlyphs = (STRING_LEN == rDevice.HasGlyphs(rDevice.GetFont(), sSampleText));
     return bHasSampleTextGlyphs ? sSampleText : rtl::OUString();
 }
 
@@ -1101,7 +1166,6 @@ UScriptCode otCoverageToScript(vcl::UnicodeCoverage::UnicodeCoverageEnum eOTCove
         case vcl::UnicodeCoverage::LATIN_1_SUPPLEMENT:
         case vcl::UnicodeCoverage::LATIN_EXTENDED_A:
         case vcl::UnicodeCoverage::LATIN_EXTENDED_B:
-        case vcl::UnicodeCoverage::IPA_EXTENSIONS:
             eRet = USCRIPT_LATIN;
             break;
         case vcl::UnicodeCoverage::COMBINING_DIACRITICAL_MARKS:
@@ -1390,6 +1454,7 @@ UScriptCode otCoverageToScript(vcl::UnicodeCoverage::UnicodeCoverageEnum eOTCove
         case vcl::UnicodeCoverage::PHAISTOS_DISC:
             eRet = USCRIPT_SYMBOLS;
             break;
+        case vcl::UnicodeCoverage::IPA_EXTENSIONS:
         case vcl::UnicodeCoverage::SPECIALS:
         case vcl::UnicodeCoverage::HALFWIDTH_AND_FULLWIDTH_FORMS:
         case vcl::UnicodeCoverage::VERTICAL_FORMS:
@@ -1413,4 +1478,64 @@ UScriptCode otCoverageToScript(vcl::UnicodeCoverage::UnicodeCoverageEnum eOTCove
     return eRet;
 }
 
+rtl::OUString makeRepresentativeTextForFont(sal_Int16 nScriptType, const Font &rFont)
+{
+    rtl::OUString sRet(makeRepresentativeTextForLanguage(rFont.GetLanguage()));
+
+    if (sRet.isEmpty())
+    {
+        VirtualDevice aDevice;
+        aDevice.SetFont(rFont);
+        vcl::FontCapabilities aFontCapabilities;
+        if (aDevice.GetFontCapabilities(aFontCapabilities))
+        {
+#if OSL_DEBUG_LEVEL > 2
+            lcl_dump_unicode_coverage(aFontCapabilities.maUnicodeRange);
+#endif
+
+            aFontCapabilities.maUnicodeRange &= getWeakMask();
+
+            if (nScriptType != com::sun::star::i18n::ScriptType::ASIAN)
+            {
+                aFontCapabilities.maUnicodeRange &= getCJKMask();
+                aFontCapabilities.maCodePageRange =
+                    boost::dynamic_bitset<sal_uInt32>(aFontCapabilities.maCodePageRange.size());
+            }
+            if (nScriptType != com::sun::star::i18n::ScriptType::LATIN)
+                aFontCapabilities.maUnicodeRange &= getLatinMask();
+            if (nScriptType != com::sun::star::i18n::ScriptType::COMPLEX)
+                aFontCapabilities.maUnicodeRange &= getCTLMask();
+
+#if OSL_DEBUG_LEVEL > 2
+            fprintf(stderr, "minimal\n");
+            lcl_dump_unicode_coverage(aFontCapabilities.maUnicodeRange);
+            lcl_dump_codepage_coverage(aFontCapabilities.maCodePageRange);
+#endif
+
+            UScriptCode eScript = getScript(aFontCapabilities);
+
+            if (nScriptType == com::sun::star::i18n::ScriptType::ASIAN)
+                eScript = attemptToDisambiguateHan(eScript, aDevice);
+
+            sRet = makeRepresentativeTextForScript(eScript);
+        }
+
+        if (sRet.isEmpty())
+        {
+            if (nScriptType == com::sun::star::i18n::ScriptType::COMPLEX)
+            {
+                sRet = makeRepresentativeTextForScript(USCRIPT_HEBREW);
+                if (STRING_LEN != aDevice.HasGlyphs(rFont, sRet))
+                {
+                    sRet = makeMinimalTextForScript(USCRIPT_HEBREW);
+                    if (STRING_LEN != aDevice.HasGlyphs(rFont, sRet))
+                        sRet = makeRepresentativeTextForScript(USCRIPT_ARABIC);
+                }
+            }
+        }
+    }
+
+    return sRet;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/inc/svx/fntctrl.hxx b/svx/inc/svx/fntctrl.hxx
index 2d50833..6a5c32f 100644
--- a/svx/inc/svx/fntctrl.hxx
+++ b/svx/inc/svx/fntctrl.hxx
@@ -53,7 +53,8 @@ private:
 
     SVX_DLLPRIVATE void InitSettings( sal_Bool bForeground, sal_Bool bBackground );
     SVX_DLLPRIVATE void Init ();
-    SVX_DLLPRIVATE void SetFontSize( const SfxItemSet& rSet, sal_uInt16 nSlot, SvxFont& rFont );
+    SVX_DLLPRIVATE void SetFontSize(const SfxItemSet& rSet, sal_uInt16 nSlot, SvxFont& rFont);
+    SVX_DLLPRIVATE void SetFontLang(const SfxItemSet& rSet, sal_uInt16 nSlot, SvxFont& rFont);
 
 public:
                         SvxFontPrevWindow( Window* pParent );
diff --git a/svx/source/dialog/fntctrl.cxx b/svx/source/dialog/fntctrl.cxx
index 4e8db69..c9548d9 100644
--- a/svx/source/dialog/fntctrl.cxx
+++ b/svx/source/dialog/fntctrl.cxx
@@ -48,6 +48,7 @@
 #endif
 #include <vector>
 #include <svtools/colorcfg.hxx>
+#include <svtools/sampletext.hxx>
 
 #include <svx/fntctrl.hxx>
 #include <svx/dialogs.hrc>
@@ -80,6 +81,7 @@
 #include <editeng/charreliefitem.hxx>       // SvxCharReliefItem
 #include <editeng/twolinesitem.hxx>         // SvxTwoLinesItem
 #include <editeng/charscaleitem.hxx>        // SvxCharScaleWidthItem
+#include <editeng/langitem.hxx>     // SvxLanguageItem
 
 // define ----------------------------------------------------------------
 
@@ -694,18 +696,20 @@ void SvxFontPrevWindow::Paint( const Rectangle& )
 
             if ( !pImpl->bSelection || pImpl->bUseFontNameAsText )
             {
+                using namespace com::sun::star::i18n::ScriptType;
                 pImpl->aText = rFont.GetName();
                 if (pImpl->m_bCJKEnabled)
                 {
                     if (pImpl->aText.Len())
                         pImpl->aText.AppendAscii("   ");
-                    pImpl->aText += rCJKFont.GetName();
+                    pImpl->aText += makeRepresentativeTextForFont(ASIAN, rCJKFont);
+
                 }
                 if (pImpl->m_bCTLEnabled)
                 {
                     if (pImpl->aText.Len())
                         pImpl->aText.AppendAscii("   ");
-                    pImpl->aText += rCTLFont.GetName();
+                    pImpl->aText += makeRepresentativeTextForFont(COMPLEX, rCTLFont);
                 }
             }
 
@@ -919,13 +923,13 @@ static void SetPrevFontStyle( const SfxItemSet& rSet, sal_uInt16 nPosture, sal_u
     sal_uInt16 nWhich;
     if( GetWhich( rSet, nPosture, nWhich ) )
     {
-        const SvxPostureItem& rItem = ( SvxPostureItem& ) rSet.Get( nWhich );
+        const SvxPostureItem& rItem = ( const SvxPostureItem& ) rSet.Get( nWhich );
         rFont.SetItalic( ( FontItalic ) rItem.GetValue() != ITALIC_NONE ? ITALIC_NORMAL : ITALIC_NONE );
     }
 
     if( GetWhich( rSet, nWeight, nWhich ) )
     {
-        SvxWeightItem& rItem = ( SvxWeightItem& ) rSet.Get( nWhich );
+        const SvxWeightItem& rItem = ( const SvxWeightItem& ) rSet.Get( nWhich );
         rFont.SetWeight( ( FontWeight ) rItem.GetValue() != WEIGHT_NORMAL ? WEIGHT_BOLD : WEIGHT_NORMAL );
     }
 }
@@ -946,6 +950,17 @@ void SvxFontPrevWindow::SetFontSize( const SfxItemSet& rSet, sal_uInt16 nSlot, S
     rFont.SetSize( Size( 0, nH ) );
 }
 
+void SvxFontPrevWindow::SetFontLang(const SfxItemSet& rSet, sal_uInt16 nSlot, SvxFont& rFont)
+{
+    sal_uInt16 nWhich;
+    LanguageType nLang;
+    if( GetWhich( rSet, nSlot, nWhich ) )
+        nLang = static_cast<const SvxLanguageItem&>(rSet.Get(nWhich)).GetLanguage();
+    else
+        nLang = LANGUAGE_NONE;
+    rFont.SetLanguage(nLang);
+}
+
 static void SetPrevFontEscapement(SvxFont& _rFont, sal_uInt8 nProp, sal_uInt8 nEscProp, short nEsc )
 {
     _rFont.SetPropr( nProp );
@@ -1121,6 +1136,11 @@ void SvxFontPrevWindow::SetFromItemSet( const SfxItemSet &rSet,
     SetFontSize( rSet, SID_ATTR_CHAR_CJK_FONTHEIGHT, rCJKFont );
     SetFontSize( rSet, SID_ATTR_CHAR_CTL_FONTHEIGHT, rCTLFont );
 
+    // Language
+    SetFontLang( rSet, SID_ATTR_CHAR_LANGUAGE, rFont );
+    SetFontLang( rSet, SID_ATTR_CHAR_CJK_LANGUAGE, rCJKFont );
+    SetFontLang( rSet, SID_ATTR_CHAR_CTL_LANGUAGE, rCTLFont );
+
     // Color
     if( GetWhich( rSet, SID_ATTR_CHAR_COLOR, nWhich ) )
     {
@@ -1364,6 +1384,11 @@ void SvxFontPrevWindow::Init( const SfxItemSet& rSet )
     SetFontSize( rSet, SID_ATTR_CHAR_CJK_FONTHEIGHT, rCJKFont );
     SetFontSize( rSet, SID_ATTR_CHAR_CTL_FONTHEIGHT, rCTLFont );
 
+    // Language
+    SetFontLang( rSet, SID_ATTR_CHAR_LANGUAGE, rFont );
+    SetFontLang( rSet, SID_ATTR_CHAR_CJK_LANGUAGE, rCJKFont );
+    SetFontLang( rSet, SID_ATTR_CHAR_CTL_LANGUAGE, rCTLFont );
+
     // Color
     nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_COLOR );
     if( ISITEMSET )
commit 41c083a7ade3feb7f5b6516f859db00fa8e2cf72
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Oct 20 22:04:34 2011 +0100

    expose an API to map from UScriptCode to i18n::ScriptType

diff --git a/i18npool/source/breakiterator/breakiteratorImpl.cxx b/i18npool/source/breakiterator/breakiteratorImpl.cxx
index e81bfff..fcc8376 100644
--- a/i18npool/source/breakiterator/breakiteratorImpl.cxx
+++ b/i18npool/source/breakiterator/breakiteratorImpl.cxx
@@ -31,6 +31,7 @@
 
 #include <breakiteratorImpl.hxx>
 #include <unicode/uchar.h>
+#include <i18nutil/unicode.hxx>
 #include <rtl/ustrbuf.hxx>
 
 using namespace ::com::sun::star::uno;
@@ -445,64 +446,10 @@ sal_Int16 SAL_CALL BreakIteratorImpl::getWordType( const OUString& /*Text*/,
 
 namespace
 {
-    //See unicode/uscript.h
-    static sal_Int16 scriptTypes[] =
-    {
-        ScriptType::WEAK, ScriptType::WEAK, ScriptType::COMPLEX, ScriptType::LATIN, ScriptType::COMPLEX,
-        ScriptType::ASIAN, ScriptType::LATIN, ScriptType::LATIN, ScriptType::LATIN, ScriptType::COMPLEX,
-        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::LATIN, ScriptType::LATIN, ScriptType::LATIN,
-    // 15
-        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::ASIAN, ScriptType::ASIAN, ScriptType::COMPLEX,
-        ScriptType::ASIAN, ScriptType::COMPLEX, ScriptType::ASIAN, ScriptType::COMPLEX, ScriptType::COMPLEX,
-        ScriptType::LATIN, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::LATIN,
-    // 30
-        ScriptType::LATIN, ScriptType::COMPLEX, ScriptType::LATIN, ScriptType::COMPLEX, ScriptType::COMPLEX,
-        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
-        ScriptType::LATIN, ScriptType::ASIAN, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
-    // 45
-        ScriptType::COMPLEX, ScriptType::LATIN, ScriptType::LATIN, ScriptType::COMPLEX, ScriptType::COMPLEX,
-        ScriptType::LATIN, ScriptType::LATIN, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::LATIN,
-        ScriptType::COMPLEX, ScriptType::LATIN, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
-    // 60
-        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
-        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::LATIN, ScriptType::LATIN, ScriptType::COMPLEX,
-        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::ASIAN, ScriptType::ASIAN,
-    // 75
-        ScriptType::COMPLEX, ScriptType::LATIN, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
-        ScriptType::LATIN, ScriptType::LATIN, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
-        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
-    // 90
-        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
-        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
-        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::WEAK, ScriptType::WEAK, ScriptType::COMPLEX,
-    // 105
-        ScriptType::ASIAN, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
-        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
-        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::ASIAN,
-    // 120
-        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
-        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::WEAK, ScriptType::WEAK,
-        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
-    // 135
-        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
-        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
-        ScriptType::COMPLEX,
-        ScriptType::WEAK
-    };
-
-#   define scriptTypesCount SAL_N_ELEMENTS(scriptTypes)
-
     sal_Int16 getScriptClassByUAX24Script(sal_uInt32 currentChar)
     {
-        sal_Int16 nRet;
         int32_t script = u_getIntPropertyValue(currentChar, UCHAR_SCRIPT);
-        if (script < 0)
-            nRet = ScriptType::WEAK;
-        else if (static_cast<size_t>(script) >= SAL_N_ELEMENTS(scriptTypes))
-            nRet = ScriptType::COMPLEX;         // anything new is going to be pretty wild
-        else
-            nRet = scriptTypes[script];
-        return nRet;
+        return unicode::getScriptClassFromUScriptCode(static_cast<UScriptCode>(script));
     }
 
     struct UBlock2Script
diff --git a/i18nutil/inc/i18nutil/unicode.hxx b/i18nutil/inc/i18nutil/unicode.hxx
index f865552..d5e72b1 100644
--- a/i18nutil/inc/i18nutil/unicode.hxx
+++ b/i18nutil/inc/i18nutil/unicode.hxx
@@ -30,6 +30,7 @@
 
 #include <com/sun/star/i18n/UnicodeScript.hpp>
 #include <sal/types.h>
+#include <unicode/uscript.h>
 #include "i18nutildllapi.h"
 
 typedef struct _ScriptTypeList {
@@ -61,6 +62,9 @@ public:
     static sal_Bool SAL_CALL isWhiteSpace( const sal_Unicode ch);
     static sal_Bool SAL_CALL isAlphaDigit( const sal_Unicode ch);
     static sal_Bool SAL_CALL isPunctuation( const sal_Unicode ch);
+
+    //Map an ISO 15924 script code to Latin/Asian/Complex/Weak
+    static sal_Int16 SAL_CALL getScriptClassFromUScriptCode(UScriptCode eScript);
 };
 
 #endif
diff --git a/i18nutil/source/utility/unicode.cxx b/i18nutil/source/utility/unicode.cxx
index f04faa5..b0a97d6 100644
--- a/i18nutil/source/utility/unicode.cxx
+++ b/i18nutil/source/utility/unicode.cxx
@@ -28,6 +28,7 @@
 
 #include <com/sun/star/i18n/UnicodeType.hpp>
 #include <com/sun/star/i18n/KCharacterType.hpp>
+#include <com/sun/star/i18n/ScriptType.hpp>
 #include <i18nutil/unicode.hxx>
 #include "unicode_data.h"
 
@@ -497,5 +498,61 @@ sal_Int32 SAL_CALL unicode::getCharType( const sal_Unicode ch )
     }
 }
 
+sal_Int16 SAL_CALL unicode::getScriptClassFromUScriptCode(UScriptCode eScript)
+{
+    //See unicode/uscript.h
+    static sal_Int16 scriptTypes[] =
+    {
+        ScriptType::WEAK, ScriptType::WEAK, ScriptType::COMPLEX, ScriptType::LATIN, ScriptType::COMPLEX,
+        ScriptType::ASIAN, ScriptType::LATIN, ScriptType::LATIN, ScriptType::LATIN, ScriptType::COMPLEX,
+        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::LATIN, ScriptType::LATIN, ScriptType::LATIN,
+    // 15
+        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::ASIAN, ScriptType::ASIAN, ScriptType::COMPLEX,
+        ScriptType::ASIAN, ScriptType::COMPLEX, ScriptType::ASIAN, ScriptType::COMPLEX, ScriptType::COMPLEX,
+        ScriptType::LATIN, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::LATIN,
+    // 30
+        ScriptType::LATIN, ScriptType::COMPLEX, ScriptType::LATIN, ScriptType::COMPLEX, ScriptType::COMPLEX,
+        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
+        ScriptType::LATIN, ScriptType::ASIAN, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
+    // 45
+        ScriptType::COMPLEX, ScriptType::LATIN, ScriptType::LATIN, ScriptType::COMPLEX, ScriptType::COMPLEX,
+        ScriptType::LATIN, ScriptType::LATIN, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::LATIN,
+        ScriptType::COMPLEX, ScriptType::LATIN, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
+    // 60
+        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
+        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::LATIN, ScriptType::LATIN, ScriptType::COMPLEX,
+        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::ASIAN, ScriptType::ASIAN,
+    // 75
+        ScriptType::COMPLEX, ScriptType::LATIN, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
+        ScriptType::LATIN, ScriptType::LATIN, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
+        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
+    // 90
+        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
+        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
+        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::WEAK, ScriptType::WEAK, ScriptType::COMPLEX,
+    // 105
+        ScriptType::ASIAN, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
+        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
+        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::ASIAN,
+    // 120
+        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
+        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::WEAK, ScriptType::WEAK,
+        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
+    // 135
+        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
+        ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX, ScriptType::COMPLEX,
+        ScriptType::COMPLEX,
+        ScriptType::WEAK
+    };
+
+    sal_Int16 nRet;
+    if (eScript < USCRIPT_COMMON)
+        nRet = ScriptType::WEAK;
+    else if (static_cast<size_t>(eScript) >= SAL_N_ELEMENTS(scriptTypes))
+        nRet = ScriptType::COMPLEX;         // anything new is going to be pretty wild
+    else
+        nRet = scriptTypes[eScript];
+    return nRet;
+}
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit c57ba94721a152db405716753a15c870401c3a63
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Oct 20 13:36:45 2011 +0100

    drop confusing and unused single font setters

diff --git a/reportdesign/source/ui/dlg/Condition.cxx b/reportdesign/source/ui/dlg/Condition.cxx
index a5d55fb..10520e3 100644
--- a/reportdesign/source/ui/dlg/Condition.cxx
+++ b/reportdesign/source/ui/dlg/Condition.cxx
@@ -674,7 +674,7 @@ void Condition::updateToolbar(const uno::Reference< report::XReportControlFormat
             aFont.SetEmphasisMark( static_cast< FontEmphasisMark >( _xReportControlFormat->getControlTextEmphasis() ) );
             aFont.SetRelief( static_cast< FontRelief >( _xReportControlFormat->getCharRelief() ) );
             aFont.SetColor( _xReportControlFormat->getCharColor() );
-            m_aPreview.SetFont( aFont );
+            m_aPreview.SetFont( aFont, aFont, aFont );
             m_aPreview.SetBackColor( _xReportControlFormat->getControlBackground() );
             m_aPreview.SetTextLineColor( Color( _xReportControlFormat->getCharUnderlineColor() ) );
         }
diff --git a/svx/inc/svx/fntctrl.hxx b/svx/inc/svx/fntctrl.hxx
index 7adc049..2d50833 100644
--- a/svx/inc/svx/fntctrl.hxx
+++ b/svx/inc/svx/fntctrl.hxx
@@ -68,10 +68,7 @@ public:
     // for reasons of efficiency not const
     SvxFont&            GetFont();
     const SvxFont&      GetFont() const;
-    void                SetFont( const SvxFont& rFont );
     void                SetFont( const SvxFont& rNormalFont, const SvxFont& rCJKFont, const SvxFont& rCTLFont );
-    void                SetCJKFont( const SvxFont& rFont );
-    void                SetCTLFont( const SvxFont& rFont );
     SvxFont&            GetCJKFont();
     SvxFont&            GetCTLFont();
     void                SetColor( const Color& rColor );
diff --git a/svx/source/dialog/fntctrl.cxx b/svx/source/dialog/fntctrl.cxx
index 2f5dcf0..4e8db69 100644
--- a/svx/source/dialog/fntctrl.cxx
+++ b/svx/source/dialog/fntctrl.cxx
@@ -599,16 +599,6 @@ void SvxFontPrevWindow::SetFontNameAsPreviewText()
 
 // -----------------------------------------------------------------------
 
-void SvxFontPrevWindow::SetFont( const SvxFont& rOutFont )
-{
-    setFont( rOutFont, pImpl->aFont );
-
-    pImpl->Invalidate100PercentFontWidth();
-    Invalidate();
-}
-
-// -----------------------------------------------------------------------
-
 void SvxFontPrevWindow::SetFont( const SvxFont& rNormalOutFont, const SvxFont& rCJKOutFont, const SvxFont& rCTLFont )
 {
     setFont( rNormalOutFont, pImpl->aFont );
@@ -622,24 +612,6 @@ void SvxFontPrevWindow::SetFont( const SvxFont& rNormalOutFont, const SvxFont& r
 
 // -----------------------------------------------------------------------
 
-void SvxFontPrevWindow::SetCJKFont( const SvxFont &rCJKOutFont )
-{
-    setFont( rCJKOutFont, pImpl->aCJKFont );
-
-    pImpl->Invalidate100PercentFontWidth();
-    Invalidate();
-}
-// -----------------------------------------------------------------------------
-void SvxFontPrevWindow::SetCTLFont( const SvxFont &rCTLOutFont )
-{
-    setFont( rCTLOutFont, pImpl->aCTLFont );
-
-    pImpl->Invalidate100PercentFontWidth();
-    Invalidate();
-}
-
-// -----------------------------------------------------------------------
-
 void SvxFontPrevWindow::SetColor(const Color &rColor)
 {
     delete pImpl->pColor;
@@ -1457,7 +1429,7 @@ void SvxFontPrevWindow::SetFont( const SfxItemSet& rSet, sal_uInt16 nSlot, SvxFo
     sal_uInt16 nWhich = rSet.GetPool()->GetWhich( nSlot );
     if( ISITEMSET )
     {
-        const SvxFontItem& rFontItem = ( SvxFontItem& ) rSet.Get( nWhich );
+        const SvxFontItem& rFontItem = (const SvxFontItem&)rSet.Get(nWhich);
         rFont.SetFamily( rFontItem.GetFamily() );
         rFont.SetName( rFontItem.GetFamilyName() );
         rFont.SetPitch( rFontItem.GetPitch() );
diff --git a/unusedcode.easy b/unusedcode.easy
index 60c838c..c6a0ba0 100644
--- a/unusedcode.easy
+++ b/unusedcode.easy
@@ -1025,8 +1025,6 @@ SvxEditSourceHint::SetStartValue(unsigned long)
 SvxEditSourceHint::SetValue(unsigned long)
 SvxFont::DrawText(OutputDevice*, Point const&, String const&, unsigned short, unsigned short) const
 SvxFontPrevWindow::IsTwoLines() const
-SvxFontPrevWindow::SetCJKFont(SvxFont const&)
-SvxFontPrevWindow::SetCTLFont(SvxFont const&)
 SvxFontPrevWindow::SetNoLines(unsigned char)
 SvxFontPrevWindow::SetPreviewBackgroundToCharacter(unsigned char)
 SvxFontPrevWindow::SvxFontPrevWindow(Window*)


More information about the Libreoffice-commits mailing list