X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/511f273f9ec0eac39b9d6fb40e7af9f2f6f05519..069d0f27ef7d87fd337e6baad1c5f4c7223ed693:/src/common/fontmap.cpp diff --git a/src/common/fontmap.cpp b/src/common/fontmap.cpp index 4f1e9bd0cb..116565bbcf 100644 --- a/src/common/fontmap.cpp +++ b/src/common/fontmap.cpp @@ -36,17 +36,19 @@ #include "wx/fontmap.h" #include "wx/config.h" +#include "wx/memconf.h" #include "wx/msgdlg.h" #include "wx/fontdlg.h" #include "wx/choicdlg.h" +#include "wx/encconv.h" // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- // the config paths we use -static const wxChar* FONTMAPPER_ROOT_PATH = wxT("FontMapper"); +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"); static const wxChar* FONTMAPPER_FONT_FROM_ENCODING_PATH = wxT("Encodings"); @@ -146,7 +148,7 @@ static const wxChar* gs_encodingNames[] = static wxFontMapper gs_fontMapper; // and public pointer -wxFontMapper * WXDLLEXPORT wxTheFontMapper = &gs_fontMapper; +wxFontMapper * wxTheFontMapper = &gs_fontMapper; // ---------------------------------------------------------------------------- // private classes @@ -206,7 +208,7 @@ wxFontMapper::~wxFontMapper() void wxFontMapper::SetConfigPath(const wxString& prefix) { wxCHECK_RET( !prefix.IsEmpty() && prefix[0] == wxCONFIG_PATH_SEPARATOR, - _T("an absolute path should be given to " + wxT("an absolute path should be given to " "wxFontMapper::SetConfigPath()") ); m_configRootPath = prefix; @@ -222,7 +224,18 @@ wxConfigBase *wxFontMapper::GetConfig() if ( !m_config ) { // try the default - m_config = wxConfig::Get(); + m_config = wxConfig::Get(FALSE /*don't create on demand*/ ); + + 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; + wxConfig::Set(m_config); + } } return m_config; @@ -254,7 +267,7 @@ bool wxFontMapper::ChangePath(const wxString& pathNew, wxString *pathOld) } wxASSERT_MSG( !pathNew || (pathNew[0] != wxCONFIG_PATH_SEPARATOR), - _T("should be a relative path") ); + wxT("should be a relative path") ); path += pathNew; @@ -278,7 +291,7 @@ wxString wxFontMapper::GetEncodingDescription(wxFontEncoding encoding) size_t count = WXSIZEOF(gs_encodingDescs); wxASSERT_MSG( count == WXSIZEOF(gs_encodings), - _T("inconsitency detected - forgot to update one of " + wxT("inconsitency detected - forgot to update one of " "the arrays?") ); for ( size_t i = 0; i < count; i++ ) @@ -301,7 +314,7 @@ wxString wxFontMapper::GetEncodingName(wxFontEncoding encoding) size_t count = WXSIZEOF(gs_encodingNames); wxASSERT_MSG( count == WXSIZEOF(gs_encodings), - _T("inconsitency detected - forgot to update one of " + wxT("inconsitency detected - forgot to update one of " "the arrays?") ); for ( size_t i = 0; i < count; i++ ) @@ -342,8 +355,9 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, } else { - wxLogDebug(_T("corrupted config data - invalid encoding %ld " - "for charset '%s'"), value, charset.c_str()); + wxLogDebug(wxT("corrupted config data: invalid encoding %ld " + "for charset '%s' ignored"), + value, charset.c_str()); } } @@ -368,20 +382,20 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, { cs.MakeUpper(); - if ( !cs || cs == _T("US-ASCII") ) + if ( !cs || cs == wxT("US-ASCII") ) encoding = wxFONTENCODING_DEFAULT; - else if ( cs == _T("KOI8-R") || cs == _T("KOI8-U") ) + else if ( cs == wxT("KOI8-R") || cs == wxT("KOI8-U") ) encoding = wxFONTENCODING_KOI8; - else if ( cs.Left(3) == _T("ISO") ) + else if ( cs.Left(3) == wxT("ISO") ) { // 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('-') ) + if ( *p == wxT('-') ) p++; unsigned int value; - if ( wxSscanf(p, _T("8859-%u"), &value) == 1 ) + if ( wxSscanf(p, wxT("8859-%u"), &value) == 1 ) { if ( value < wxFONTENCODING_ISO8859_MAX - wxFONTENCODING_ISO8859_1 ) @@ -392,7 +406,7 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, } } } - else if ( cs.Left(8) == _T("WINDOWS-") ) + else if ( cs.Left(8) == wxT("WINDOWS-") ) { int value; if ( wxSscanf(cs.c_str() + 8, wxT("%u"), &value) == 1 ) @@ -425,16 +439,16 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& 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()); + msg.Printf(_("The charset '%s' is unknown. You may select\n" + "another charset to replace it with or choose\n" + "[Cancel] if it cannot be replaced"), charset.c_str()); // the list of choices size_t count = WXSIZEOF(gs_encodingDescs); wxASSERT_MSG( count == WXSIZEOF(gs_encodings), - _T("inconsitency detected - forgot to update one of " - "the arrays?") ); + wxT("inconsitency detected - forgot to update one of " + "the arrays?") ); wxString *encodingNamesTranslated = new wxString[count]; @@ -458,9 +472,22 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, if ( n != -1 ) { - // TODO save the result in the config! - encoding = gs_encodings[n]; + + // save the result in the config now + if ( ChangePath(FONTMAPPER_CHARSET_PATH, &pathOld) ) + { + wxConfigBase *config = GetConfig(); + + // remember the alt encoding for this charset + if ( !config->Write(charset, (long)encoding) ) + { + wxLogError(_("Failed to remember the encoding " + "for the charset '%s'."), charset.c_str()); + } + + RestorePath(pathOld); + } } //else: cancelled } @@ -497,9 +524,12 @@ bool wxFontMapper::TestAltEncoding(const wxString& configEntry, bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, wxNativeEncodingInfo *info, + const wxString& facename, bool interactive) { - wxCHECK_MSG( info, FALSE, _T("bad pointer in GetAltForEncoding") ); + wxCHECK_MSG( info, FALSE, wxT("bad pointer in GetAltForEncoding") ); + + info->facename = facename; if ( encoding == wxFONTENCODING_DEFAULT ) { @@ -517,7 +547,12 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, // wxFatalError doesn't return } - wxString configEntry = GetEncodingName(encoding); + wxString configEntry, encName = GetEncodingName(encoding); + if ( !!facename ) + { + configEntry = facename + _T("_"); + } + configEntry += encName; // do we have a font spec for this encoding? wxString pathOld; @@ -529,6 +564,12 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, RestorePath(pathOld); + if ( !!fontinfo && !!facename ) + { + // we tried to find a match with facename - now try without it + fontinfo = config->Read(encName); + } + if ( !!fontinfo ) { if ( info->FromString(fontinfo) ) @@ -542,10 +583,11 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, } else { - wxLogDebug(_T("corrupted config data: string '%s' is not " + 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 } // ask the user @@ -581,6 +623,7 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, wxFont font = retData.GetChosenFont(); *info = retData.EncodingInfo(); + info -> encoding = retData.GetEncoding(); // remember this in the config if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH, &pathOld) ) @@ -598,71 +641,44 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, } //else: we're in non-interactive mode - // now try the default mappings - switch ( encoding ) - { - case wxFONTENCODING_ISO8859_15: - // iso8859-15 is slightly modified iso8859-1 - if ( TestAltEncoding(configEntry, wxFONTENCODING_ISO8859_1, info) ) - return TRUE; - // fall through - - case wxFONTENCODING_ISO8859_1: - // iso8859-1 is identical to CP1252 - if ( TestAltEncoding(configEntry, wxFONTENCODING_CP1252, info) ) - return TRUE; - - break; - - case wxFONTENCODING_CP1252: - if ( TestAltEncoding(configEntry, wxFONTENCODING_ISO8859_1, info) ) - return TRUE; - - break; - - // iso8859-13 is quite similar to WinBaltic - case wxFONTENCODING_ISO8859_13: - if ( TestAltEncoding(configEntry, wxFONTENCODING_CP1257, info) ) - return TRUE; - - break; - - case wxFONTENCODING_CP1257: - if ( TestAltEncoding(configEntry, wxFONTENCODING_ISO8859_13, info) ) - return TRUE; - - break; - // iso8859-8 is almost identical to WinHebrew - case wxFONTENCODING_ISO8859_8: - if ( TestAltEncoding(configEntry, wxFONTENCODING_CP1255, info) ) - return TRUE; + // now try the default mappings: + wxFontEncodingArray equiv = wxEncodingConverter::GetAllEquivalents(encoding); + size_t count = equiv.GetCount(); + for ( size_t i = (equiv[0] == encoding) ? 1 : 0; i < count; i++ ) + { + if ( TestAltEncoding(configEntry, equiv[i], info) ) + return TRUE; + } - break; + return FALSE; +} - case wxFONTENCODING_CP1255: - if ( TestAltEncoding(configEntry, wxFONTENCODING_ISO8859_8, info) ) - return TRUE; - break; - // and iso8859-7 is not too different from WinGreek - case wxFONTENCODING_ISO8859_7: - if ( TestAltEncoding(configEntry, wxFONTENCODING_CP1253, info) ) - return TRUE; +bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, + wxFontEncoding *alt_encoding, + const wxString& facename, + bool interactive) +{ + wxNativeEncodingInfo info; + bool r = GetAltForEncoding(encoding, &info, facename, interactive); + *alt_encoding = info.encoding; + return r; +} - break; - case wxFONTENCODING_CP1253: - if ( TestAltEncoding(configEntry, wxFONTENCODING_ISO8859_7, info) ) - return TRUE; - break; +bool wxFontMapper::IsEncodingAvailable(wxFontEncoding encoding, + const wxString& facename) +{ + wxNativeEncodingInfo info; - default: - // TODO add other mappings... - ; + if (wxGetNativeFontEncoding(encoding, &info)) + { + info.facename = facename; + return wxTestFontEncoding(info); } - - return FALSE; + else + return FALSE; }