X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3ca6a5f04692678cd2d9f3ea0843fc3f5a0b254f..7aa5864467bf0bb220fdc447876f13f178ae8f35:/src/common/fontmap.cpp diff --git a/src/common/fontmap.cpp b/src/common/fontmap.cpp index 18a61b6768..977f7b2c44 100644 --- a/src/common/fontmap.cpp +++ b/src/common/fontmap.cpp @@ -28,6 +28,8 @@ #pragma hdrstop #endif +#if wxUSE_FONTMAP + #ifndef WX_PRECOMP #include "wx/app.h" #include "wx/log.h" @@ -42,6 +44,7 @@ #endif #if wxUSE_GUI + #include "wx/fontutil.h" #include "wx/msgdlg.h" #include "wx/fontdlg.h" #include "wx/choicdlg.h" @@ -54,12 +57,17 @@ // ---------------------------------------------------------------------------- // the config paths we use +#if wxUSE_CONFIG static const wxChar* FONTMAPPER_ROOT_PATH = wxT("/wxWindows/FontMapper"); static const wxChar* FONTMAPPER_CHARSET_PATH = wxT("Charsets"); static const wxChar* FONTMAPPER_CHARSET_ALIAS_PATH = wxT("Aliases"); + +// we only ask questions in GUI mode #if wxUSE_GUI static const wxChar* FONTMAPPER_FONT_FROM_ENCODING_PATH = wxT("Encodings"); + static const wxChar* FONTMAPPER_FONT_DONT_ASK = wxT("none"); #endif // wxUSE_GUI +#endif // wxUSE_CONFIG // encodings supported by GetEncodingDescription static wxFontEncoding gs_encodings[] = @@ -89,66 +97,72 @@ static wxFontEncoding gs_encodings[] = wxFONTENCODING_CP1256, wxFONTENCODING_CP1257, wxFONTENCODING_CP437, + wxFONTENCODING_UTF7, + wxFONTENCODING_UTF8, }; // the descriptions for them static const wxChar* gs_encodingDescs[] = { - wxTRANSLATE( "West European (ISO-8859-1/Latin 1)" ), - wxTRANSLATE( "Central European (ISO-8859-2/Latin 2)" ), + wxTRANSLATE( "Western European (ISO-8859-1)" ), + wxTRANSLATE( "Central European (ISO-8859-2)" ), wxTRANSLATE( "Esperanto (ISO-8859-3)" ), wxTRANSLATE( "Baltic (old) (ISO-8859-4)" ), - wxTRANSLATE( "Cyrillic (Latin 5)" ), + wxTRANSLATE( "Cyrillic (ISO-8859-5)" ), wxTRANSLATE( "Arabic (ISO-8859-6)" ), wxTRANSLATE( "Greek (ISO-8859-7)" ), wxTRANSLATE( "Hebrew (ISO-8859-8)" ), wxTRANSLATE( "Turkish (ISO-8859-9)" ), wxTRANSLATE( "Nordic (ISO-8859-10)" ), wxTRANSLATE( "Thai (ISO-8859-11)" ), - wxTRANSLATE( "ISO-8859-12" ), + wxTRANSLATE( "Indian (ISO-8859-12)" ), wxTRANSLATE( "Baltic (ISO-8859-13)" ), - wxTRANSLATE( "ISO-8859-14" ), - wxTRANSLATE( "West European new (ISO-8859-15/Latin 0)" ), + wxTRANSLATE( "Celtic (ISO-8859-14)" ), + wxTRANSLATE( "Western European with Euro (ISO-8859-15)" ), wxTRANSLATE( "KOI8-R" ), - wxTRANSLATE( "Windows Latin 2 (CP 1250)" ), + wxTRANSLATE( "Windows Central European (CP 1250)" ), wxTRANSLATE( "Windows Cyrillic (CP 1251)" ), - wxTRANSLATE( "Windows Latin 1 (CP 1252)" ), + wxTRANSLATE( "Windows Western European (CP 1252)" ), wxTRANSLATE( "Windows Greek (CP 1253)" ), wxTRANSLATE( "Windows Turkish (CP 1254)" ), wxTRANSLATE( "Windows Hebrew (CP 1255)" ), wxTRANSLATE( "Windows Arabic (CP 1256)" ), wxTRANSLATE( "Windows Baltic (CP 1257)" ), wxTRANSLATE( "Windows/DOS OEM (CP 437)" ), + wxTRANSLATE( "Unicode 7 bit (UTF-7)" ), + wxTRANSLATE( "Unicode 8 bit (UTF-8)" ), }; // and the internal names static const wxChar* gs_encodingNames[] = { - wxT( "iso8859-1" ), - wxT( "iso8859-2" ), - wxT( "iso8859-3" ), - wxT( "iso8859-4" ), - wxT( "iso8859-5" ), - wxT( "iso8859-6" ), - wxT( "iso8859-7" ), - wxT( "iso8859-8" ), - wxT( "iso8859-9" ), - wxT( "iso8859-10" ), - wxT( "iso8859-11" ), - wxT( "iso8859-12" ), - wxT( "iso8859-13" ), - wxT( "iso8859-14" ), - wxT( "iso8859-15" ), + 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( "windows1250" ), - wxT( "windows1251" ), - wxT( "windows1252" ), - wxT( "windows1253" ), - wxT( "windows1254" ), - wxT( "windows1255" ), - wxT( "windows1256" ), - wxT( "windows1257" ), - wxT( "windows437" ), + 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( "utf7" ), + wxT( "utf8" ), }; // ---------------------------------------------------------------------------- @@ -312,6 +326,11 @@ void wxFontMapper::RestorePath(const wxString& pathOld) /* static */ wxString wxFontMapper::GetEncodingDescription(wxFontEncoding encoding) { + if ( encoding == wxFONTENCODING_DEFAULT ) + { + return _("Default encoding"); + } + size_t count = WXSIZEOF(gs_encodingDescs); wxASSERT_MSG( count == WXSIZEOF(gs_encodings), @@ -334,6 +353,11 @@ wxString wxFontMapper::GetEncodingDescription(wxFontEncoding encoding) /* static */ wxString wxFontMapper::GetEncodingName(wxFontEncoding encoding) { + if ( encoding == wxFONTENCODING_DEFAULT ) + { + return _("default"); + } + size_t count = WXSIZEOF(gs_encodingNames); wxASSERT_MSG( count == WXSIZEOF(gs_encodings), @@ -400,9 +424,13 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, } #endif - // if didn't find it there, try to reckognise it ourselves + // if didn't find it there, try to recognize it ourselves if ( encoding == wxFONTENCODING_SYSTEM ) { + // trim any spaces + cs.Trim(TRUE); + cs.Trim(FALSE); + // discard the optional quotes if ( !!cs ) { @@ -415,9 +443,26 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, cs.MakeUpper(); if ( !cs || cs == wxT("US-ASCII") ) + { encoding = wxFONTENCODING_DEFAULT; - else if ( cs == wxT("KOI8-R") || cs == wxT("KOI8-U") ) + } + else if ( cs == wxT("UTF-7") ) + { + encoding = wxFONTENCODING_UTF7; + } + else if ( cs == wxT("UTF-8") ) + { + encoding = wxFONTENCODING_UTF8; + } + else if ( cs == wxT("KOI8-R") || + cs == wxT("KOI8-U") || + 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 reckognizing it at all encoding = wxFONTENCODING_KOI8; + } else if ( cs.Left(3) == wxT("ISO") ) { // the dash is optional (or, to be exact, it is not, but @@ -429,29 +474,53 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, unsigned int value; if ( wxSscanf(p, wxT("8859-%u"), &value) == 1 ) { - if ( value < wxFONTENCODING_ISO8859_MAX - - wxFONTENCODING_ISO8859_1 ) + // make it 0 based and check that it is strictly positive in + // the process (no such thing as iso8859-0 encoding) + if ( (value-- > 0) && + (value < wxFONTENCODING_ISO8859_MAX - + wxFONTENCODING_ISO8859_1) ) { // it's a valid ISO8859 encoding - value += wxFONTENCODING_ISO8859_1 - 1; + value += wxFONTENCODING_ISO8859_1; encoding = (wxFontEncoding)value; } } } - else if ( cs.Left(8) == wxT("WINDOWS-") ) + else // check for Windows charsets { - int value; - if ( wxSscanf(cs.c_str() + 8, wxT("%u"), &value) == 1 ) + size_t len; + if ( cs.Left(7) == wxT("WINDOWS") ) + { + len = 7; + } + else if ( cs.Left(2) == wxT("CP") ) { - if ( value >= 1250 ) + len = 2; + } + else // not a Windows encoding + { + len = 0; + } + + if ( len ) + { + const wxChar *p = cs.c_str() + len; + if ( *p == wxT('-') ) + p++; + + int value; + if ( wxSscanf(p, wxT("%u"), &value) == 1 ) { - value -= 1250; - if ( value < wxFONTENCODING_CP12_MAX - - wxFONTENCODING_CP1250 - 1 ) + if ( value >= 1250 ) { - // a valid Windows code page - value += wxFONTENCODING_CP1250; - encoding = (wxFontEncoding)value; + value -= 1250; + if ( value < wxFONTENCODING_CP12_MAX - + wxFONTENCODING_CP1250 ) + { + // a valid Windows code page + value += wxFONTENCODING_CP1250; + encoding = (wxFontEncoding)value; + } } } } @@ -630,33 +699,46 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, RestorePath(pathOld); - if ( !!fontinfo && !!facename ) + // 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 ) { - // we tried to find a match with facename - now try without it - fontinfo = config->Read(encName); + interactive = FALSE; } - - if ( !!fontinfo ) + else // use the info entered the last time { - if ( info->FromString(fontinfo) ) + if ( !!fontinfo && !!facename ) { - if ( wxTestFontEncoding(*info) ) - { - // ok, got something - return TRUE; - } - //else: no such fonts, look for something else + // we tried to find a match with facename - now try without it + fontinfo = config->Read(encName); } - else + + if ( !!fontinfo ) { - wxLogDebug(wxT("corrupted config data: string '%s' is not a valid font encoding info"), fontinfo.c_str()); + if ( info->FromString(fontinfo) ) + { + if ( wxTestFontEncoding(*info) ) + { + // ok, got something + return TRUE; + } + //else: no such fonts, look for something else + // (should we erase the outdated value?) + } + else + { + wxLogDebug(wxT("corrupted config data: string '%s' is not a valid font encoding info"), + fontinfo.c_str()); + } } + //else: there is no information in config about this encoding } - //else: there is no information in config about this encoding } #endif // wxUSE_CONFIG // ask the user +#if wxUSE_FONTDLG if ( interactive ) { wxString title(m_titleDialog); @@ -665,7 +747,7 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, // the message wxString msg; - msg.Printf(_("The encoding '%s' is unknown.\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)?"), + 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)?"), GetEncodingDescription(encoding).c_str()); wxWindow *parent = m_windowParent; @@ -688,22 +770,35 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, info -> encoding = retData.GetEncoding(); #if wxUSE_CONFIG - // remember this in the config + // remember this in the config if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH, &pathOld) ) { GetConfig()->Write(configEntry, info->ToString()); RestorePath(pathOld); } -#endif +#endif // wxUSE_CONFIG return TRUE; } //else: the user canceled the font selection dialog } - //else: the user doesn't want to select a font + else + { + // the user doesn't want to select a font for this encoding, + // remember it to avoid asking the same question again later +#if wxUSE_CONFIG + if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH, &pathOld) ) + { + GetConfig()->Write(configEntry, FONTMAPPER_FONT_DONT_ASK); + + RestorePath(pathOld); + } +#endif // wxUSE_CONFIG + } } //else: we're in non-interactive mode +#endif // wxUSE_FONTDLG // now try the default mappings: wxFontEncodingArray equiv = wxEncodingConverter::GetAllEquivalents(encoding); @@ -746,3 +841,5 @@ bool wxFontMapper::IsEncodingAvailable(wxFontEncoding encoding, } #endif // wxUSE_GUI + +#endif // wxUSE_FONTMAP