X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/baaae89f09ece7ab8a17570ee535683b9d14aeda..e11898f903183f897a2b2a50a4447ea73ba7273f:/src/mac/carbon/fontdlg.cpp?ds=sidebyside diff --git a/src/mac/carbon/fontdlg.cpp b/src/mac/carbon/fontdlg.cpp index e7875df4f5..5fafc36dbf 100644 --- a/src/mac/carbon/fontdlg.cpp +++ b/src/mac/carbon/fontdlg.cpp @@ -1,13 +1,12 @@ ///////////////////////////////////////////////////////////////////////////// // Name: fontdlg.cpp -// Purpose: wxFontDialog class. NOTE: you can use the generic class -// if you wish, instead of implementing this. -// Author: AUTHOR +// Purpose: wxFontDialog class for carbon 10.2+. +// Author: Ryan Norton // Modified by: -// Created: ??/??/98 +// Created: 1998-01-01 // RCS-ID: $Id$ -// Copyright: (c) AUTHOR -// Licence: wxWindows licence +// Copyright: (c) Ryan Norton +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ @@ -21,9 +20,211 @@ IMPLEMENT_DYNAMIC_CLASS(wxFontDialog, wxDialog) #endif -/* - * wxFontDialog - */ +#include "wx/mac/private.h" + +#if defined( __WXMAC__ ) && TARGET_API_MAC_OSX && ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2 ) + +#include + +#include "wx/msgdlg.h" + +pascal OSStatus wxFontDialogEventHandler( EventHandlerCallRef inHandlerCallRef, + EventRef event, void* pData) +{ + wxASSERT(GetEventClass(event) == kEventClassFont && + GetEventKind(event) == kEventFontSelection); + + OSStatus status = noErr; + + FMFontFamily fontfamily; + FMFontStyle fontstyle; + FMFontSize fontsize; + RGBColor fontcolor; + + status = GetEventParameter (event, kEventParamFMFontFamily, + typeFMFontFamily, NULL, + sizeof (FMFontFamily), + NULL, &(fontfamily)); + check_noerr (status); + + status = GetEventParameter (event, kEventParamFMFontStyle, + typeFMFontStyle, NULL, + sizeof (FMFontStyle), + NULL, &(fontstyle)); + check_noerr (status); + + status = GetEventParameter (event, kEventParamFMFontSize, + typeFMFontSize, NULL, + sizeof (FMFontSize), + NULL, &(fontsize)); + + check_noerr (status); + + status = GetEventParameter (event, kEventParamFontColor, + typeRGBColor, NULL, + sizeof( RGBColor ), NULL, &fontcolor); + check_noerr (status); + + //now do the conversion to the wx font data + wxFontData theFontData; + wxFont theFont; + + //set color + wxColour theColor; + theColor.Set(&(WXCOLORREF&)fontcolor); + theFontData.SetColour(theColor); + + //set size + theFont.SetPointSize(fontsize); + + //set name + Str255 theFontName; + GetFontName(fontfamily, theFontName); + theFont.SetFaceName(wxMacMakeStringFromPascal(theFontName)); + + //TODOTODO: Get font family - mayby by the script code? + theFont.SetFamily(wxDEFAULT); + + //TODOTODO: Get other styles? + theFont.SetStyle(((fontstyle & italic) ? wxFONTSTYLE_ITALIC : 0)); + theFont.SetWeight((fontstyle & bold) ? wxBOLD : wxNORMAL); + theFont.SetUnderlined(((fontstyle & underline) ? true : false)); + + //phew!! We're done - set the chosen font + theFontData.SetChosenFont(theFont); + ((wxFontDialog*)pData)->SetData(theFontData); + + return status; +} + +DEFINE_ONE_SHOT_HANDLER_GETTER( wxFontDialogEventHandler ); + +//--------------------------- +// Class implementation +//--------------------------- + +wxFontDialog::wxFontDialog() : + m_dialogParent(NULL), m_pEventHandlerRef(NULL) +{ +} + +wxFontDialog::wxFontDialog(wxWindow *parent, const wxFontData& data) +{ + Create(parent, data); +} + +wxFontDialog::~wxFontDialog() +{ + if (m_pEventHandlerRef) + ::RemoveEventHandler((EventHandlerRef&)m_pEventHandlerRef); +} + +void wxFontDialog::SetData(wxFontData& fontdata) +{ + m_fontData = fontdata; +} + +bool wxFontDialog::Create(wxWindow *parent, const wxFontData& data) +{ + m_dialogParent = parent; + m_fontData = data; + + //Register the events that will return this dialog + EventTypeSpec ftEventList[] = { { kEventClassFont, kEventFontSelection } }; + + OSStatus err = noErr; + +//FIXMEFIXME: Why doesn't it recieve events if there's a parent? +// if (parent) +// { +// err = InstallWindowEventHandler( +// MAC_WXHWND(parent->GetHandle()), +// GetwxFontDialogEventHandlerUPP(), +// GetEventTypeCount(ftEventList), ftEventList, +// this, (&(EventHandlerRef&)m_pEventHandlerRef)); +// +// } +// else //no parent - send to app +// { + err = InstallApplicationEventHandler( + GetwxFontDialogEventHandlerUPP(), + GetEventTypeCount(ftEventList), ftEventList, + this, (&(EventHandlerRef&)m_pEventHandlerRef)); +// } + + return err == noErr; +} + +bool wxFontDialog::IsShown() const +{ + return FPIsFontPanelVisible(); +} + +int wxFontDialog::ShowModal() +{ + wxASSERT(!FPIsFontPanelVisible()); + + //set up initial font + wxFont theInitialFont = m_fontData.GetInitialFont(); + + //create ATSU style + ATSUStyle theStyle; + OSStatus status = ATSUCreateStyle(&theStyle); + check_noerr(status); + + //put stuff into the style - we don't need kATSUColorTag + ATSUFontID fontid = theInitialFont.MacGetATSUFontID(); + Fixed fontsize = theInitialFont.MacGetFontSize() << 16; + ATSUAttributeTag theTags[2] = { kATSUFontTag, kATSUSizeTag }; + ByteCount theSizes[2] = { sizeof(ATSUFontID), sizeof(Fixed) }; + ATSUAttributeValuePtr theValues[2] = { &fontid, + &fontsize }; + + //set the stuff for the ATSU style + verify_noerr (ATSUSetAttributes (theStyle, 2, theTags, theSizes, theValues) ); + + //they set us up the bomb! Set the initial font of the dialog + SetFontInfoForSelection(kFontSelectionATSUIType, + 1, + &theStyle, + (HIObjectRef) + (m_dialogParent ? + GetWindowEventTarget(MAC_WXHWND(m_dialogParent->GetHandle())) : + GetApplicationEventTarget()) + ); + + //dispose of the style + status = ATSUDisposeStyle(theStyle); + check_noerr(status); + + //in case the user doesn't choose anything - + //if he doesn't we'll get a bad font with red text + m_fontData.SetChosenFont(m_fontData.GetInitialFont()); + m_fontData.SetColour(wxColour(0,0,0)); + + //finally, show the font dialog + if( (status = FPShowHideFontPanel()) == noErr) + { + while(FPIsFontPanelVisible()) + { + //yeild so we can get events + ::wxSafeYield(m_dialogParent, false); + } + } + else + return wxID_CANCEL; + + return wxID_OK; +} + + +#else + //10.2+ only + + +// +// no native implementation +// wxFontDialog::wxFontDialog() { @@ -35,6 +236,11 @@ wxFontDialog::wxFontDialog(wxWindow *parent, const wxFontData& data) Create(parent, data); } +void wxFontDialog::SetData(wxFontData& fontdata) +{ + m_fontData = fontdata; +} + bool wxFontDialog::Create(wxWindow *parent, const wxFontData& data) { m_dialogParent = parent; @@ -46,9 +252,15 @@ bool wxFontDialog::Create(wxWindow *parent, const wxFontData& data) return TRUE; } +bool wxFontDialog::IsShown() const +{ + return false; +} + int wxFontDialog::ShowModal() { // TODO: show (maybe create) the dialog return wxID_CANCEL; } +#endif // 10.2+ \ No newline at end of file