X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3c1866e88fb77fc7e0b349cc15f6cebf0f727a9d..b53aea81d2e102224b452ef5bf7aee1132f37c6f:/src/common/fontmap.cpp diff --git a/src/common/fontmap.cpp b/src/common/fontmap.cpp index 081c2c5215..88f9add423 100644 --- a/src/common/fontmap.cpp +++ b/src/common/fontmap.cpp @@ -1,12 +1,12 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: common/fontmap.cpp +// Name: src/common/fontmap.cpp // Purpose: wxFontMapper class // Author: Vadim Zeitlin // Modified by: // Created: 04.11.99 // RCS-ID: $Id$ -// Copyright: (c) Vadim Zeitlin -// Licence: wxWindows license +// Copyright: (c) 1999-2003 Vadim Zeitlin +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "fontmap.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -28,24 +24,124 @@ #pragma hdrstop #endif +#if wxUSE_FONTMAP + +#include "wx/fontmap.h" + #ifndef WX_PRECOMP #include "wx/app.h" #include "wx/log.h" #include "wx/intl.h" + #include "wx/msgdlg.h" + #include "wx/choicdlg.h" #endif // PCH -#include "wx/fontmap.h" -#include "wx/config.h" -#include "wx/choicdlg.h" +#if wxUSE_CONFIG + #include "wx/config.h" +#endif // wxUSE_CONFIG + +#if defined(__WXMSW__) + #include "wx/msw/private.h" // includes windows.h for LOGFONT + #include "wx/msw/winundef.h" +#endif + +#include "wx/fmappriv.h" +#include "wx/fontutil.h" +#include "wx/fontdlg.h" +#include "wx/encinfo.h" + +#include "wx/encconv.h" + +#if wxUSE_EXTENDED_RTTI + +wxBEGIN_ENUM( wxFontEncoding ) + wxENUM_MEMBER( wxFONTENCODING_SYSTEM ) + wxENUM_MEMBER( wxFONTENCODING_DEFAULT ) + + wxENUM_MEMBER( wxFONTENCODING_ISO8859_1 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_2 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_3 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_4 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_5 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_6 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_7 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_8 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_9 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_10 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_11 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_12 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_13 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_14 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_15 ) + wxENUM_MEMBER( wxFONTENCODING_ISO8859_MAX ) + wxENUM_MEMBER( wxFONTENCODING_KOI8 ) + wxENUM_MEMBER( wxFONTENCODING_KOI8_U ) + wxENUM_MEMBER( wxFONTENCODING_ALTERNATIVE ) + wxENUM_MEMBER( wxFONTENCODING_BULGARIAN ) + wxENUM_MEMBER( wxFONTENCODING_CP437 ) + wxENUM_MEMBER( wxFONTENCODING_CP850 ) + wxENUM_MEMBER( wxFONTENCODING_CP852 ) + wxENUM_MEMBER( wxFONTENCODING_CP855 ) + wxENUM_MEMBER( wxFONTENCODING_CP866 ) + + wxENUM_MEMBER( wxFONTENCODING_CP874 ) + wxENUM_MEMBER( wxFONTENCODING_CP932 ) + wxENUM_MEMBER( wxFONTENCODING_CP936 ) + wxENUM_MEMBER( wxFONTENCODING_CP949 ) + wxENUM_MEMBER( wxFONTENCODING_CP950 ) + wxENUM_MEMBER( wxFONTENCODING_CP1250 ) + wxENUM_MEMBER( wxFONTENCODING_CP1251 ) + wxENUM_MEMBER( wxFONTENCODING_CP1252 ) + wxENUM_MEMBER( wxFONTENCODING_CP1253 ) + wxENUM_MEMBER( wxFONTENCODING_CP1254 ) + wxENUM_MEMBER( wxFONTENCODING_CP1255 ) + wxENUM_MEMBER( wxFONTENCODING_CP1256 ) + wxENUM_MEMBER( wxFONTENCODING_CP1257 ) + wxENUM_MEMBER( wxFONTENCODING_CP12_MAX ) + wxENUM_MEMBER( wxFONTENCODING_UTF7 ) + wxENUM_MEMBER( wxFONTENCODING_UTF8 ) + wxENUM_MEMBER( wxFONTENCODING_GB2312 ) + wxENUM_MEMBER( wxFONTENCODING_BIG5 ) + wxENUM_MEMBER( wxFONTENCODING_SHIFT_JIS ) + wxENUM_MEMBER( wxFONTENCODING_EUC_JP ) + wxENUM_MEMBER( wxFONTENCODING_UNICODE ) +wxEND_ENUM( wxFontEncoding ) +#endif // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- // the config paths we use -static const char* FONTMAPPER_ROOT_PATH = _T("FontMapper"); -static const char* FONTMAPPER_CHARSET_PATH = _T("Charsets"); -static const char* FONTMAPPER_CHARSET_ALIAS_PATH = _T("Aliases"); +#if wxUSE_CONFIG + +static const wxChar* FONTMAPPER_FONT_FROM_ENCODING_PATH = wxT("Encodings"); +static const wxChar* FONTMAPPER_FONT_DONT_ASK = wxT("none"); + +#endif // wxUSE_CONFIG + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +// it may happen that while we're showing a dialog asking the user about +// something, another request for an encoding mapping arrives: in this case it +// is best to not do anything because otherwise we risk to enter an infinite +// loop so we create an object of this class on stack to test for this in all +// interactive functions +class ReentrancyBlocker +{ +public: + ReentrancyBlocker(bool& flag) : m_flagOld(flag), m_flag(flag) + { m_flag = true; } + ~ReentrancyBlocker() { m_flag = m_flagOld; } + +private: + bool m_flagOld; + bool& m_flag; + + DECLARE_NO_COPY_CLASS(ReentrancyBlocker) +}; // ============================================================================ // implementation @@ -57,7 +153,6 @@ static const char* FONTMAPPER_CHARSET_ALIAS_PATH = _T("Aliases"); wxFontMapper::wxFontMapper() { - m_config = NULL; m_windowParent = NULL; } @@ -65,285 +160,361 @@ wxFontMapper::~wxFontMapper() { } -// ---------------------------------------------------------------------------- -// customisation -// ---------------------------------------------------------------------------- - -/* static */ const wxChar *wxFontMapper::GetDefaultConfigPath() +/* static */ +wxFontMapper *wxFontMapper::Get() { - return FONTMAPPER_ROOT_PATH; + wxFontMapperBase *fontmapper = wxFontMapperBase::Get(); + wxASSERT_MSG( !fontmapper->IsDummy(), + wxT("GUI code requested a wxFontMapper but we only have a wxFontMapperBase.") ); + + // Now return it anyway because there's a chance the GUI code might just + // only want to call wxFontMapperBase functions and it's better than + // crashing by returning NULL + return (wxFontMapper *)fontmapper; } -void wxFontMapper::SetConfigPath(const wxString& prefix) +wxFontEncoding +wxFontMapper::CharsetToEncoding(const wxString& charset, bool interactive) { - wxCHECK_RET( !prefix.IsEmpty() && prefix[0] == wxCONFIG_PATH_SEPARATOR, - _T("an absolute path should be given to " - "wxFontMapper::SetConfigPath()") ); + // try the ways not needing the users intervention first + int encoding = wxFontMapperBase::NonInteractiveCharsetToEncoding(charset); - m_configRootPath = prefix; -} + // if we failed to find the encoding, ask the user -- unless disabled + if ( encoding == wxFONTENCODING_UNKNOWN ) + { + // this is the special value which disables asking the user (he had + // chosen to suppress this the last time) + encoding = wxFONTENCODING_SYSTEM; + } +#if wxUSE_CHOICEDLG + else if ( (encoding == wxFONTENCODING_SYSTEM) && interactive ) + { + // prepare the dialog data + // the dialog title + wxString title(m_titleDialog); + if ( !title ) + title << wxTheApp->GetAppDisplayName() << _(": unknown charset"); -// ---------------------------------------------------------------------------- -// get config object and path for it -// ---------------------------------------------------------------------------- + // the message + wxString msg; + msg.Printf(_("The charset '%s' is unknown. You may select\nanother charset to replace it with or choose\n[Cancel] if it cannot be replaced"), charset); -wxConfigBase *wxFontMapper::GetConfig() -{ - if ( !m_config ) - { - // try the default - m_config = wxConfig::Get(); + // the list of choices + const size_t count = GetSupportedEncodingsCount(); + + wxString *encodingNamesTranslated = new wxString[count]; + + for ( size_t i = 0; i < count; i++ ) + { + encodingNamesTranslated[i] = GetEncodingDescription(GetEncoding(i)); + } + + // the parent window + wxWindow *parent = m_windowParent; + if ( !parent ) + parent = wxTheApp->GetTopWindow(); + + // do ask the user and get back the index in encodings table + int n = wxGetSingleChoiceIndex(msg, title, + count, + encodingNamesTranslated, + parent); + + delete [] encodingNamesTranslated; + + if ( n != -1 ) + { + encoding = GetEncoding(n); + } + +#if wxUSE_CONFIG && wxUSE_FILECONFIG + // save the result in the config now + wxFontMapperPathChanger path(this, FONTMAPPER_CHARSET_PATH); + if ( path.IsOk() ) + { + wxConfigBase *config = GetConfig(); + + // remember the alt encoding for this charset -- or remember that + // we don't know it + long value = n == -1 ? (long)wxFONTENCODING_UNKNOWN : (long)encoding; + if ( !config->Write(charset, value) ) + { + wxLogError(_("Failed to remember the encoding for the charset '%s'."), charset); + } + } +#endif // wxUSE_CONFIG } +#else + wxUnusedVar(interactive); +#endif // wxUSE_CHOICEDLG - return m_config; + return (wxFontEncoding)encoding; } -const wxString& wxFontMapper::GetConfigPath() +// ---------------------------------------------------------------------------- +// support for unknown encodings: we maintain a map between the +// (platform-specific) strings identifying them and our wxFontEncodings they +// correspond to which is used by GetFontForEncoding() function +// ---------------------------------------------------------------------------- + +bool wxFontMapper::TestAltEncoding(const wxString& configEntry, + wxFontEncoding encReplacement, + wxNativeEncodingInfo *info) { - if ( !m_configRootPath ) + if ( wxGetNativeFontEncoding(encReplacement, info) && + wxTestFontEncoding(*info) ) { - // use the default - m_configRootPath = GetDefaultConfigPath(); +#if wxUSE_CONFIG && wxUSE_FILECONFIG + // remember the mapping in the config + wxFontMapperPathChanger path(this, FONTMAPPER_FONT_FROM_ENCODING_PATH); + + if ( path.IsOk() ) + { + GetConfig()->Write(configEntry, info->ToString()); + } +#else + wxUnusedVar(configEntry); +#endif // wxUSE_CONFIG + return true; } - return m_configRootPath; + return false; } -bool wxFontMapper::ChangePath(const wxString& pathNew, wxString *pathOld) +bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, + wxNativeEncodingInfo *info, + const wxString& facename, + bool interactive) { - wxConfigBase *config = GetConfig(); - if ( !config ) - return FALSE; +#if wxUSE_GUI + // we need a flag to prevent infinite recursion which happens, for + // example, when GetAltForEncoding() is called from an OnPaint() handler: + // in this case, wxYield() which is called from wxMessageBox() we use here + // will lead to another call of OnPaint() and hence to another call of + // GetAltForEncoding() -- and it is impossible to catch this from the user + // code because we are called from wxFont ctor implicitly. - *pathOld = config->GetPath(); + // assume we're always called from the main thread, so that it is safe to + // use a static var + static bool s_inGetAltForEncoding = false; - wxString path = GetConfigPath(); - if ( path.IsEmpty() || path.Last() != wxCONFIG_PATH_SEPARATOR ) - { - path += wxCONFIG_PATH_SEPARATOR; - } + if ( interactive && s_inGetAltForEncoding ) + return false; - wxASSERT_MSG( !pathNew || (pathNew[0] != wxCONFIG_PATH_SEPARATOR), - _T("should be a relative path") ); + ReentrancyBlocker blocker(s_inGetAltForEncoding); +#endif // wxUSE_GUI - path += pathNew; + wxCHECK_MSG( info, false, wxT("bad pointer in GetAltForEncoding") ); - config->SetPath(path); + info->facename = facename; - return TRUE; -} + if ( encoding == wxFONTENCODING_DEFAULT ) + { + encoding = wxFont::GetDefaultEncoding(); + } -void wxFontMapper::RestorePath(const wxString& pathOld) -{ - GetConfig()->SetPath(pathOld); -} + // if we failed to load the system default encoding, something is really + // wrong and we'd better stop now -- otherwise we will go into endless + // recursion trying to create the font in the msg box with the error + // message + if ( encoding == wxFONTENCODING_SYSTEM ) + { + wxLogFatalError(_("can't load any font, aborting")); -// ---------------------------------------------------------------------------- -// charset/encoding correspondence -// ---------------------------------------------------------------------------- + // wxLogFatalError doesn't return + } -wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, - bool interactive) -{ - wxFontEncoding encoding = wxFONTENCODING_SYSTEM; + wxString configEntry, + encName = GetEncodingName(encoding); + if ( !facename.empty() ) + { + configEntry = facename + _T("_"); + } + configEntry += encName; - // we're going to modify it, make a copy - wxString cs = charset; +#if wxUSE_CONFIG && wxUSE_FILECONFIG + // do we have a font spec for this encoding? + wxString fontinfo; + wxFontMapperPathChanger path(this, FONTMAPPER_FONT_FROM_ENCODING_PATH); + if ( path.IsOk() ) + { + fontinfo = GetConfig()->Read(configEntry); + } - // first try the user-defined settings - wxString pathOld; - if ( ChangePath(FONTMAPPER_CHARSET_PATH, &pathOld) ) + // this special value means that we don't know of fonts for this + // encoding but, moreover, have already asked the user as well and he + // didn't specify any font neither + if ( fontinfo == FONTMAPPER_FONT_DONT_ASK ) { - wxConfigBase *config = GetConfig(); + interactive = false; + } + else // use the info entered the last time + { + if ( !fontinfo.empty() && !facename.empty() ) + { + // we tried to find a match with facename -- now try without it + fontinfo = GetConfig()->Read(encName); + } - // do we have an encoding for this charset? - long value = config->Read(charset, -1l); - if ( value != -1 ) + if ( !fontinfo.empty() ) { - if ( value >= 0 && value <= wxFONTENCODING_MAX ) + if ( info->FromString(fontinfo) ) { - encoding = (wxFontEncoding)value; + if ( wxTestFontEncoding(*info) ) + { + // ok, got something + return true; + } + //else: no such fonts, look for something else + // (should we erase the outdated value?) } else { - wxLogDebug(_T("corrupted config data - invalid encoding %ld " - "for charset '%s'"), value, charset.c_str()); + wxLogDebug(wxT("corrupted config data: string '%s' is not a valid font encoding info"), + fontinfo); } } - - if ( encoding == wxFONTENCODING_SYSTEM ) + //else: there is no information in config about this encoding + } +#endif // wxUSE_CONFIG + + // now try to map this encoding to a compatible one which we have on this + // system + wxFontEncodingArray equiv = wxEncodingConverter::GetAllEquivalents(encoding); + size_t count = equiv.GetCount(); + bool foundEquivEncoding = false; + wxFontEncoding equivEncoding = wxFONTENCODING_SYSTEM; + if ( count ) + { + for ( size_t i = 0; i < count && !foundEquivEncoding; i++ ) { - // may be we have an alias? - config->SetPath(FONTMAPPER_CHARSET_ALIAS_PATH); + // don't test for encoding itself, we already know we don't have it + if ( equiv[i] == encoding ) + continue; - wxString alias = config->Read(charset); - if ( !!alias ) + if ( TestAltEncoding(configEntry, equiv[i], info) ) { - // yes, we do - use it instead - cs = alias; + equivEncoding = equiv[i]; + + foundEquivEncoding = true; } } - - RestorePath(pathOld); } - // if didn't find it there, try to reckognise it ourselves - if ( encoding == wxFONTENCODING_SYSTEM ) + // ask the user +#if wxUSE_FONTDLG + if ( interactive ) { - cs.MakeUpper(); + wxString title(m_titleDialog); + if ( !title ) + title << wxTheApp->GetAppDisplayName() << _(": unknown encoding"); - if ( !cs || cs == _T("US-ASCII") ) - encoding = wxFONTENCODING_DEFAULT; - else if ( cs == _T("KOI8-R") || cs == _T("KOI8-U") ) - encoding = wxFONTENCODING_KOI8; - else if ( cs.Left(3) == _T("ISO") ) + // built the message + wxString encDesc = GetEncodingDescription(encoding), + msg; + if ( foundEquivEncoding ) { - // the dash is optional (or, to be exact, it is not, but - // several brokenmails "forget" it) - const wxChar *p = cs.c_str() + 3; - if ( *p == _T('-') ) - p++; - - unsigned int value; - if ( wxSscanf(p, _T("8859-%u"), &value) == 1 ) + // ask the user if he wants to override found alternative encoding + msg.Printf(_("No font for displaying text in encoding '%s' found,\nbut an alternative encoding '%s' is available.\nDo you want to use this encoding (otherwise you will have to choose another one)?"), + encDesc, GetEncodingDescription(equivEncoding)); + } + else + { + msg.Printf(_("No font for displaying text in encoding '%s' found.\nWould you like to select a font to be used for this encoding\n(otherwise the text in this encoding will not be shown correctly)?"), + encDesc); + } + + // the question is different in 2 cases so the answer has to be + // interpreted differently as well + int answer = foundEquivEncoding ? wxNO : wxYES; + + if ( wxMessageBox(msg, title, + wxICON_QUESTION | wxYES_NO, + m_windowParent) == answer ) + { + wxFontData data; + data.SetEncoding(encoding); + data.EncodingInfo() = *info; + wxFontDialog dialog(m_windowParent, data); + if ( dialog.ShowModal() == wxID_OK ) { - if ( value < wxFONTENCODING_ISO8859_MAX - - wxFONTENCODING_ISO8859_1 ) + wxFontData retData = dialog.GetFontData(); + + *info = retData.EncodingInfo(); + info->encoding = retData.GetEncoding(); + +#if wxUSE_CONFIG && wxUSE_FILECONFIG + // remember this in the config + wxFontMapperPathChanger path2(this, + FONTMAPPER_FONT_FROM_ENCODING_PATH); + if ( path2.IsOk() ) { - // it's a valid ISO8859 encoding - value += wxFONTENCODING_ISO8859_1 - 1; - encoding = (wxFontEncoding)value; + GetConfig()->Write(configEntry, info->ToString()); } +#endif // wxUSE_CONFIG + + return true; } + //else: the user canceled the font selection dialog } - else if ( cs.Left(8) == _T("WINDOWS-") ) + else { - int value; - if ( wxSscanf(cs.c_str() + 8, "%u", &value) == 1 ) + // the user doesn't want to select a font for this encoding + // or selected to use equivalent encoding + // + // remember it to avoid asking the same question again later +#if wxUSE_CONFIG && wxUSE_FILECONFIG + wxFontMapperPathChanger path2(this, + FONTMAPPER_FONT_FROM_ENCODING_PATH); + if ( path2.IsOk() ) { - if ( value >= 1250 ) - { - value -= 1250; - if ( value < wxFONTENCODING_CP12_MAX - - wxFONTENCODING_CP1250 - 1 ) - { - // a valid Windows code page - value += wxFONTENCODING_CP1250; - encoding = (wxFontEncoding)value; - } - } + GetConfig()->Write + ( + configEntry, + foundEquivEncoding + ? (const wxChar*)info->ToString().c_str() + : FONTMAPPER_FONT_DONT_ASK + ); } +#endif // wxUSE_CONFIG } - //else: unknown } + //else: we're in non-interactive mode +#else + wxUnusedVar(equivEncoding); +#endif // wxUSE_FONTDLG - // if still no luck, ask the user - unless disabled - if ( (encoding == wxFONTENCODING_SYSTEM) && interactive ) - { - // prepare the dialog data - - // the dialog title - wxString title(m_titleDialog); - if ( !title ) - title << wxTheApp->GetAppName() << _(": unknown charset"); - - // the message - wxString msg; - msg.Printf(_("The charset '%s' is unknown. You may select another " - "charset to replace it with or choose [Cancel] if it " - "cannot be replaced"), charset.c_str()); - - // the list of choices - static wxFontEncoding encodings[] = - { - wxFONTENCODING_ISO8859_1, - wxFONTENCODING_ISO8859_2, - wxFONTENCODING_ISO8859_3, - wxFONTENCODING_ISO8859_4, - wxFONTENCODING_ISO8859_5, - wxFONTENCODING_ISO8859_6, - wxFONTENCODING_ISO8859_7, - wxFONTENCODING_ISO8859_8, - wxFONTENCODING_ISO8859_9, - wxFONTENCODING_ISO8859_10, - wxFONTENCODING_ISO8859_11, - wxFONTENCODING_ISO8859_12, - wxFONTENCODING_ISO8859_13, - wxFONTENCODING_ISO8859_14, - wxFONTENCODING_ISO8859_15, - wxFONTENCODING_KOI8, - wxFONTENCODING_CP1250, - wxFONTENCODING_CP1251, - wxFONTENCODING_CP1252, - wxFONTENCODING_CP1253, - wxFONTENCODING_CP1254, - wxFONTENCODING_CP1255, - wxFONTENCODING_CP1256, - wxFONTENCODING_CP1257, - }; - - static const wxChar* encodingNames[] = - { - "West European (ISO-8859-1/Latin 1)", - "Central European (ISO-8859-2/Latin 2)", - "Esperanto (ISO-8859-3)", - "Baltic (ISO-8859-4)", - "Cyrillic (Latin 5)", - "Arabic (ISO-8859-6)" - "Greek (ISO-8859-7)", - "Hebrew (ISO-8859-8)", - "Turkish (ISO-8859-9)", - "Baltic II (ISO-8859-10)", - "Thai (ISO-8859-11)", - "ISO-8859-12", - "ISO-8859-13", - "ISO-8859-14", - "West European new (ISO-8859-15/Latin 0)", - "KOI8-R", - "Windows Latin 2 (CP 1250)", - "Windows Cyrillic (CP 1251)", - "Windows Latin 1 (CP 1252)", - "Windows Greek (CP 1253)", - "Windows Turkish (CP 1254)", - "Windows Hebrew (CP 1255)", - "Windows Arabic (CP 1256)", - "Windows Baltic (CP 1257)", - }; - - size_t count = WXSIZEOF(encodingNames); - - wxASSERT_MSG( count == WXSIZEOF(encodings), - _T("inconsitency detected - forgot to update one of " - "the arrays?") ); + return foundEquivEncoding; +} - wxString *encodingNamesTranslated = new wxString[count]; +bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, + wxFontEncoding *encodingAlt, + const wxString& facename, + bool interactive) +{ + wxCHECK_MSG( encodingAlt, false, + _T("wxFontEncoding::GetAltForEncoding(): NULL pointer") ); - for ( size_t n = 0; n < count; n++ ) - { - encodingNamesTranslated[n] = wxGetTranslation(encodingNames[n]); - } + wxNativeEncodingInfo info; + if ( !GetAltForEncoding(encoding, &info, facename, interactive) ) + return false; - // the parent window - wxWindow *parent = m_windowParent; - if ( !parent ) - parent = wxTheApp->GetTopWindow(); + *encodingAlt = info.encoding; - // do ask the user and get back the index in encodings table - int n = wxGetSingleChoiceIndex(msg, title, - count, - encodingNamesTranslated, - parent); + return true; +} - delete [] encodingNamesTranslated; +bool wxFontMapper::IsEncodingAvailable(wxFontEncoding encoding, + const wxString& facename) +{ + wxNativeEncodingInfo info; - if ( n != -1 ) - { - encoding = encodings[n]; - } - //else: cancelled - } + if ( !wxGetNativeFontEncoding(encoding, &info) ) + return false; - return encoding; + info.facename = facename; + return wxTestFontEncoding(info); } +#endif // wxUSE_FONTMAP