]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/fontcmn.cpp
Applied #15375 to stop event-sending in generic wxSpinCtrl ctor (eco)
[wxWidgets.git] / src / common / fontcmn.cpp
index c6f2c50c6a51870f1255c229295c1adea820255d..715e2c05f6336acba629938db081d732318fb46c 100644 (file)
@@ -4,7 +4,6 @@
 // Author:      Vadim Zeitlin
 // Modified by:
 // Created:     20.09.99
 // Author:      Vadim Zeitlin
 // Modified by:
 // Created:     20.09.99
-// RCS-ID:      $Id$
 // Copyright:   (c) wxWidgets team
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 // Copyright:   (c) wxWidgets team
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -29,6 +28,7 @@
 #ifndef WX_PRECOMP
     #include "wx/dc.h"
     #include "wx/intl.h"
 #ifndef WX_PRECOMP
     #include "wx/dc.h"
     #include "wx/intl.h"
+    #include "wx/math.h"
     #include "wx/dcscreen.h"
     #include "wx/log.h"
     #include "wx/gdicmn.h"
     #include "wx/dcscreen.h"
     #include "wx/log.h"
     #include "wx/gdicmn.h"
@@ -76,47 +76,51 @@ extern const char *wxDumpFont(const wxFont *font)
 // ----------------------------------------------------------------------------
 
 wxBEGIN_ENUM( wxFontFamily )
 // ----------------------------------------------------------------------------
 
 wxBEGIN_ENUM( wxFontFamily )
-wxENUM_MEMBER( wxDEFAULT )
-wxENUM_MEMBER( wxDECORATIVE )
-wxENUM_MEMBER( wxROMAN )
-wxENUM_MEMBER( wxSCRIPT )
-wxENUM_MEMBER( wxSWISS )
-wxENUM_MEMBER( wxMODERN )
-wxENUM_MEMBER( wxTELETYPE )
+wxENUM_MEMBER( wxFONTFAMILY_DEFAULT )
+wxENUM_MEMBER( wxFONTFAMILY_DECORATIVE )
+wxENUM_MEMBER( wxFONTFAMILY_ROMAN )
+wxENUM_MEMBER( wxFONTFAMILY_SCRIPT )
+wxENUM_MEMBER( wxFONTFAMILY_SWISS )
+wxENUM_MEMBER( wxFONTFAMILY_MODERN )
+wxENUM_MEMBER( wxFONTFAMILY_TELETYPE )
 wxEND_ENUM( wxFontFamily )
 
 wxBEGIN_ENUM( wxFontStyle )
 wxEND_ENUM( wxFontFamily )
 
 wxBEGIN_ENUM( wxFontStyle )
-wxENUM_MEMBER( wxNORMAL )
-wxENUM_MEMBER( wxITALIC )
-wxENUM_MEMBER( wxSLANT )
+wxENUM_MEMBER( wxFONTSTYLE_NORMAL )
+wxENUM_MEMBER( wxFONTSTYLE_ITALIC )
+wxENUM_MEMBER( wxFONTSTYLE_SLANT )
 wxEND_ENUM( wxFontStyle )
 
 wxBEGIN_ENUM( wxFontWeight )
 wxEND_ENUM( wxFontStyle )
 
 wxBEGIN_ENUM( wxFontWeight )
-wxENUM_MEMBER( wxNORMAL )
-wxENUM_MEMBER( wxLIGHT )
-wxENUM_MEMBER( wxBOLD )
+wxENUM_MEMBER( wxFONTWEIGHT_NORMAL )
+wxENUM_MEMBER( wxFONTWEIGHT_LIGHT )
+wxENUM_MEMBER( wxFONTWEIGHT_BOLD )
 wxEND_ENUM( wxFontWeight )
 
 wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY_XTI(wxFont, wxGDIObject, "wx/font.h")
 
 wxEND_ENUM( wxFontWeight )
 
 wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY_XTI(wxFont, wxGDIObject, "wx/font.h")
 
+//WX_IMPLEMENT_ANY_VALUE_TYPE(wxAnyValueTypeImpl<wxFont>)
+
 wxBEGIN_PROPERTIES_TABLE(wxFont)
 wxPROPERTY( Size,int, SetPointSize, GetPointSize, 12, 0 /*flags*/, \
            wxT("Helpstring"), wxT("group"))
 wxBEGIN_PROPERTIES_TABLE(wxFont)
 wxPROPERTY( Size,int, SetPointSize, GetPointSize, 12, 0 /*flags*/, \
            wxT("Helpstring"), wxT("group"))
-wxPROPERTY( Family, int , SetFamily, GetFamily, (int)wxDEFAULT, \
+wxPROPERTY( Family, wxFontFamily , SetFamily, GetFamily, (wxFontFamily)wxDEFAULT, \
            0 /*flags*/, wxT("Helpstring"), wxT("group")) // wxFontFamily
            0 /*flags*/, wxT("Helpstring"), wxT("group")) // wxFontFamily
-wxPROPERTY( Style, int, SetStyle, GetStyle, (int)wxNORMAL, 0 /*flags*/, \
+wxPROPERTY( Style, wxFontStyle, SetStyle, GetStyle, (wxFontStyle)wxNORMAL, 0 /*flags*/, \
            wxT("Helpstring"), wxT("group")) // wxFontStyle
            wxT("Helpstring"), wxT("group")) // wxFontStyle
-wxPROPERTY( Weight, int, SetWeight, GetWeight, (int)wxNORMAL, 0 /*flags*/, \
+wxPROPERTY( Weight, wxFontWeight, SetWeight, GetWeight, (wxFontWeight)wxNORMAL, 0 /*flags*/, \
            wxT("Helpstring"), wxT("group")) // wxFontWeight
 wxPROPERTY( Underlined, bool, SetUnderlined, GetUnderlined, false, 0 /*flags*/, \
            wxT("Helpstring"), wxT("group"))
            wxT("Helpstring"), wxT("group")) // wxFontWeight
 wxPROPERTY( Underlined, bool, SetUnderlined, GetUnderlined, false, 0 /*flags*/, \
            wxT("Helpstring"), wxT("group"))
+wxPROPERTY( Strikethrough, bool, SetStrikethrough, GetStrikethrough, false, 0, \
+                   wxT("Helpstring"), wxT("group"))
 wxPROPERTY( Face, wxString, SetFaceName, GetFaceName, wxEMPTY_PARAMETER_VALUE, \
            0 /*flags*/, wxT("Helpstring"), wxT("group"))
 wxPROPERTY( Encoding, wxFontEncoding, SetEncoding, GetEncoding, \
            wxFONTENCODING_DEFAULT, 0 /*flags*/, wxT("Helpstring"), wxT("group"))
 wxEND_PROPERTIES_TABLE()
 
 wxPROPERTY( Face, wxString, SetFaceName, GetFaceName, wxEMPTY_PARAMETER_VALUE, \
            0 /*flags*/, wxT("Helpstring"), wxT("group"))
 wxPROPERTY( Encoding, wxFontEncoding, SetEncoding, GetEncoding, \
            wxFONTENCODING_DEFAULT, 0 /*flags*/, wxT("Helpstring"), wxT("group"))
 wxEND_PROPERTIES_TABLE()
 
-wxCONSTRUCTOR_6( wxFont, int, Size, int, Family, int, Style, int, Weight, \
+wxCONSTRUCTOR_6( wxFont, int, Size, wxFontFamily, Family, wxFontStyle, Style, wxFontWeight, Weight, \
                 bool, Underlined, wxString, Face )
 
 wxEMPTY_HANDLERS_TABLE(wxFont)
                 bool, Underlined, wxString, Face )
 
 wxEMPTY_HANDLERS_TABLE(wxFont)
@@ -125,33 +129,6 @@ wxEMPTY_HANDLERS_TABLE(wxFont)
 // implementation
 // ============================================================================
 
 // implementation
 // ============================================================================
 
-// ----------------------------------------------------------------------------
-// helper functions
-// ----------------------------------------------------------------------------
-
-static inline int flags2Style(int flags)
-{
-    return flags & wxFONTFLAG_ITALIC
-                    ? wxFONTSTYLE_ITALIC
-                    : flags & wxFONTFLAG_SLANT
-                        ? wxFONTSTYLE_SLANT
-                        : wxFONTSTYLE_NORMAL;
-}
-
-static inline int flags2Weight(int flags)
-{
-    return flags & wxFONTFLAG_LIGHT
-                    ? wxFONTWEIGHT_LIGHT
-                    : flags & wxFONTFLAG_BOLD
-                        ? wxFONTWEIGHT_BOLD
-                        : wxFONTWEIGHT_NORMAL;
-}
-
-static inline bool flags2Underlined(int flags)
-{
-    return (flags & wxFONTFLAG_UNDERLINED) != 0;
-}
-
 // ----------------------------------------------------------------------------
 // wxFontBase
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // wxFontBase
 // ----------------------------------------------------------------------------
@@ -206,8 +183,11 @@ wxFont *wxFontBase::New(int pointSize,
                         const wxString& face,
                         wxFontEncoding encoding)
 {
                         const wxString& face,
                         wxFontEncoding encoding)
 {
-    return New(pointSize, family, flags2Style(flags), flags2Weight(flags),
-               flags2Underlined(flags), face, encoding);
+    return New(pointSize, family,
+               GetStyleFromFlags(flags),
+               GetWeightFromFlags(flags),
+               GetUnderlinedFromFlags(flags),
+               face, encoding);
 }
 
 /* static */
 }
 
 /* static */
@@ -217,8 +197,11 @@ wxFont *wxFontBase::New(const wxSize& pixelSize,
                         const wxString& face,
                         wxFontEncoding encoding)
 {
                         const wxString& face,
                         wxFontEncoding encoding)
 {
-    return New(pixelSize, family, flags2Style(flags), flags2Weight(flags),
-               flags2Underlined(flags), face, encoding);
+    return New(pixelSize, family,
+               GetStyleFromFlags(flags),
+               GetWeightFromFlags(flags),
+               GetUnderlinedFromFlags(flags),
+               face, encoding);
 }
 
 /* static */
 }
 
 /* static */
@@ -325,6 +308,7 @@ void wxFontBase::DoSetNativeFontInfo(const wxNativeFontInfo& info)
     SetStyle(info.style);
     SetWeight(info.weight);
     SetUnderlined(info.underlined);
     SetStyle(info.style);
     SetWeight(info.weight);
     SetUnderlined(info.underlined);
+    SetStrikethrough(info.strikethrough);
     SetFaceName(info.faceName);
     SetEncoding(info.encoding);
 #else
     SetFaceName(info.faceName);
     SetEncoding(info.encoding);
 #else
@@ -412,6 +396,7 @@ bool wxFontBase::operator==(const wxFont& font) const
             GetStyle() == font.GetStyle() &&
             GetWeight() == font.GetWeight() &&
             GetUnderlined() == font.GetUnderlined() &&
             GetStyle() == font.GetStyle() &&
             GetWeight() == font.GetWeight() &&
             GetUnderlined() == font.GetUnderlined() &&
+            GetStrikethrough() == font.GetStrikethrough() &&
             GetFaceName().IsSameAs(font.GetFaceName(), false) &&
             GetEncoding() == font.GetEncoding()
            );
             GetFaceName().IsSameAs(font.GetFaceName(), false) &&
             GetEncoding() == font.GetEncoding()
            );
@@ -489,6 +474,29 @@ bool wxFontBase::SetFaceName(const wxString& facename)
     return true;
 }
 
     return true;
 }
 
+void wxFontBase::SetSymbolicSize(wxFontSymbolicSize size)
+{
+    SetSymbolicSizeRelativeTo(size, wxNORMAL_FONT->GetPointSize());
+}
+
+/* static */
+int wxFontBase::AdjustToSymbolicSize(wxFontSymbolicSize size, int base)
+{
+    // Using a fixed factor (1.2, from CSS2) is a bad idea as explained at
+    // http://www.w3.org/TR/CSS21/fonts.html#font-size-props so use the values
+    // from http://style.cleverchimp.com/font_size_intervals/altintervals.html
+    // instead.
+    static const float factors[] = { 0.60f, 0.75f, 0.89f, 1.f, 1.2f, 1.5f, 2.f };
+
+    wxCOMPILE_TIME_ASSERT
+    (
+        WXSIZEOF(factors) == wxFONTSIZE_XX_LARGE - wxFONTSIZE_XX_SMALL + 1,
+        WrongFontSizeFactorsSize
+    );
+
+    return wxRound(factors[size - wxFONTSIZE_XX_SMALL]*base);
+}
+
 wxFont& wxFont::MakeBold()
 {
     SetWeight(wxFONTWEIGHT_BOLD);
 wxFont& wxFont::MakeBold()
 {
     SetWeight(wxFONTWEIGHT_BOLD);
@@ -511,10 +519,36 @@ wxFont& wxFont::MakeItalic()
 wxFont wxFont::Italic() const
 {
     wxFont font(*this);
 wxFont wxFont::Italic() const
 {
     wxFont font(*this);
-    font.SetStyle(wxFONTSTYLE_ITALIC);
+    font.MakeItalic();
+    return font;
+}
+
+wxFont& wxFont::MakeUnderlined()
+{
+    SetUnderlined(true);
+    return *this;
+}
+
+wxFont wxFont::Underlined() const
+{
+    wxFont font(*this);
+    font.MakeUnderlined();
+    return font;
+}
+
+wxFont wxFont::Strikethrough() const
+{
+    wxFont font(*this);
+    font.MakeStrikethrough();
     return font;
 }
 
     return font;
 }
 
+wxFont& wxFont::MakeStrikethrough()
+{
+    SetStrikethrough(true);
+    return *this;
+}
+
 wxFont& wxFont::Scale(float x)
 {
     SetPointSize(int(x*GetPointSize() + 0.5));
 wxFont& wxFont::Scale(float x)
 {
     SetPointSize(int(x*GetPointSize() + 0.5));
@@ -559,19 +593,22 @@ void wxNativeFontInfo::SetFaceName(const wxArrayString& facenames)
 
 // These are the generic forms of FromString()/ToString.
 //
 
 // These are the generic forms of FromString()/ToString.
 //
-// convert to/from the string representation: format is
-//      version;pointsize;family;style;weight;underlined;facename;encoding
+// convert to/from the string representation: the general format is
+// "version;the rest..." with currently defined versions being:
+//
+//      0;pointsize;family;style;weight;underlined;facename;encoding
+//      1;pointsize;family;style;weight;underlined;strikethrough;facename;encoding
 
 bool wxNativeFontInfo::FromString(const wxString& s)
 {
     long l;
 
 bool wxNativeFontInfo::FromString(const wxString& s)
 {
     long l;
+    unsigned long version;
 
     wxStringTokenizer tokenizer(s, wxT(";"));
 
     wxString token = tokenizer.GetNextToken();
 
     wxStringTokenizer tokenizer(s, wxT(";"));
 
     wxString token = tokenizer.GetNextToken();
-    //
-    //  Ignore the version for now
-    //
+    if ( !token.ToULong(&version) || version > 1 )
+        return false;
 
     token = tokenizer.GetNextToken();
     if ( !token.ToLong(&l) )
 
     token = tokenizer.GetNextToken();
     if ( !token.ToLong(&l) )
@@ -598,6 +635,14 @@ bool wxNativeFontInfo::FromString(const wxString& s)
         return false;
     underlined = l != 0;
 
         return false;
     underlined = l != 0;
 
+    if ( version == 1 )
+    {
+        token = tokenizer.GetNextToken();
+        if ( !token.ToLong(&l) )
+            return false;
+        strikethrough = l != 0;
+    }
+
     faceName = tokenizer.GetNextToken();
 
 #ifndef __WXMAC__
     faceName = tokenizer.GetNextToken();
 
 #ifndef __WXMAC__
@@ -617,13 +662,14 @@ wxString wxNativeFontInfo::ToString() const
 {
     wxString s;
 
 {
     wxString s;
 
-    s.Printf(wxT("%d;%d;%d;%d;%d;%d;%s;%d"),
-             0,                                 // version
+    s.Printf(wxT("%d;%d;%d;%d;%d;%d;%d;%s;%d"),
+             1,                                 // version
              pointSize,
              family,
              (int)style,
              (int)weight,
              underlined,
              pointSize,
              family,
              (int)style,
              (int)weight,
              underlined,
+             strikethrough,
              faceName.GetData(),
              (int)encoding);
 
              faceName.GetData(),
              (int)encoding);
 
@@ -637,6 +683,7 @@ void wxNativeFontInfo::Init()
     style = wxFONTSTYLE_NORMAL;
     weight = wxFONTWEIGHT_NORMAL;
     underlined = false;
     style = wxFONTSTYLE_NORMAL;
     weight = wxFONTWEIGHT_NORMAL;
     underlined = false;
+    strikethrough = false;
     faceName.clear();
     encoding = wxFONTENCODING_DEFAULT;
 }
     faceName.clear();
     encoding = wxFONTENCODING_DEFAULT;
 }
@@ -661,6 +708,11 @@ bool wxNativeFontInfo::GetUnderlined() const
     return underlined;
 }
 
     return underlined;
 }
 
+bool wxNativeFontInfo::GetStrikethrough() const
+{
+    return strikethrough;
+}
+
 wxString wxNativeFontInfo::GetFaceName() const
 {
     return faceName;
 wxString wxNativeFontInfo::GetFaceName() const
 {
     return faceName;
@@ -696,6 +748,11 @@ void wxNativeFontInfo::SetUnderlined(bool underlined_)
     underlined = underlined_;
 }
 
     underlined = underlined_;
 }
 
+void wxNativeFontInfo::SetStrikethrough(bool strikethrough_)
+{
+    strikethrough = strikethrough_;
+}
+
 bool wxNativeFontInfo::SetFaceName(const wxString& facename_)
 {
     faceName = facename_;
 bool wxNativeFontInfo::SetFaceName(const wxString& facename_)
 {
     faceName = facename_;
@@ -732,6 +789,11 @@ wxString wxNativeFontInfo::ToUserString() const
         desc << _("underlined");
     }
 
         desc << _("underlined");
     }
 
+    if ( GetStrikethrough() )
+    {
+        desc << _("strikethrough");
+    }
+
     switch ( GetWeight() )
     {
         default:
     switch ( GetWeight() )
     {
         default:
@@ -779,7 +841,7 @@ wxString wxNativeFontInfo::ToUserString() const
             // that the different words which compose this facename are
             // not different adjectives or other data but rather all parts
             // of the facename
             // that the different words which compose this facename are
             // not different adjectives or other data but rather all parts
             // of the facename
-            desc << wxT(" '") << face << _("'");
+            desc << wxT(" '") << face << wxT("'");
         }
         else
             desc << wxT(' ') << face;
         }
         else
             desc << wxT(' ') << face;
@@ -904,6 +966,10 @@ bool wxNativeFontInfo::FromUserString(const wxString& s)
         {
             SetUnderlined(true);
         }
         {
             SetUnderlined(true);
         }
+        else if ( token == wxT("strikethrough") || token == _("strikethrough") )
+        {
+            SetStrikethrough(true);
+        }
         else if ( token == wxT("light") || token == _("light") )
         {
             SetWeight(wxFONTWEIGHT_LIGHT);
         else if ( token == wxT("light") || token == _("light") )
         {
             SetWeight(wxFONTWEIGHT_LIGHT);
@@ -982,7 +1048,7 @@ bool wxNativeFontInfo::FromUserString(const wxString& s)
                 SetFamily(family);
             }
             // NB: the check on the facename is implemented in wxFontBase::SetFaceName
                 SetFamily(family);
             }
             // NB: the check on the facename is implemented in wxFontBase::SetFaceName
-            //     and not in wxNativeFontInfo::SetFaceName thus we need to explicitely
+            //     and not in wxNativeFontInfo::SetFaceName thus we need to explicitly
             //     call here wxFontEnumerator::IsValidFacename
             else if (
 #if wxUSE_FONTENUM
             //     call here wxFontEnumerator::IsValidFacename
             else if (
 #if wxUSE_FONTENUM
@@ -1001,7 +1067,7 @@ bool wxNativeFontInfo::FromUserString(const wxString& s)
     if ( !face.empty() )
     {
         // NB: the check on the facename is implemented in wxFontBase::SetFaceName
     if ( !face.empty() )
     {
         // NB: the check on the facename is implemented in wxFontBase::SetFaceName
-        //     and not in wxNativeFontInfo::SetFaceName thus we need to explicitely
+        //     and not in wxNativeFontInfo::SetFaceName thus we need to explicitly
         //     call here wxFontEnumerator::IsValidFacename
         if (
 #if wxUSE_FONTENUM
         //     call here wxFontEnumerator::IsValidFacename
         if (
 #if wxUSE_FONTENUM