📄 fontdlg.cpp
字号:
/////////////////////////////////////////////////////////////////////////////// Name: src/mac/carbon/fontdlg.cpp// Purpose: wxFontDialog class for carbon 10.2+.// Author: Ryan Norton// Modified by:// Created: 1998-01-01// RCS-ID: $Id: fontdlg.cpp,v 1.39 2006/10/21 16:39:41 VZ Exp $// Copyright: (c) Ryan Norton// Licence: wxWindows licence/////////////////////////////////////////////////////////////////////////////// ===========================================================================// declarations// ===========================================================================// ---------------------------------------------------------------------------// headers// ---------------------------------------------------------------------------// For compilers that support precompilation, includes "wx.h".#include "wx/wxprec.h"#if wxUSE_FONTDLG#ifdef __BORLANDC__ #pragma hdrstop#endif#ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/wxchar.h" #include "wx/dcclient.h" #include "wx/frame.h" #include "wx/textctrl.h" #include "wx/listbox.h" #include "wx/checkbox.h" #include "wx/choice.h" #include "wx/sizer.h" #include "wx/stattext.h" #include "wx/button.h"#endif#include "wx/fontdlg.h"#if wxMAC_USE_EXPERIMENTAL_FONTDIALOGIMPLEMENT_DYNAMIC_CLASS(wxFontDialog, wxDialog)#include "wx/mac/private.h"// ---------------------------------------------------------------------------// wxFontDialog// ---------------------------------------------------------------------------static const EventTypeSpec eventList[] ={ { kEventClassFont, kEventFontSelection } ,} ;pascal OSStatus wxMacCarbonFontPanelHandler(EventHandlerCallRef nextHandler, EventRef event, void *userData){ OSStatus result = eventNotHandledErr ; wxFontDialog *fontdialog = (wxFontDialog*) userData ; wxFontData& fontdata= fontdialog->GetFontData() ; wxMacCarbonEvent cEvent( event ); switch(cEvent.GetKind()) { case kEventFontSelection : { ATSUFontID fontId = 0 ; if ( cEvent.GetParameter<ATSUFontID>(kEventParamATSUFontID, &fontId) == noErr ) { FMFontStyle fontStyle = cEvent.GetParameter<FMFontStyle>(kEventParamFMFontStyle); FMFontSize fontSize = cEvent.GetParameter<FMFontSize>(kEventParamFMFontSize); CFStringRef cfName = NULL;#if 1 FMFontFamily fontFamily = cEvent.GetParameter<FMFontFamily>(kEventParamFMFontFamily); ATSFontFamilyRef atsfontfamilyref = FMGetATSFontFamilyRefFromFontFamily( fontFamily ) ; OSStatus err = ATSFontFamilyGetName( atsfontfamilyref , kATSOptionFlagsDefault , &cfName ) ; wxASSERT_MSG( err == noErr , wxT("ATSFontFamilyGetName failed") );#else // we don't use the ATSU naming anymore ByteCount actualLength = 0; char *c = NULL; OSStatus err = ATSUFindFontName(fontId , kFontFamilyName, kFontUnicodePlatform, kFontNoScriptCode, kFontNoLanguageCode , 0 , NULL , &actualLength , NULL ); if ( err == noErr) { actualLength += 1 ; char *c = (char*)malloc( actualLength ); err = ATSUFindFontName(fontId, kFontFamilyName, kFontUnicodePlatform, kFontNoScriptCode, kFontNoLanguageCode, actualLength, c , NULL, NULL); cfName = CFStringCreateWithCharacters(NULL, (UniChar*) c, (actualLength-1) >> 1); } else { err = ATSUFindFontName(fontId , kFontFamilyName, kFontNoPlatformCode, kFontNoScriptCode, kFontNoLanguageCode , 0 , NULL , &actualLength , NULL ); if ( err == noErr ) { actualLength += 1 ; c = (char*)malloc(actualLength); err = ATSUFindFontName(fontId, kFontFamilyName, kFontNoPlatformCode, kFontNoScriptCode, kFontNoLanguageCode, actualLength, c , NULL, NULL); c[actualLength-1] = 0; cfName = CFStringCreateWithCString(NULL, c, kCFStringEncodingMacRoman ); } } if ( c!=NULL ) free(c);#endif if ( cfName!=NULL ) { fontdata.m_chosenFont.SetFaceName(wxMacCFStringHolder(cfName).AsString(wxLocale::GetSystemEncoding())); fontdata.m_chosenFont.SetPointSize(fontSize); fontdata.m_chosenFont.SetStyle(fontStyle & italic ? wxFONTSTYLE_ITALIC : wxFONTSTYLE_NORMAL); fontdata.m_chosenFont.SetUnderlined((fontStyle & underline)!=0); fontdata.m_chosenFont.SetWeight(fontStyle & bold ? wxFONTWEIGHT_BOLD : wxFONTWEIGHT_NORMAL); } } RGBColor fontColor ; if ( cEvent.GetParameter<RGBColor>(kEventParamFontColor, &fontColor) == noErr ) fontdata.m_fontColour.FromRGBColor((WXCOLORREF*) &fontColor); else { CFDictionaryRef dict ; if ( cEvent.GetParameter<CFDictionaryRef>(kEventParamDictionary, &dict) == noErr ) { CFDictionaryRef attributesDict ; if ( CFDictionaryGetValueIfPresent(dict, kFontPanelAttributesKey, (const void **)&attributesDict) ) { CFDataRef tagsData; CFDataRef sizesData; CFDataRef valuesData; if ( CFDictionaryGetValueIfPresent(attributesDict, kFontPanelAttributeTagsKey, (const void **)&tagsData) && CFDictionaryGetValueIfPresent(attributesDict, kFontPanelAttributeSizesKey, (const void **)&sizesData) && CFDictionaryGetValueIfPresent(attributesDict, kFontPanelAttributeValuesKey, (const void **)&valuesData) ) { ItemCount count = CFDataGetLength(tagsData)/sizeof(ATSUAttributeTag); ATSUAttributeTag *tagPtr = (ATSUAttributeTag *)CFDataGetBytePtr(tagsData); ByteCount *sizePtr = (ByteCount *)CFDataGetBytePtr(sizesData); UInt32 *bytePtr = (UInt32*)CFDataGetBytePtr(valuesData); ATSUAttributeValuePtr valuesPtr = bytePtr ; for ( ItemCount i = 0 ; i < count ; ++i) { if ( tagPtr[i] == kATSUColorTag && sizePtr[i] == sizeof(RGBColor)) { fontdata.m_fontColour.FromRGBColor((WXCOLORREF*) valuesPtr); break ; } bytePtr = (UInt32*)( (UInt8*)bytePtr + sizePtr[i]); } } } } } } break ; } ; return result ;}DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacCarbonFontPanelHandler )wxFontDialog::wxFontDialog(){}wxFontDialog::wxFontDialog(wxWindow *parent, const wxFontData& data){ Create(parent, data);}wxFontDialog::~wxFontDialog(){}bool wxFontDialog::Create(wxWindow *parent, const wxFontData& data){ m_fontData = data; return true ;}int wxFontDialog::ShowModal(){ OSStatus err ; wxFont font = *wxNORMAL_FONT ; if ( m_fontData.m_initialFont.Ok() ) { font = m_fontData.m_initialFont ; } ATSUStyle style = (ATSUStyle)font.MacGetATSUStyle(); err = SetFontInfoForSelection (kFontSelectionATSUIType,1, &style , NULL); // just clicking on ENTER will not send us any font setting event, therefore we have to make sure // that field is already correct m_fontData.m_chosenFont = font ; EventHandlerRef handler ; err = InstallApplicationEventHandler( GetwxMacCarbonFontPanelHandlerUPP(), GetEventTypeCount(eventList), eventList, this , &handler ); if ( !FPIsFontPanelVisible() ) FPShowHideFontPanel(); int retval = RunMixedFontDialog(this); ::RemoveEventHandler(handler); return retval ;}#else#if !USE_NATIVE_FONT_DIALOG_FOR_MACOSX#undef wxFontDialog#include "wx/mac/fontdlg.h"#include "wx/fontenum.h"#include "wx/colordlg.h"#include "wx/spinctrl.h"// ---------------------------------------------------------------------------// wxFontDialog stub for mac OS's without a native font dialog// ---------------------------------------------------------------------------static const wxChar *FontFamilyIntToString(int family);static int FontFamilyStringToInt(const wxChar *family);//-----------------------------------------------------------------------------// helper class - wxFontPreviewCtrl//-----------------------------------------------------------------------------class WXDLLEXPORT wxFontPreviewCtrl : public wxWindow{public: wxFontPreviewCtrl(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, long style = 0) : wxWindow(parent, id, pos, sz, style) { SetBackgroundColour(*wxWHITE); }private: void OnPaint(wxPaintEvent& event); DECLARE_EVENT_TABLE()};BEGIN_EVENT_TABLE(wxFontPreviewCtrl, wxWindow) EVT_PAINT(wxFontPreviewCtrl::OnPaint)END_EVENT_TABLE()void wxFontPreviewCtrl::OnPaint(wxPaintEvent& WXUNUSED(event)){ wxPaintDC dc(this); wxSize size = GetSize(); wxFont font = GetFont(); if ( font.Ok() ) { dc.SetFont(font); // Calculate vertical centre long w = 0, h = 0; dc.GetTextExtent( wxT("X"), &w, &h); dc.SetTextForeground(GetForegroundColour()); dc.SetClippingRegion(2, 2, size.x-4, size.y-4); dc.DrawText(_("ABCDEFGabcdefg12345"), 10, size.y/2 - h/2); dc.DestroyClippingRegion(); }}/* * A control for displaying a small preview of a colour or bitmap */class wxFontColourSwatchCtrl: public wxControl{ DECLARE_CLASS(wxFontColourSwatchCtrl)public: wxFontColourSwatchCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0); virtual ~wxFontColourSwatchCtrl(); void OnPaint(wxPaintEvent& event); void OnMouseEvent(wxMouseEvent& event); void SetColour(const wxColour& colour) { m_colour = colour; SetBackgroundColour(m_colour); } wxColour& GetColour() { return m_colour; } virtual wxSize DoGetBestSize() const { return GetSize(); }protected: wxColour m_colour;DECLARE_EVENT_TABLE()};/* * A control for displaying a small preview of a colour or bitmap */BEGIN_EVENT_TABLE(wxFontColourSwatchCtrl, wxControl) EVT_MOUSE_EVENTS(wxFontColourSwatchCtrl::OnMouseEvent)END_EVENT_TABLE()IMPLEMENT_CLASS(wxFontColourSwatchCtrl, wxControl)wxFontColourSwatchCtrl::wxFontColourSwatchCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style): wxControl(parent, id, pos, size, style){ SetColour(* wxWHITE); SetBackgroundStyle(wxBG_STYLE_COLOUR);}wxFontColourSwatchCtrl::~wxFontColourSwatchCtrl(){}void wxFontColourSwatchCtrl::OnMouseEvent(wxMouseEvent& event){ if (event.LeftDown()) { wxWindow* parent = GetParent(); while (parent != NULL && !parent->IsKindOf(CLASSINFO(wxDialog)) && !parent->IsKindOf(CLASSINFO(wxFrame))) parent = parent->GetParent(); wxColourData data; data.SetChooseFull(true); data.SetColour(m_colour); wxColourDialog *dialog = new wxColourDialog(parent, &data); // Crashes on wxMac (no m_peer)#ifndef __WXMAC__ dialog->SetTitle(_("Background colour"));#endif if (dialog->ShowModal() == wxID_OK) { wxColourData retData = dialog->GetColourData(); m_colour = retData.GetColour(); SetBackgroundColour(m_colour); } dialog->Destroy(); Refresh(); wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, GetId()); GetEventHandler()->ProcessEvent(event); }}/*! * wxFontDialog type definition */IMPLEMENT_DYNAMIC_CLASS( wxFontDialog, wxDialog )/*! * wxFontDialog event table definition */BEGIN_EVENT_TABLE( wxFontDialog, wxDialog ) EVT_LISTBOX( wxID_FONTDIALOG_FACENAME, wxFontDialog::OnFontdialogFacenameSelected ) EVT_SPINCTRL( wxID_FONTDIALOG_FONTSIZE, wxFontDialog::OnFontdialogFontsizeUpdated ) EVT_TEXT( wxID_FONTDIALOG_FONTSIZE, wxFontDialog::OnFontdialogFontsizeTextUpdated ) EVT_CHECKBOX( wxID_FONTDIALOG_BOLD, wxFontDialog::OnFontdialogBoldClick ) EVT_CHECKBOX( wxID_FONTDIALOG_ITALIC, wxFontDialog::OnFontdialogItalicClick ) EVT_CHECKBOX( wxID_FONTDIALOG_UNDERLINED, wxFontDialog::OnFontdialogUnderlinedClick ) EVT_BUTTON( wxID_OK, wxFontDialog::OnOkClick ) EVT_BUTTON(wxID_FONTDIALOG_COLOUR, wxFontDialog::OnColourChanged)END_EVENT_TABLE()/*! * wxFontDialog constructors */wxFontDialog::wxFontDialog( ){ m_dialogParent = NULL;}wxFontDialog::wxFontDialog(wxWindow* parent, const wxFontData& fontData){ m_dialogParent = NULL; Create(parent, fontData);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -