X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6648cd46dcfa615e084e0960e677e5ecd39778a5..748a3af8e74ce74fe143650af0b2da2534c70d45:/src/common/fontmap.cpp diff --git a/src/common/fontmap.cpp b/src/common/fontmap.cpp index 56f3461d2d..18a61b6768 100644 --- a/src/common/fontmap.cpp +++ b/src/common/fontmap.cpp @@ -35,11 +35,18 @@ #endif // PCH #include "wx/fontmap.h" -#include "wx/config.h" -#include "wx/msgdlg.h" -#include "wx/fontdlg.h" -#include "wx/choicdlg.h" +#if wxUSE_CONFIG + #include "wx/config.h" + #include "wx/memconf.h" +#endif + +#if wxUSE_GUI + #include "wx/msgdlg.h" + #include "wx/fontdlg.h" + #include "wx/choicdlg.h" +#endif // wxUSE_GUI + #include "wx/encconv.h" // ---------------------------------------------------------------------------- @@ -47,10 +54,12 @@ // ---------------------------------------------------------------------------- // 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"); +#if wxUSE_GUI + static const wxChar* FONTMAPPER_FONT_FROM_ENCODING_PATH = wxT("Encodings"); +#endif // wxUSE_GUI // encodings supported by GetEncodingDescription static wxFontEncoding gs_encodings[] = @@ -79,6 +88,7 @@ static wxFontEncoding gs_encodings[] = wxFONTENCODING_CP1255, wxFONTENCODING_CP1256, wxFONTENCODING_CP1257, + wxFONTENCODING_CP437, }; // the descriptions for them @@ -87,16 +97,16 @@ static const wxChar* gs_encodingDescs[] = wxTRANSLATE( "West European (ISO-8859-1/Latin 1)" ), wxTRANSLATE( "Central European (ISO-8859-2/Latin 2)" ), wxTRANSLATE( "Esperanto (ISO-8859-3)" ), - wxTRANSLATE( "Baltic (ISO-8859-4)" ), + wxTRANSLATE( "Baltic (old) (ISO-8859-4)" ), wxTRANSLATE( "Cyrillic (Latin 5)" ), wxTRANSLATE( "Arabic (ISO-8859-6)" ), wxTRANSLATE( "Greek (ISO-8859-7)" ), wxTRANSLATE( "Hebrew (ISO-8859-8)" ), wxTRANSLATE( "Turkish (ISO-8859-9)" ), - wxTRANSLATE( "Baltic II (ISO-8859-10)" ), + wxTRANSLATE( "Nordic (ISO-8859-10)" ), wxTRANSLATE( "Thai (ISO-8859-11)" ), wxTRANSLATE( "ISO-8859-12" ), - wxTRANSLATE( "ISO-8859-13" ), + wxTRANSLATE( "Baltic (ISO-8859-13)" ), wxTRANSLATE( "ISO-8859-14" ), wxTRANSLATE( "West European new (ISO-8859-15/Latin 0)" ), wxTRANSLATE( "KOI8-R" ), @@ -108,6 +118,7 @@ static const wxChar* gs_encodingDescs[] = wxTRANSLATE( "Windows Hebrew (CP 1255)" ), wxTRANSLATE( "Windows Arabic (CP 1256)" ), wxTRANSLATE( "Windows Baltic (CP 1257)" ), + wxTRANSLATE( "Windows/DOS OEM (CP 437)" ), }; // and the internal names @@ -137,6 +148,7 @@ static const wxChar* gs_encodingNames[] = wxT( "windows1255" ), wxT( "windows1256" ), wxT( "windows1257" ), + wxT( "windows437" ), }; // ---------------------------------------------------------------------------- @@ -187,8 +199,13 @@ private: wxFontMapper::wxFontMapper() { +#if wxUSE_CONFIG m_config = NULL; +#endif // wxUSE_CONFIG + +#if wxUSE_GUI m_windowParent = NULL; +#endif // wxUSE_GUI } wxFontMapper::~wxFontMapper() @@ -199,6 +216,8 @@ wxFontMapper::~wxFontMapper() // customisation // ---------------------------------------------------------------------------- +#if wxUSE_CONFIG + /* static */ const wxChar *wxFontMapper::GetDefaultConfigPath() { return FONTMAPPER_ROOT_PATH; @@ -207,13 +226,11 @@ wxFontMapper::~wxFontMapper() void wxFontMapper::SetConfigPath(const wxString& prefix) { wxCHECK_RET( !prefix.IsEmpty() && prefix[0] == wxCONFIG_PATH_SEPARATOR, - wxT("an absolute path should be given to " - "wxFontMapper::SetConfigPath()") ); + wxT("an absolute path should be given to wxFontMapper::SetConfigPath()") ); m_configRootPath = prefix; } - // ---------------------------------------------------------------------------- // get config object and path for it // ---------------------------------------------------------------------------- @@ -223,7 +240,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; @@ -239,9 +267,11 @@ const wxString& wxFontMapper::GetConfigPath() return m_configRootPath; } +#endif bool wxFontMapper::ChangePath(const wxString& pathNew, wxString *pathOld) { +#if wxUSE_CONFIG wxConfigBase *config = GetConfig(); if ( !config ) return FALSE; @@ -262,11 +292,17 @@ bool wxFontMapper::ChangePath(const wxString& pathNew, wxString *pathOld) config->SetPath(path); return TRUE; +#else + return FALSE; +#endif } void wxFontMapper::RestorePath(const wxString& pathOld) { +#if wxUSE_CONFIG GetConfig()->SetPath(pathOld); +#else +#endif } // ---------------------------------------------------------------------------- @@ -279,8 +315,7 @@ wxString wxFontMapper::GetEncodingDescription(wxFontEncoding encoding) size_t count = WXSIZEOF(gs_encodingDescs); wxASSERT_MSG( count == WXSIZEOF(gs_encodings), - wxT("inconsitency detected - forgot to update one of " - "the arrays?") ); + wxT("inconsitency detected - forgot to update one of the arrays?") ); for ( size_t i = 0; i < count; i++ ) { @@ -302,8 +337,7 @@ wxString wxFontMapper::GetEncodingName(wxFontEncoding encoding) size_t count = WXSIZEOF(gs_encodingNames); wxASSERT_MSG( count == WXSIZEOF(gs_encodings), - wxT("inconsitency detected - forgot to update one of " - "the arrays?") ); + wxT("inconsistency detected - forgot to update one of the arrays?") ); for ( size_t i = 0; i < count; i++ ) { @@ -327,6 +361,7 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, // we're going to modify it, make a copy wxString cs = charset; +#if wxUSE_CONFIG // first try the user-defined settings wxString pathOld; if ( ChangePath(FONTMAPPER_CHARSET_PATH, &pathOld) ) @@ -343,8 +378,8 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, } else { - wxLogDebug(wxT("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()); } } @@ -363,10 +398,20 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, RestorePath(pathOld); } +#endif // if didn't find it there, try to reckognise it ourselves if ( encoding == wxFONTENCODING_SYSTEM ) { + // discard the optional quotes + if ( !!cs ) + { + if ( cs[0u] == _T('"') && cs.Last() == _T('"') ) + { + cs = wxString(cs.c_str(), cs.length() - 1); + } + } + cs.MakeUpper(); if ( !cs || cs == wxT("US-ASCII") ) @@ -414,6 +459,7 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, //else: unknown } +#if wxUSE_GUI // if still no luck, ask the user - unless disabled if ( (encoding == wxFONTENCODING_SYSTEM) && interactive ) { @@ -426,16 +472,13 @@ 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\nanother 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), - wxT("inconsitency detected - forgot to update one of " - "the arrays?") ); + wxT("inconsitency detected - forgot to update one of the arrays?") ); wxString *encodingNamesTranslated = new wxString[count]; @@ -459,12 +502,27 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, if ( n != -1 ) { - // TODO save the result in the config! - encoding = gs_encodings[n]; + +#if wxUSE_CONFIG + // 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); + } +#endif // wxUSE_CONFIG } //else: cancelled } +#endif // wxUSE_GUI return encoding; } @@ -475,6 +533,8 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, // correspond to which is used by GetFontForEncoding() function // ---------------------------------------------------------------------------- +#if wxUSE_GUI + bool wxFontMapper::TestAltEncoding(const wxString& configEntry, wxFontEncoding encReplacement, wxNativeEncodingInfo *info) @@ -482,6 +542,7 @@ bool wxFontMapper::TestAltEncoding(const wxString& configEntry, if ( wxGetNativeFontEncoding(encReplacement, info) && wxTestFontEncoding(*info) ) { +#if wxUSE_CONFIG // remember the mapping in the config wxFontMapperPathChanger path(this, FONTMAPPER_FONT_FROM_ENCODING_PATH); @@ -489,18 +550,48 @@ bool wxFontMapper::TestAltEncoding(const wxString& configEntry, { GetConfig()->Write(configEntry, info->ToString()); } - +#endif // wxUSE_CONFIG return TRUE; } return FALSE; } +#if wxUSE_GUI +class ReentrancyBlocker +{ +public: + ReentrancyBlocker(bool& b) : m_b(b) { m_b = TRUE; } + ~ReentrancyBlocker() { m_b = FALSE; } + +private: + bool& m_b; +}; +#endif + bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, wxNativeEncodingInfo *info, const wxString& facename, bool interactive) { +#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. + + // assume we're always called from the main thread, so that it is safe to + // use a static var + static bool s_inGetAltForEncoding = FALSE; + + if ( interactive && s_inGetAltForEncoding ) + return FALSE; + + ReentrancyBlocker blocker(s_inGetAltForEncoding); +#endif // wxUSE_GUI + wxCHECK_MSG( info, FALSE, wxT("bad pointer in GetAltForEncoding") ); info->facename = facename; @@ -521,8 +612,14 @@ 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; +#if wxUSE_CONFIG // do we have a font spec for this encoding? wxString pathOld; if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH, &pathOld) ) @@ -533,6 +630,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) ) @@ -546,11 +649,12 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, } else { - wxLogDebug(wxT("corrupted config data: string '%s' is not " - "a valid font encoding info"), fontinfo.c_str()); + 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 } +#endif // wxUSE_CONFIG // ask the user if ( interactive ) @@ -561,11 +665,7 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, // the message wxString msg; - msg.Printf(_("The encoding '%s' is unknown.\n" - "Would 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(_("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)?"), GetEncodingDescription(encoding).c_str()); wxWindow *parent = m_windowParent; @@ -585,14 +685,17 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, wxFont font = retData.GetChosenFont(); *info = retData.EncodingInfo(); + info -> encoding = retData.GetEncoding(); - // remember this in the config +#if wxUSE_CONFIG + // remember this in the config if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH, &pathOld) ) { GetConfig()->Write(configEntry, info->ToString()); RestorePath(pathOld); } +#endif return TRUE; } @@ -602,19 +705,21 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, } //else: we're in non-interactive mode - // now try the default mappings: - wxFontEncodingArray equiv = wxEncodingConverter::GetAllEquivalents(encoding); - for ( unsigned i = (equiv[0] == encoding) ? 1 : 0; i < equiv.GetCount(); i++ ) - if ( TestAltEncoding(configEntry, equiv[i], info) ) - return TRUE; + size_t count = equiv.GetCount(); + if ( count ) + { + for ( size_t i = (equiv[0] == encoding) ? 1 : 0; i < count; i++ ) + { + if ( TestAltEncoding(configEntry, equiv[i], info) ) + return TRUE; + } + } return FALSE; } - - bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, wxFontEncoding *alt_encoding, const wxString& facename, @@ -626,14 +731,18 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, return r; } - - bool wxFontMapper::IsEncodingAvailable(wxFontEncoding encoding, const wxString& facename) { wxNativeEncodingInfo info; - - wxGetNativeFontEncoding(encoding, &info); - info.facename = facename; - return wxTestFontEncoding(info); + + if (wxGetNativeFontEncoding(encoding, &info)) + { + info.facename = facename; + return wxTestFontEncoding(info); + } + + return FALSE; } + +#endif // wxUSE_GUI