1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        src/common/fontenumcmn.cpp
3 // Purpose:     wxFontEnumerator class
4 // Author:      Vadim Zeitlin
5 // Modified by:
6 // Created:     7/5/2006
7 // RCS-ID:      $Id: fontenumcmn.cpp 43727 2006-12-01 10:14:28Z VS $
8 // Copyright:   (c) 1999-2003 Vadim Zeitlin <vadim@wxwindows.org>
9 // Licence:     wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11 
12 // ============================================================================
13 // declarations
14 // ============================================================================
15 
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19 
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
22 
23 #ifdef __BORLANDC__
24     #pragma hdrstop
25 #endif
26 
27 #include "wx/fontenum.h"
28 
29 // ============================================================================
30 // implementation
31 // ============================================================================
32 
33 // A simple wxFontEnumerator which doesn't perform any filtering and
34 // just returns all facenames and encodings found in the system
35 class WXDLLEXPORT wxSimpleFontEnumerator : public wxFontEnumerator
36 {
37 public:
wxSimpleFontEnumerator()38     wxSimpleFontEnumerator() { }
39 
40     // called by EnumerateFacenames
OnFacename(const wxString & facename)41     virtual bool OnFacename(const wxString& facename)
42     {
43         m_arrFacenames.Add(facename);
44         return true;
45     }
46 
47     // called by EnumerateEncodings
OnFontEncoding(const wxString & WXUNUSED (facename),const wxString & encoding)48     virtual bool OnFontEncoding(const wxString& WXUNUSED(facename),
49                                 const wxString& encoding)
50     {
51         m_arrEncodings.Add(encoding);
52         return true;
53     }
54 
55 public:
56     wxArrayString m_arrFacenames, m_arrEncodings;
57 };
58 
59 
60 /* static */
GetFacenames(wxFontEncoding encoding,bool fixedWidthOnly)61 wxArrayString wxFontEnumerator::GetFacenames(wxFontEncoding encoding, bool fixedWidthOnly)
62 {
63     wxSimpleFontEnumerator temp;
64     temp.EnumerateFacenames(encoding, fixedWidthOnly);
65     return temp.m_arrFacenames;
66 }
67 
68 /* static */
GetEncodings(const wxString & facename)69 wxArrayString wxFontEnumerator::GetEncodings(const wxString& facename)
70 {
71     wxSimpleFontEnumerator temp;
72     temp.EnumerateEncodings(facename);
73     return temp.m_arrEncodings;
74 }
75 
76 /* static */
IsValidFacename(const wxString & facename)77 bool wxFontEnumerator::IsValidFacename(const wxString &facename)
78 {
79     // we cache the result of wxFontEnumerator::GetFacenames supposing that
80     // the array of face names won't change in the session of this program
81     static wxArrayString s_arr = wxFontEnumerator::GetFacenames();
82 
83 #ifdef __WXMSW__
84     // Quoting the MSDN:
85     //     "MS Shell Dlg is a mapping mechanism that enables
86     //     U.S. English Microsoft Windows NT, and Microsoft Windows 2000 to
87     //     support locales that have characters that are not contained in code
88     //     page 1252. It is not a font but a face name for a nonexistent font."
89     // Thus we need to consider "Ms Shell Dlg" and "Ms Shell Dlg 2" as valid
90     // font face names even if they are enumerated by wxFontEnumerator
91     if (facename.IsSameAs(wxT("Ms Shell Dlg"), false) ||
92         facename.IsSameAs(wxT("Ms Shell Dlg 2"), false))
93         return true;
94 #endif
95 
96     // is given font face name a valid one ?
97     if (s_arr.Index(facename, false) == wxNOT_FOUND)
98         return false;
99 
100     return true;
101 }
102 
103 #ifdef wxHAS_UTF8_FONTS
EnumerateEncodingsUTF8(const wxString & facename)104 bool wxFontEnumerator::EnumerateEncodingsUTF8(const wxString& facename)
105 {
106     // name of UTF-8 encoding: no need to use wxFontMapper for it as it's
107     // unlikely to change
108     const wxString utf8(_T("UTF-8"));
109 
110     // all fonts are in UTF-8 only if this code is used
111     if ( !facename.empty() )
112     {
113         OnFontEncoding(facename, utf8);
114         return true;
115     }
116 
117     // so enumerating all facenames supporting this encoding is the same as
118     // enumerating all facenames
119     const wxArrayString facenames(GetFacenames(wxFONTENCODING_UTF8));
120     const size_t count = facenames.size();
121     if ( !count )
122         return false;
123 
124     for ( size_t n = 0; n < count; n++ )
125     {
126         OnFontEncoding(facenames[n], utf8);
127     }
128 
129     return true;
130 }
131 #endif // wxHAS_UTF8_FONTS
132