X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5707316c9cbc2b44bb6b0246d766e5bb0cfdc2e7..dc9b623b9561db9a164969e7eec3c1853e839cfb:/src/common/fontmap.cpp?ds=sidebyside diff --git a/src/common/fontmap.cpp b/src/common/fontmap.cpp index 21a3e219e6..f40ea75e95 100644 --- a/src/common/fontmap.cpp +++ b/src/common/fontmap.cpp @@ -88,6 +88,10 @@ static wxFontEncoding gs_encodings[] = wxFONTENCODING_ISO8859_14, wxFONTENCODING_ISO8859_15, wxFONTENCODING_KOI8, + wxFONTENCODING_CP932, + wxFONTENCODING_CP936, + wxFONTENCODING_CP949, + wxFONTENCODING_CP950, wxFONTENCODING_CP1250, wxFONTENCODING_CP1251, wxFONTENCODING_CP1252, @@ -120,6 +124,10 @@ static const wxChar* gs_encodingDescs[] = wxTRANSLATE( "Celtic (ISO-8859-14)" ), wxTRANSLATE( "Western European with Euro (ISO-8859-15)" ), wxTRANSLATE( "KOI8-R" ), + wxTRANSLATE( "Windows Japanese (CP 932)" ), + wxTRANSLATE( "Windows Chinese Simplified (CP 936)" ), + wxTRANSLATE( "Windows Korean (CP 949)" ), + wxTRANSLATE( "Windows Chinese Traditional (CP 950)" ), wxTRANSLATE( "Windows Central European (CP 1250)" ), wxTRANSLATE( "Windows Cyrillic (CP 1251)" ), wxTRANSLATE( "Windows Western European (CP 1252)" ), @@ -133,7 +141,7 @@ static const wxChar* gs_encodingDescs[] = wxTRANSLATE( "Unicode 8 bit (UTF-8)" ), }; -// and the internal names +// and the internal names (these are not translated on purpose!) static const wxChar* gs_encodingNames[] = { wxT( "iso-8859-1" ), @@ -152,6 +160,10 @@ static const wxChar* gs_encodingNames[] = wxT( "iso-8859-14" ), wxT( "iso-8859-15" ), wxT( "koi8-r" ), + wxT( "windows-932" ), + wxT( "windows-936" ), + wxT( "windows-949" ), + wxT( "windows-950" ), wxT( "windows-1250" ), wxT( "windows-1251" ), wxT( "windows-1252" ), @@ -225,6 +237,10 @@ wxFontMapper::wxFontMapper() wxFontMapper::~wxFontMapper() { +#if wxUSE_CONFIG + if ( m_configIsDummy ) + delete m_config; +#endif // wxUSE_CONFIG } // ---------------------------------------------------------------------------- @@ -277,12 +293,13 @@ wxConfigBase *wxFontMapper::GetConfig() { // 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, // 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 + // either doesn't use wxConfig at all or creates wxConfig object in + // wxApp::OnInit(), before any real interaction with the user takes // place... } @@ -385,7 +402,7 @@ wxString wxFontMapper::GetEncodingName(wxFontEncoding encoding) { if ( gs_encodings[i] == encoding ) { - return wxGetTranslation(gs_encodingNames[i]); + return gs_encodingNames[i]; } } @@ -552,6 +569,25 @@ wxFontEncoding wxFontMapper::CharsetToEncoding(const wxString& charset, encoding = (wxFontEncoding)value; } } + + switch ( value ) + { + case 932: + encoding = wxFONTENCODING_CP932; + break; + + case 936: + encoding = wxFONTENCODING_CP936; + break; + + case 949: + encoding = wxFONTENCODING_CP949; + break; + + case 950: + encoding = wxFONTENCODING_CP950; + break; + } } } } @@ -712,7 +748,8 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, // wxFatalError doesn't return } - wxString configEntry, encName = GetEncodingName(encoding); + wxString configEntry, + encName = GetEncodingName(encoding); if ( !!facename ) { configEntry = facename + _T("_"); @@ -768,6 +805,29 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding 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++ ) + { + // don't test for encoding itself, we already know we don't have it + if ( equiv[i] == encoding ) + continue; + + if ( TestAltEncoding(configEntry, equiv[i], info) ) + { + equivEncoding = equiv[i]; + + foundEquivEncoding = TRUE; + } + } + } + // ask the user #if wxUSE_FONTDLG if ( interactive ) @@ -776,29 +836,40 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, if ( !title ) title << wxTheApp->GetAppName() << _(": unknown encoding"); - // the message - wxString msg; - 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()); + // built the message + wxString encDesc = GetEncodingDescription(encoding), + msg; + if ( foundEquivEncoding ) + { + // 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.c_str(), GetEncodingDescription(equivEncoding).c_str()); + } + 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.c_str()); + } - wxWindow *parent = m_windowParent; - if ( !parent ) - parent = wxTheApp->GetTopWindow(); + // 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, parent) == wxYES ) + wxICON_QUESTION | wxYES_NO, + m_windowParent) == answer ) { wxFontData data; data.SetEncoding(encoding); data.EncodingInfo() = *info; - wxFontDialog dialog(parent, &data); + wxFontDialog dialog(m_windowParent, &data); if ( dialog.ShowModal() == wxID_OK ) { wxFontData retData = dialog.GetFontData(); wxFont font = retData.GetChosenFont(); *info = retData.EncodingInfo(); - info -> encoding = retData.GetEncoding(); + info->encoding = retData.GetEncoding(); #if wxUSE_CONFIG // remember this in the config @@ -816,12 +887,19 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, } else { - // the user doesn't want to select a font for this encoding, + // 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 if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH, &pathOld) ) { - GetConfig()->Write(configEntry, FONTMAPPER_FONT_DONT_ASK); + GetConfig()->Write + ( + configEntry, + foundEquivEncoding ? info->ToString().c_str() + : FONTMAPPER_FONT_DONT_ASK + ); RestorePath(pathOld); } @@ -831,19 +909,7 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, //else: we're in non-interactive mode #endif // wxUSE_FONTDLG - // now try the default mappings: - wxFontEncodingArray equiv = wxEncodingConverter::GetAllEquivalents(encoding); - 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; + return foundEquivEncoding; } bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,