]> git.saurik.com Git - wxWidgets.git/commitdiff
added wxFont::IsFixedWidth(), documented it and implemented for wxGTK/Motif
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 14 Jan 2002 19:04:35 +0000 (19:04 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 14 Jan 2002 19:04:35 +0000 (19:04 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13570 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/font.tex
include/wx/font.h
include/wx/fontutil.h
include/wx/gtk/font.h
include/wx/gtk1/font.h
samples/font/font.cpp
src/common/fontcmn.cpp
src/gtk/font.cpp
src/gtk1/font.cpp
src/unix/fontutil.cpp

index 7fa1453b5ae7e124de8f0a6a6f01cadf7b660c3a..64be90e3c7b6ac0e0e194b134cf9e1773d3b57c8 100644 (file)
@@ -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
 application data structure, and there is a risk of double deletion.
 
 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}
 \membersection{wxFont::GetDefaultEncoding}\label{wxfontgetdefaultencoding}
 
 \func{static wxFontEncoding}{GetDefaultEncoding}{\void}
index 7eac1f1dc5815925ae2644e0caf1d2fb1a2e1636..eb507cfd249e519defcb09ec2445eb560c170210 100644 (file)
@@ -113,6 +113,8 @@ public:
     virtual wxFontEncoding GetEncoding() const = 0;
     virtual wxNativeFontInfo *GetNativeFontInfo() const;
 
     virtual wxFontEncoding GetEncoding() const = 0;
     virtual wxNativeFontInfo *GetNativeFontInfo() const;
 
+    virtual bool IsFixedWidth() const;
+
     wxString GetNativeFontInfoDesc() const;
     wxString GetNativeFontInfoUserDesc() const;
 
     wxString GetNativeFontInfoDesc() const;
     wxString GetNativeFontInfoUserDesc() const;
 
index ad966ea6061064599911c7ccdcd200892488146a..8305e1417a1325dc154a4562e9fa48e1a18f9ae4 100644 (file)
     #include "wx/msw/winundef.h"
 #endif
 
     #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
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // types
 // ----------------------------------------------------------------------------
 //     further it might make sense to make it a real class with virtual methods
 struct WXDLLEXPORT wxNativeFontInfo
 {
 //     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
     // the components of the XLFD
-    wxString     fontElements[14];
+    wxString     fontElements[wxXLFD_MAX];
 
 
+public:
     // the full XLFD
     wxString     xFontName;
 
     // the full XLFD
     wxString     xFontName;
 
@@ -57,6 +85,9 @@ struct WXDLLEXPORT wxNativeFontInfo
 
     // generate an XLFD using the fontElements
     wxString GetXFontName() const;
 
     // 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__)
 #elif defined(__WXMSW__)
     LOGFONT      lf;
 #elif defined(__WXPM__)
index 0a2bfbb095bfb56c0484a65f4d1dfb4bc921b3da..de17523e9f6191c5b7d7f3fb091d54a69e1dfaa8 100644 (file)
@@ -86,6 +86,7 @@ public:
     virtual bool GetUnderlined() const;
     virtual wxFontEncoding GetEncoding() const;
     virtual wxNativeFontInfo *GetNativeFontInfo() const;
     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 );
 
     virtual void SetPointSize( int pointSize );
     virtual void SetFamily( int family );
@@ -107,6 +108,9 @@ protected:
     // common part of all ctors
     void Init();
 
     // 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)
 };
 private:
     DECLARE_DYNAMIC_CLASS(wxFont)
 };
index 0a2bfbb095bfb56c0484a65f4d1dfb4bc921b3da..de17523e9f6191c5b7d7f3fb091d54a69e1dfaa8 100644 (file)
@@ -86,6 +86,7 @@ public:
     virtual bool GetUnderlined() const;
     virtual wxFontEncoding GetEncoding() const;
     virtual wxNativeFontInfo *GetNativeFontInfo() const;
     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 );
 
     virtual void SetPointSize( int pointSize );
     virtual void SetFamily( int family );
@@ -107,6 +108,9 @@ protected:
     // common part of all ctors
     void Init();
 
     // 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)
 };
 private:
     DECLARE_DYNAMIC_CLASS(wxFont)
 };
index a88746d28e79badd9d4335fbf7d9b6588b0daf50..69e2621c5b199eab2e44daf264439d6132d9d3f1 100644 (file)
@@ -180,7 +180,7 @@ bool MyApp::OnInit()
 {
     // Create the main application window
     MyFrame *frame = new MyFrame("Font wxWindows demo",
 {
     // 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);
 
     // Show it and tell the application that it's our main window
     frame->Show(TRUE);
@@ -625,28 +625,42 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
     dc.SetBackground(wxBrush(wxT("white"), wxSOLID));
     dc.Clear();
 
     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;
     // 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->
                     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.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());
 
     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);
 
     // prepare to draw the font
     dc.SetFont(m_font);
index b8a4497f8ba6d238d00ad9cc80aa3f194764075a..320d37935ecdc95f6a9caaa618943452aefe0df9 100644 (file)
@@ -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
 {
 #ifdef wxNO_NATIVE_FONTINFO
 wxNativeFontInfo *wxFontBase::GetNativeFontInfo() const
 {
 #ifdef wxNO_NATIVE_FONTINFO
index d1239aba2533bb507d133e1feac7287b5a0adf96..940b38d81aa1be78f189ecfb2416092228e5c48b 100644 (file)
@@ -307,6 +307,11 @@ wxFont::~wxFont()
 // accessors
 // ----------------------------------------------------------------------------
 
 // accessors
 // ----------------------------------------------------------------------------
 
+bool wxFont::HasNativeFont() const
+{
+    return !M_FONTDATA->m_nativeFontInfo.xFontName.empty();
+}
+
 int wxFont::GetPointSize() const
 {
     wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
 int wxFont::GetPointSize() const
 {
     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
index d1239aba2533bb507d133e1feac7287b5a0adf96..940b38d81aa1be78f189ecfb2416092228e5c48b 100644 (file)
@@ -307,6 +307,11 @@ wxFont::~wxFont()
 // accessors
 // ----------------------------------------------------------------------------
 
 // accessors
 // ----------------------------------------------------------------------------
 
+bool wxFont::HasNativeFont() const
+{
+    return !M_FONTDATA->m_nativeFontInfo.xFontName.empty();
+}
+
 int wxFont::GetPointSize() const
 {
     wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
 int wxFont::GetPointSize() const
 {
     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
index 0da307c8d5a65b5277bb30c4b133d971155a258b..27c2de464aa47c5e354f0c47b275c91642e5f6c6 100644 (file)
@@ -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)
 {
     // TODO: we should be able to handle the font aliases here, but how?
 bool wxNativeFontInfo::FromXFontName(const wxString& fontname)
 {
     // TODO: we should be able to handle the font aliases here, but how?