1 /////////////////////////////////////////////////////////////////////////////
2 // Name: common/fontmap.cpp
3 // Purpose: wxFontMapper class
4 // Author: Vadim Zeitlin
8 // Copyright: (c) Vadim Zeitlin
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
21 #pragma implementation "fontmap.h"
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
39 #include "wx/module.h"
40 #include "wx/fontmap.h"
43 #include "wx/config.h"
44 #include "wx/memconf.h"
48 #include "wx/fontutil.h"
49 #include "wx/msgdlg.h"
50 #include "wx/fontdlg.h"
51 #include "wx/choicdlg.h"
54 #include "wx/encconv.h"
56 // ----------------------------------------------------------------------------
58 // ----------------------------------------------------------------------------
60 // the config paths we use
62 static const wxChar
* FONTMAPPER_ROOT_PATH
= wxT("/wxWindows/FontMapper");
63 static const wxChar
* FONTMAPPER_CHARSET_PATH
= wxT("Charsets");
64 static const wxChar
* FONTMAPPER_CHARSET_ALIAS_PATH
= wxT("Aliases");
66 // we only ask questions in GUI mode
68 static const wxChar
* FONTMAPPER_FONT_FROM_ENCODING_PATH
= wxT("Encodings");
69 static const wxChar
* FONTMAPPER_FONT_DONT_ASK
= wxT("none");
71 #endif // wxUSE_CONFIG
73 // encodings supported by GetEncodingDescription
74 static wxFontEncoding gs_encodings
[] =
76 wxFONTENCODING_ISO8859_1
,
77 wxFONTENCODING_ISO8859_2
,
78 wxFONTENCODING_ISO8859_3
,
79 wxFONTENCODING_ISO8859_4
,
80 wxFONTENCODING_ISO8859_5
,
81 wxFONTENCODING_ISO8859_6
,
82 wxFONTENCODING_ISO8859_7
,
83 wxFONTENCODING_ISO8859_8
,
84 wxFONTENCODING_ISO8859_9
,
85 wxFONTENCODING_ISO8859_10
,
86 wxFONTENCODING_ISO8859_11
,
87 wxFONTENCODING_ISO8859_12
,
88 wxFONTENCODING_ISO8859_13
,
89 wxFONTENCODING_ISO8859_14
,
90 wxFONTENCODING_ISO8859_15
,
96 wxFONTENCODING_CP1250
,
97 wxFONTENCODING_CP1251
,
98 wxFONTENCODING_CP1252
,
99 wxFONTENCODING_CP1253
,
100 wxFONTENCODING_CP1254
,
101 wxFONTENCODING_CP1255
,
102 wxFONTENCODING_CP1256
,
103 wxFONTENCODING_CP1257
,
104 wxFONTENCODING_CP437
,
107 wxFONTENCODING_EUC_JP
,
110 // the descriptions for them
111 static const wxChar
* gs_encodingDescs
[] =
113 wxTRANSLATE( "Western European (ISO-8859-1)" ),
114 wxTRANSLATE( "Central European (ISO-8859-2)" ),
115 wxTRANSLATE( "Esperanto (ISO-8859-3)" ),
116 wxTRANSLATE( "Baltic (old) (ISO-8859-4)" ),
117 wxTRANSLATE( "Cyrillic (ISO-8859-5)" ),
118 wxTRANSLATE( "Arabic (ISO-8859-6)" ),
119 wxTRANSLATE( "Greek (ISO-8859-7)" ),
120 wxTRANSLATE( "Hebrew (ISO-8859-8)" ),
121 wxTRANSLATE( "Turkish (ISO-8859-9)" ),
122 wxTRANSLATE( "Nordic (ISO-8859-10)" ),
123 wxTRANSLATE( "Thai (ISO-8859-11)" ),
124 wxTRANSLATE( "Indian (ISO-8859-12)" ),
125 wxTRANSLATE( "Baltic (ISO-8859-13)" ),
126 wxTRANSLATE( "Celtic (ISO-8859-14)" ),
127 wxTRANSLATE( "Western European with Euro (ISO-8859-15)" ),
128 wxTRANSLATE( "KOI8-R" ),
129 wxTRANSLATE( "Windows Japanese (CP 932)" ),
130 wxTRANSLATE( "Windows Chinese Simplified (CP 936)" ),
131 wxTRANSLATE( "Windows Korean (CP 949)" ),
132 wxTRANSLATE( "Windows Chinese Traditional (CP 950)" ),
133 wxTRANSLATE( "Windows Central European (CP 1250)" ),
134 wxTRANSLATE( "Windows Cyrillic (CP 1251)" ),
135 wxTRANSLATE( "Windows Western European (CP 1252)" ),
136 wxTRANSLATE( "Windows Greek (CP 1253)" ),
137 wxTRANSLATE( "Windows Turkish (CP 1254)" ),
138 wxTRANSLATE( "Windows Hebrew (CP 1255)" ),
139 wxTRANSLATE( "Windows Arabic (CP 1256)" ),
140 wxTRANSLATE( "Windows Baltic (CP 1257)" ),
141 wxTRANSLATE( "Windows/DOS OEM (CP 437)" ),
142 wxTRANSLATE( "Unicode 7 bit (UTF-7)" ),
143 wxTRANSLATE( "Unicode 8 bit (UTF-8)" ),
144 wxTRANSLATE( "Extended Unix Codepage for Japanese (EUC-JP)" ),
147 // and the internal names (these are not translated on purpose!)
148 static const wxChar
* gs_encodingNames
[] =
159 wxT( "iso-8859-10" ),
160 wxT( "iso-8859-11" ),
161 wxT( "iso-8859-12" ),
162 wxT( "iso-8859-13" ),
163 wxT( "iso-8859-14" ),
164 wxT( "iso-8859-15" ),
166 wxT( "windows-932" ),
167 wxT( "windows-936" ),
168 wxT( "windows-949" ),
169 wxT( "windows-950" ),
170 wxT( "windows-1250" ),
171 wxT( "windows-1251" ),
172 wxT( "windows-1252" ),
173 wxT( "windows-1253" ),
174 wxT( "windows-1254" ),
175 wxT( "windows-1255" ),
176 wxT( "windows-1256" ),
177 wxT( "windows-1257" ),
178 wxT( "windows-437" ),
184 wxCOMPILE_TIME_ASSERT( WXSIZEOF(gs_encodingDescs
) == WXSIZEOF(gs_encodings
) &&
185 WXSIZEOF(gs_encodingNames
) == WXSIZEOF(gs_encodings
),
186 EncodingsArraysNotInSync
);
188 // ----------------------------------------------------------------------------
190 // ----------------------------------------------------------------------------
192 // change the config path during the lifetime of this object
193 class wxFontMapperPathChanger
196 wxFontMapperPathChanger(wxFontMapper
*fontMapper
, const wxString
& path
)
198 m_fontMapper
= fontMapper
;
199 m_ok
= m_fontMapper
->ChangePath(path
, &m_pathOld
);
202 bool IsOk() const { return m_ok
; }
204 ~wxFontMapperPathChanger()
207 m_fontMapper
->RestorePath(m_pathOld
);
211 wxFontMapper
*m_fontMapper
;
216 // ============================================================================
218 // ============================================================================
220 // ----------------------------------------------------------------------------
222 // ----------------------------------------------------------------------------
224 wxFontMapper::wxFontMapper()
228 m_configIsDummy
= FALSE
;
229 #endif // wxUSE_CONFIG
232 m_windowParent
= NULL
;
236 wxFontMapper::~wxFontMapper()
239 if ( m_configIsDummy
)
241 #endif // wxUSE_CONFIG
244 wxFontMapper
*wxFontMapper::sm_instance
= NULL
;
246 /*static*/ wxFontMapper
*wxFontMapper::Get()
249 sm_instance
= new wxFontMapper
;
253 /*static*/ wxFontMapper
*wxFontMapper::Set(wxFontMapper
*mapper
)
255 wxFontMapper
*old
= sm_instance
;
256 sm_instance
= mapper
;
260 class wxFontMapperModule
: public wxModule
263 wxFontMapperModule() : wxModule() {}
264 virtual bool OnInit() { return TRUE
; }
265 virtual void OnExit() { delete wxFontMapper::Set(NULL
); }
267 DECLARE_DYNAMIC_CLASS(wxFontMapperModule
)
270 IMPLEMENT_DYNAMIC_CLASS(wxFontMapperModule
, wxModule
)
272 // ----------------------------------------------------------------------------
274 // ----------------------------------------------------------------------------
278 /* static */ const wxChar
*wxFontMapper::GetDefaultConfigPath()
280 return FONTMAPPER_ROOT_PATH
;
283 void wxFontMapper::SetConfigPath(const wxString
& prefix
)
285 wxCHECK_RET( !prefix
.IsEmpty() && prefix
[0] == wxCONFIG_PATH_SEPARATOR
,
286 wxT("an absolute path should be given to wxFontMapper::SetConfigPath()") );
288 m_configRootPath
= prefix
;
291 // ----------------------------------------------------------------------------
292 // get config object and path for it
293 // ----------------------------------------------------------------------------
295 wxConfigBase
*wxFontMapper::GetConfig()
300 m_config
= wxConfig::Get(FALSE
/*don't create on demand*/ );
304 // we still want to have a config object because otherwise we would
305 // keep asking the user the same questions in the interactive mode,
306 // so create a dummy config which won't write to any files/registry
307 // but will allow us to remember the results of the questions at
308 // least during this run
309 m_config
= new wxMemoryConfig
;
310 m_configIsDummy
= TRUE
;
311 // VS: we can't call wxConfig::Set(m_config) here because that would
312 // disable automatic wxConfig instance creation if this code was
313 // called before wxApp::OnInit (this happens in wxGTK -- it sets
314 // default wxFont encoding in wxApp::Initialize())
318 if ( m_configIsDummy
&& wxConfig::Get(FALSE
) != NULL
)
320 // VS: in case we created dummy m_config (see above), we want to switch back
321 // to the real one as soon as one becomes available.
323 m_config
= wxConfig::Get(FALSE
);
324 m_configIsDummy
= FALSE
;
325 // FIXME: ideally, we should add keys from dummy config to the real one now,
326 // but it is a low-priority task because typical wxWin application
327 // either doesn't use wxConfig at all or creates wxConfig object in
328 // wxApp::OnInit(), before any real interaction with the user takes
335 const wxString
& wxFontMapper::GetConfigPath()
337 if ( !m_configRootPath
)
340 m_configRootPath
= GetDefaultConfigPath();
343 return m_configRootPath
;
347 bool wxFontMapper::ChangePath(const wxString
& pathNew
, wxString
*pathOld
)
350 wxConfigBase
*config
= GetConfig();
354 *pathOld
= config
->GetPath();
356 wxString path
= GetConfigPath();
357 if ( path
.IsEmpty() || path
.Last() != wxCONFIG_PATH_SEPARATOR
)
359 path
+= wxCONFIG_PATH_SEPARATOR
;
362 wxASSERT_MSG( !pathNew
|| (pathNew
[0] != wxCONFIG_PATH_SEPARATOR
),
363 wxT("should be a relative path") );
367 config
->SetPath(path
);
375 void wxFontMapper::RestorePath(const wxString
& pathOld
)
378 GetConfig()->SetPath(pathOld
);
383 // ----------------------------------------------------------------------------
384 // charset/encoding correspondence
385 // ----------------------------------------------------------------------------
388 wxString
wxFontMapper::GetEncodingDescription(wxFontEncoding encoding
)
390 if ( encoding
== wxFONTENCODING_DEFAULT
)
392 return _("Default encoding");
395 const size_t count
= WXSIZEOF(gs_encodingDescs
);
397 for ( size_t i
= 0; i
< count
; i
++ )
399 if ( gs_encodings
[i
] == encoding
)
401 return wxGetTranslation(gs_encodingDescs
[i
]);
406 str
.Printf(_("Unknown encoding (%d)"), encoding
);
412 wxString
wxFontMapper::GetEncodingName(wxFontEncoding encoding
)
414 if ( encoding
== wxFONTENCODING_DEFAULT
)
419 const size_t count
= WXSIZEOF(gs_encodingNames
);
421 for ( size_t i
= 0; i
< count
; i
++ )
423 if ( gs_encodings
[i
] == encoding
)
425 return gs_encodingNames
[i
];
430 str
.Printf(_("unknown-%d"), encoding
);
435 wxFontEncoding
wxFontMapper::CharsetToEncoding(const wxString
& charset
,
438 // a special pseudo encoding which means "don't ask me about this charset
439 // any more" - we need it to avoid driving the user crazy with asking him
440 // time after time about the same charset which he [presumably] doesn't
441 // have the fonts fot
442 static const int wxFONTENCODING_UNKNOWN
= -2;
444 wxFontEncoding encoding
= wxFONTENCODING_SYSTEM
;
446 // we're going to modify it, make a copy
447 wxString cs
= charset
;
450 // first try the user-defined settings
452 if ( ChangePath(FONTMAPPER_CHARSET_PATH
, &pathOld
) )
454 wxConfigBase
*config
= GetConfig();
456 // do we have an encoding for this charset?
457 long value
= config
->Read(charset
, -1l);
460 if ( value
== wxFONTENCODING_UNKNOWN
)
462 // don't try to find it, in particular don't ask the user
463 return wxFONTENCODING_SYSTEM
;
466 if ( value
>= 0 && value
<= wxFONTENCODING_MAX
)
468 encoding
= (wxFontEncoding
)value
;
472 wxLogDebug(wxT("corrupted config data: invalid encoding %ld for charset '%s' ignored"),
473 value
, charset
.c_str());
477 if ( encoding
== wxFONTENCODING_SYSTEM
)
479 // may be we have an alias?
480 config
->SetPath(FONTMAPPER_CHARSET_ALIAS_PATH
);
482 wxString alias
= config
->Read(charset
);
485 // yes, we do - use it instead
490 RestorePath(pathOld
);
492 #endif // wxUSE_CONFIG
494 // if didn't find it there, try to recognize it ourselves
495 if ( encoding
== wxFONTENCODING_SYSTEM
)
501 // discard the optional quotes
504 if ( cs
[0u] == _T('"') && cs
.Last() == _T('"') )
506 cs
= wxString(cs
.c_str(), cs
.length() - 1);
512 if ( cs
.empty() || cs
== _T("US-ASCII") )
514 encoding
= wxFONTENCODING_DEFAULT
;
516 else if ( cs
== wxT("UTF-7") )
518 encoding
= wxFONTENCODING_UTF7
;
520 else if ( cs
== wxT("UTF-8") )
522 encoding
= wxFONTENCODING_UTF8
;
524 else if ( cs
== wxT("GB2312") )
526 encoding
= wxFONTENCODING_GB2312
;
528 else if ( cs
== wxT("BIG5") )
530 encoding
= wxFONTENCODING_BIG5
;
532 else if ( cs
== wxT("SJIS") ||
533 cs
== wxT("SHIFT_JIS") ||
534 cs
== wxT("SHIFT-JIS") )
536 encoding
= wxFONTENCODING_SHIFT_JIS
;
538 else if ( cs
== wxT("EUC-JP") ||
539 cs
== wxT("EUC_JP") )
541 encoding
= wxFONTENCODING_EUC_JP
;
543 else if ( cs
== wxT("KOI8-R") ||
544 cs
== wxT("KOI8-U") ||
545 cs
== wxT("KOI8-RU") )
547 // although koi8-ru is not strictly speaking the same as koi8-r,
548 // they are similar enough to make mapping it to koi8 better than
549 // not reckognizing it at all
550 encoding
= wxFONTENCODING_KOI8
;
552 else if ( cs
.Left(3) == wxT("ISO") )
554 // the dash is optional (or, to be exact, it is not, but
555 // several brokenmails "forget" it)
556 const wxChar
*p
= cs
.c_str() + 3;
557 if ( *p
== wxT('-') )
560 // printf( "iso %s\n", (const char*) cs.ToAscii() );
563 if ( wxSscanf(p
, wxT("8859-%u"), &value
) == 1 )
565 // printf( "value %d\n", (int)value );
567 // make it 0 based and check that it is strictly positive in
568 // the process (no such thing as iso8859-0 encoding)
569 if ( (value
-- > 0) &&
570 (value
< wxFONTENCODING_ISO8859_MAX
-
571 wxFONTENCODING_ISO8859_1
) )
573 // it's a valid ISO8859 encoding
574 value
+= wxFONTENCODING_ISO8859_1
;
575 encoding
= (wxFontEncoding
)value
;
579 else if ( cs
.Left(4) == wxT("8859") )
581 const wxChar
*p
= cs
.c_str();
584 if ( wxSscanf(p
, wxT("8859-%u"), &value
) == 1 )
586 // printf( "value %d\n", (int)value );
588 // make it 0 based and check that it is strictly positive in
589 // the process (no such thing as iso8859-0 encoding)
590 if ( (value
-- > 0) &&
591 (value
< wxFONTENCODING_ISO8859_MAX
-
592 wxFONTENCODING_ISO8859_1
) )
594 // it's a valid ISO8859 encoding
595 value
+= wxFONTENCODING_ISO8859_1
;
596 encoding
= (wxFontEncoding
)value
;
600 else // check for Windows charsets
603 if ( cs
.Left(7) == wxT("WINDOWS") )
607 else if ( cs
.Left(2) == wxT("CP") )
611 else // not a Windows encoding
618 const wxChar
*p
= cs
.c_str() + len
;
619 if ( *p
== wxT('-') )
623 if ( wxSscanf(p
, wxT("%u"), &value
) == 1 )
628 if ( value
< wxFONTENCODING_CP12_MAX
-
629 wxFONTENCODING_CP1250
)
631 // a valid Windows code page
632 value
+= wxFONTENCODING_CP1250
;
633 encoding
= (wxFontEncoding
)value
;
640 encoding
= wxFONTENCODING_CP932
;
644 encoding
= wxFONTENCODING_CP936
;
648 encoding
= wxFONTENCODING_CP949
;
652 encoding
= wxFONTENCODING_CP950
;
662 // if still no luck, ask the user - unless disabled
663 if ( (encoding
== wxFONTENCODING_SYSTEM
) && interactive
)
665 // prepare the dialog data
668 wxString
title(m_titleDialog
);
670 title
<< wxTheApp
->GetAppName() << _(": unknown charset");
674 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());
676 // the list of choices
677 const size_t count
= WXSIZEOF(gs_encodingDescs
);
679 wxString
*encodingNamesTranslated
= new wxString
[count
];
681 for ( size_t i
= 0; i
< count
; i
++ )
683 encodingNamesTranslated
[i
] = wxGetTranslation(gs_encodingDescs
[i
]);
687 wxWindow
*parent
= m_windowParent
;
689 parent
= wxTheApp
->GetTopWindow();
691 // do ask the user and get back the index in encodings table
692 int n
= wxGetSingleChoiceIndex(msg
, title
,
694 encodingNamesTranslated
,
697 delete [] encodingNamesTranslated
;
701 encoding
= gs_encodings
[n
];
705 // save the result in the config now
706 if ( ChangePath(FONTMAPPER_CHARSET_PATH
, &pathOld
) )
708 wxConfigBase
*config
= GetConfig();
710 // remember the alt encoding for this charset - or remember that
712 long value
= n
== -1 ? wxFONTENCODING_UNKNOWN
: (long)encoding
;
713 if ( !config
->Write(charset
, value
) )
715 wxLogError(_("Failed to remember the encoding for the charset '%s'."), charset
.c_str());
718 RestorePath(pathOld
);
720 #endif // wxUSE_CONFIG
727 // ----------------------------------------------------------------------------
728 // support for unknown encodings: we maintain a map between the
729 // (platform-specific) strings identifying them and our wxFontEncodings they
730 // correspond to which is used by GetFontForEncoding() function
731 // ----------------------------------------------------------------------------
735 bool wxFontMapper::TestAltEncoding(const wxString
& configEntry
,
736 wxFontEncoding encReplacement
,
737 wxNativeEncodingInfo
*info
)
739 if ( wxGetNativeFontEncoding(encReplacement
, info
) &&
740 wxTestFontEncoding(*info
) )
743 // remember the mapping in the config
744 wxFontMapperPathChanger
path(this, FONTMAPPER_FONT_FROM_ENCODING_PATH
);
748 GetConfig()->Write(configEntry
, info
->ToString());
750 #endif // wxUSE_CONFIG
758 class ReentrancyBlocker
761 ReentrancyBlocker(bool& b
) : m_b(b
) { m_b
= TRUE
; }
762 ~ReentrancyBlocker() { m_b
= FALSE
; }
769 bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding
,
770 wxNativeEncodingInfo
*info
,
771 const wxString
& facename
,
775 // we need a flag to prevent infinite recursion which happens, for
776 // example, when GetAltForEncoding() is called from an OnPaint() handler:
777 // in this case, wxYield() which is called from wxMessageBox() we use here
778 // will lead to another call of OnPaint() and hence to another call of
779 // GetAltForEncoding() - and it is impossible to catch this from the user
780 // code because we are called from wxFont ctor implicitly.
782 // assume we're always called from the main thread, so that it is safe to
784 static bool s_inGetAltForEncoding
= FALSE
;
786 if ( interactive
&& s_inGetAltForEncoding
)
789 ReentrancyBlocker
blocker(s_inGetAltForEncoding
);
792 wxCHECK_MSG( info
, FALSE
, wxT("bad pointer in GetAltForEncoding") );
794 info
->facename
= facename
;
796 if ( encoding
== wxFONTENCODING_DEFAULT
)
798 encoding
= wxFont::GetDefaultEncoding();
801 // if we failed to load the system default encoding, something is really
802 // wrong and we'd better stop now - otherwise we will go into endless
803 // recursion trying to create the font in the msg box with the error
805 if ( encoding
== wxFONTENCODING_SYSTEM
)
807 wxLogFatalError(_("can't load any font, aborting"));
809 // wxLogFatalError doesn't return
812 wxString configEntry
,
813 encName
= GetEncodingName(encoding
);
816 configEntry
= facename
+ _T("_");
818 configEntry
+= encName
;
821 // do we have a font spec for this encoding?
823 if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH
, &pathOld
) )
825 wxConfigBase
*config
= GetConfig();
827 wxString fontinfo
= config
->Read(configEntry
);
829 RestorePath(pathOld
);
831 // this special value means that we don't know of fonts for this
832 // encoding but, moreover, have already asked the user as well and he
833 // didn't specify any font neither
834 if ( fontinfo
== FONTMAPPER_FONT_DONT_ASK
)
838 else // use the info entered the last time
840 if ( !!fontinfo
&& !!facename
)
842 // we tried to find a match with facename - now try without it
843 fontinfo
= config
->Read(encName
);
848 if ( info
->FromString(fontinfo
) )
850 if ( wxTestFontEncoding(*info
) )
855 //else: no such fonts, look for something else
856 // (should we erase the outdated value?)
860 wxLogDebug(wxT("corrupted config data: string '%s' is not a valid font encoding info"),
864 //else: there is no information in config about this encoding
867 #endif // wxUSE_CONFIG
869 // now try to map this encoding to a compatible one which we have on this
871 wxFontEncodingArray equiv
= wxEncodingConverter::GetAllEquivalents(encoding
);
872 size_t count
= equiv
.GetCount();
873 bool foundEquivEncoding
= FALSE
;
874 wxFontEncoding equivEncoding
= wxFONTENCODING_SYSTEM
;
877 for ( size_t i
= 0; i
< count
&& !foundEquivEncoding
; i
++ )
879 // don't test for encoding itself, we already know we don't have it
880 if ( equiv
[i
] == encoding
)
883 if ( TestAltEncoding(configEntry
, equiv
[i
], info
) )
885 equivEncoding
= equiv
[i
];
887 foundEquivEncoding
= TRUE
;
896 wxString
title(m_titleDialog
);
898 title
<< wxTheApp
->GetAppName() << _(": unknown encoding");
901 wxString encDesc
= GetEncodingDescription(encoding
),
903 if ( foundEquivEncoding
)
905 // ask the user if he wants to override found alternative encoding
906 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)?"),
907 encDesc
.c_str(), GetEncodingDescription(equivEncoding
).c_str());
911 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)?"),
915 // the question is different in 2 cases so the answer has to be
916 // interpreted differently as well
917 int answer
= foundEquivEncoding
? wxNO
: wxYES
;
919 if ( wxMessageBox(msg
, title
,
920 wxICON_QUESTION
| wxYES_NO
,
921 m_windowParent
) == answer
)
924 data
.SetEncoding(encoding
);
925 data
.EncodingInfo() = *info
;
926 wxFontDialog
dialog(m_windowParent
, data
);
927 if ( dialog
.ShowModal() == wxID_OK
)
929 wxFontData retData
= dialog
.GetFontData();
930 wxFont font
= retData
.GetChosenFont();
932 *info
= retData
.EncodingInfo();
933 info
->encoding
= retData
.GetEncoding();
936 // remember this in the config
937 if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH
, &pathOld
) )
939 GetConfig()->Write(configEntry
, info
->ToString());
941 RestorePath(pathOld
);
943 #endif // wxUSE_CONFIG
947 //else: the user canceled the font selection dialog
951 // the user doesn't want to select a font for this encoding
952 // or selected to use equivalent encoding
954 // remember it to avoid asking the same question again later
956 if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH
, &pathOld
) )
961 foundEquivEncoding
? info
->ToString().c_str()
962 : FONTMAPPER_FONT_DONT_ASK
965 RestorePath(pathOld
);
967 #endif // wxUSE_CONFIG
970 //else: we're in non-interactive mode
971 #endif // wxUSE_FONTDLG
973 return foundEquivEncoding
;
976 bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding
,
977 wxFontEncoding
*alt_encoding
,
978 const wxString
& facename
,
981 wxNativeEncodingInfo info
;
982 bool r
= GetAltForEncoding(encoding
, &info
, facename
, interactive
);
983 *alt_encoding
= info
.encoding
;
987 bool wxFontMapper::IsEncodingAvailable(wxFontEncoding encoding
,
988 const wxString
& facename
)
990 wxNativeEncodingInfo info
;
992 if (wxGetNativeFontEncoding(encoding
, &info
))
994 info
.facename
= facename
;
995 return wxTestFontEncoding(info
);
1003 #endif // wxUSE_FONTMAP