1
///////////////////////////////////////////////////////////////////////////////
2
// Name: src/common/fmapbase.cpp
3
// Purpose: wxFontMapperBase class implementation
4
// Author: Vadim Zeitlin
6
// Created: 21.06.2003 (extracted from common/fontmap.cpp)
7
// RCS-ID: $Id: fmapbase.cpp 71630 2012-06-01 11:01:46Z VZ $
8
// Copyright: (c) 1999-2003 Vadim Zeitlin <vadim@wxwindows.org>
9
// Licence: wxWindows licence
10
///////////////////////////////////////////////////////////////////////////////
12
// ============================================================================
14
// ============================================================================
16
// ----------------------------------------------------------------------------
18
// ----------------------------------------------------------------------------
20
// for compilers that support precompilation, includes "wx.h".
21
#include "wx/wxprec.h"
33
#include "wx/module.h"
34
#include "wx/wxcrtvararg.h"
37
#if defined(__WINDOWS__)
38
#include "wx/msw/private.h" // includes windows.h for LOGFONT
39
#include "wx/msw/winundef.h"
42
#include "wx/fontmap.h"
43
#include "wx/fmappriv.h"
45
#include "wx/apptrait.h"
47
// wxMemoryConfig uses wxFileConfig
48
#if wxUSE_CONFIG && wxUSE_FILECONFIG
49
#include "wx/config.h"
50
#include "wx/memconf.h"
53
// ----------------------------------------------------------------------------
55
// ----------------------------------------------------------------------------
57
// encodings supported by GetEncodingDescription
58
static const wxFontEncoding gs_encodings[] =
60
wxFONTENCODING_ISO8859_1,
61
wxFONTENCODING_ISO8859_2,
62
wxFONTENCODING_ISO8859_3,
63
wxFONTENCODING_ISO8859_4,
64
wxFONTENCODING_ISO8859_5,
65
wxFONTENCODING_ISO8859_6,
66
wxFONTENCODING_ISO8859_7,
67
wxFONTENCODING_ISO8859_8,
68
wxFONTENCODING_ISO8859_9,
69
wxFONTENCODING_ISO8859_10,
70
wxFONTENCODING_ISO8859_11,
71
wxFONTENCODING_ISO8859_12,
72
wxFONTENCODING_ISO8859_13,
73
wxFONTENCODING_ISO8859_14,
74
wxFONTENCODING_ISO8859_15,
76
wxFONTENCODING_KOI8_U,
83
wxFONTENCODING_CP1250,
84
wxFONTENCODING_CP1251,
85
wxFONTENCODING_CP1252,
86
wxFONTENCODING_CP1253,
87
wxFONTENCODING_CP1254,
88
wxFONTENCODING_CP1255,
89
wxFONTENCODING_CP1256,
90
wxFONTENCODING_CP1257,
91
wxFONTENCODING_CP1258,
92
wxFONTENCODING_CP1361,
96
wxFONTENCODING_UTF16BE,
97
wxFONTENCODING_UTF16LE,
98
wxFONTENCODING_UTF32BE,
99
wxFONTENCODING_UTF32LE,
100
wxFONTENCODING_EUC_JP,
101
wxFONTENCODING_DEFAULT,
102
wxFONTENCODING_ISO2022_JP,
104
wxFONTENCODING_MACROMAN,
105
wxFONTENCODING_MACJAPANESE,
106
wxFONTENCODING_MACCHINESETRAD,
107
wxFONTENCODING_MACKOREAN,
108
wxFONTENCODING_MACARABIC,
109
wxFONTENCODING_MACHEBREW,
110
wxFONTENCODING_MACGREEK,
111
wxFONTENCODING_MACCYRILLIC,
112
wxFONTENCODING_MACDEVANAGARI,
113
wxFONTENCODING_MACGURMUKHI,
114
wxFONTENCODING_MACGUJARATI,
115
wxFONTENCODING_MACORIYA,
116
wxFONTENCODING_MACBENGALI,
117
wxFONTENCODING_MACTAMIL,
118
wxFONTENCODING_MACTELUGU,
119
wxFONTENCODING_MACKANNADA,
120
wxFONTENCODING_MACMALAJALAM,
121
wxFONTENCODING_MACSINHALESE,
122
wxFONTENCODING_MACBURMESE,
123
wxFONTENCODING_MACKHMER,
124
wxFONTENCODING_MACTHAI,
125
wxFONTENCODING_MACLAOTIAN,
126
wxFONTENCODING_MACGEORGIAN,
127
wxFONTENCODING_MACARMENIAN,
128
wxFONTENCODING_MACCHINESESIMP,
129
wxFONTENCODING_MACTIBETAN,
130
wxFONTENCODING_MACMONGOLIAN,
131
wxFONTENCODING_MACETHIOPIC,
132
wxFONTENCODING_MACCENTRALEUR,
133
wxFONTENCODING_MACVIATNAMESE,
134
wxFONTENCODING_MACARABICEXT,
135
wxFONTENCODING_MACSYMBOL,
136
wxFONTENCODING_MACDINGBATS,
137
wxFONTENCODING_MACTURKISH,
138
wxFONTENCODING_MACCROATIAN,
139
wxFONTENCODING_MACICELANDIC,
140
wxFONTENCODING_MACROMANIAN,
141
wxFONTENCODING_MACCELTIC,
142
wxFONTENCODING_MACGAELIC,
143
wxFONTENCODING_MACKEYBOARD
146
// the descriptions for them
147
static const char* const gs_encodingDescs[] =
149
wxTRANSLATE( "Western European (ISO-8859-1)" ),
150
wxTRANSLATE( "Central European (ISO-8859-2)" ),
151
wxTRANSLATE( "Esperanto (ISO-8859-3)" ),
152
wxTRANSLATE( "Baltic (old) (ISO-8859-4)" ),
153
wxTRANSLATE( "Cyrillic (ISO-8859-5)" ),
154
wxTRANSLATE( "Arabic (ISO-8859-6)" ),
155
wxTRANSLATE( "Greek (ISO-8859-7)" ),
156
wxTRANSLATE( "Hebrew (ISO-8859-8)" ),
157
wxTRANSLATE( "Turkish (ISO-8859-9)" ),
158
wxTRANSLATE( "Nordic (ISO-8859-10)" ),
159
wxTRANSLATE( "Thai (ISO-8859-11)" ),
160
wxTRANSLATE( "Indian (ISO-8859-12)" ),
161
wxTRANSLATE( "Baltic (ISO-8859-13)" ),
162
wxTRANSLATE( "Celtic (ISO-8859-14)" ),
163
wxTRANSLATE( "Western European with Euro (ISO-8859-15)" ),
164
wxTRANSLATE( "KOI8-R" ),
165
wxTRANSLATE( "KOI8-U" ),
166
wxTRANSLATE( "Windows/DOS OEM Cyrillic (CP 866)" ),
167
wxTRANSLATE( "Windows Thai (CP 874)" ),
168
wxTRANSLATE( "Windows Japanese (CP 932) or Shift-JIS" ),
169
wxTRANSLATE( "Windows Chinese Simplified (CP 936) or GB-2312" ),
170
wxTRANSLATE( "Windows Korean (CP 949)" ),
171
wxTRANSLATE( "Windows Chinese Traditional (CP 950) or Big-5" ),
172
wxTRANSLATE( "Windows Central European (CP 1250)" ),
173
wxTRANSLATE( "Windows Cyrillic (CP 1251)" ),
174
wxTRANSLATE( "Windows Western European (CP 1252)" ),
175
wxTRANSLATE( "Windows Greek (CP 1253)" ),
176
wxTRANSLATE( "Windows Turkish (CP 1254)" ),
177
wxTRANSLATE( "Windows Hebrew (CP 1255)" ),
178
wxTRANSLATE( "Windows Arabic (CP 1256)" ),
179
wxTRANSLATE( "Windows Baltic (CP 1257)" ),
180
wxTRANSLATE( "Windows Vietnamese (CP 1258)" ),
181
wxTRANSLATE( "Windows Johab (CP 1361)" ),
182
wxTRANSLATE( "Windows/DOS OEM (CP 437)" ),
183
wxTRANSLATE( "Unicode 7 bit (UTF-7)" ),
184
wxTRANSLATE( "Unicode 8 bit (UTF-8)" ),
185
#ifdef WORDS_BIGENDIAN
186
wxTRANSLATE( "Unicode 16 bit (UTF-16)" ),
187
wxTRANSLATE( "Unicode 16 bit Little Endian (UTF-16LE)" ),
188
wxTRANSLATE( "Unicode 32 bit (UTF-32)" ),
189
wxTRANSLATE( "Unicode 32 bit Little Endian (UTF-32LE)" ),
190
#else // WORDS_BIGENDIAN
191
wxTRANSLATE( "Unicode 16 bit Big Endian (UTF-16BE)" ),
192
wxTRANSLATE( "Unicode 16 bit (UTF-16)" ),
193
wxTRANSLATE( "Unicode 32 bit Big Endian (UTF-32BE)" ),
194
wxTRANSLATE( "Unicode 32 bit (UTF-32)" ),
195
#endif // WORDS_BIGENDIAN
196
wxTRANSLATE( "Extended Unix Codepage for Japanese (EUC-JP)" ),
197
wxTRANSLATE( "US-ASCII" ),
198
wxTRANSLATE( "ISO-2022-JP" ),
200
wxTRANSLATE( "MacRoman" ),
201
wxTRANSLATE( "MacJapanese" ),
202
wxTRANSLATE( "MacChineseTrad" ),
203
wxTRANSLATE( "MacKorean" ),
204
wxTRANSLATE( "MacArabic" ),
205
wxTRANSLATE( "MacHebrew" ),
206
wxTRANSLATE( "MacGreek" ),
207
wxTRANSLATE( "MacCyrillic" ),
208
wxTRANSLATE( "MacDevanagari" ),
209
wxTRANSLATE( "MacGurmukhi" ),
210
wxTRANSLATE( "MacGujarati" ),
211
wxTRANSLATE( "MacOriya" ),
212
wxTRANSLATE( "MacBengali" ),
213
wxTRANSLATE( "MacTamil" ),
214
wxTRANSLATE( "MacTelugu" ),
215
wxTRANSLATE( "MacKannada" ),
216
wxTRANSLATE( "MacMalayalam" ),
217
wxTRANSLATE( "MacSinhalese" ),
218
wxTRANSLATE( "MacBurmese" ),
219
wxTRANSLATE( "MacKhmer" ),
220
wxTRANSLATE( "MacThai" ),
221
wxTRANSLATE( "MacLaotian" ),
222
wxTRANSLATE( "MacGeorgian" ),
223
wxTRANSLATE( "MacArmenian" ),
224
wxTRANSLATE( "MacChineseSimp" ),
225
wxTRANSLATE( "MacTibetan" ),
226
wxTRANSLATE( "MacMongolian" ),
227
wxTRANSLATE( "MacEthiopic" ),
228
wxTRANSLATE( "MacCentralEurRoman" ),
229
wxTRANSLATE( "MacVietnamese" ),
230
wxTRANSLATE( "MacExtArabic" ),
231
wxTRANSLATE( "MacSymbol" ),
232
wxTRANSLATE( "MacDingbats" ),
233
wxTRANSLATE( "MacTurkish" ),
234
wxTRANSLATE( "MacCroatian" ),
235
wxTRANSLATE( "MacIcelandic" ),
236
wxTRANSLATE( "MacRomanian" ),
237
wxTRANSLATE( "MacCeltic" ),
238
wxTRANSLATE( "MacGaelic" ),
239
wxTRANSLATE( "MacKeyboardGlyphs" )
242
// and the internal names (these are not translated on purpose!)
243
static const wxChar* const gs_encodingNames[][9] =
245
// names from the columns correspond to these OS:
246
// Linux Solaris and IRIX HP-UX AIX
247
{ wxT("ISO-8859-1"), wxT("ISO8859-1"), wxT("iso88591"), wxT("8859-1"), wxT("iso_8859_1"), NULL },
248
{ wxT("ISO-8859-2"), wxT("ISO8859-2"), wxT("iso88592"), wxT("8859-2"), NULL },
249
{ wxT("ISO-8859-3"), wxT("ISO8859-3"), wxT("iso88593"), wxT("8859-3"), NULL },
250
{ wxT("ISO-8859-4"), wxT("ISO8859-4"), wxT("iso88594"), wxT("8859-4"), NULL },
251
{ wxT("ISO-8859-5"), wxT("ISO8859-5"), wxT("iso88595"), wxT("8859-5"), NULL },
252
{ wxT("ISO-8859-6"), wxT("ISO8859-6"), wxT("iso88596"), wxT("8859-6"), NULL },
253
{ wxT("ISO-8859-7"), wxT("ISO8859-7"), wxT("iso88597"), wxT("8859-7"), NULL },
254
{ wxT("ISO-8859-8"), wxT("ISO8859-8"), wxT("iso88598"), wxT("8859-8"), NULL },
255
{ wxT("ISO-8859-9"), wxT("ISO8859-9"), wxT("iso88599"), wxT("8859-9"), NULL },
256
{ wxT("ISO-8859-10"), wxT("ISO8859-10"), wxT("iso885910"), wxT("8859-10"), NULL },
257
{ wxT("ISO-8859-11"), wxT("ISO8859-11"), wxT("iso885911"), wxT("8859-11"), NULL },
258
{ wxT("ISO-8859-12"), wxT("ISO8859-12"), wxT("iso885912"), wxT("8859-12"), NULL },
259
{ wxT("ISO-8859-13"), wxT("ISO8859-13"), wxT("iso885913"), wxT("8859-13"), NULL },
260
{ wxT("ISO-8859-14"), wxT("ISO8859-14"), wxT("iso885914"), wxT("8859-14"), NULL },
261
{ wxT("ISO-8859-15"), wxT("ISO8859-15"), wxT("iso885915"), wxT("8859-15"), NULL },
263
// although koi8-ru is not strictly speaking the same as koi8-r,
264
// they are similar enough to make mapping it to koi8 better than
265
// not recognizing it at all
266
{ wxT( "KOI8-R" ), wxT( "KOI8-RU" ), NULL },
267
{ wxT( "KOI8-U" ), NULL },
269
{ wxT( "WINDOWS-866" ), wxT( "CP866" ), NULL },
271
{ wxT( "WINDOWS-874" ), wxT( "CP874" ), wxT( "MS874" ), wxT( "IBM-874" ), NULL },
272
{ wxT( "WINDOWS-932" ), wxT( "CP932" ), wxT( "MS932" ), wxT( "IBM-932" ), wxT( "SJIS" ), wxT( "SHIFT-JIS" ), wxT( "SHIFT_JIS" ), NULL },
273
{ wxT( "WINDOWS-936" ), wxT( "CP936" ), wxT( "MS936" ), wxT( "IBM-936" ), wxT( "GB2312" ), wxT( "gbk" ),wxT( "GBK" ), NULL },
274
{ wxT( "WINDOWS-949" ), wxT( "CP949" ), wxT( "MS949" ), wxT( "IBM-949" ), wxT( "EUC-KR" ), wxT( "eucKR" ), wxT( "euc_kr" ), NULL },
275
{ wxT( "WINDOWS-950" ), wxT( "CP950" ), wxT( "MS950" ), wxT( "IBM-950" ), wxT( "BIG5" ), wxT( "BIG-5" ), wxT( "BIG-FIVE" ), NULL },
276
{ wxT( "WINDOWS-1250" ),wxT( "CP1250" ),wxT( "MS1250" ),wxT( "IBM-1250" ),NULL },
277
{ wxT( "WINDOWS-1251" ),wxT( "CP1251" ),wxT( "MS1251" ),wxT( "IBM-1251" ),NULL },
278
{ wxT( "WINDOWS-1252" ),wxT( "CP1252" ),wxT( "MS1252" ),wxT( "IBM-1252" ),NULL },
279
{ wxT( "WINDOWS-1253" ),wxT( "CP1253" ),wxT( "MS1253" ),wxT( "IBM-1253" ),NULL },
280
{ wxT( "WINDOWS-1254" ),wxT( "CP1254" ),wxT( "MS1254" ),wxT( "IBM-1254" ),NULL },
281
{ wxT( "WINDOWS-1255" ),wxT( "CP1255" ),wxT( "MS1255" ),wxT( "IBM-1255" ),NULL },
282
{ wxT( "WINDOWS-1256" ),wxT( "CP1256" ),wxT( "MS1256" ),wxT( "IBM-1256" ),NULL },
283
{ wxT( "WINDOWS-1257" ),wxT( "CP1257" ),wxT( "MS1257" ),wxT( "IBM-1257" ),NULL },
284
{ wxT( "WINDOWS-1258" ),wxT( "CP1258" ),wxT( "MS1258" ),wxT( "IBM-1258" ),NULL },
285
{ wxT( "WINDOWS-1361" ),wxT( "CP1361" ),wxT( "MS1361" ),wxT( "IBM-1361" ), wxT( "JOHAB" ), NULL },
286
{ wxT( "WINDOWS-437" ), wxT( "CP437" ), wxT( "MS437" ), wxT( "IBM-437" ), NULL },
288
{ wxT( "UTF-7" ), wxT("UTF7"), NULL },
289
{ wxT( "UTF-8" ), wxT("UTF8"), NULL },
290
#ifdef WORDS_BIGENDIAN
291
{ wxT( "UTF-16BE" ), wxT("UTF16BE"), wxT("UCS-2BE"), wxT("UCS2BE"), wxT("UTF-16"), wxT("UTF16"), wxT("UCS-2"), wxT("UCS2"), NULL },
292
{ wxT( "UTF-16LE" ), wxT("UTF16LE"), wxT("UCS-2LE"), wxT("UCS2LE"), NULL },
293
{ wxT( "UTF-32BE" ), wxT("UTF32BE"), wxT("UCS-4BE" ), wxT("UTF-32"), wxT("UTF32"), wxT("UCS-4"), wxT("UCS4"), NULL },
294
{ wxT( "UTF-32LE" ), wxT("UTF32LE"), wxT("UCS-4LE"), wxT("UCS4LE"), NULL },
295
#else // WORDS_BIGENDIAN
296
{ wxT("UTF-16BE"), wxT("UTF16BE"), wxT("UCS-2BE"), wxT("UCS2BE"), NULL },
297
{ wxT("UTF-16LE"), wxT("UTF16LE"), wxT("UCS-2LE"), wxT("UTF-16"), wxT("UTF16"), wxT("UCS-2"), wxT("UCS2"), NULL },
298
{ wxT("UTF-32BE"), wxT("UTF32BE"), wxT("UCS-4BE"), wxT("UCS4BE"), NULL },
299
{ wxT("UTF-32LE"), wxT("UTF32LE"), wxT("UCS-4LE"), wxT("UCS4LE"), wxT("UTF-32"), wxT("UTF32"), wxT("UCS-4"), wxT("UCS4"), NULL },
300
#endif // WORDS_BIGENDIAN
302
{ wxT( "EUC-JP" ), wxT( "eucJP" ), wxT( "euc_jp" ), wxT( "IBM-eucJP" ), NULL },
304
// 646 is for Solaris, roman8 -- for HP-UX
305
{ wxT( "US-ASCII" ), wxT( "ASCII" ), wxT("C"), wxT("POSIX"), wxT("ANSI_X3.4-1968"),
306
wxT("646"), wxT("roman8"), wxT( "" ), NULL },
308
{ wxT( "ISO-2022-JP" ), NULL },
311
{ wxT( "MacRoman" ), NULL },
312
{ wxT( "MacJapanese" ), NULL },
313
{ wxT( "MacChineseTrad" ), NULL },
314
{ wxT( "MacKorean" ), NULL },
315
{ wxT( "MacArabic" ), NULL },
316
{ wxT( "MacHebrew" ), NULL },
317
{ wxT( "MacGreek" ), NULL },
318
{ wxT( "MacCyrillic" ), NULL },
319
{ wxT( "MacDevanagari" ), NULL },
320
{ wxT( "MacGurmukhi" ), NULL },
321
{ wxT( "MacGujarati" ), NULL },
322
{ wxT( "MacOriya" ), NULL },
323
{ wxT( "MacBengali" ), NULL },
324
{ wxT( "MacTamil" ), NULL },
325
{ wxT( "MacTelugu" ), NULL },
326
{ wxT( "MacKannada" ), NULL },
327
{ wxT( "MacMalayalam" ), NULL },
328
{ wxT( "MacSinhalese" ), NULL },
329
{ wxT( "MacBurmese" ), NULL },
330
{ wxT( "MacKhmer" ), NULL },
331
{ wxT( "MacThai" ), NULL },
332
{ wxT( "MacLaotian" ), NULL },
333
{ wxT( "MacGeorgian" ), NULL },
334
{ wxT( "MacArmenian" ), NULL },
335
{ wxT( "MacChineseSimp" ), NULL },
336
{ wxT( "MacTibetan" ), NULL },
337
{ wxT( "MacMongolian" ), NULL },
338
{ wxT( "MacEthiopic" ), NULL },
339
{ wxT( "MacCentralEurRoman" ), NULL },
340
{ wxT( "MacVietnamese" ), NULL },
341
{ wxT( "MacExtArabic" ), NULL },
342
{ wxT( "MacSymbol" ), NULL },
343
{ wxT( "MacDingbats" ), NULL },
344
{ wxT( "MacTurkish" ), NULL },
345
{ wxT( "MacCroatian" ), NULL },
346
{ wxT( "MacIcelandic" ), NULL },
347
{ wxT( "MacRomanian" ), NULL },
348
{ wxT( "MacCeltic" ), NULL },
349
{ wxT( "MacGaelic" ), NULL },
350
{ wxT( "MacKeyboardGlyphs" ), NULL }
353
wxCOMPILE_TIME_ASSERT( WXSIZEOF(gs_encodingDescs) == WXSIZEOF(gs_encodings), EncodingsArraysNotInSync );
354
wxCOMPILE_TIME_ASSERT( WXSIZEOF(gs_encodingNames) == WXSIZEOF(gs_encodings), EncodingsArraysNotInSync );
356
// ----------------------------------------------------------------------------
358
// ----------------------------------------------------------------------------
360
// clean up the font mapper object
361
class wxFontMapperModule : public wxModule
364
wxFontMapperModule() : wxModule() { }
366
virtual bool OnInit()
368
// a dummy wxFontMapperBase object could have been created during the
369
// program startup before wxApp was created, we have to delete it to
370
// allow creating the real font mapper next time it is needed now that
371
// we can create it (when the modules are initialized, wxApp object
373
wxFontMapperBase *fm = wxFontMapperBase::Get();
374
if ( fm && fm->IsDummy() )
375
wxFontMapperBase::Reset();
380
virtual void OnExit()
382
wxFontMapperBase::Reset();
385
DECLARE_DYNAMIC_CLASS(wxFontMapperModule)
388
IMPLEMENT_DYNAMIC_CLASS(wxFontMapperModule, wxModule)
391
// ============================================================================
392
// wxFontMapperBase implementation
393
// ============================================================================
395
wxFontMapper *wxFontMapperBase::sm_instance = NULL;
397
// ----------------------------------------------------------------------------
399
// ----------------------------------------------------------------------------
401
wxFontMapperBase::wxFontMapperBase()
403
#if wxUSE_CONFIG && wxUSE_FILECONFIG
404
m_configDummy = NULL;
405
#endif // wxUSE_CONFIG
408
wxFontMapperBase::~wxFontMapperBase()
410
#if wxUSE_CONFIG && wxUSE_FILECONFIG
412
delete m_configDummy;
413
#endif // wxUSE_CONFIG
417
wxFontMapperBase *wxFontMapperBase::Get()
421
wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
424
sm_instance = traits->CreateFontMapper();
426
wxASSERT_MSG( sm_instance,
427
wxT("wxAppTraits::CreateFontMapper() failed") );
432
// last resort: we must create something because the existing code
433
// relies on always having a valid font mapper object
434
sm_instance = (wxFontMapper *)new wxFontMapperBase;
438
return (wxFontMapperBase*)sm_instance;
442
wxFontMapper *wxFontMapperBase::Set(wxFontMapper *mapper)
444
wxFontMapper *old = sm_instance;
445
sm_instance = mapper;
450
void wxFontMapperBase::Reset()
454
// we need a cast as wxFontMapper is not fully declared here and so the
455
// compiler can't know that it derives from wxFontMapperBase (but
456
// run-time behaviour will be correct because the dtor is virtual)
457
delete (wxFontMapperBase *)sm_instance;
462
#if wxUSE_CONFIG && wxUSE_FILECONFIG
464
// ----------------------------------------------------------------------------
465
// config usage customisation
466
// ----------------------------------------------------------------------------
469
static wxString gs_defaultConfigPath(FONTMAPPER_ROOT_PATH);
472
const wxString& wxFontMapperBase::GetDefaultConfigPath()
474
// NB: we return const wxString& and not wxString for compatibility
475
// with 2.8 that returned const wxChar*
476
return gs_defaultConfigPath;
479
void wxFontMapperBase::SetConfigPath(const wxString& prefix)
481
wxCHECK_RET( !prefix.empty() && prefix[0] == wxCONFIG_PATH_SEPARATOR,
482
wxT("an absolute path should be given to wxFontMapper::SetConfigPath()") );
484
m_configRootPath = prefix;
487
// ----------------------------------------------------------------------------
488
// get config object and path for it
489
// ----------------------------------------------------------------------------
491
wxConfigBase *wxFontMapperBase::GetConfig()
493
wxConfigBase *config = wxConfig::Get(false);
495
// If there is no global configuration, use an internal memory configuration
498
if ( !m_configDummy )
499
m_configDummy = new wxMemoryConfig;
500
config = m_configDummy;
502
// FIXME: ideally, we should add keys from dummy config to a real one later,
503
// but it is a low-priority task because typical wxWin application
504
// either doesn't use wxConfig at all or creates wxConfig object in
505
// wxApp::OnInit(), before any real interaction with the user takes
512
const wxString& wxFontMapperBase::GetConfigPath()
514
if ( !m_configRootPath )
517
m_configRootPath = GetDefaultConfigPath();
520
return m_configRootPath;
523
// ----------------------------------------------------------------------------
525
// ----------------------------------------------------------------------------
527
bool wxFontMapperBase::ChangePath(const wxString& pathNew, wxString *pathOld)
529
wxConfigBase *config = GetConfig();
533
*pathOld = config->GetPath();
535
wxString path = GetConfigPath();
536
if ( path.empty() || path.Last() != wxCONFIG_PATH_SEPARATOR )
538
path += wxCONFIG_PATH_SEPARATOR;
541
wxASSERT_MSG( !pathNew || (pathNew[0] != wxCONFIG_PATH_SEPARATOR),
542
wxT("should be a relative path") );
546
config->SetPath(path);
551
void wxFontMapperBase::RestorePath(const wxString& pathOld)
553
GetConfig()->SetPath(pathOld);
558
// ----------------------------------------------------------------------------
559
// charset/encoding correspondence
560
// ----------------------------------------------------------------------------
563
wxFontMapperBase::CharsetToEncoding(const wxString& charset,
564
bool WXUNUSED(interactive))
566
int enc = NonInteractiveCharsetToEncoding(charset);
567
if ( enc == wxFONTENCODING_UNKNOWN )
569
// we should return wxFONTENCODING_SYSTEM from here for unknown
571
enc = wxFONTENCODING_SYSTEM;
574
return (wxFontEncoding)enc;
578
wxFontMapperBase::NonInteractiveCharsetToEncoding(const wxString& charset)
580
wxFontEncoding encoding = wxFONTENCODING_SYSTEM;
582
// we're going to modify it, make a copy
583
wxString cs = charset;
585
#if wxUSE_CONFIG && wxUSE_FILECONFIG
586
// first try the user-defined settings
587
wxFontMapperPathChanger path(this, FONTMAPPER_CHARSET_PATH);
590
wxConfigBase *config = GetConfig();
592
// do we have an encoding for this charset?
593
long value = config->Read(charset, -1l);
596
if ( value == wxFONTENCODING_UNKNOWN )
598
// don't try to find it, in particular don't ask the user
602
if ( value >= 0 && value <= wxFONTENCODING_MAX )
604
encoding = (wxFontEncoding)value;
608
wxLogDebug(wxT("corrupted config data: invalid encoding %ld for charset '%s' ignored"),
609
value, charset.c_str());
613
if ( encoding == wxFONTENCODING_SYSTEM )
615
// may be we have an alias?
616
config->SetPath(FONTMAPPER_CHARSET_ALIAS_PATH);
618
wxString alias = config->Read(charset);
619
if ( !alias.empty() )
621
// yes, we do - use it instead
626
#endif // wxUSE_CONFIG
628
// if didn't find it there, try to recognize it ourselves
629
if ( encoding == wxFONTENCODING_SYSTEM )
635
// discard the optional quotes
638
if ( cs[0u] == wxT('"') && cs.Last() == wxT('"') )
640
cs = wxString(cs.c_str(), cs.length() - 1);
644
for ( size_t i = 0; i < WXSIZEOF(gs_encodingNames); ++i )
646
for ( const wxChar* const* encName = gs_encodingNames[i]; *encName; ++encName )
648
if ( cs.CmpNoCase(*encName) == 0 )
649
return gs_encodings[i];
655
if ( cs.Left(3) == wxT("ISO") )
657
// the dash is optional (or, to be exact, it is not, but
658
// several broken programs "forget" it)
659
const wxChar *p = cs.c_str() + 3;
660
if ( *p == wxT('-') )
664
if ( wxSscanf(p, wxT("8859-%u"), &value) == 1 )
666
// make it 0 based and check that it is strictly positive in
667
// the process (no such thing as iso8859-0 encoding)
668
if ( (value-- > 0) &&
669
(value < wxFONTENCODING_ISO8859_MAX -
670
wxFONTENCODING_ISO8859_1) )
672
// it's a valid ISO8859 encoding
673
value += wxFONTENCODING_ISO8859_1;
674
encoding = (wxFontEncoding)value;
678
else if ( cs.Left(4) == wxT("8859") )
680
const wxChar *p = cs.c_str();
683
if ( wxSscanf(p, wxT("8859-%u"), &value) == 1 )
685
// make it 0 based and check that it is strictly positive in
686
// the process (no such thing as iso8859-0 encoding)
687
if ( (value-- > 0) &&
688
(value < wxFONTENCODING_ISO8859_MAX -
689
wxFONTENCODING_ISO8859_1) )
691
// it's a valid ISO8859 encoding
692
value += wxFONTENCODING_ISO8859_1;
693
encoding = (wxFontEncoding)value;
697
else // check for Windows charsets
700
if ( cs.Left(7) == wxT("WINDOWS") )
704
else if ( cs.Left(2) == wxT("CP") )
708
else // not a Windows encoding
715
const wxChar *p = cs.c_str() + len;
716
if ( *p == wxT('-') )
720
if ( wxSscanf(p, wxT("%u"), &value) == 1 )
725
if ( value < wxFONTENCODING_CP12_MAX -
726
wxFONTENCODING_CP1250 )
728
// a valid Windows code page
729
value += wxFONTENCODING_CP1250;
730
encoding = (wxFontEncoding)value;
737
encoding = wxFONTENCODING_CP866;
741
encoding = wxFONTENCODING_CP874;
745
encoding = wxFONTENCODING_CP932;
749
encoding = wxFONTENCODING_CP936;
753
encoding = wxFONTENCODING_CP949;
757
encoding = wxFONTENCODING_CP950;
761
encoding = wxFONTENCODING_CP1258;
765
encoding = wxFONTENCODING_CP1361;
778
size_t wxFontMapperBase::GetSupportedEncodingsCount()
780
return WXSIZEOF(gs_encodings);
784
wxFontEncoding wxFontMapperBase::GetEncoding(size_t n)
786
wxCHECK_MSG( n < WXSIZEOF(gs_encodings), wxFONTENCODING_SYSTEM,
787
wxT("wxFontMapper::GetEncoding(): invalid index") );
789
return gs_encodings[n];
793
wxString wxFontMapperBase::GetEncodingDescription(wxFontEncoding encoding)
795
if ( encoding == wxFONTENCODING_DEFAULT )
797
return _("Default encoding");
800
const size_t count = WXSIZEOF(gs_encodingDescs);
802
for ( size_t i = 0; i < count; i++ )
804
if ( gs_encodings[i] == encoding )
806
return wxGetTranslation(gs_encodingDescs[i]);
811
str.Printf(_("Unknown encoding (%d)"), encoding);
817
wxString wxFontMapperBase::GetEncodingName(wxFontEncoding encoding)
819
if ( encoding == wxFONTENCODING_DEFAULT )
824
const size_t count = WXSIZEOF(gs_encodingNames);
826
for ( size_t i = 0; i < count; i++ )
828
if ( gs_encodings[i] == encoding )
830
return gs_encodingNames[i][0];
835
str.Printf(_("unknown-%d"), encoding);
841
const wxChar** wxFontMapperBase::GetAllEncodingNames(wxFontEncoding encoding)
843
static const wxChar* const dummy[] = { NULL };
845
for ( size_t i = 0; i < WXSIZEOF(gs_encodingNames); i++ )
847
if ( gs_encodings[i] == encoding )
849
return const_cast<const wxChar**>(gs_encodingNames[i]);
853
return const_cast<const wxChar**>(dummy);
857
wxFontEncoding wxFontMapperBase::GetEncodingFromName(const wxString& name)
859
const size_t count = WXSIZEOF(gs_encodingNames);
861
for ( size_t i = 0; i < count; i++ )
863
for ( const wxChar* const* encName = gs_encodingNames[i]; *encName; ++encName )
865
if ( name.CmpNoCase(*encName) == 0 )
866
return gs_encodings[i];
870
return wxFONTENCODING_MAX;
873
#endif // wxUSE_FONTMAP