1///////////////////////////////////////////////////////////////////////////////
2// Name:        src/os2/fontenum.cpp
3// Purpose:     wxFontEnumerator class for Windows
4// Author:      Julian Smart
5// Modified by: David Webster to add support for font encodings
6// Created:     01/03/00
7// RCS-ID:      $Id: fontenum.cpp 39734 2006-06-14 19:51:14Z ABX $
8// Copyright:   (c) Julian Smart
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#if wxUSE_FONTMAP
24
25#include "wx/fontenum.h"
26
27#ifndef WX_PRECOMP
28    #include "wx/font.h"
29#endif
30
31#include "wx/fontmap.h"
32#include "wx/encinfo.h"
33
34#include "wx/os2/private.h"
35
36// ----------------------------------------------------------------------------
37// private classes
38// ----------------------------------------------------------------------------
39
40class wxFontEnumeratorHelper
41{
42public:
43    wxFontEnumeratorHelper(wxFontEnumerator *fontEnum);
44
45    // control what exactly are we enumerating
46    bool SetEncoding(wxFontEncoding encoding);
47    void SetFixedOnly(bool fixedOnly)
48        { m_fixedOnly = fixedOnly; }
49
50    // call to start enumeration
51    void DoEnumerate();
52
53    // called by our font enumeration proc
54    bool OnFont(/*const LPLOGFONT lf, const LPTEXTMETRIC tm*/) const;
55
56private:
57    // the object we forward calls to OnFont() to
58    wxFontEnumerator *m_fontEnum;
59
60    // if != -1, enum only fonts which have this encoding
61    int m_charset;
62
63    // if not empty, enum only the fonts with this facename
64    wxString m_facename;
65
66    // if true, enum only fixed fonts
67    bool m_fixedOnly;
68};
69
70// ----------------------------------------------------------------------------
71// private functions
72// ----------------------------------------------------------------------------
73
74// TODO:
75/*
76int CALLBACK wxFontEnumeratorProc(LPLOGFONT lplf, LPTEXTMETRIC lptm,
77                                  DWORD dwStyle, LONG lParam);
78*/
79
80// ============================================================================
81// implementation
82// ============================================================================
83
84// ----------------------------------------------------------------------------
85// wxFontEnumeratorHelper
86// ----------------------------------------------------------------------------
87
88wxFontEnumeratorHelper::wxFontEnumeratorHelper(wxFontEnumerator *fontEnum)
89{
90    m_fontEnum = fontEnum;
91    m_charset = -1;
92    m_fixedOnly = FALSE;
93}
94
95bool wxFontEnumeratorHelper::SetEncoding(wxFontEncoding encoding)
96{
97    wxNativeEncodingInfo info;
98    if ( !wxGetNativeFontEncoding(encoding, &info) )
99    {
100        if ( !wxFontMapper::Get()->GetAltForEncoding(encoding, &info) )
101        {
102            // no such encodings at all
103            return FALSE;
104        }
105    }
106    m_charset = info.charset;
107    m_facename = info.facename;
108
109    return true;
110}
111
112#define wxFONTENUMPROC FONTENUMPROC
113
114void wxFontEnumeratorHelper::DoEnumerate()
115{
116   // TODO:
117   /*
118    HDC hDC = ::GetDC(NULL);
119
120#ifdef __WIN32__
121    LOGFONT lf;
122    lf.lfCharSet = m_charset;
123    wxStrncpy(lf.lfFaceName, m_facename, WXSIZEOF(lf.lfFaceName));
124    lf.lfPitchAndFamily = 0;
125    ::EnumFontFamiliesEx(hDC, &lf, (wxFONTENUMPROC)wxFontEnumeratorProc,
126                         (LPARAM)this, 0) ;
127#else // Win16
128    ::EnumFonts(hDC, (LPTSTR)NULL, (FONTENUMPROC)wxFontEnumeratorProc,
129    #ifdef STRICT
130               (LPARAM)
131    #else
132               (LPSTR)
133    #endif
134               this);
135#endif // Win32/16
136
137    ::ReleaseDC(NULL, hDC);
138    */
139}
140
141bool wxFontEnumeratorHelper::OnFont(/*const LPLOGFONT lf,
142                                      const LPTEXTMETRIC tm */) const
143{
144   // TODO:
145   /*
146    if ( m_fixedOnly )
147    {
148        // check that it's a fixed pitch font (there is *no* error here, the
149        // flag name is misleading!)
150        if ( tm->tmPitchAndFamily & TMPF_FIXED_PITCH )
151        {
152            // not a fixed pitch font
153            return true;
154        }
155    }
156
157    if ( m_charset != -1 )
158    {
159        // check that we have the right encoding
160        if ( lf->lfCharSet != m_charset )
161        {
162            return true;
163        }
164    }
165
166    return m_fontEnum->OnFacename(lf->lfFaceName);
167   */
168    return true;
169}
170
171// ----------------------------------------------------------------------------
172// wxFontEnumerator
173// ----------------------------------------------------------------------------
174
175bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding,
176                                          bool fixedWidthOnly)
177{
178    wxFontEnumeratorHelper fe(this);
179    if ( fe.SetEncoding(encoding) )
180    {
181        fe.SetFixedOnly(fixedWidthOnly);
182
183        fe.DoEnumerate();
184    }
185    // else: no such fonts, unknown encoding
186
187    return true;
188}
189
190bool wxFontEnumerator::EnumerateEncodings(const wxString& WXUNUSED(family))
191{
192    wxFAIL_MSG(wxT("TODO"));
193
194    return true;
195}
196
197// ----------------------------------------------------------------------------
198// Windows callbacks
199// ----------------------------------------------------------------------------
200
201// TODO:
202/*
203int CALLBACK wxFontEnumeratorProc(LPLOGFONT lplf, LPTEXTMETRIC lptm,
204                                  DWORD dwStyle, LONG lParam)
205{
206    // Get rid of any fonts that we don't want...
207    if ( dwStyle != TRUETYPE_FONTTYPE )
208    {
209        // continue enumeration
210        return TRUE;
211    }
212
213    wxFontEnumeratorHelper *fontEnum = (wxFontEnumeratorHelper *)lParam;
214
215    return fontEnum->OnFont(lplf, lptm);
216}
217*/
218
219#endif // wxUSE_FONTMAP
220