///////////////////////////////////////////////////////////////////////////////
-// Name: mac/fontenum.cpp
+// Name: src/mac/carbon/fontenum.cpp
// Purpose: wxFontEnumerator class for MacOS
// Author: Stefan Csomor
-// Modified by:
+// Modified by:
// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Stefan Csomor
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
-// ============================================================================
-// declarations
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-// headers
-// ----------------------------------------------------------------------------
-
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma implementation "fontenum.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
-#ifdef __BORLANDC__
- #pragma hdrstop
-#endif
+#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/mac/private.h"
// ----------------------------------------------------------------------------
-// private classes
-// ----------------------------------------------------------------------------
-
-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 ;
- Str255 p_name ;
-
- short lines ;
+ //
+ // From Apple's QA 1471 http://developer.apple.com/qa/qa2006/qa1471.html
+ //
- menu = NewMenu( 32000 , "\pFont" ) ;
- AppendResMenu( menu , 'FONT' ) ;
- lines = CountMenuItems( menu ) ;
-
- for ( int i = 1 ; i < lines+1 ; i ++ )
+ 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)
{
- GetMenuItemText( menu , i , p_name ) ;
- wxString c_name = wxMacMakeStringFromPascal(p_name) ;
-
- /*
-
- if ( m_fixedOnly )
+ // Get the next font in the iteration.
+ status = ATSFontFamilyIteratorNext( theFontFamilyIterator, &theATSFontFamilyRef );
+ if(status == noErr)
{
- // check that it's a fixed pitch font (there is *no* error here, the
- // flag name is misleading!)
- if ( tm->tmPitchAndFamily & TMPF_FIXED_PITCH )
+ // 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 )
{
- // not a fixed pitch font
- return TRUE;
+ status = noErr;
+ continue ;
}
- }
-
- if ( m_charset != -1 )
- {
- // check that we have the right encoding
- if ( lf->lfCharSet != m_charset )
+
+ if ( encoding != wxFONTENCODING_SYSTEM )
{
- return TRUE;
+ 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 if (status == kATSIterationScopeModified) // Make sure the font database hasnÕt changed.
+ {
+ // reset the iterator
+ status = ATSFontFamilyIteratorReset (kATSFontContextLocal, nil, nil,
+ kATSOptionFlagsUnRestrictedScope,
+ &theFontFamilyIterator);
+ fontFamilies.Clear() ;
}
-
- */
- 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;
}
bool wxFontEnumerator::EnumerateEncodings(const wxString& family)
{
wxFAIL_MSG(wxT("wxFontEnumerator::EnumerateEncodings() not yet implemented"));
- return TRUE;
+ return true;
}
+
+#endif // wxUSE_FONTMAP