]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/fmapbase.cpp
Rework the wxCusor ctor taking wx stock number to provide as many cursors as
[wxWidgets.git] / src / common / fmapbase.cpp
index 759c7541eb789c6f30a159869c1df7302df02af7..15b742ba229707e6dc29f5bff79f53a85669298a 100644 (file)
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
-// Name:        common/fmapbase.cpp
+// Name:        src/common/fmapbase.cpp
 // Purpose:     wxFontMapperBase class implementation
 // Author:      Vadim Zeitlin
 // Modified by:
 // Purpose:     wxFontMapperBase class implementation
 // Author:      Vadim Zeitlin
 // Modified by:
     #include "wx/app.h"
     #include "wx/log.h"
     #include "wx/intl.h"
     #include "wx/app.h"
     #include "wx/log.h"
     #include "wx/intl.h"
+    #include "wx/module.h"
+    #include "wx/wxcrtvararg.h"
 #endif //WX_PRECOMP
 
 #if defined(__WXMSW__)
 #endif //WX_PRECOMP
 
 #if defined(__WXMSW__)
-  #include  "wx/msw/private.h"  // includes windows.h for LOGFONT
-  #include  "wx/msw/winundef.h"
+    #include  "wx/msw/private.h"  // includes windows.h for LOGFONT
+    #include  "wx/msw/winundef.h"
 #endif
 
 #include "wx/fontmap.h"
 #include "wx/fmappriv.h"
 
 #include "wx/apptrait.h"
 #endif
 
 #include "wx/fontmap.h"
 #include "wx/fmappriv.h"
 
 #include "wx/apptrait.h"
-#include "wx/module.h"
 
 // wxMemoryConfig uses wxFileConfig
 #if wxUSE_CONFIG && wxUSE_FILECONFIG
 
 // wxMemoryConfig uses wxFileConfig
 #if wxUSE_CONFIG && wxUSE_FILECONFIG
@@ -73,6 +74,7 @@ static wxFontEncoding gs_encodings[] =
     wxFONTENCODING_ISO8859_15,
     wxFONTENCODING_KOI8,
     wxFONTENCODING_KOI8_U,
     wxFONTENCODING_ISO8859_15,
     wxFONTENCODING_KOI8,
     wxFONTENCODING_KOI8_U,
+    wxFONTENCODING_CP874,
     wxFONTENCODING_CP932,
     wxFONTENCODING_CP936,
     wxFONTENCODING_CP949,
     wxFONTENCODING_CP932,
     wxFONTENCODING_CP936,
     wxFONTENCODING_CP949,
@@ -88,13 +90,15 @@ static wxFontEncoding gs_encodings[] =
     wxFONTENCODING_CP437,
     wxFONTENCODING_UTF7,
     wxFONTENCODING_UTF8,
     wxFONTENCODING_CP437,
     wxFONTENCODING_UTF7,
     wxFONTENCODING_UTF8,
-    wxFONTENCODING_UTF16,
     wxFONTENCODING_UTF16BE,
     wxFONTENCODING_UTF16LE,
     wxFONTENCODING_UTF16BE,
     wxFONTENCODING_UTF16LE,
-    wxFONTENCODING_UTF32,
     wxFONTENCODING_UTF32BE,
     wxFONTENCODING_UTF32LE,
     wxFONTENCODING_EUC_JP,
     wxFONTENCODING_UTF32BE,
     wxFONTENCODING_UTF32LE,
     wxFONTENCODING_EUC_JP,
+    wxFONTENCODING_DEFAULT,
+    wxFONTENCODING_BIG5,
+    wxFONTENCODING_SHIFT_JIS,
+    wxFONTENCODING_GB2312,
 };
 
 // the descriptions for them
 };
 
 // the descriptions for them
@@ -117,6 +121,7 @@ static const wxChar* gs_encodingDescs[] =
     wxTRANSLATE( "Western European with Euro (ISO-8859-15)" ),
     wxTRANSLATE( "KOI8-R" ),
     wxTRANSLATE( "KOI8-U" ),
     wxTRANSLATE( "Western European with Euro (ISO-8859-15)" ),
     wxTRANSLATE( "KOI8-R" ),
     wxTRANSLATE( "KOI8-U" ),
+    wxTRANSLATE( "Windows Thai (CP 874)" ),
     wxTRANSLATE( "Windows Japanese (CP 932)" ),
     wxTRANSLATE( "Windows Chinese Simplified (CP 936)" ),
     wxTRANSLATE( "Windows Korean (CP 949)" ),
     wxTRANSLATE( "Windows Japanese (CP 932)" ),
     wxTRANSLATE( "Windows Chinese Simplified (CP 936)" ),
     wxTRANSLATE( "Windows Korean (CP 949)" ),
@@ -132,62 +137,93 @@ static const wxChar* gs_encodingDescs[] =
     wxTRANSLATE( "Windows/DOS OEM (CP 437)" ),
     wxTRANSLATE( "Unicode 7 bit (UTF-7)" ),
     wxTRANSLATE( "Unicode 8 bit (UTF-8)" ),
     wxTRANSLATE( "Windows/DOS OEM (CP 437)" ),
     wxTRANSLATE( "Unicode 7 bit (UTF-7)" ),
     wxTRANSLATE( "Unicode 8 bit (UTF-8)" ),
+#ifdef WORDS_BIGENDIAN
     wxTRANSLATE( "Unicode 16 bit (UTF-16)" ),
     wxTRANSLATE( "Unicode 16 bit (UTF-16)" ),
-    wxTRANSLATE( "Unicode 16 bit Big Endian (UTF-16BE)" ),
     wxTRANSLATE( "Unicode 16 bit Little Endian (UTF-16LE)" ),
     wxTRANSLATE( "Unicode 32 bit (UTF-32)" ),
     wxTRANSLATE( "Unicode 16 bit Little Endian (UTF-16LE)" ),
     wxTRANSLATE( "Unicode 32 bit (UTF-32)" ),
-    wxTRANSLATE( "Unicode 32 bit Big Endian (UTF-32BE)" ),
     wxTRANSLATE( "Unicode 32 bit Little Endian (UTF-32LE)" ),
     wxTRANSLATE( "Unicode 32 bit Little Endian (UTF-32LE)" ),
+#else // WORDS_BIGENDIAN
+    wxTRANSLATE( "Unicode 16 bit Big Endian (UTF-16BE)" ),
+    wxTRANSLATE( "Unicode 16 bit (UTF-16)" ),
+    wxTRANSLATE( "Unicode 32 bit Big Endian (UTF-32BE)" ),
+    wxTRANSLATE( "Unicode 32 bit (UTF-32)" ),
+#endif // WORDS_BIGENDIAN
     wxTRANSLATE( "Extended Unix Codepage for Japanese (EUC-JP)" ),
     wxTRANSLATE( "Extended Unix Codepage for Japanese (EUC-JP)" ),
+    wxTRANSLATE( "US-ASCII" ),
+    wxTRANSLATE( "BIG5" ),
+    wxTRANSLATE( "SHIFT-JIS" ),
+    wxTRANSLATE( "GB-2312" ),
 };
 
 // and the internal names (these are not translated on purpose!)
 };
 
 // and the internal names (these are not translated on purpose!)
-static const wxChar* gs_encodingNames[] =
+static const wxChar* gs_encodingNames[WXSIZEOF(gs_encodingDescs)][9] =
 {
 {
-    wxT( "iso-8859-1" ),
-    wxT( "iso-8859-2" ),
-    wxT( "iso-8859-3" ),
-    wxT( "iso-8859-4" ),
-    wxT( "iso-8859-5" ),
-    wxT( "iso-8859-6" ),
-    wxT( "iso-8859-7" ),
-    wxT( "iso-8859-8" ),
-    wxT( "iso-8859-9" ),
-    wxT( "iso-8859-10" ),
-    wxT( "iso-8859-11" ),
-    wxT( "iso-8859-12" ),
-    wxT( "iso-8859-13" ),
-    wxT( "iso-8859-14" ),
-    wxT( "iso-8859-15" ),
-    wxT( "koi8-r" ),
-    wxT( "koi8-u" ),
-    wxT( "windows-932" ),
-    wxT( "windows-936" ),
-    wxT( "windows-949" ),
-    wxT( "windows-950" ),
-    wxT( "windows-1250" ),
-    wxT( "windows-1251" ),
-    wxT( "windows-1252" ),
-    wxT( "windows-1253" ),
-    wxT( "windows-1254" ),
-    wxT( "windows-1255" ),
-    wxT( "windows-1256" ),
-    wxT( "windows-1257" ),
-    wxT( "windows-437" ),
-    wxT( "utf-7" ),
-    wxT( "utf-8" ),
-    wxT( "utf-16" ),
-    wxT( "utf-16be" ),
-    wxT( "utf-16le" ),
-    wxT( "utf-32" ),
-    wxT( "utf-32be" ),
-    wxT( "utf-32le" ),
-    wxT( "euc-jp" ),
+    // names from the columns correspond to these OS:
+    //      Linux        Solaris and IRIX       HP-UX             AIX
+    { _T("ISO-8859-1"),  _T("ISO8859-1"),  _T("iso88591"),  _T("8859-1"), wxT("iso_8859_1"), NULL },
+    { _T("ISO-8859-2"),  _T("ISO8859-2"),  _T("iso88592"),  _T("8859-2"), NULL },
+    { _T("ISO-8859-3"),  _T("ISO8859-3"),  _T("iso88593"),  _T("8859-3"), NULL },
+    { _T("ISO-8859-4"),  _T("ISO8859-4"),  _T("iso88594"),  _T("8859-4"), NULL },
+    { _T("ISO-8859-5"),  _T("ISO8859-5"),  _T("iso88595"),  _T("8859-5"), NULL },
+    { _T("ISO-8859-6"),  _T("ISO8859-6"),  _T("iso88596"),  _T("8859-6"), NULL },
+    { _T("ISO-8859-7"),  _T("ISO8859-7"),  _T("iso88597"),  _T("8859-7"), NULL },
+    { _T("ISO-8859-8"),  _T("ISO8859-8"),  _T("iso88598"),  _T("8859-8"), NULL },
+    { _T("ISO-8859-9"),  _T("ISO8859-9"),  _T("iso88599"),  _T("8859-9"), NULL },
+    { _T("ISO-8859-10"), _T("ISO8859-10"), _T("iso885910"), _T("8859-10"), NULL },
+    { _T("ISO-8859-11"), _T("ISO8859-11"), _T("iso885911"), _T("8859-11"), NULL },
+    { _T("ISO-8859-12"), _T("ISO8859-12"), _T("iso885912"), _T("8859-12"), NULL },
+    { _T("ISO-8859-13"), _T("ISO8859-13"), _T("iso885913"), _T("8859-13"), NULL },
+    { _T("ISO-8859-14"), _T("ISO8859-14"), _T("iso885914"), _T("8859-14"), NULL },
+    { _T("ISO-8859-15"), _T("ISO8859-15"), _T("iso885915"), _T("8859-15"), NULL },
+
+    // although koi8-ru is not strictly speaking the same as koi8-r,
+    // they are similar enough to make mapping it to koi8 better than
+    // not recognizing it at all
+    { wxT( "KOI8-R" ), wxT( "KOI8-RU" ), NULL },
+    { wxT( "KOI8-U" ), NULL },
+
+    { wxT( "WINDOWS-874" ), wxT( "CP-874" ), wxT( "MS-874" ), wxT( "IBM-874" ), NULL },
+    { wxT( "WINDOWS-932" ), wxT( "CP-932" ), wxT( "MS-932" ), wxT( "IBM-932" ), NULL },
+    { wxT( "WINDOWS-936" ), wxT( "CP-936" ), wxT( "MS-936" ), wxT( "IBM-936" ), NULL },
+    { wxT( "WINDOWS-949" ), wxT( "CP-949" ), wxT( "MS-949" ), wxT( "IBM-949" ), wxT( "EUC-KR" ), wxT( "eucKR" ), wxT( "euc_kr" ), NULL },
+    { wxT( "WINDOWS-950" ), wxT( "CP-950" ), wxT( "MS-950" ), wxT( "IBM-950" ), NULL },
+    { wxT( "WINDOWS-1250" ),wxT( "CP-1250" ),wxT( "MS-1250" ),wxT( "IBM-1250" ),NULL },
+    { wxT( "WINDOWS-1251" ),wxT( "CP-1251" ),wxT( "MS-1251" ),wxT( "IBM-1251" ),NULL },
+    { wxT( "WINDOWS-1252" ),wxT( "CP-1252" ),wxT( "MS-1252" ),wxT( "IBM-1252" ),NULL },
+    { wxT( "WINDOWS-1253" ),wxT( "CP-1253" ),wxT( "MS-1253" ),wxT( "IBM-1253" ),NULL },
+    { wxT( "WINDOWS-1254" ),wxT( "CP-1254" ),wxT( "MS-1254" ),wxT( "IBM-1254" ),NULL },
+    { wxT( "WINDOWS-1255" ),wxT( "CP-1255" ),wxT( "MS-1255" ),wxT( "IBM-1255" ),NULL },
+    { wxT( "WINDOWS-1256" ),wxT( "CP-1256" ),wxT( "MS-1256" ),wxT( "IBM-1256" ),NULL },
+    { wxT( "WINDOWS-1257" ),wxT( "CP-1257" ),wxT( "MS-1257" ),wxT( "IBM-1257" ),NULL },
+    { wxT( "WINDOWS-437" ), wxT( "CP-437" ), wxT( "MS-437" ), wxT( "IBM-437" ), NULL },
+
+    { wxT( "UTF-7" ), NULL },
+    { wxT( "UTF-8" ), NULL },
+#ifdef WORDS_BIGENDIAN
+    { wxT( "UTF-16BE" ), wxT("UCS-2BE"), wxT( "UTF-16" ), wxT("UCS-2"), NULL },
+    { wxT( "UTF-16LE" ), wxT("UCS-2LE"), NULL },
+    { wxT( "UTF-32BE" ), wxT( "UCS-4BE" ), wxT( "UTF-32" ), wxT( "UCS-4" ), NULL },
+    { wxT( "UTF-32LE" ), wxT( "UCS-4LE" ), NULL },
+#else // WORDS_BIGENDIAN
+    { wxT( "UTF-16BE" ), wxT("UCS-2BE"), NULL },
+    { wxT( "UTF-16LE" ), wxT("UCS-2LE"), wxT( "UTF-16" ), wxT("UCS-2"), NULL },
+    { wxT( "UTF-32BE" ), wxT( "UCS-4BE" ), NULL },
+    { wxT( "UTF-32LE" ), wxT( "UCS-4LE" ), wxT( "UTF-32" ), wxT( "UCS-4" ), NULL },
+#endif // WORDS_BIGENDIAN
+
+    { wxT( "EUC-JP" ), wxT( "eucJP" ), wxT( "euc_jp" ), wxT( "IBM-eucJP" ), NULL },
+
+    // 646 is for Solaris, roman8 -- for HP-UX
+    { wxT( "US-ASCII" ), wxT( "ASCII" ), wxT("C"), wxT("POSIX"), wxT("ANSI_X3.4-1968"),
+      wxT("646"), wxT("roman8"), wxT( "" ), NULL },
+
+    { wxT( "BIG5" ), wxT("big5"), NULL },
+    { wxT( "SJIS" ), wxT( "SHIFT-JIS" ), wxT( "SHIFT_JIS" ), NULL },
+    { wxT( "GB2312" ), NULL },
 };
 
 };
 
-wxCOMPILE_TIME_ASSERT( WXSIZEOF(gs_encodingDescs) == WXSIZEOF(gs_encodings) &&
-                       WXSIZEOF(gs_encodingNames) == WXSIZEOF(gs_encodings),
-                       EncodingsArraysNotInSync );
+wxCOMPILE_TIME_ASSERT( WXSIZEOF(gs_encodingDescs) == WXSIZEOF(gs_encodings), EncodingsArraysNotInSync );
+wxCOMPILE_TIME_ASSERT( WXSIZEOF(gs_encodingNames) == WXSIZEOF(gs_encodings), EncodingsArraysNotInSync );
 
 // ----------------------------------------------------------------------------
 // private classes
 
 // ----------------------------------------------------------------------------
 // private classes
@@ -198,8 +234,25 @@ class wxFontMapperModule : public wxModule
 {
 public:
     wxFontMapperModule() : wxModule() { }
 {
 public:
     wxFontMapperModule() : wxModule() { }
-    virtual bool OnInit() { return true; }
-    virtual void OnExit() { delete wxFontMapperBase::Set(NULL); }
+
+    virtual bool OnInit()
+    {
+        // a dummy wxFontMapperBase object could have been created during the
+        // program startup before wxApp was created, we have to delete it to
+        // allow creating the real font mapper next time it is needed now that
+        // we can create it (when the modules are initialized, wxApp object
+        // already exists)
+        wxFontMapperBase *fm = wxFontMapperBase::Get();
+        if ( fm && fm->IsDummy() )
+            wxFontMapperBase::Reset();
+
+        return true;
+    }
+
+    virtual void OnExit()
+    {
+        wxFontMapperBase::Reset();
+    }
 
     DECLARE_DYNAMIC_CLASS(wxFontMapperModule)
 };
 
     DECLARE_DYNAMIC_CLASS(wxFontMapperModule)
 };
@@ -220,24 +273,19 @@ wxFontMapper *wxFontMapperBase::sm_instance = NULL;
 wxFontMapperBase::wxFontMapperBase()
 {
 #if wxUSE_CONFIG && wxUSE_FILECONFIG
 wxFontMapperBase::wxFontMapperBase()
 {
 #if wxUSE_CONFIG && wxUSE_FILECONFIG
-    m_config = NULL;
-    m_configIsDummy = false;
+    m_configDummy = NULL;
 #endif // wxUSE_CONFIG
 }
 
 wxFontMapperBase::~wxFontMapperBase()
 {
 #if wxUSE_CONFIG && wxUSE_FILECONFIG
 #endif // wxUSE_CONFIG
 }
 
 wxFontMapperBase::~wxFontMapperBase()
 {
 #if wxUSE_CONFIG && wxUSE_FILECONFIG
-    if ( m_configIsDummy )
-        delete m_config;
+    if ( m_configDummy )
+        delete m_configDummy;
 #endif // wxUSE_CONFIG
 }
 
 /* static */
 #endif // wxUSE_CONFIG
 }
 
 /* static */
-// Declared as returning wxFontMapper when wxUSE_GUI=1.  Unfortunately, it's
-// only implemented in wxBase library.  Note that if the last resort
-// is taken and GUI code tries to treat it as a real wxFontMapper
-// then you'd be in trouble.
 wxFontMapperBase *wxFontMapperBase::Get()
 {
     if ( !sm_instance )
 wxFontMapperBase *wxFontMapperBase::Get()
 {
     if ( !sm_instance )
@@ -270,21 +318,39 @@ wxFontMapper *wxFontMapperBase::Set(wxFontMapper *mapper)
     return old;
 }
 
     return old;
 }
 
+/* static */
+void wxFontMapperBase::Reset()
+{
+    if ( sm_instance )
+    {
+        // we need a cast as wxFontMapper is not fully declared here and so the
+        // compiler can't know that it derives from wxFontMapperBase (but
+        // run-time behaviour will be correct because the dtor is virtual)
+        delete (wxFontMapperBase *)sm_instance;
+        sm_instance = NULL;
+    }
+}
+
 #if wxUSE_CONFIG && wxUSE_FILECONFIG
 
 // ----------------------------------------------------------------------------
 // config usage customisation
 // ----------------------------------------------------------------------------
 
 #if wxUSE_CONFIG && wxUSE_FILECONFIG
 
 // ----------------------------------------------------------------------------
 // config usage customisation
 // ----------------------------------------------------------------------------
 
+
+static wxString gs_defaultConfigPath(FONTMAPPER_ROOT_PATH);
+
 /* static */
 /* static */
-const wxChar *wxFontMapperBase::GetDefaultConfigPath()
+const wxString& wxFontMapperBase::GetDefaultConfigPath()
 {
 {
-    return FONTMAPPER_ROOT_PATH;
+    // NB: we return const wxString& and not wxString for compatibility
+    //     with 2.8 that returned const wxChar*
+    return gs_defaultConfigPath;
 }
 
 void wxFontMapperBase::SetConfigPath(const wxString& prefix)
 {
 }
 
 void wxFontMapperBase::SetConfigPath(const wxString& prefix)
 {
-    wxCHECK_RET( !prefix.IsEmpty() && prefix[0] == wxCONFIG_PATH_SEPARATOR,
+    wxCHECK_RET( !prefix.empty() && prefix[0] == wxCONFIG_PATH_SEPARATOR,
                  wxT("an absolute path should be given to wxFontMapper::SetConfigPath()") );
 
     m_configRootPath = prefix;
                  wxT("an absolute path should be given to wxFontMapper::SetConfigPath()") );
 
     m_configRootPath = prefix;
@@ -296,42 +362,23 @@ void wxFontMapperBase::SetConfigPath(const wxString& prefix)
 
 wxConfigBase *wxFontMapperBase::GetConfig()
 {
 
 wxConfigBase *wxFontMapperBase::GetConfig()
 {
-    if ( !m_config )
-    {
-        // try the default
-        m_config = wxConfig::Get(false /*don't create on demand*/ );
+    wxConfigBase *config = wxConfig::Get(false);
 
 
-        if ( !m_config )
-        {
-            // we still want to have a config object because otherwise we would
-            // keep asking the user the same questions in the interactive mode,
-            // so create a dummy config which won't write to any files/registry
-            // but will allow us to remember the results of the questions at
-            // least during this run
-            m_config = new wxMemoryConfig;
-            m_configIsDummy = true;
-            // VS: we can't call wxConfig::Set(m_config) here because that would
-            //     disable automatic wxConfig instance creation if this code was
-            //     called before wxApp::OnInit (this happens in wxGTK -- it sets
-            //     default wxFont encoding in wxApp::Initialize())
-        }
-    }
-
-    if ( m_configIsDummy && wxConfig::Get(false) != NULL )
+    // If there is no global configuration, use an internal memory configuration
+    if ( !config )
     {
     {
-        // VS: in case we created dummy m_config (see above), we want to switch back
-        //     to the real one as soon as one becomes available.
-        delete m_config;
-        m_config = wxConfig::Get(false);
-        m_configIsDummy = false;
-        // FIXME: ideally, we should add keys from dummy config to the real one now,
+        if ( !m_configDummy )
+            m_configDummy = new wxMemoryConfig;
+        config = m_configDummy;
+
+        // FIXME: ideally, we should add keys from dummy config to a real one later,
         //        but it is a low-priority task because typical wxWin application
         //        either doesn't use wxConfig at all or creates wxConfig object in
         //        wxApp::OnInit(), before any real interaction with the user takes
         //        place...
     }
 
         //        but it is a low-priority task because typical wxWin application
         //        either doesn't use wxConfig at all or creates wxConfig object in
         //        wxApp::OnInit(), before any real interaction with the user takes
         //        place...
     }
 
-    return m_config;
+    return config;
 }
 
 const wxString& wxFontMapperBase::GetConfigPath()
 }
 
 const wxString& wxFontMapperBase::GetConfigPath()
@@ -358,7 +405,7 @@ bool wxFontMapperBase::ChangePath(const wxString& pathNew, wxString *pathOld)
     *pathOld = config->GetPath();
 
     wxString path = GetConfigPath();
     *pathOld = config->GetPath();
 
     wxString path = GetConfigPath();
-    if ( path.IsEmpty() || path.Last() != wxCONFIG_PATH_SEPARATOR )
+    if ( path.empty() || path.Last() != wxCONFIG_PATH_SEPARATOR )
     {
         path += wxCONFIG_PATH_SEPARATOR;
     }
     {
         path += wxCONFIG_PATH_SEPARATOR;
     }
@@ -441,7 +488,7 @@ wxFontMapperBase::NonInteractiveCharsetToEncoding(const wxString& charset)
             config->SetPath(FONTMAPPER_CHARSET_ALIAS_PATH);
 
             wxString alias = config->Read(charset);
             config->SetPath(FONTMAPPER_CHARSET_ALIAS_PATH);
 
             wxString alias = config->Read(charset);
-            if ( !alias.IsEmpty() )
+            if ( !alias.empty() )
             {
                 // yes, we do - use it instead
                 cs = alias;
             {
                 // yes, we do - use it instead
                 cs = alias;
@@ -466,95 +513,25 @@ wxFontMapperBase::NonInteractiveCharsetToEncoding(const wxString& charset)
             }
         }
 
             }
         }
 
+        // check for known encoding name
+        const wxFontEncoding e = GetEncodingFromName(cs);
+        if ( e != wxFONTENCODING_MAX )
+            return e;
+
+        // deal with general encoding names of the form FOO-xxx
         cs.MakeUpper();
 
         cs.MakeUpper();
 
-        if ( cs.empty() || cs == _T("US-ASCII") )
-        {
-            encoding = wxFONTENCODING_DEFAULT;
-        }
-        else if ( cs == wxT("UTF-7") )
-        {
-            encoding = wxFONTENCODING_UTF7;
-        }
-        else if ( cs == wxT("UTF-8") )
-        {
-            encoding = wxFONTENCODING_UTF8;
-        }
-        else if ( cs == wxT("UTF-16") )
-        {
-            encoding = wxFONTENCODING_UTF16;
-        }
-        else if ( cs == wxT("UTF-16BE") )
-        {
-            encoding = wxFONTENCODING_UTF16BE;
-        }
-        else if ( cs == wxT("UTF-16LE") )
-        {
-            encoding = wxFONTENCODING_UTF16LE;
-        }
-        else if ( cs == wxT("UTF-32") || cs == wxT("UCS-4") )
-        {
-            encoding = wxFONTENCODING_UTF32;
-        }
-        else if ( cs == wxT("UTF-32BE") || cs == wxT("UCS-4BE") )
-        {
-            encoding = wxFONTENCODING_UTF32BE;
-        }
-        else if ( cs == wxT("UTF-32LE") || cs == wxT("UCS-4LE") )
-        {
-            encoding = wxFONTENCODING_UTF32LE;
-        }
-        else if ( cs == wxT("GB2312") )
-        {
-            encoding = wxFONTENCODING_GB2312;
-        }
-        else if ( cs == wxT("BIG5") )
-        {
-            encoding = wxFONTENCODING_BIG5;
-        }
-        else if ( cs == wxT("SJIS") ||
-                  cs == wxT("SHIFT_JIS") ||
-                  cs == wxT("SHIFT-JIS") )
-        {
-            encoding = wxFONTENCODING_SHIFT_JIS;
-        }
-        else if ( cs == wxT("EUC-JP") ||
-                  cs == wxT("EUC_JP") )
-        {
-            encoding = wxFONTENCODING_EUC_JP;
-        }
-        else if ( cs == wxT("EUC-KR") ||
-                  cs == wxT("EUC_KR") )
+        if ( cs.Left(3) == wxT("ISO") )
         {
         {
-            encoding = wxFONTENCODING_CP949;
-        }
-        else if ( cs == wxT("KOI8-R") ||
-                  cs == wxT("KOI8-RU") )
-        {
-            // although koi8-ru is not strictly speaking the same as koi8-r,
-            // they are similar enough to make mapping it to koi8 better than
-            // not recognizing it at all
-            encoding = wxFONTENCODING_KOI8;
-        }
-        else if ( cs == wxT("KOI8-U") )
-        {
-            encoding = wxFONTENCODING_KOI8_U;
-        }
-        else if ( cs.Left(3) == wxT("ISO") )
-        {
-            // the dash is optional (or, to be exact, it is not, but
-            // several brokenmails "forget" it)
+            // the dash is optional (or, to be exact, it is not, but many
+            // broken programs "forget" it in the output they generate)
             const wxChar *p = cs.c_str() + 3;
             if ( *p == wxT('-') )
                 p++;
 
             const wxChar *p = cs.c_str() + 3;
             if ( *p == wxT('-') )
                 p++;
 
-            // printf( "iso %s\n", (const char*) cs.ToAscii() );
-
             unsigned int value;
             if ( wxSscanf(p, wxT("8859-%u"), &value) == 1 )
             {
             unsigned int value;
             if ( wxSscanf(p, wxT("8859-%u"), &value) == 1 )
             {
-                // printf( "value %d\n", (int)value );
-
                 // make it 0 based and check that it is strictly positive in
                 // the process (no such thing as iso8859-0 encoding)
                 if ( (value-- > 0) &&
                 // make it 0 based and check that it is strictly positive in
                 // the process (no such thing as iso8859-0 encoding)
                 if ( (value-- > 0) &&
@@ -574,8 +551,6 @@ wxFontMapperBase::NonInteractiveCharsetToEncoding(const wxString& charset)
             unsigned int value;
             if ( wxSscanf(p, wxT("8859-%u"), &value) == 1 )
             {
             unsigned int value;
             if ( wxSscanf(p, wxT("8859-%u"), &value) == 1 )
             {
-                // printf( "value %d\n", (int)value );
-
                 // make it 0 based and check that it is strictly positive in
                 // the process (no such thing as iso8859-0 encoding)
                 if ( (value-- > 0) &&
                 // make it 0 based and check that it is strictly positive in
                 // the process (no such thing as iso8859-0 encoding)
                 if ( (value-- > 0) &&
@@ -610,7 +585,7 @@ wxFontMapperBase::NonInteractiveCharsetToEncoding(const wxString& charset)
                 if ( *p == wxT('-') )
                     p++;
 
                 if ( *p == wxT('-') )
                     p++;
 
-                int value;
+                unsigned int value;
                 if ( wxSscanf(p, wxT("%u"), &value) == 1 )
                 {
                     if ( value >= 1250 )
                 if ( wxSscanf(p, wxT("%u"), &value) == 1 )
                 {
                     if ( value >= 1250 )
@@ -627,6 +602,14 @@ wxFontMapperBase::NonInteractiveCharsetToEncoding(const wxString& charset)
 
                     switch ( value )
                     {
 
                     switch ( value )
                     {
+                        case 866:
+                            encoding = wxFONTENCODING_CP866;
+                            break;
+
+                        case 874:
+                            encoding = wxFONTENCODING_CP874;
+                            break;
+
                         case 932:
                             encoding = wxFONTENCODING_CP932;
                             break;
                         case 932:
                             encoding = wxFONTENCODING_CP932;
                             break;
@@ -705,7 +688,7 @@ wxString wxFontMapperBase::GetEncodingName(wxFontEncoding encoding)
     {
         if ( gs_encodings[i] == encoding )
         {
     {
         if ( gs_encodings[i] == encoding )
         {
-            return gs_encodingNames[i];
+            return gs_encodingNames[i][0];
         }
     }
 
         }
     }
 
@@ -716,25 +699,52 @@ wxString wxFontMapperBase::GetEncodingName(wxFontEncoding encoding)
 }
 
 /* static */
 }
 
 /* static */
-wxFontEncoding wxFontMapperBase::GetEncodingFromName(const wxString& name)
+const wxChar** wxFontMapperBase::GetAllEncodingNames(wxFontEncoding encoding)
 {
 {
-    const size_t count = WXSIZEOF(gs_encodingNames);
+    static const wxChar* dummy[] = { NULL };
 
 
-    for ( size_t i = 0; i < count; i++ )
+    for ( size_t i = 0; i < WXSIZEOF(gs_encodingNames); i++ )
     {
     {
-        if ( gs_encodingNames[i] == name )
+        if ( gs_encodings[i] == encoding )
         {
         {
-            return gs_encodings[i];
+            return gs_encodingNames[i];
         }
     }
 
         }
     }
 
-    if ( name == _("default") )
+    return dummy;
+}
+
+/* static */
+wxFontEncoding wxFontMapperBase::GetEncodingFromName(const wxString& name)
+{
+    const size_t count = WXSIZEOF(gs_encodingNames);
+
+    // many charsets use hyphens in their names but some systems use the
+    // same names without hyphens (e.g. "UTF-8" and "UTF8" are both common)
+    // so to avoid bloating gs_encodingNames array too much recognize both
+    // versions with and without hyphens here
+    wxString nameNoHyphens(name);
+    if ( !nameNoHyphens.Replace(_T("-"), _T("")) )
+    {
+        // no replacement has been done, no need to compare twice
+        nameNoHyphens.clear();
+    }
+
+
+    for ( size_t i = 0; i < count; i++ )
     {
     {
-        return wxFONTENCODING_DEFAULT;
+        for ( const wxChar** encName = gs_encodingNames[i]; *encName; ++encName )
+        {
+            if ( name.CmpNoCase(*encName) == 0 ||
+                    (!nameNoHyphens.empty() &&
+                     nameNoHyphens.CmpNoCase(*encName) == 0) )
+            {
+                return gs_encodings[i];
+            }
+        }
     }
 
     return wxFONTENCODING_MAX;
 }
 
 #endif // wxUSE_FONTMAP
     }
 
     return wxFONTENCODING_MAX;
 }
 
 #endif // wxUSE_FONTMAP
-