wxNativeFontInfo changes

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8949 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2000-12-18 21:15:16 +00:00
parent accb325754
commit 7826e2dd83
17 changed files with 265 additions and 186 deletions

View File

@@ -18,7 +18,6 @@
#include "wx/window.h" #include "wx/window.h"
#include "wx/font.h" #include "wx/font.h"
#include "wx/fontutil.h"
#include "wx/colour.h" #include "wx/colour.h"
#include "wx/gdicmn.h" #include "wx/gdicmn.h"

View File

@@ -1697,9 +1697,16 @@ typedef enum {
wxPRINT_MODE_PRINTER = 3 // Send to printer wxPRINT_MODE_PRINTER = 3 // Send to printer
} wxPrintMode; } 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__) #if defined(__WXMSW__)
# define wxALL_FILES_PATTERN "*.*" # define wxALL_FILES_PATTERN "*.*"
# define wxALL_FILES gettext_noop("All files (*.*)|*.*") # define wxALL_FILES gettext_noop("All files (*.*)|*.*")
@@ -1707,6 +1714,7 @@ typedef enum {
# define wxALL_FILES_PATTERN "*" # define wxALL_FILES_PATTERN "*"
# define wxALL_FILES gettext_noop("All files (*)|*") # define wxALL_FILES gettext_noop("All files (*)|*")
#endif #endif
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// macros that enable wxWindows apps to be compiled in absence of the // macros that enable wxWindows apps to be compiled in absence of the
// sytem headers, although some platform specific types are used in the // sytem headers, although some platform specific types are used in the

View File

@@ -67,50 +67,19 @@ enum wxFontWeight
wxFONTWEIGHT_MAX 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 // wxFontBase represents a font object
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
class WXDLLEXPORT wxFontRefData; class WXDLLEXPORT wxFontRefData;
class WXDLLEXPORT wxNativeFontInfo;
class WXDLLEXPORT wxFontBase : public wxGDIObject class WXDLLEXPORT wxFontBase : public wxGDIObject
{ {
public: public:
// creator function // creator function
// from the font components
static wxFont *New( static wxFont *New(
int pointSize, // size of the font in points int pointSize, // size of the font in points
int family, // see wxFontFamily enum int family, // see wxFontFamily enum
@@ -119,7 +88,12 @@ public:
bool underlined = FALSE, // not underlined by default bool underlined = FALSE, // not underlined by default
const wxString& face = wxEmptyString, // facename const wxString& face = wxEmptyString, // facename
wxFontEncoding encoding = wxFONTENCODING_DEFAULT); // ISO8859-X, ... 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? // was the font successfully created?
bool Ok() const { return m_refData != NULL; } bool Ok() const { return m_refData != NULL; }
@@ -136,7 +110,8 @@ public:
virtual bool GetUnderlined() const = 0; virtual bool GetUnderlined() const = 0;
virtual wxString GetFaceName() const = 0; virtual wxString GetFaceName() const = 0;
virtual wxFontEncoding GetEncoding() const = 0; virtual wxFontEncoding GetEncoding() const = 0;
virtual wxNativeFontInfo GetNativeFontInfo() const; virtual wxNativeFontInfo *GetNativeFontInfo() const;
wxString GetNativeFontInfoDesc() const;
// change the font characteristics // change the font characteristics
virtual void SetPointSize( int pointSize ) = 0; virtual void SetPointSize( int pointSize ) = 0;
@@ -148,6 +123,8 @@ public:
virtual void SetEncoding(wxFontEncoding encoding) = 0; virtual void SetEncoding(wxFontEncoding encoding) = 0;
virtual void SetNativeFontInfo(const wxNativeFontInfo& info); 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() // translate the fonts into human-readable string (i.e. GetStyleString()
// will return "wxITALIC" for an italic font, ...) // will return "wxITALIC" for an italic font, ...)
wxString GetFamilyString() const; wxString GetFamilyString() const;

View File

@@ -12,6 +12,8 @@
#ifndef _WX_FONTENC_H_ #ifndef _WX_FONTENC_H_
#define _WX_FONTENC_H_ #define _WX_FONTENC_H_
#include "wx/string.h"
// font encodings // font encodings
enum wxFontEncoding enum wxFontEncoding
{ {
@@ -68,4 +70,44 @@ enum wxFontEncoding
wxFONTENCODING_MAX 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_ #endif // _WX_FONTENC_H_

View File

@@ -21,9 +21,6 @@
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
#include "wx/fontenc.h" // for wxFontEncoding #include "wx/fontenc.h" // for wxFontEncoding
#if wxUSE_GUI
#include "wx/fontutil.h" // for wxNativeEncodingInfo
#endif // wxUSE_GUI
#if wxUSE_CONFIG #if wxUSE_CONFIG
class WXDLLEXPORT wxConfigBase; class WXDLLEXPORT wxConfigBase;

View File

@@ -26,47 +26,35 @@
#include "wx/font.h" // for wxFont and wxFontEncoding #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 // types
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// This private structure specifies all the parameters needed to create a font // wxNativeFontInfo is platform-specific font representation: this struct
// with the given encoding on this platform. // 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
// Under X, it contains the last 2 elements of the font specifications // somewhere and pass it somewhere else (possibly save them somewhere using
// (registry and encoding). // ToString() and restore them using FromString())
// struct WXDLLEXPORT wxNativeFontInfo
// 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" #if defined(__WXGTK__)
wxFontEncoding encoding; // so that we know what this struct represents 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
#if defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMAC__) // it is important to be able to serialize wxNativeFontInfo objects to be
wxNativeEncodingInfo() { charset = 0; /* ANSI_CHARSET */ } // able to store them (in config file, for example)
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); bool FromString(const wxString& s);
wxString ToString() const; wxString ToString() const;
}; };

View File

@@ -36,11 +36,15 @@ public:
// ctors and such // ctors and such
wxFont() { Init(); } wxFont() { Init(); }
wxFont(const wxFont& font) { Init(); Ref(font); } wxFont(const wxFont& font) { Init(); Ref(font); }
wxFont(const wxString& fontname, const wxFontData& fontdata) { Create(fontname, fontdata); } wxFont(const wxString& fontname,
wxFont(const wxNativeFontInfo& info); wxFontEncoding fontenc = wxFONTENCODING_DEFAULT)
{
Init();
// assignment Create(fontname, fontenc);
wxFont& operator=(const wxFont& font); }
wxFont(const wxNativeFontInfo& info);
wxFont(int size, wxFont(int size,
int family, int family,
@@ -61,13 +65,18 @@ public:
int weight, int weight,
bool underlined = FALSE, bool underlined = FALSE,
const wxString& face = wxEmptyString, const wxString& face = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT, wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
const wxNativeFontInfo& info = wxNullNativeFontInfo);
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(); ~wxFont();
// assignment
wxFont& operator=(const wxFont& font);
// implement base class pure virtuals // implement base class pure virtuals
virtual int GetPointSize() const; virtual int GetPointSize() const;
virtual int GetFamily() const; virtual int GetFamily() const;
@@ -76,7 +85,7 @@ public:
virtual wxString GetFaceName() const; virtual wxString GetFaceName() const;
virtual bool GetUnderlined() const; virtual bool GetUnderlined() const;
virtual wxFontEncoding GetEncoding() const; virtual wxFontEncoding GetEncoding() const;
virtual wxNativeFontInfo GetNativeFontInfo() const; virtual wxNativeFontInfo *GetNativeFontInfo() const;
virtual void SetPointSize( int pointSize ); virtual void SetPointSize( int pointSize );
virtual void SetFamily( int family ); virtual void SetFamily( int family );

View File

@@ -36,11 +36,15 @@ public:
// ctors and such // ctors and such
wxFont() { Init(); } wxFont() { Init(); }
wxFont(const wxFont& font) { Init(); Ref(font); } wxFont(const wxFont& font) { Init(); Ref(font); }
wxFont(const wxString& fontname, const wxFontData& fontdata) { Create(fontname, fontdata); } wxFont(const wxString& fontname,
wxFont(const wxNativeFontInfo& info); wxFontEncoding fontenc = wxFONTENCODING_DEFAULT)
{
Init();
// assignment Create(fontname, fontenc);
wxFont& operator=(const wxFont& font); }
wxFont(const wxNativeFontInfo& info);
wxFont(int size, wxFont(int size,
int family, int family,
@@ -61,13 +65,18 @@ public:
int weight, int weight,
bool underlined = FALSE, bool underlined = FALSE,
const wxString& face = wxEmptyString, const wxString& face = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT, wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
const wxNativeFontInfo& info = wxNullNativeFontInfo);
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(); ~wxFont();
// assignment
wxFont& operator=(const wxFont& font);
// implement base class pure virtuals // implement base class pure virtuals
virtual int GetPointSize() const; virtual int GetPointSize() const;
virtual int GetFamily() const; virtual int GetFamily() const;
@@ -76,7 +85,7 @@ public:
virtual wxString GetFaceName() const; virtual wxString GetFaceName() const;
virtual bool GetUnderlined() const; virtual bool GetUnderlined() const;
virtual wxFontEncoding GetEncoding() const; virtual wxFontEncoding GetEncoding() const;
virtual wxNativeFontInfo GetNativeFontInfo() const; virtual wxNativeFontInfo *GetNativeFontInfo() const;
virtual void SetPointSize( int pointSize ); virtual void SetPointSize( int pointSize );
virtual void SetFamily( int family ); virtual void SetFamily( int family );

View File

@@ -415,22 +415,20 @@ void MyFrame::OnEnumerateFamiliesForEncoding(wxCommandEvent& WXUNUSED(event))
void MyFrame::OnCheckNativeToFromString(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()) if ( fontInfo.IsEmpty() )
wxMessageBox("Native font info string is empty!", "Font demo", {
wxOK); wxLogError("Native font info string is empty!");
}
else else
{ {
wxNativeFontInfo info; wxFont *font = wxFont::New(fontInfo);
info.FromString(fontInfo); if ( fontInfo != font->GetNativeFontInfoDesc() )
wxFont font(info); wxLogError("wxNativeFontInfo ToString()/FromString() broken!");
if(fontInfo == font.GetNativeFontInfo().ToString())
wxMessageBox("wxNativeFontInfo ToString()/FromString() works!",
"Font demo", wxOK);
else else
wxMessageBox("wxNativeFontInfo ToString()/FromString() doesn't work!", wxLogError("wxNativeFontInfo works: %s", fontInfo.c_str());
"Font demo", wxOK); delete font;
} }
} }
@@ -678,11 +676,12 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
dc.DrawText(fontInfo, 5, 5); dc.DrawText(fontInfo, 5, 5);
if(m_font.Ok()) if ( m_font.Ok() )
{ {
dc.SetFont(wxFont(m_font.GetNativeFontInfo())); wxString fontDesc = m_font.GetNativeFontInfoDesc();
fontInfo.Printf("Native font info: %s", m_font.GetNativeFontInfo().ToString().GetData()); dc.SetFont(wxFont(fontDesc));
dc.DrawText(fontInfo, 5, 5 + dc.GetCharHeight()); fontInfo.Printf("Native font info: %s", fontDesc.c_str());
dc.DrawText(fontInfo, 5, 5 + dc.GetCharHeight());
} }
// prepare to draw the font // prepare to draw the font

View File

@@ -30,6 +30,7 @@
#ifndef WX_PRECOMP #ifndef WX_PRECOMP
#include "wx/font.h" #include "wx/font.h"
#include "wx/fontutil.h"
#endif // WX_PRECOMP #endif // WX_PRECOMP
#include "wx/tokenzr.h" #include "wx/tokenzr.h"
@@ -62,22 +63,32 @@ wxFont *wxFontBase::New(const wxNativeFontInfo& info)
return new wxFont(info); return new wxFont(info);
} }
wxNativeFontInfo wxFontBase::GetNativeFontInfo() const /* static */
wxFont *wxFontBase::New(const wxString& strNativeFontDesc)
{
wxNativeFontInfo fontInfo;
if ( !fontInfo.FromString(strNativeFontDesc) )
return (wxFont *)NULL;
return New(fontInfo);
}
wxNativeFontInfo *wxFontBase::GetNativeFontInfo() const
{ {
#if !defined(__WXGTK__) #if !defined(__WXGTK__)
wxNativeFontInfo fontInfo; wxNativeFontInfo *fontInfo = new wxNativeFontInfo;
fontInfo.pointSize = GetPointSize(); fontInfo->pointSize = GetPointSize();
fontInfo.family = GetFamily(); fontInfo->family = GetFamily();
fontInfo.style = GetStyle(); fontInfo->style = GetStyle();
fontInfo.weight = GetWeight(); fontInfo->weight = GetWeight();
fontInfo.underlined = GetUnderlined(); fontInfo->underlined = GetUnderlined();
fontInfo.faceName = GetFaceName(); fontInfo->faceName = GetFaceName();
fontInfo.encoding = GetEncoding(); fontInfo->encoding = GetEncoding();
return fontInfo; return fontInfo;
#else #else
return wxNullNativeFontInfo; return (wxNativeFontInfo *)NULL;
#endif #endif
} }
@@ -94,6 +105,19 @@ void wxFontBase::SetNativeFontInfo(const wxNativeFontInfo& info)
#endif #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) wxFont& wxFont::operator=(const wxFont& font)
{ {
if ( this != &font ) if ( this != &font )
@@ -213,7 +237,7 @@ wxString wxNativeFontInfo::ToString() const
{ {
wxString s; wxString s;
s.Printf("%d;%d;%d;%d;%d;%s;%d", s.Printf(_T("%d;%d;%d;%d;%d;%s;%d"),
pointSize, pointSize,
family, family,
style, style,
@@ -225,5 +249,5 @@ wxString wxNativeFontInfo::ToString() const
return s; return s;
} }
#endif #endif // generic wxNativeFontInfo implementation

View File

@@ -32,6 +32,7 @@
#include "wx/app.h" #include "wx/app.h"
#include "wx/log.h" #include "wx/log.h"
#include "wx/intl.h" #include "wx/intl.h"
#include "wx/fontutil.h"
#endif // PCH #endif // PCH
#include "wx/fontmap.h" #include "wx/fontmap.h"
@@ -685,10 +686,10 @@ bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding,
wxFont font = retData.GetChosenFont(); wxFont font = retData.GetChosenFont();
*info = retData.EncodingInfo(); *info = retData.EncodingInfo();
info -> encoding = retData.GetEncoding(); info->encoding = retData.GetEncoding();
#if wxUSE_CONFIG #if wxUSE_CONFIG
// remember this in the config // remember this in the config
if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH, &pathOld) ) if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH, &pathOld) )
{ {
GetConfig()->Write(configEntry, info->ToString()); GetConfig()->Write(configEntry, info->ToString());

View File

@@ -126,7 +126,6 @@ wxBrush wxNullBrush;
wxFont wxNullFont; wxFont wxNullFont;
wxColour wxNullColour; wxColour wxNullColour;
wxPalette wxNullPalette; wxPalette wxNullPalette;
wxNativeFontInfo wxNullNativeFontInfo;
/* Default window names */ /* Default window names */
const wxChar *wxControlNameStr = wxT("control"); const wxChar *wxControlNameStr = wxT("control");

View File

@@ -47,8 +47,7 @@ public:
int weight = wxDEFAULT, int weight = wxDEFAULT,
bool underlined = FALSE, bool underlined = FALSE,
const wxString& faceName = wxEmptyString, const wxString& faceName = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT, wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
const wxNativeFontInfo& info = wxNullNativeFontInfo);
wxFontRefData( const wxFontRefData& data ); wxFontRefData( const wxFontRefData& data );
virtual ~wxFontRefData(); virtual ~wxFontRefData();
@@ -60,8 +59,7 @@ protected:
int weight, int weight,
bool underlined, bool underlined,
const wxString& faceName, const wxString& faceName,
wxFontEncoding encoding, wxFontEncoding encoding);
const wxNativeFontInfo& info);
private: private:
wxList m_scaled_xfonts; wxList m_scaled_xfonts;
@@ -72,6 +70,7 @@ private:
bool m_underlined; bool m_underlined;
wxString m_faceName; wxString m_faceName;
wxFontEncoding m_encoding; wxFontEncoding m_encoding;
wxNativeFontInfo m_nativeFontInfo; wxNativeFontInfo m_nativeFontInfo;
friend class wxFont; friend class wxFont;
@@ -91,8 +90,7 @@ void wxFontRefData::Init(int pointSize,
int weight, int weight,
bool underlined, bool underlined,
const wxString& faceName, const wxString& faceName,
wxFontEncoding encoding, wxFontEncoding encoding)
const wxNativeFontInfo& info = wxNullNativeFontInfo)
{ {
if (family == wxDEFAULT) if (family == wxDEFAULT)
m_family = wxSWISS; m_family = wxSWISS;
@@ -118,24 +116,22 @@ void wxFontRefData::Init(int pointSize,
m_underlined = underlined; m_underlined = underlined;
m_encoding = encoding; m_encoding = encoding;
m_nativeFontInfo = info;
} }
wxFontRefData::wxFontRefData( const wxFontRefData& data ) wxFontRefData::wxFontRefData( const wxFontRefData& data )
: m_scaled_xfonts(wxKEY_INTEGER) : m_scaled_xfonts(wxKEY_INTEGER)
{ {
Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight, Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight,
data.m_underlined, data.m_faceName, data.m_encoding, data.m_underlined, data.m_faceName, data.m_encoding);
data.m_nativeFontInfo );
} }
wxFontRefData::wxFontRefData(int size, int family, int style, wxFontRefData::wxFontRefData(int size, int family, int style,
int weight, bool underlined, const wxString& faceName, wxFontEncoding encoding, int weight, bool underlined,
const wxNativeFontInfo& info = wxNullNativeFontInfo) const wxString& faceName,
wxFontEncoding encoding)
: m_scaled_xfonts(wxKEY_INTEGER) : m_scaled_xfonts(wxKEY_INTEGER)
{ {
Init(size, family, style, weight, Init(size, family, style, weight, underlined, faceName, encoding);
underlined, faceName, encoding, info);
} }
wxFontRefData::~wxFontRefData() wxFontRefData::~wxFontRefData()
@@ -179,7 +175,14 @@ void wxFont::Init()
wxFont::wxFont(const wxNativeFontInfo& info) 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, bool wxFont::Create( int pointSize,
@@ -188,20 +191,19 @@ bool wxFont::Create( int pointSize,
int weight, int weight,
bool underlined, bool underlined,
const wxString& face, const wxString& face,
wxFontEncoding encoding, wxFontEncoding encoding)
const wxNativeFontInfo& info )
{ {
m_refData = new wxFontRefData(pointSize, family, style, weight, m_refData = new wxFontRefData(pointSize, family, style, weight,
underlined, face, encoding, info); underlined, face, encoding);
return TRUE; return TRUE;
} }
bool wxFont::Create(const wxString& fontname, const wxFontData& fontdata) bool wxFont::Create(const wxString& fontname, wxFontEncoding enc)
{ {
Init(); Init();
if(!fontname) if( !fontname )
{ {
*this = wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT); *this = wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT);
return TRUE; return TRUE;
@@ -267,7 +269,7 @@ bool wxFont::Create(const wxString& fontname, const wxFontData& fontdata)
tn.GetNextToken(); // avg width tn.GetNextToken(); // avg width
// deal with font encoding // deal with font encoding
M_FONTDATA->m_encoding = fontdata.GetEncoding(); M_FONTDATA->m_encoding = enc;
if ( M_FONTDATA->m_encoding == wxFONTENCODING_SYSTEM ) if ( M_FONTDATA->m_encoding == wxFONTENCODING_SYSTEM )
{ {
wxString registry = tn.GetNextToken().MakeUpper(), wxString registry = tn.GetNextToken().MakeUpper(),
@@ -376,13 +378,14 @@ wxFontEncoding wxFont::GetEncoding() const
return M_FONTDATA->m_encoding; 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()) if(M_FONTDATA->m_nativeFontInfo.xFontName.IsEmpty())
GetInternalFont(); GetInternalFont();
return M_FONTDATA->m_nativeFontInfo;
return new wxNativeFontInfo(M_FONTDATA->m_nativeFontInfo);
} }

View File

@@ -11,6 +11,7 @@
#pragma implementation "fontdlg.h" #pragma implementation "fontdlg.h"
#endif #endif
#include "wx/fontutil.h"
#include "wx/fontdlg.h" #include "wx/fontdlg.h"
#include "wx/utils.h" #include "wx/utils.h"
#include "wx/intl.h" #include "wx/intl.h"
@@ -64,7 +65,8 @@ void gtk_fontdialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFontDialog *dial
if (!gfont) if (!gfont)
{ {
wxMessageBox(_("Please choose a valid font."), _("Error"), wxOK); wxMessageBox(_("Please choose a valid font."), _("Error"),
wxOK | wxICON_ERROR);
return; 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 // we ignore the facename here - should be enough to choose an arbitrary
// one if the registry/encoding are specified // one if the registry/encoding are specified
// dialog->m_fontData.EncodingInfo().facename = xfamily;
fontdata.EncodingInfo().xregistry = xregistry; fontdata.EncodingInfo().xregistry = xregistry;
fontdata.EncodingInfo().xencoding = xencoding; fontdata.EncodingInfo().xencoding = xencoding;
// pass fontdata to wxFont ctor so that it can get the encoding from there // 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) // 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 ); g_free( fontname );
@@ -178,11 +179,21 @@ wxFontDialog::wxFontDialog( wxWindow *parent, wxFontData *fontdata )
wxFont font = m_fontData.GetInitialFont(); wxFont font = m_fontData.GetInitialFont();
if( font.Ok() ) if( font.Ok() )
{ {
wxNativeFontInfo info = font.GetNativeFontInfo(); wxNativeFontInfo *info = font.GetNativeFontInfo();
if( info.xFontName.IsEmpty() ) if ( info )
font.GetInternalFont(); {
gtk_font_selection_dialog_set_font_name(sel, wxConvCurrent->cWX2MB(info.xFontName.GetData())); 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?"));
}
} }
} }

View File

@@ -126,7 +126,6 @@ wxBrush wxNullBrush;
wxFont wxNullFont; wxFont wxNullFont;
wxColour wxNullColour; wxColour wxNullColour;
wxPalette wxNullPalette; wxPalette wxNullPalette;
wxNativeFontInfo wxNullNativeFontInfo;
/* Default window names */ /* Default window names */
const wxChar *wxControlNameStr = wxT("control"); const wxChar *wxControlNameStr = wxT("control");

View File

@@ -47,8 +47,7 @@ public:
int weight = wxDEFAULT, int weight = wxDEFAULT,
bool underlined = FALSE, bool underlined = FALSE,
const wxString& faceName = wxEmptyString, const wxString& faceName = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT, wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
const wxNativeFontInfo& info = wxNullNativeFontInfo);
wxFontRefData( const wxFontRefData& data ); wxFontRefData( const wxFontRefData& data );
virtual ~wxFontRefData(); virtual ~wxFontRefData();
@@ -60,8 +59,7 @@ protected:
int weight, int weight,
bool underlined, bool underlined,
const wxString& faceName, const wxString& faceName,
wxFontEncoding encoding, wxFontEncoding encoding);
const wxNativeFontInfo& info);
private: private:
wxList m_scaled_xfonts; wxList m_scaled_xfonts;
@@ -72,6 +70,7 @@ private:
bool m_underlined; bool m_underlined;
wxString m_faceName; wxString m_faceName;
wxFontEncoding m_encoding; wxFontEncoding m_encoding;
wxNativeFontInfo m_nativeFontInfo; wxNativeFontInfo m_nativeFontInfo;
friend class wxFont; friend class wxFont;
@@ -91,8 +90,7 @@ void wxFontRefData::Init(int pointSize,
int weight, int weight,
bool underlined, bool underlined,
const wxString& faceName, const wxString& faceName,
wxFontEncoding encoding, wxFontEncoding encoding)
const wxNativeFontInfo& info = wxNullNativeFontInfo)
{ {
if (family == wxDEFAULT) if (family == wxDEFAULT)
m_family = wxSWISS; m_family = wxSWISS;
@@ -118,24 +116,22 @@ void wxFontRefData::Init(int pointSize,
m_underlined = underlined; m_underlined = underlined;
m_encoding = encoding; m_encoding = encoding;
m_nativeFontInfo = info;
} }
wxFontRefData::wxFontRefData( const wxFontRefData& data ) wxFontRefData::wxFontRefData( const wxFontRefData& data )
: m_scaled_xfonts(wxKEY_INTEGER) : m_scaled_xfonts(wxKEY_INTEGER)
{ {
Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight, Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight,
data.m_underlined, data.m_faceName, data.m_encoding, data.m_underlined, data.m_faceName, data.m_encoding);
data.m_nativeFontInfo );
} }
wxFontRefData::wxFontRefData(int size, int family, int style, wxFontRefData::wxFontRefData(int size, int family, int style,
int weight, bool underlined, const wxString& faceName, wxFontEncoding encoding, int weight, bool underlined,
const wxNativeFontInfo& info = wxNullNativeFontInfo) const wxString& faceName,
wxFontEncoding encoding)
: m_scaled_xfonts(wxKEY_INTEGER) : m_scaled_xfonts(wxKEY_INTEGER)
{ {
Init(size, family, style, weight, Init(size, family, style, weight, underlined, faceName, encoding);
underlined, faceName, encoding, info);
} }
wxFontRefData::~wxFontRefData() wxFontRefData::~wxFontRefData()
@@ -179,7 +175,14 @@ void wxFont::Init()
wxFont::wxFont(const wxNativeFontInfo& info) 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, bool wxFont::Create( int pointSize,
@@ -188,20 +191,19 @@ bool wxFont::Create( int pointSize,
int weight, int weight,
bool underlined, bool underlined,
const wxString& face, const wxString& face,
wxFontEncoding encoding, wxFontEncoding encoding)
const wxNativeFontInfo& info )
{ {
m_refData = new wxFontRefData(pointSize, family, style, weight, m_refData = new wxFontRefData(pointSize, family, style, weight,
underlined, face, encoding, info); underlined, face, encoding);
return TRUE; return TRUE;
} }
bool wxFont::Create(const wxString& fontname, const wxFontData& fontdata) bool wxFont::Create(const wxString& fontname, wxFontEncoding enc)
{ {
Init(); Init();
if(!fontname) if( !fontname )
{ {
*this = wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT); *this = wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT);
return TRUE; return TRUE;
@@ -267,7 +269,7 @@ bool wxFont::Create(const wxString& fontname, const wxFontData& fontdata)
tn.GetNextToken(); // avg width tn.GetNextToken(); // avg width
// deal with font encoding // deal with font encoding
M_FONTDATA->m_encoding = fontdata.GetEncoding(); M_FONTDATA->m_encoding = enc;
if ( M_FONTDATA->m_encoding == wxFONTENCODING_SYSTEM ) if ( M_FONTDATA->m_encoding == wxFONTENCODING_SYSTEM )
{ {
wxString registry = tn.GetNextToken().MakeUpper(), wxString registry = tn.GetNextToken().MakeUpper(),
@@ -376,13 +378,14 @@ wxFontEncoding wxFont::GetEncoding() const
return M_FONTDATA->m_encoding; 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()) if(M_FONTDATA->m_nativeFontInfo.xFontName.IsEmpty())
GetInternalFont(); GetInternalFont();
return M_FONTDATA->m_nativeFontInfo;
return new wxNativeFontInfo(M_FONTDATA->m_nativeFontInfo);
} }

View File

@@ -11,6 +11,7 @@
#pragma implementation "fontdlg.h" #pragma implementation "fontdlg.h"
#endif #endif
#include "wx/fontutil.h"
#include "wx/fontdlg.h" #include "wx/fontdlg.h"
#include "wx/utils.h" #include "wx/utils.h"
#include "wx/intl.h" #include "wx/intl.h"
@@ -64,7 +65,8 @@ void gtk_fontdialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFontDialog *dial
if (!gfont) if (!gfont)
{ {
wxMessageBox(_("Please choose a valid font."), _("Error"), wxOK); wxMessageBox(_("Please choose a valid font."), _("Error"),
wxOK | wxICON_ERROR);
return; 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 // we ignore the facename here - should be enough to choose an arbitrary
// one if the registry/encoding are specified // one if the registry/encoding are specified
// dialog->m_fontData.EncodingInfo().facename = xfamily;
fontdata.EncodingInfo().xregistry = xregistry; fontdata.EncodingInfo().xregistry = xregistry;
fontdata.EncodingInfo().xencoding = xencoding; fontdata.EncodingInfo().xencoding = xencoding;
// pass fontdata to wxFont ctor so that it can get the encoding from there // 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) // 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 ); g_free( fontname );
@@ -178,11 +179,21 @@ wxFontDialog::wxFontDialog( wxWindow *parent, wxFontData *fontdata )
wxFont font = m_fontData.GetInitialFont(); wxFont font = m_fontData.GetInitialFont();
if( font.Ok() ) if( font.Ok() )
{ {
wxNativeFontInfo info = font.GetNativeFontInfo(); wxNativeFontInfo *info = font.GetNativeFontInfo();
if( info.xFontName.IsEmpty() ) if ( info )
font.GetInternalFont(); {
gtk_font_selection_dialog_set_font_name(sel, wxConvCurrent->cWX2MB(info.xFontName.GetData())); 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?"));
}
} }
} }