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.
+\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}
\func{static wxFontEncoding}{GetDefaultEncoding}{\void}
virtual wxFontEncoding GetEncoding() const = 0;
virtual wxNativeFontInfo *GetNativeFontInfo() const;
+ virtual bool IsFixedWidth() const;
+
wxString GetNativeFontInfoDesc() const;
wxString GetNativeFontInfoUserDesc() const;
#include "wx/msw/winundef.h"
#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
// ----------------------------------------------------------------------------
// further it might make sense to make it a real class with virtual methods
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
- wxString fontElements[14];
+ wxString fontElements[wxXLFD_MAX];
+public:
// the full XLFD
wxString xFontName;
// generate an XLFD using the fontElements
wxString GetXFontName() const;
+
+ // get the given XFLD component
+ wxString GetXFontComponent(wxXLFDField field) const;
#elif defined(__WXMSW__)
LOGFONT lf;
#elif defined(__WXPM__)
virtual bool GetUnderlined() const;
virtual wxFontEncoding GetEncoding() const;
virtual wxNativeFontInfo *GetNativeFontInfo() const;
+ virtual bool IsFixedWidth() const;
virtual void SetPointSize( int pointSize );
virtual void SetFamily( int family );
// common part of all ctors
void Init();
+ // do we have the XFLD for this font (or just wxWin description)?
+ inline bool HasNativeFont() const;
+
private:
DECLARE_DYNAMIC_CLASS(wxFont)
};
virtual bool GetUnderlined() const;
virtual wxFontEncoding GetEncoding() const;
virtual wxNativeFontInfo *GetNativeFontInfo() const;
+ virtual bool IsFixedWidth() const;
virtual void SetPointSize( int pointSize );
virtual void SetFamily( int family );
// common part of all ctors
void Init();
+ // do we have the XFLD for this font (or just wxWin description)?
+ inline bool HasNativeFont() const;
+
private:
DECLARE_DYNAMIC_CLASS(wxFont)
};
{
// Create the main application window
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
frame->Show(TRUE);
dc.SetBackground(wxBrush(wxT("white"), wxSOLID));
dc.Clear();
+ // one text line height
+ wxCoord hLine = dc.GetCharHeight();
+
+ // the current text origin
+ wxCoord x = 5,
+ y = 5;
+
// output the font name/info
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.GetFamilyString().c_str(),
wxTheFontMapper->
- GetEncodingDescription(m_font.GetEncoding()).c_str(),
+ GetEncodingDescription(m_font.GetEncoding()).c_str());
+
+ 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.GetWeightString().c_str(),
+ m_font.IsFixedWidth() ? _T("yes") : _T("no"));
- dc.DrawText(fontInfo, 5, 5);
+ dc.DrawText(fontInfo, x, y);
+ y += hLine;
if ( m_font.Ok() )
{
wxString fontDesc = m_font.GetNativeFontInfoUserDesc();
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
- int x = 5,
- y = dc.GetCharHeight() * (2 + 1);
+ y += hLine;
// prepare to draw the font
dc.SetFont(m_font);
return New(fontInfo);
}
+bool wxFontBase::IsFixedWidth() const
+{
+ return GetFamily() == wxFONTFAMILY_TELETYPE;
+}
+
wxNativeFontInfo *wxFontBase::GetNativeFontInfo() const
{
#ifdef wxNO_NATIVE_FONTINFO
// accessors
// ----------------------------------------------------------------------------
+bool wxFont::HasNativeFont() const
+{
+ return !M_FONTDATA->m_nativeFontInfo.xFontName.empty();
+}
+
int wxFont::GetPointSize() const
{
wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
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
// accessors
// ----------------------------------------------------------------------------
+bool wxFont::HasNativeFont() const
+{
+ return !M_FONTDATA->m_nativeFontInfo.xFontName.empty();
+}
+
int wxFont::GetPointSize() const
{
wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
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
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)
{
// TODO: we should be able to handle the font aliases here, but how?