From 7826e2dd838d59c6a8061b4fdd9f7326a6e06de3 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 18 Dec 2000 21:15:16 +0000 Subject: [PATCH] wxNativeFontInfo changes git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8949 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/cmndata.h | 1 - include/wx/defs.h | 14 +++++++--- include/wx/font.h | 49 +++++++++------------------------- include/wx/fontenc.h | 42 +++++++++++++++++++++++++++++ include/wx/fontmap.h | 3 --- include/wx/fontutil.h | 60 +++++++++++++++++------------------------- include/wx/gtk/font.h | 25 ++++++++++++------ include/wx/gtk1/font.h | 25 ++++++++++++------ samples/font/font.cpp | 31 +++++++++++----------- src/common/fontcmn.cpp | 48 ++++++++++++++++++++++++--------- src/common/fontmap.cpp | 5 ++-- src/gtk/data.cpp | 1 - src/gtk/font.cpp | 49 ++++++++++++++++++---------------- src/gtk/fontdlg.cpp | 25 +++++++++++++----- src/gtk1/data.cpp | 1 - src/gtk1/font.cpp | 49 ++++++++++++++++++---------------- src/gtk1/fontdlg.cpp | 25 +++++++++++++----- 17 files changed, 266 insertions(+), 187 deletions(-) diff --git a/include/wx/cmndata.h b/include/wx/cmndata.h index 7cfa51d570..028c27fe4f 100644 --- a/include/wx/cmndata.h +++ b/include/wx/cmndata.h @@ -18,7 +18,6 @@ #include "wx/window.h" #include "wx/font.h" -#include "wx/fontutil.h" #include "wx/colour.h" #include "wx/gdicmn.h" diff --git a/include/wx/defs.h b/include/wx/defs.h index 8c13ac9d34..f1bd9ecc33 100644 --- a/include/wx/defs.h +++ b/include/wx/defs.h @@ -1697,9 +1697,16 @@ typedef enum { wxPRINT_MODE_PRINTER = 3 // Send to printer } wxPrintMode; -// --------------------------------------------------------------------------- -// Macro to specify "All Files" on different platforms -// --------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// miscellaneous +// ---------------------------------------------------------------------------- + +// define this macro if font handling is done using the X font names +#if defined(__WXGTK__) || defined(__X__) + #define _WX_X_FONTLIKE +#endif + +// macro to specify "All Files" on different platforms #if defined(__WXMSW__) # define wxALL_FILES_PATTERN "*.*" # define wxALL_FILES gettext_noop("All files (*.*)|*.*") @@ -1707,6 +1714,7 @@ typedef enum { # define wxALL_FILES_PATTERN "*" # define wxALL_FILES gettext_noop("All files (*)|*") #endif + // --------------------------------------------------------------------------- // macros that enable wxWindows apps to be compiled in absence of the // sytem headers, although some platform specific types are used in the diff --git a/include/wx/font.h b/include/wx/font.h index 3010028809..fe9632599c 100644 --- a/include/wx/font.h +++ b/include/wx/font.h @@ -67,50 +67,19 @@ enum wxFontWeight wxFONTWEIGHT_MAX }; -// ---------------------------------------------------------------------------- -// wxNativeFontInfo is platform-specific font representation -// ---------------------------------------------------------------------------- - -// this struct should be considered as opaque font description only used by -// the native functions, the user code can only get the objects of this type -// from somewhere and pass it somewhere else (possibly save them somewhere -// using ToString() and restore them using FromString()) -struct WXDLLEXPORT wxNativeFontInfo -{ -#if defined(__WXGTK__) - wxString xFontName; -#else // other platforms - // - // This is a generic implementation that should work on all ports - // without specific support by the port. - // - int pointSize; - int family; - int style; - int weight; - bool underlined; - wxString faceName; - wxFontEncoding encoding; -#endif // platforms - - // it is important to be able to serialize wxNativeFontInfo objects to be - // able to store them (in config file, for example) - bool FromString(const wxString& s); - wxString ToString() const; -}; - -WXDLLEXPORT_DATA(extern wxNativeFontInfo) wxNullNativeFontInfo; - // ---------------------------------------------------------------------------- // wxFontBase represents a font object // ---------------------------------------------------------------------------- class WXDLLEXPORT wxFontRefData; +class WXDLLEXPORT wxNativeFontInfo; class WXDLLEXPORT wxFontBase : public wxGDIObject { public: // creator function + + // from the font components static wxFont *New( int pointSize, // size of the font in points int family, // see wxFontFamily enum @@ -119,7 +88,12 @@ public: bool underlined = FALSE, // not underlined by default const wxString& face = wxEmptyString, // facename wxFontEncoding encoding = wxFONTENCODING_DEFAULT); // ISO8859-X, ... - static wxFont *New(const wxNativeFontInfo& info); + + // from the (opaque) native font description object + static wxFont *New(const wxNativeFontInfo& nativeFontDesc); + + // from the string representation of wxNativeFontInfo + static wxFont *New(const wxString& strNativeFontDesc); // was the font successfully created? bool Ok() const { return m_refData != NULL; } @@ -136,7 +110,8 @@ public: virtual bool GetUnderlined() const = 0; virtual wxString GetFaceName() const = 0; virtual wxFontEncoding GetEncoding() const = 0; - virtual wxNativeFontInfo GetNativeFontInfo() const; + virtual wxNativeFontInfo *GetNativeFontInfo() const; + wxString GetNativeFontInfoDesc() const; // change the font characteristics virtual void SetPointSize( int pointSize ) = 0; @@ -148,6 +123,8 @@ public: virtual void SetEncoding(wxFontEncoding encoding) = 0; virtual void SetNativeFontInfo(const wxNativeFontInfo& info); + // VZ: there is no void SetNativeFontInfo(const wxString& info), needed? + // translate the fonts into human-readable string (i.e. GetStyleString() // will return "wxITALIC" for an italic font, ...) wxString GetFamilyString() const; diff --git a/include/wx/fontenc.h b/include/wx/fontenc.h index 83300a6f40..4af4ca20d2 100644 --- a/include/wx/fontenc.h +++ b/include/wx/fontenc.h @@ -12,6 +12,8 @@ #ifndef _WX_FONTENC_H_ #define _WX_FONTENC_H_ +#include "wx/string.h" + // font encodings enum wxFontEncoding { @@ -68,4 +70,44 @@ enum wxFontEncoding wxFONTENCODING_MAX }; +// ---------------------------------------------------------------------------- +// types +// ---------------------------------------------------------------------------- + +// This private structure specifies all the parameters needed to create a font +// with the given encoding on this platform. +// +// Under X, it contains the last 2 elements of the font specifications +// (registry and encoding). +// +// Under Windows, it contains a number which is one of predefined CHARSET_XXX +// values. +// +// Under all platforms it also contains a facename string which should be +// used, if not empty, to create fonts in this encoding (this is the only way +// to create a font of non-standard encoding (like KOI8) under Windows - the +// facename specifies the encoding then) + +struct WXDLLEXPORT wxNativeEncodingInfo +{ + wxString facename; // may be empty meaning "any" + wxFontEncoding encoding; // so that we know what this struct represents + +#if defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMAC__) + wxNativeEncodingInfo() { charset = 0; /* ANSI_CHARSET */ } + + int charset; +#elif defined(_WX_X_FONTLIKE) + wxString xregistry, + xencoding; +#else + #error "Unsupported toolkit" +#endif + + // this struct is saved in config by wxFontMapper, so it should know to + // serialise itself (implemented in platform-specific code) + bool FromString(const wxString& s); + wxString ToString() const; +}; + #endif // _WX_FONTENC_H_ diff --git a/include/wx/fontmap.h b/include/wx/fontmap.h index 43285146c0..920733ed35 100644 --- a/include/wx/fontmap.h +++ b/include/wx/fontmap.h @@ -21,9 +21,6 @@ // ---------------------------------------------------------------------------- #include "wx/fontenc.h" // for wxFontEncoding -#if wxUSE_GUI - #include "wx/fontutil.h" // for wxNativeEncodingInfo -#endif // wxUSE_GUI #if wxUSE_CONFIG class WXDLLEXPORT wxConfigBase; diff --git a/include/wx/fontutil.h b/include/wx/fontutil.h index 6eb762401d..7defab993d 100644 --- a/include/wx/fontutil.h +++ b/include/wx/fontutil.h @@ -26,47 +26,35 @@ #include "wx/font.h" // for wxFont and wxFontEncoding -// for our purposes here, GDK and X are identical -#if defined(__WXGTK__) || defined(__X__) - #define _WX_X_FONTLIKE -#endif - // ---------------------------------------------------------------------------- // types // ---------------------------------------------------------------------------- -// This private structure specifies all the parameters needed to create a font -// with the given encoding on this platform. -// -// Under X, it contains the last 2 elements of the font specifications -// (registry and encoding). -// -// Under Windows, it contains a number which is one of predefined CHARSET_XXX -// values. -// -// Under all platforms it also contains a facename string which should be -// used, if not empty, to create fonts in this encoding (this is the only way -// to create a font of non-standard encoding (like KOI8) under Windows - the -// facename specifies the encoding then) - -struct WXDLLEXPORT wxNativeEncodingInfo +// wxNativeFontInfo is platform-specific font representation: this struct +// should be considered as opaque font description only used by the native +// functions, the user code can only get the objects of this type from +// somewhere and pass it somewhere else (possibly save them somewhere using +// ToString() and restore them using FromString()) +struct WXDLLEXPORT wxNativeFontInfo { - wxString facename; // may be empty meaning "any" - wxFontEncoding encoding; // so that we know what this struct represents - -#if defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMAC__) - wxNativeEncodingInfo() { charset = 0; /* ANSI_CHARSET */ } - - int charset; -#elif defined(_WX_X_FONTLIKE) - wxString xregistry, - xencoding; -#else - #error "Unsupported toolkit" -#endif - - // this struct is saved in config by wxFontMapper, so it should know to - // serialise itself (implemented in platform-specific code) +#if defined(__WXGTK__) + wxString xFontName; +#else // other platforms + // + // This is a generic implementation that should work on all ports + // without specific support by the port. + // + int pointSize; + int family; + int style; + int weight; + bool underlined; + wxString faceName; + wxFontEncoding encoding; +#endif // platforms + + // it is important to be able to serialize wxNativeFontInfo objects to be + // able to store them (in config file, for example) bool FromString(const wxString& s); wxString ToString() const; }; diff --git a/include/wx/gtk/font.h b/include/wx/gtk/font.h index a15d5b5dcc..ed7ac95c86 100644 --- a/include/wx/gtk/font.h +++ b/include/wx/gtk/font.h @@ -36,11 +36,15 @@ public: // ctors and such wxFont() { Init(); } wxFont(const wxFont& font) { Init(); Ref(font); } - wxFont(const wxString& fontname, const wxFontData& fontdata) { Create(fontname, fontdata); } - wxFont(const wxNativeFontInfo& info); + wxFont(const wxString& fontname, + wxFontEncoding fontenc = wxFONTENCODING_DEFAULT) + { + Init(); - // assignment - wxFont& operator=(const wxFont& font); + Create(fontname, fontenc); + } + + wxFont(const wxNativeFontInfo& info); wxFont(int size, int family, @@ -61,13 +65,18 @@ public: int weight, bool underlined = FALSE, const wxString& face = wxEmptyString, - wxFontEncoding encoding = wxFONTENCODING_DEFAULT, - const wxNativeFontInfo& info = wxNullNativeFontInfo); + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); - bool Create(const wxString& fontname, const wxFontData& fontdata); + // wxGTK-specific + bool Create(const wxString& fontname, + wxFontEncoding fontenc = wxFONTENCODING_DEFAULT); + bool Create(const wxNativeFontInfo& fontinfo); ~wxFont(); + // assignment + wxFont& operator=(const wxFont& font); + // implement base class pure virtuals virtual int GetPointSize() const; virtual int GetFamily() const; @@ -76,7 +85,7 @@ public: virtual wxString GetFaceName() const; virtual bool GetUnderlined() const; virtual wxFontEncoding GetEncoding() const; - virtual wxNativeFontInfo GetNativeFontInfo() const; + virtual wxNativeFontInfo *GetNativeFontInfo() const; virtual void SetPointSize( int pointSize ); virtual void SetFamily( int family ); diff --git a/include/wx/gtk1/font.h b/include/wx/gtk1/font.h index a15d5b5dcc..ed7ac95c86 100644 --- a/include/wx/gtk1/font.h +++ b/include/wx/gtk1/font.h @@ -36,11 +36,15 @@ public: // ctors and such wxFont() { Init(); } wxFont(const wxFont& font) { Init(); Ref(font); } - wxFont(const wxString& fontname, const wxFontData& fontdata) { Create(fontname, fontdata); } - wxFont(const wxNativeFontInfo& info); + wxFont(const wxString& fontname, + wxFontEncoding fontenc = wxFONTENCODING_DEFAULT) + { + Init(); - // assignment - wxFont& operator=(const wxFont& font); + Create(fontname, fontenc); + } + + wxFont(const wxNativeFontInfo& info); wxFont(int size, int family, @@ -61,13 +65,18 @@ public: int weight, bool underlined = FALSE, const wxString& face = wxEmptyString, - wxFontEncoding encoding = wxFONTENCODING_DEFAULT, - const wxNativeFontInfo& info = wxNullNativeFontInfo); + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); - bool Create(const wxString& fontname, const wxFontData& fontdata); + // wxGTK-specific + bool Create(const wxString& fontname, + wxFontEncoding fontenc = wxFONTENCODING_DEFAULT); + bool Create(const wxNativeFontInfo& fontinfo); ~wxFont(); + // assignment + wxFont& operator=(const wxFont& font); + // implement base class pure virtuals virtual int GetPointSize() const; virtual int GetFamily() const; @@ -76,7 +85,7 @@ public: virtual wxString GetFaceName() const; virtual bool GetUnderlined() const; virtual wxFontEncoding GetEncoding() const; - virtual wxNativeFontInfo GetNativeFontInfo() const; + virtual wxNativeFontInfo *GetNativeFontInfo() const; virtual void SetPointSize( int pointSize ); virtual void SetFamily( int family ); diff --git a/samples/font/font.cpp b/samples/font/font.cpp index 4736134731..c436ed747d 100644 --- a/samples/font/font.cpp +++ b/samples/font/font.cpp @@ -415,22 +415,20 @@ void MyFrame::OnEnumerateFamiliesForEncoding(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnCheckNativeToFromString(wxCommandEvent& WXUNUSED(event)) { - wxString fontInfo = m_canvas->GetTextFont().GetNativeFontInfo().ToString(); + wxString fontInfo = m_canvas->GetTextFont().GetNativeFontInfoDesc(); - if(fontInfo.IsEmpty()) - wxMessageBox("Native font info string is empty!", "Font demo", - wxOK); + if ( fontInfo.IsEmpty() ) + { + wxLogError("Native font info string is empty!"); + } else { - wxNativeFontInfo info; - info.FromString(fontInfo); - wxFont font(info); - if(fontInfo == font.GetNativeFontInfo().ToString()) - wxMessageBox("wxNativeFontInfo ToString()/FromString() works!", - "Font demo", wxOK); + wxFont *font = wxFont::New(fontInfo); + if ( fontInfo != font->GetNativeFontInfoDesc() ) + wxLogError("wxNativeFontInfo ToString()/FromString() broken!"); else - wxMessageBox("wxNativeFontInfo ToString()/FromString() doesn't work!", - "Font demo", wxOK); + wxLogError("wxNativeFontInfo works: %s", fontInfo.c_str()); + delete font; } } @@ -678,11 +676,12 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) dc.DrawText(fontInfo, 5, 5); - if(m_font.Ok()) + if ( m_font.Ok() ) { - dc.SetFont(wxFont(m_font.GetNativeFontInfo())); - fontInfo.Printf("Native font info: %s", m_font.GetNativeFontInfo().ToString().GetData()); - dc.DrawText(fontInfo, 5, 5 + dc.GetCharHeight()); + wxString fontDesc = m_font.GetNativeFontInfoDesc(); + dc.SetFont(wxFont(fontDesc)); + fontInfo.Printf("Native font info: %s", fontDesc.c_str()); + dc.DrawText(fontInfo, 5, 5 + dc.GetCharHeight()); } // prepare to draw the font diff --git a/src/common/fontcmn.cpp b/src/common/fontcmn.cpp index c1eec3bd25..5d0050e77f 100644 --- a/src/common/fontcmn.cpp +++ b/src/common/fontcmn.cpp @@ -30,6 +30,7 @@ #ifndef WX_PRECOMP #include "wx/font.h" + #include "wx/fontutil.h" #endif // WX_PRECOMP #include "wx/tokenzr.h" @@ -62,22 +63,32 @@ wxFont *wxFontBase::New(const wxNativeFontInfo& info) return new wxFont(info); } -wxNativeFontInfo wxFontBase::GetNativeFontInfo() const +/* static */ +wxFont *wxFontBase::New(const wxString& strNativeFontDesc) { -#if !defined(__WXGTK__) wxNativeFontInfo fontInfo; + if ( !fontInfo.FromString(strNativeFontDesc) ) + return (wxFont *)NULL; + + return New(fontInfo); +} + +wxNativeFontInfo *wxFontBase::GetNativeFontInfo() const +{ +#if !defined(__WXGTK__) + wxNativeFontInfo *fontInfo = new wxNativeFontInfo; - fontInfo.pointSize = GetPointSize(); - fontInfo.family = GetFamily(); - fontInfo.style = GetStyle(); - fontInfo.weight = GetWeight(); - fontInfo.underlined = GetUnderlined(); - fontInfo.faceName = GetFaceName(); - fontInfo.encoding = GetEncoding(); + fontInfo->pointSize = GetPointSize(); + fontInfo->family = GetFamily(); + fontInfo->style = GetStyle(); + fontInfo->weight = GetWeight(); + fontInfo->underlined = GetUnderlined(); + fontInfo->faceName = GetFaceName(); + fontInfo->encoding = GetEncoding(); return fontInfo; #else - return wxNullNativeFontInfo; + return (wxNativeFontInfo *)NULL; #endif } @@ -94,6 +105,19 @@ void wxFontBase::SetNativeFontInfo(const wxNativeFontInfo& info) #endif } +wxString wxFontBase::GetNativeFontInfoDesc() const +{ + wxString fontDesc; + wxNativeFontInfo *fontInfo = GetNativeFontInfo(); + if ( fontInfo ) + { + fontDesc = fontInfo->ToString(); + delete fontInfo; + } + + return fontDesc; +} + wxFont& wxFont::operator=(const wxFont& font) { if ( this != &font ) @@ -213,7 +237,7 @@ wxString wxNativeFontInfo::ToString() const { wxString s; - s.Printf("%d;%d;%d;%d;%d;%s;%d", + s.Printf(_T("%d;%d;%d;%d;%d;%s;%d"), pointSize, family, style, @@ -225,5 +249,5 @@ wxString wxNativeFontInfo::ToString() const return s; } -#endif +#endif // generic wxNativeFontInfo implementation diff --git a/src/common/fontmap.cpp b/src/common/fontmap.cpp index 7e76472727..5032eeb6bf 100644 --- a/src/common/fontmap.cpp +++ b/src/common/fontmap.cpp @@ -32,6 +32,7 @@ #include "wx/app.h" #include "wx/log.h" #include "wx/intl.h" + #include "wx/fontutil.h" #endif // PCH #include "wx/fontmap.h" @@ -685,10 +686,10 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding, wxFont font = retData.GetChosenFont(); *info = retData.EncodingInfo(); - info -> encoding = retData.GetEncoding(); + info->encoding = retData.GetEncoding(); #if wxUSE_CONFIG - // remember this in the config + // remember this in the config if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH, &pathOld) ) { GetConfig()->Write(configEntry, info->ToString()); diff --git a/src/gtk/data.cpp b/src/gtk/data.cpp index 932a0d00c2..dc6b6523a8 100644 --- a/src/gtk/data.cpp +++ b/src/gtk/data.cpp @@ -126,7 +126,6 @@ wxBrush wxNullBrush; wxFont wxNullFont; wxColour wxNullColour; wxPalette wxNullPalette; -wxNativeFontInfo wxNullNativeFontInfo; /* Default window names */ const wxChar *wxControlNameStr = wxT("control"); diff --git a/src/gtk/font.cpp b/src/gtk/font.cpp index 0dbf09dd4d..c58aca2e81 100644 --- a/src/gtk/font.cpp +++ b/src/gtk/font.cpp @@ -47,8 +47,7 @@ public: int weight = wxDEFAULT, bool underlined = FALSE, const wxString& faceName = wxEmptyString, - wxFontEncoding encoding = wxFONTENCODING_DEFAULT, - const wxNativeFontInfo& info = wxNullNativeFontInfo); + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); wxFontRefData( const wxFontRefData& data ); virtual ~wxFontRefData(); @@ -60,8 +59,7 @@ protected: int weight, bool underlined, const wxString& faceName, - wxFontEncoding encoding, - const wxNativeFontInfo& info); + wxFontEncoding encoding); private: wxList m_scaled_xfonts; @@ -72,6 +70,7 @@ private: bool m_underlined; wxString m_faceName; wxFontEncoding m_encoding; + wxNativeFontInfo m_nativeFontInfo; friend class wxFont; @@ -91,8 +90,7 @@ void wxFontRefData::Init(int pointSize, int weight, bool underlined, const wxString& faceName, - wxFontEncoding encoding, - const wxNativeFontInfo& info = wxNullNativeFontInfo) + wxFontEncoding encoding) { if (family == wxDEFAULT) m_family = wxSWISS; @@ -118,24 +116,22 @@ void wxFontRefData::Init(int pointSize, m_underlined = underlined; m_encoding = encoding; - m_nativeFontInfo = info; } wxFontRefData::wxFontRefData( const wxFontRefData& data ) : m_scaled_xfonts(wxKEY_INTEGER) { Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight, - data.m_underlined, data.m_faceName, data.m_encoding, - data.m_nativeFontInfo ); + data.m_underlined, data.m_faceName, data.m_encoding); } wxFontRefData::wxFontRefData(int size, int family, int style, - int weight, bool underlined, const wxString& faceName, wxFontEncoding encoding, - const wxNativeFontInfo& info = wxNullNativeFontInfo) + int weight, bool underlined, + const wxString& faceName, + wxFontEncoding encoding) : m_scaled_xfonts(wxKEY_INTEGER) { - Init(size, family, style, weight, - underlined, faceName, encoding, info); + Init(size, family, style, weight, underlined, faceName, encoding); } wxFontRefData::~wxFontRefData() @@ -179,7 +175,14 @@ void wxFont::Init() wxFont::wxFont(const wxNativeFontInfo& info) { - Create(info.xFontName, wxFontData()); + Init(); + + Create(info.ToString()); +} + +bool wxFont::Create(const wxNativeFontInfo& info) +{ + return Create(info.xFontName); } bool wxFont::Create( int pointSize, @@ -188,20 +191,19 @@ bool wxFont::Create( int pointSize, int weight, bool underlined, const wxString& face, - wxFontEncoding encoding, - const wxNativeFontInfo& info ) + wxFontEncoding encoding) { m_refData = new wxFontRefData(pointSize, family, style, weight, - underlined, face, encoding, info); + underlined, face, encoding); return TRUE; } -bool wxFont::Create(const wxString& fontname, const wxFontData& fontdata) +bool wxFont::Create(const wxString& fontname, wxFontEncoding enc) { Init(); - if(!fontname) + if( !fontname ) { *this = wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT); return TRUE; @@ -267,7 +269,7 @@ bool wxFont::Create(const wxString& fontname, const wxFontData& fontdata) tn.GetNextToken(); // avg width // deal with font encoding - M_FONTDATA->m_encoding = fontdata.GetEncoding(); + M_FONTDATA->m_encoding = enc; if ( M_FONTDATA->m_encoding == wxFONTENCODING_SYSTEM ) { wxString registry = tn.GetNextToken().MakeUpper(), @@ -376,13 +378,14 @@ wxFontEncoding wxFont::GetEncoding() const return M_FONTDATA->m_encoding; } -wxNativeFontInfo wxFont::GetNativeFontInfo() const +wxNativeFontInfo *wxFont::GetNativeFontInfo() const { - wxCHECK_MSG( Ok(), wxNullNativeFontInfo, wxT("invalid font") ); + wxCHECK_MSG( Ok(), (wxNativeFontInfo *)NULL, wxT("invalid font") ); if(M_FONTDATA->m_nativeFontInfo.xFontName.IsEmpty()) GetInternalFont(); - return M_FONTDATA->m_nativeFontInfo; + + return new wxNativeFontInfo(M_FONTDATA->m_nativeFontInfo); } diff --git a/src/gtk/fontdlg.cpp b/src/gtk/fontdlg.cpp index 47a34e1bcc..4b26ff00af 100644 --- a/src/gtk/fontdlg.cpp +++ b/src/gtk/fontdlg.cpp @@ -11,6 +11,7 @@ #pragma implementation "fontdlg.h" #endif +#include "wx/fontutil.h" #include "wx/fontdlg.h" #include "wx/utils.h" #include "wx/intl.h" @@ -64,7 +65,8 @@ void gtk_fontdialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFontDialog *dial if (!gfont) { - wxMessageBox(_("Please choose a valid font."), _("Error"), wxOK); + wxMessageBox(_("Please choose a valid font."), _("Error"), + wxOK | wxICON_ERROR); return; } @@ -101,13 +103,12 @@ void gtk_fontdialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFontDialog *dial // we ignore the facename here - should be enough to choose an arbitrary // one if the registry/encoding are specified - // dialog->m_fontData.EncodingInfo().facename = xfamily; fontdata.EncodingInfo().xregistry = xregistry; fontdata.EncodingInfo().xencoding = xencoding; // pass fontdata to wxFont ctor so that it can get the encoding from there // if it is already known (otherwise it will try to deduce it itself) - dialog->m_fontData.SetChosenFont( wxFont(fontname, fontdata) ); + dialog->m_fontData.SetChosenFont(wxFont(fontname, fontdata.GetEncoding())); g_free( fontname ); @@ -178,11 +179,21 @@ wxFontDialog::wxFontDialog( wxWindow *parent, wxFontData *fontdata ) wxFont font = m_fontData.GetInitialFont(); if( font.Ok() ) { - wxNativeFontInfo info = font.GetNativeFontInfo(); + wxNativeFontInfo *info = font.GetNativeFontInfo(); - if( info.xFontName.IsEmpty() ) - font.GetInternalFont(); - gtk_font_selection_dialog_set_font_name(sel, wxConvCurrent->cWX2MB(info.xFontName.GetData())); + if ( info ) + { + const wxString& fontname = info->xFontName; + if ( !fontname ) + font.GetInternalFont(); + gtk_font_selection_dialog_set_font_name(sel, + wxConvCurrent->cWX2MB(fontname)); + } + else + { + // this is not supposed to happen! + wxFAIL_MSG(_T("font is ok but no native font info?")); + } } } diff --git a/src/gtk1/data.cpp b/src/gtk1/data.cpp index 932a0d00c2..dc6b6523a8 100644 --- a/src/gtk1/data.cpp +++ b/src/gtk1/data.cpp @@ -126,7 +126,6 @@ wxBrush wxNullBrush; wxFont wxNullFont; wxColour wxNullColour; wxPalette wxNullPalette; -wxNativeFontInfo wxNullNativeFontInfo; /* Default window names */ const wxChar *wxControlNameStr = wxT("control"); diff --git a/src/gtk1/font.cpp b/src/gtk1/font.cpp index 0dbf09dd4d..c58aca2e81 100644 --- a/src/gtk1/font.cpp +++ b/src/gtk1/font.cpp @@ -47,8 +47,7 @@ public: int weight = wxDEFAULT, bool underlined = FALSE, const wxString& faceName = wxEmptyString, - wxFontEncoding encoding = wxFONTENCODING_DEFAULT, - const wxNativeFontInfo& info = wxNullNativeFontInfo); + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); wxFontRefData( const wxFontRefData& data ); virtual ~wxFontRefData(); @@ -60,8 +59,7 @@ protected: int weight, bool underlined, const wxString& faceName, - wxFontEncoding encoding, - const wxNativeFontInfo& info); + wxFontEncoding encoding); private: wxList m_scaled_xfonts; @@ -72,6 +70,7 @@ private: bool m_underlined; wxString m_faceName; wxFontEncoding m_encoding; + wxNativeFontInfo m_nativeFontInfo; friend class wxFont; @@ -91,8 +90,7 @@ void wxFontRefData::Init(int pointSize, int weight, bool underlined, const wxString& faceName, - wxFontEncoding encoding, - const wxNativeFontInfo& info = wxNullNativeFontInfo) + wxFontEncoding encoding) { if (family == wxDEFAULT) m_family = wxSWISS; @@ -118,24 +116,22 @@ void wxFontRefData::Init(int pointSize, m_underlined = underlined; m_encoding = encoding; - m_nativeFontInfo = info; } wxFontRefData::wxFontRefData( const wxFontRefData& data ) : m_scaled_xfonts(wxKEY_INTEGER) { Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight, - data.m_underlined, data.m_faceName, data.m_encoding, - data.m_nativeFontInfo ); + data.m_underlined, data.m_faceName, data.m_encoding); } wxFontRefData::wxFontRefData(int size, int family, int style, - int weight, bool underlined, const wxString& faceName, wxFontEncoding encoding, - const wxNativeFontInfo& info = wxNullNativeFontInfo) + int weight, bool underlined, + const wxString& faceName, + wxFontEncoding encoding) : m_scaled_xfonts(wxKEY_INTEGER) { - Init(size, family, style, weight, - underlined, faceName, encoding, info); + Init(size, family, style, weight, underlined, faceName, encoding); } wxFontRefData::~wxFontRefData() @@ -179,7 +175,14 @@ void wxFont::Init() wxFont::wxFont(const wxNativeFontInfo& info) { - Create(info.xFontName, wxFontData()); + Init(); + + Create(info.ToString()); +} + +bool wxFont::Create(const wxNativeFontInfo& info) +{ + return Create(info.xFontName); } bool wxFont::Create( int pointSize, @@ -188,20 +191,19 @@ bool wxFont::Create( int pointSize, int weight, bool underlined, const wxString& face, - wxFontEncoding encoding, - const wxNativeFontInfo& info ) + wxFontEncoding encoding) { m_refData = new wxFontRefData(pointSize, family, style, weight, - underlined, face, encoding, info); + underlined, face, encoding); return TRUE; } -bool wxFont::Create(const wxString& fontname, const wxFontData& fontdata) +bool wxFont::Create(const wxString& fontname, wxFontEncoding enc) { Init(); - if(!fontname) + if( !fontname ) { *this = wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT); return TRUE; @@ -267,7 +269,7 @@ bool wxFont::Create(const wxString& fontname, const wxFontData& fontdata) tn.GetNextToken(); // avg width // deal with font encoding - M_FONTDATA->m_encoding = fontdata.GetEncoding(); + M_FONTDATA->m_encoding = enc; if ( M_FONTDATA->m_encoding == wxFONTENCODING_SYSTEM ) { wxString registry = tn.GetNextToken().MakeUpper(), @@ -376,13 +378,14 @@ wxFontEncoding wxFont::GetEncoding() const return M_FONTDATA->m_encoding; } -wxNativeFontInfo wxFont::GetNativeFontInfo() const +wxNativeFontInfo *wxFont::GetNativeFontInfo() const { - wxCHECK_MSG( Ok(), wxNullNativeFontInfo, wxT("invalid font") ); + wxCHECK_MSG( Ok(), (wxNativeFontInfo *)NULL, wxT("invalid font") ); if(M_FONTDATA->m_nativeFontInfo.xFontName.IsEmpty()) GetInternalFont(); - return M_FONTDATA->m_nativeFontInfo; + + return new wxNativeFontInfo(M_FONTDATA->m_nativeFontInfo); } diff --git a/src/gtk1/fontdlg.cpp b/src/gtk1/fontdlg.cpp index 47a34e1bcc..4b26ff00af 100644 --- a/src/gtk1/fontdlg.cpp +++ b/src/gtk1/fontdlg.cpp @@ -11,6 +11,7 @@ #pragma implementation "fontdlg.h" #endif +#include "wx/fontutil.h" #include "wx/fontdlg.h" #include "wx/utils.h" #include "wx/intl.h" @@ -64,7 +65,8 @@ void gtk_fontdialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFontDialog *dial if (!gfont) { - wxMessageBox(_("Please choose a valid font."), _("Error"), wxOK); + wxMessageBox(_("Please choose a valid font."), _("Error"), + wxOK | wxICON_ERROR); return; } @@ -101,13 +103,12 @@ void gtk_fontdialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFontDialog *dial // we ignore the facename here - should be enough to choose an arbitrary // one if the registry/encoding are specified - // dialog->m_fontData.EncodingInfo().facename = xfamily; fontdata.EncodingInfo().xregistry = xregistry; fontdata.EncodingInfo().xencoding = xencoding; // pass fontdata to wxFont ctor so that it can get the encoding from there // if it is already known (otherwise it will try to deduce it itself) - dialog->m_fontData.SetChosenFont( wxFont(fontname, fontdata) ); + dialog->m_fontData.SetChosenFont(wxFont(fontname, fontdata.GetEncoding())); g_free( fontname ); @@ -178,11 +179,21 @@ wxFontDialog::wxFontDialog( wxWindow *parent, wxFontData *fontdata ) wxFont font = m_fontData.GetInitialFont(); if( font.Ok() ) { - wxNativeFontInfo info = font.GetNativeFontInfo(); + wxNativeFontInfo *info = font.GetNativeFontInfo(); - if( info.xFontName.IsEmpty() ) - font.GetInternalFont(); - gtk_font_selection_dialog_set_font_name(sel, wxConvCurrent->cWX2MB(info.xFontName.GetData())); + if ( info ) + { + const wxString& fontname = info->xFontName; + if ( !fontname ) + font.GetInternalFont(); + gtk_font_selection_dialog_set_font_name(sel, + wxConvCurrent->cWX2MB(fontname)); + } + else + { + // this is not supposed to happen! + wxFAIL_MSG(_T("font is ok but no native font info?")); + } } } -- 2.47.2