added wxFont::IsFixedWidth(), documented it and implemented for wxGTK/Motif
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13570 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -174,6 +174,13 @@ the application should try to clean up all fonts itself. This is because
|
|||||||
wxWindows cannot know if a pointer to the font object is stored in an
|
wxWindows cannot know if a pointer to the font object is stored in an
|
||||||
application data structure, and there is a risk of double deletion.
|
application data structure, and there is a risk of double deletion.
|
||||||
|
|
||||||
|
\membersection{wxFont::IsFixedWidth}\label{wxfontisfixedwidth}
|
||||||
|
|
||||||
|
\constfunc{bool}{IsFixedWidth}{\void}
|
||||||
|
|
||||||
|
Returns {\tt TRUE} if the font is a fixed width (or monospaced) font,
|
||||||
|
{\tt FALSE} if it is a proportional one or font is invalid.
|
||||||
|
|
||||||
\membersection{wxFont::GetDefaultEncoding}\label{wxfontgetdefaultencoding}
|
\membersection{wxFont::GetDefaultEncoding}\label{wxfontgetdefaultencoding}
|
||||||
|
|
||||||
\func{static wxFontEncoding}{GetDefaultEncoding}{\void}
|
\func{static wxFontEncoding}{GetDefaultEncoding}{\void}
|
||||||
|
@@ -113,6 +113,8 @@ public:
|
|||||||
virtual wxFontEncoding GetEncoding() const = 0;
|
virtual wxFontEncoding GetEncoding() const = 0;
|
||||||
virtual wxNativeFontInfo *GetNativeFontInfo() const;
|
virtual wxNativeFontInfo *GetNativeFontInfo() const;
|
||||||
|
|
||||||
|
virtual bool IsFixedWidth() const;
|
||||||
|
|
||||||
wxString GetNativeFontInfoDesc() const;
|
wxString GetNativeFontInfoDesc() const;
|
||||||
wxString GetNativeFontInfoUserDesc() const;
|
wxString GetNativeFontInfoUserDesc() const;
|
||||||
|
|
||||||
|
@@ -31,6 +31,30 @@
|
|||||||
#include "wx/msw/winundef.h"
|
#include "wx/msw/winundef.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(_WX_X_FONTLIKE)
|
||||||
|
|
||||||
|
// the symbolic names for the XLFD fields (with examples for their value)
|
||||||
|
enum wxXLFDField
|
||||||
|
{
|
||||||
|
wxXLFD_FOUNDRY, // adobe
|
||||||
|
wxXLFD_FAMILY, // courier, times, ...
|
||||||
|
wxXLFD_WEIGHT, // black, bold, demibold, medium, regular, light
|
||||||
|
wxXLFD_SLANT, // r/i/o (roman/italique/oblique)
|
||||||
|
wxXLFD_SETWIDTH, // condensed, expanded, ...
|
||||||
|
wxXLFD_ADDSTYLE, // whatever - usually nothing
|
||||||
|
wxXLFD_PIXELSIZE, // size in pixels
|
||||||
|
wxXLFD_POINTSIZE, // size in points
|
||||||
|
wxXLFD_RESX, // 72, 75, 100, ...
|
||||||
|
wxXLFD_RESY,
|
||||||
|
wxXLFD_SPACING, // m/p/c (monospaced/proportional/character cell)
|
||||||
|
wxXLFD_AVGWIDTH, // average width in 1/10 pixels
|
||||||
|
wxXLFD_REGISTRY, // iso8859, rawin, koi8, ...
|
||||||
|
wxXLFD_ENCODING, // 1, r, r, ...
|
||||||
|
wxXLFD_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _WX_X_FONTLIKE
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// types
|
// types
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -45,10 +69,14 @@
|
|||||||
// further it might make sense to make it a real class with virtual methods
|
// further it might make sense to make it a real class with virtual methods
|
||||||
struct WXDLLEXPORT wxNativeFontInfo
|
struct WXDLLEXPORT wxNativeFontInfo
|
||||||
{
|
{
|
||||||
#if defined(__WXGTK__) || defined(__WXMOTIF__)
|
#if defined(_WX_X_FONTLIKE)
|
||||||
|
// the fonts array can't be accessed directly as we only parse the
|
||||||
|
// xFontName when needed
|
||||||
|
private:
|
||||||
// the components of the XLFD
|
// the components of the XLFD
|
||||||
wxString fontElements[14];
|
wxString fontElements[wxXLFD_MAX];
|
||||||
|
|
||||||
|
public:
|
||||||
// the full XLFD
|
// the full XLFD
|
||||||
wxString xFontName;
|
wxString xFontName;
|
||||||
|
|
||||||
@@ -57,6 +85,9 @@ struct WXDLLEXPORT wxNativeFontInfo
|
|||||||
|
|
||||||
// generate an XLFD using the fontElements
|
// generate an XLFD using the fontElements
|
||||||
wxString GetXFontName() const;
|
wxString GetXFontName() const;
|
||||||
|
|
||||||
|
// get the given XFLD component
|
||||||
|
wxString GetXFontComponent(wxXLFDField field) const;
|
||||||
#elif defined(__WXMSW__)
|
#elif defined(__WXMSW__)
|
||||||
LOGFONT lf;
|
LOGFONT lf;
|
||||||
#elif defined(__WXPM__)
|
#elif defined(__WXPM__)
|
||||||
|
@@ -86,6 +86,7 @@ public:
|
|||||||
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 bool IsFixedWidth() const;
|
||||||
|
|
||||||
virtual void SetPointSize( int pointSize );
|
virtual void SetPointSize( int pointSize );
|
||||||
virtual void SetFamily( int family );
|
virtual void SetFamily( int family );
|
||||||
@@ -107,6 +108,9 @@ protected:
|
|||||||
// common part of all ctors
|
// common part of all ctors
|
||||||
void Init();
|
void Init();
|
||||||
|
|
||||||
|
// do we have the XFLD for this font (or just wxWin description)?
|
||||||
|
inline bool HasNativeFont() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DECLARE_DYNAMIC_CLASS(wxFont)
|
DECLARE_DYNAMIC_CLASS(wxFont)
|
||||||
};
|
};
|
||||||
|
@@ -86,6 +86,7 @@ public:
|
|||||||
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 bool IsFixedWidth() const;
|
||||||
|
|
||||||
virtual void SetPointSize( int pointSize );
|
virtual void SetPointSize( int pointSize );
|
||||||
virtual void SetFamily( int family );
|
virtual void SetFamily( int family );
|
||||||
@@ -107,6 +108,9 @@ protected:
|
|||||||
// common part of all ctors
|
// common part of all ctors
|
||||||
void Init();
|
void Init();
|
||||||
|
|
||||||
|
// do we have the XFLD for this font (or just wxWin description)?
|
||||||
|
inline bool HasNativeFont() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DECLARE_DYNAMIC_CLASS(wxFont)
|
DECLARE_DYNAMIC_CLASS(wxFont)
|
||||||
};
|
};
|
||||||
|
@@ -180,7 +180,7 @@ bool MyApp::OnInit()
|
|||||||
{
|
{
|
||||||
// Create the main application window
|
// Create the main application window
|
||||||
MyFrame *frame = new MyFrame("Font wxWindows demo",
|
MyFrame *frame = new MyFrame("Font wxWindows demo",
|
||||||
wxPoint(50, 50), wxSize(450, 340));
|
wxPoint(50, 50), wxSize(600, 400));
|
||||||
|
|
||||||
// Show it and tell the application that it's our main window
|
// Show it and tell the application that it's our main window
|
||||||
frame->Show(TRUE);
|
frame->Show(TRUE);
|
||||||
@@ -625,28 +625,42 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
|
|||||||
dc.SetBackground(wxBrush(wxT("white"), wxSOLID));
|
dc.SetBackground(wxBrush(wxT("white"), wxSOLID));
|
||||||
dc.Clear();
|
dc.Clear();
|
||||||
|
|
||||||
|
// one text line height
|
||||||
|
wxCoord hLine = dc.GetCharHeight();
|
||||||
|
|
||||||
|
// the current text origin
|
||||||
|
wxCoord x = 5,
|
||||||
|
y = 5;
|
||||||
|
|
||||||
// output the font name/info
|
// output the font name/info
|
||||||
wxString fontInfo;
|
wxString fontInfo;
|
||||||
fontInfo.Printf(wxT("Font size is %d points, family is %s, encoding is '%s', style %s, weight %s"),
|
fontInfo.Printf(wxT("Font size is %d points, family: %s, encoding: %s"),
|
||||||
m_font.GetPointSize(),
|
m_font.GetPointSize(),
|
||||||
m_font.GetFamilyString().c_str(),
|
m_font.GetFamilyString().c_str(),
|
||||||
wxTheFontMapper->
|
wxTheFontMapper->
|
||||||
GetEncodingDescription(m_font.GetEncoding()).c_str(),
|
GetEncodingDescription(m_font.GetEncoding()).c_str());
|
||||||
m_font.GetStyleString().c_str(),
|
|
||||||
m_font.GetWeightString().c_str());
|
|
||||||
|
|
||||||
dc.DrawText(fontInfo, 5, 5);
|
dc.DrawText(fontInfo, x, y);
|
||||||
|
y += hLine;
|
||||||
|
|
||||||
|
fontInfo.Printf(wxT("Style: %s, weight: %s, fixed width: %s"),
|
||||||
|
m_font.GetStyleString().c_str(),
|
||||||
|
m_font.GetWeightString().c_str(),
|
||||||
|
m_font.IsFixedWidth() ? _T("yes") : _T("no"));
|
||||||
|
|
||||||
|
dc.DrawText(fontInfo, x, y);
|
||||||
|
y += hLine;
|
||||||
|
|
||||||
if ( m_font.Ok() )
|
if ( m_font.Ok() )
|
||||||
{
|
{
|
||||||
wxString fontDesc = m_font.GetNativeFontInfoUserDesc();
|
wxString fontDesc = m_font.GetNativeFontInfoUserDesc();
|
||||||
fontInfo.Printf(wxT("Native font info: %s"), fontDesc.c_str());
|
fontInfo.Printf(wxT("Native font info: %s"), fontDesc.c_str());
|
||||||
dc.DrawText(fontInfo, 5, 5 + dc.GetCharHeight());
|
|
||||||
|
dc.DrawText(fontInfo, x, y);
|
||||||
|
y += hLine;
|
||||||
}
|
}
|
||||||
|
|
||||||
// the origin for our table
|
y += hLine;
|
||||||
int x = 5,
|
|
||||||
y = dc.GetCharHeight() * (2 + 1);
|
|
||||||
|
|
||||||
// prepare to draw the font
|
// prepare to draw the font
|
||||||
dc.SetFont(m_font);
|
dc.SetFont(m_font);
|
||||||
|
@@ -82,6 +82,11 @@ wxFont *wxFontBase::New(const wxString& strNativeFontDesc)
|
|||||||
return New(fontInfo);
|
return New(fontInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wxFontBase::IsFixedWidth() const
|
||||||
|
{
|
||||||
|
return GetFamily() == wxFONTFAMILY_TELETYPE;
|
||||||
|
}
|
||||||
|
|
||||||
wxNativeFontInfo *wxFontBase::GetNativeFontInfo() const
|
wxNativeFontInfo *wxFontBase::GetNativeFontInfo() const
|
||||||
{
|
{
|
||||||
#ifdef wxNO_NATIVE_FONTINFO
|
#ifdef wxNO_NATIVE_FONTINFO
|
||||||
|
@@ -307,6 +307,11 @@ wxFont::~wxFont()
|
|||||||
// accessors
|
// accessors
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool wxFont::HasNativeFont() const
|
||||||
|
{
|
||||||
|
return !M_FONTDATA->m_nativeFontInfo.xFontName.empty();
|
||||||
|
}
|
||||||
|
|
||||||
int wxFont::GetPointSize() const
|
int wxFont::GetPointSize() const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
|
wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
|
||||||
@@ -367,6 +372,21 @@ wxNativeFontInfo *wxFont::GetNativeFontInfo() const
|
|||||||
return new wxNativeFontInfo(M_FONTDATA->m_nativeFontInfo);
|
return new wxNativeFontInfo(M_FONTDATA->m_nativeFontInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wxFont::IsFixedWidth() const
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( Ok(), FALSE, wxT("invalid font") );
|
||||||
|
|
||||||
|
if ( HasNativeFont() )
|
||||||
|
{
|
||||||
|
// the monospace fonts are supposed to have "M" in the spacing field
|
||||||
|
wxString spacing = M_FONTDATA->
|
||||||
|
m_nativeFontInfo.GetXFontComponent(wxXLFD_SPACING);
|
||||||
|
|
||||||
|
return spacing.Upper() == _T('M');
|
||||||
|
}
|
||||||
|
|
||||||
|
return wxFontBase::IsFixedWidth();
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// change font attributes
|
// change font attributes
|
||||||
|
@@ -307,6 +307,11 @@ wxFont::~wxFont()
|
|||||||
// accessors
|
// accessors
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool wxFont::HasNativeFont() const
|
||||||
|
{
|
||||||
|
return !M_FONTDATA->m_nativeFontInfo.xFontName.empty();
|
||||||
|
}
|
||||||
|
|
||||||
int wxFont::GetPointSize() const
|
int wxFont::GetPointSize() const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
|
wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
|
||||||
@@ -367,6 +372,21 @@ wxNativeFontInfo *wxFont::GetNativeFontInfo() const
|
|||||||
return new wxNativeFontInfo(M_FONTDATA->m_nativeFontInfo);
|
return new wxNativeFontInfo(M_FONTDATA->m_nativeFontInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wxFont::IsFixedWidth() const
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( Ok(), FALSE, wxT("invalid font") );
|
||||||
|
|
||||||
|
if ( HasNativeFont() )
|
||||||
|
{
|
||||||
|
// the monospace fonts are supposed to have "M" in the spacing field
|
||||||
|
wxString spacing = M_FONTDATA->
|
||||||
|
m_nativeFontInfo.GetXFontComponent(wxXLFD_SPACING);
|
||||||
|
|
||||||
|
return spacing.Upper() == _T('M');
|
||||||
|
}
|
||||||
|
|
||||||
|
return wxFontBase::IsFixedWidth();
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// change font attributes
|
// change font attributes
|
||||||
|
@@ -196,6 +196,20 @@ wxString wxNativeFontInfo::ToUserString() const
|
|||||||
return GetXFontName();
|
return GetXFontName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxString wxNativeFontInfo::GetXFontComponent(wxXLFDField field) const
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( field < wxXLFD_MAX, _T(""), _T("invalid XLFD field") );
|
||||||
|
|
||||||
|
if ( fontElements[0].empty() )
|
||||||
|
{
|
||||||
|
// const_cast
|
||||||
|
if ( !((wxNativeFontInfo *)this)->FromXFontName(xFontName) )
|
||||||
|
return _T("");
|
||||||
|
}
|
||||||
|
|
||||||
|
return fontElements[field];
|
||||||
|
}
|
||||||
|
|
||||||
bool wxNativeFontInfo::FromXFontName(const wxString& fontname)
|
bool wxNativeFontInfo::FromXFontName(const wxString& fontname)
|
||||||
{
|
{
|
||||||
// TODO: we should be able to handle the font aliases here, but how?
|
// TODO: we should be able to handle the font aliases here, but how?
|
||||||
|
Reference in New Issue
Block a user