X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4b6a582bef796b43ad4cf0a96bd40bfd631460c6..bad6c5e264fe9a7ac9e931d071d72acdabb3401e:/src/common/fontcmn.cpp diff --git a/src/common/fontcmn.cpp b/src/common/fontcmn.cpp index cd65471ef3..86d4e874c4 100644 --- a/src/common/fontcmn.cpp +++ b/src/common/fontcmn.cpp @@ -67,7 +67,7 @@ extern const char *wxDumpFont(const wxFont *font) font->GetPointSize(), font->GetEncoding()); - wxStrlcpy(buf, s, WXSIZEOF(buf)); + wxStrlcpy(buf, s.mb_str(), WXSIZEOF(buf)); return buf; } @@ -375,6 +375,7 @@ wxString wxFontBase::GetFamilyString() const case wxFONTFAMILY_SWISS: return "wxFONTFAMILY_SWISS"; case wxFONTFAMILY_MODERN: return "wxFONTFAMILY_MODERN"; case wxFONTFAMILY_TELETYPE: return "wxFONTFAMILY_TELETYPE"; + case wxFONTFAMILY_UNKNOWN: return "wxFONTFAMILY_UNKNOWN"; default: return "wxFONTFAMILY_DEFAULT"; } } @@ -420,6 +421,44 @@ bool wxFontBase::SetFaceName(const wxString& facename) return true; } +wxFont& wxFont::MakeBold() +{ + SetWeight(wxFONTWEIGHT_BOLD); + return *this; +} + +wxFont wxFont::Bold() const +{ + wxFont font(*this); + font.MakeBold(); + return font; +} + +wxFont& wxFont::MakeItalic() +{ + SetStyle(wxFONTSTYLE_ITALIC); + return *this; +} + +wxFont wxFont::Italic() const +{ + wxFont font(*this); + font.SetStyle(wxFONTSTYLE_ITALIC); + return font; +} + +wxFont& wxFont::Scale(float x) +{ + SetPointSize(int(x*GetPointSize() + 0.5)); + return *this; +} + +wxFont wxFont::Scaled(float x) const +{ + wxFont font(*this); + font.Scale(x); + return font; +} // ---------------------------------------------------------------------------- // wxNativeFontInfo @@ -662,7 +701,61 @@ wxString wxNativeFontInfo::ToUserString() const wxString face = GetFaceName(); if ( !face.empty() ) { - desc << _T(' ') << face; + if (face.Contains(' ') || face.Contains(';') || face.Contains(',')) + { + face.Replace("'", ""); + // eventually remove quote characters: most systems do not + // allow them in a facename anyway so this usually does nothing + + // make it possible for FromUserString() function to understand + // that the different words which compose this facename are + // not different adjectives or other data but rather all parts + // of the facename + desc << _T(" '") << face << _("'"); + } + else + desc << _T(' ') << face; + } + else // no face name specified + { + // use the family + wxString familyStr; + switch ( GetFamily() ) + { + case wxFONTFAMILY_DECORATIVE: + familyStr = "decorative"; + break; + + case wxFONTFAMILY_ROMAN: + familyStr = "roman"; + break; + + case wxFONTFAMILY_SCRIPT: + familyStr = "script"; + break; + + case wxFONTFAMILY_SWISS: + familyStr = "swiss"; + break; + + case wxFONTFAMILY_MODERN: + familyStr = "modern"; + break; + + case wxFONTFAMILY_TELETYPE: + familyStr = "teletype"; + break; + + case wxFONTFAMILY_DEFAULT: + case wxFONTFAMILY_UNKNOWN: + break; + + default: + wxFAIL_MSG( "unknown font family" ); + } + + if ( !familyStr.empty() ) + desc << " '" << familyStr << " family'"; } int size = GetPointSize(); @@ -687,10 +780,13 @@ bool wxNativeFontInfo::FromUserString(const wxString& s) // reset to the default state Init(); + // ToUserString() will quote the facename if it contains spaces, commas + // or semicolons: we must be able to understand that quoted text is + // a single token: + wxString toparse(s); + // parse a more or less free form string - // - // TODO: we should handle at least the quoted facenames - wxStringTokenizer tokenizer(s, _T(";, "), wxTOKEN_STRTOK); + wxStringTokenizer tokenizer(toparse, _T(";, "), wxTOKEN_STRTOK); wxString face; unsigned long size; @@ -698,6 +794,7 @@ bool wxNativeFontInfo::FromUserString(const wxString& s) #if wxUSE_FONTMAP bool encodingfound = false; #endif + bool insideQuotes = false; while ( tokenizer.HasMoreTokens() ) { @@ -705,8 +802,36 @@ bool wxNativeFontInfo::FromUserString(const wxString& s) // normalize it token.Trim(true).Trim(false).MakeLower(); + if (insideQuotes) + { + if (token.StartsWith("'") || + token.EndsWith("'")) + { + insideQuotes = false; + + // add this last token to the facename: + face += " " + token; + + // normalize facename: + face = face.Trim(true).Trim(false); + face.Replace("'", ""); + + continue; + } + } + else + { + if (token.StartsWith("'")) + insideQuotes = true; + } // look for the known tokens + if ( insideQuotes ) + { + // only the facename may be quoted: + face += " " + token; + continue; + } if ( token == _T("underlined") || token == _("underlined") ) { SetUnderlined(true); @@ -766,10 +891,32 @@ bool wxNativeFontInfo::FromUserString(const wxString& s) // bar") if ( !face.empty() ) { + wxString familyStr; + if ( face.EndsWith(" family", &familyStr) ) + { + // it's not a facename but rather a font family + wxFontFamily family; + if ( familyStr == "decorative" ) + family = wxFONTFAMILY_DECORATIVE; + else if ( familyStr == "roman" ) + family = wxFONTFAMILY_ROMAN; + else if ( familyStr == "script" ) + family = wxFONTFAMILY_SCRIPT; + else if ( familyStr == "swiss" ) + family = wxFONTFAMILY_SWISS; + else if ( familyStr == "modern" ) + family = wxFONTFAMILY_MODERN; + else if ( familyStr == "teletype" ) + family = wxFONTFAMILY_TELETYPE; + else + return false; + + SetFamily(family); + } // NB: the check on the facename is implemented in wxFontBase::SetFaceName // and not in wxNativeFontInfo::SetFaceName thus we need to explicitely // call here wxFontEnumerator::IsValidFacename - if ( + else if ( #if wxUSE_FONTENUM !wxFontEnumerator::IsValidFacename(face) || #endif // wxUSE_FONTENUM