#if wxUSE_FONTMAP
+#include "wx/fontenum.h"
+
#ifndef WX_PRECOMP
- #include "wx/font.h"
+ #include "wx/font.h"
+ #include "wx/intl.h"
#endif
-#include "wx/fontenum.h"
#include "wx/fontutil.h"
#include "wx/fontmap.h"
-#include "wx/fontutil.h"
#include "wx/encinfo.h"
-#include "wx/intl.h"
#include "wx/mac/private.h"
-
-class wxFontEnumeratorHelper
-{
-public:
- wxFontEnumeratorHelper(wxFontEnumerator *fontEnum);
-
- // control what exactly are we enumerating
- bool SetEncoding(wxFontEncoding encoding);
- void SetFixedOnly(bool fixedOnly)
- { m_fixedOnly = fixedOnly; }
-
- // call to start enumeration
- void DoEnumerate();
-
-private:
- // the object we forward calls to OnFont() to
- wxFontEnumerator *m_fontEnum;
-
- // if != -1, enum only fonts which have this encoding
- int m_charset;
-
- // if not empty, enum only the fonts with this facename
- wxString m_facename;
-
- // if true, enum only fixed fonts
- bool m_fixedOnly;
-};
-
-// ============================================================================
-// implementation
-// ============================================================================
-
// ----------------------------------------------------------------------------
-// wxFontEnumeratorHelper
+// wxFontEnumerator
// ----------------------------------------------------------------------------
-wxFontEnumeratorHelper::wxFontEnumeratorHelper(wxFontEnumerator *fontEnum)
-{
- m_fontEnum = fontEnum;
- m_charset = -1;
- m_fixedOnly = false;
-}
-
-bool wxFontEnumeratorHelper::SetEncoding(wxFontEncoding encoding)
-{
- wxNativeEncodingInfo info;
- if ( !wxGetNativeFontEncoding( encoding, &info ) )
- {
- if ( !wxFontMapper::Get()->GetAltForEncoding( encoding, &info ) )
- // no such encodings at all
- return false;
- }
-
- m_charset = info.charset;
- m_facename = info.facename;
-
- return true;
-}
-
-void wxFontEnumeratorHelper::DoEnumerate()
+bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding,
+ bool fixedWidthOnly)
{
- MenuHandle menu;
- short lines;
-
- menu = NewMenu( 32000, "\pFont" );
- AppendResMenu( menu, 'FONT' );
- lines = CountMenuItems( menu );
-
- for ( int i = 1; i < lines + 1; i ++ )
+ //
+ // From Apple's QA 1471 http://developer.apple.com/qa/qa2006/qa1471.html
+ //
+
+ ATSFontFamilyIterator theFontFamilyIterator = NULL;
+ ATSFontFamilyRef theATSFontFamilyRef = 0;
+ OSStatus status = noErr;
+
+ wxArrayString fontFamilies ;
+
+ // Create the iterator
+ status = ATSFontFamilyIteratorCreate(kATSFontContextLocal, nil,nil,
+ kATSOptionFlagsUnRestrictedScope,
+ &theFontFamilyIterator );
+
+ wxUint32 macEncoding = wxMacGetSystemEncFromFontEnc(encoding) ;
+
+ while (status == noErr)
{
- wxString c_name ;
-#if TARGET_API_MAC_CARBON
- CFStringRef menutext ;
- c_name = wxEmptyString ;
- if ( CopyMenuItemTextAsCFString (menu, i, &menutext) == noErr )
+ // Get the next font in the iteration.
+ status = ATSFontFamilyIteratorNext( theFontFamilyIterator, &theATSFontFamilyRef );
+ if(status == noErr)
{
- c_name = wxMacCFStringHolder(menutext).AsString(wxLocale::GetSystemEncoding());
+ // added CS : avoid showing fonts that won't be displayable
+ FMFontStyle intrinsicStyle = 0 ;
+ FMFont fontInstance ;
+ FMFontFamily fmFamily = FMGetFontFamilyFromATSFontFamilyRef( theATSFontFamilyRef );
+ status = FMGetFontFromFontFamilyInstance( fmFamily , 0 , &fontInstance , &intrinsicStyle);
+ if ( status != noErr )
+ {
+ status = noErr;
+ continue ;
+ }
+
+ if ( encoding != wxFONTENCODING_SYSTEM )
+ {
+ TextEncoding fontFamiliyEncoding = ATSFontFamilyGetEncoding(theATSFontFamilyRef) ;
+ if ( fontFamiliyEncoding != macEncoding )
+ continue ;
+ }
+
+ // TODO: determine fixed widths ...
+
+ CFStringRef theName = NULL;
+ ATSFontFamilyGetName(theATSFontFamilyRef, kATSOptionFlagsDefault, &theName);
+ wxMacCFStringHolder cfName(theName) ;
+ fontFamilies.Add(cfName.AsString(wxLocale::GetSystemEncoding()));
}
-#else
- Str255 p_name;
- GetMenuItemText( menu, i, p_name );
- c_name = wxMacMakeStringFromPascal( p_name );
-#endif
-
-#if 0
- if ( m_fixedOnly )
+ else if (status == kATSIterationScopeModified) // Make sure the font database hasnÕt changed.
{
- // check that it's a fixed pitch font:
- // there is *no* error here: the flag name is misleading!
- if ( tm->tmPitchAndFamily & TMPF_FIXED_PITCH )
- // not a fixed pitch font
- return true;
+ // reset the iterator
+ status = ATSFontFamilyIteratorReset (kATSFontContextLocal, nil, nil,
+ kATSOptionFlagsUnRestrictedScope,
+ &theFontFamilyIterator);
+ fontFamilies.Clear() ;
}
-
- if ( m_charset != -1 )
- {
- // check that we have the right encoding
- if ( lf->lfCharSet != m_charset )
- return true;
- }
-#endif
-
- m_fontEnum->OnFacename( c_name );
}
-
- DisposeMenu( menu );
-}
-
-// ----------------------------------------------------------------------------
-// wxFontEnumerator
-// ----------------------------------------------------------------------------
-
-bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding,
- bool fixedWidthOnly)
-{
- wxFontEnumeratorHelper fe(this);
- if ( fe.SetEncoding(encoding) )
+ ATSFontFamilyIteratorRelease(&theFontFamilyIterator);
+
+ for ( size_t i = 0 ; i < fontFamilies.Count() ; ++i )
{
- fe.SetFixedOnly(fixedWidthOnly);
-
- fe.DoEnumerate();
+ if ( OnFacename( fontFamilies[i] ) == false )
+ break ;
}
- // else: no such fonts, unknown encoding
-
+
return true;
}
return true;
}
-#endif
+#endif // wxUSE_FONTMAP