#include "wx/tokenzr.h"
+// debugger helper: this function can be called from a debugger to show what
+// the date really is
+extern const char *wxDumpFont(const wxFont *font)
+{
+ static char buf[256];
+
+ const wxFontWeight weight = font->GetWeight();
+
+ wxString s;
+ s.Printf(wxS("%s-%s-%s-%d-%d"),
+ font->GetFaceName(),
+ weight == wxFONTWEIGHT_NORMAL
+ ? wxT("normal")
+ : weight == wxFONTWEIGHT_BOLD
+ ? wxT("bold")
+ : wxT("light"),
+ font->GetStyle() == wxFONTSTYLE_NORMAL
+ ? wxT("regular")
+ : wxT("italic"),
+ font->GetPointSize(),
+ font->GetEncoding());
+
+ wxStrlcpy(buf, s.mb_str(), WXSIZEOF(buf));
+ return buf;
+}
+
// ============================================================================
// implementation
// ============================================================================
// GetDefaultEncoding() should return something != wxFONTENCODING_DEFAULT
// and, besides, using this value here doesn't make any sense
wxCHECK_RET( encoding != wxFONTENCODING_DEFAULT,
- _T("can't set default encoding to wxFONTENCODING_DEFAULT") );
+ wxT("can't set default encoding to wxFONTENCODING_DEFAULT") );
ms_encodingDefault = encoding;
}
// NOTE: this algorithm for adjusting the font size is used by all
// implementations of wxFont except under wxMSW and wxGTK where
// native support to font creation using pixel-size is provided.
-
+
int largestGood = 0;
int smallestBad = 0;
wxString wxFontBase::GetNativeFontInfoDesc() const
{
+ wxCHECK_MSG( IsOk(), wxEmptyString, wxT("invalid font") );
+
wxString fontDesc;
const wxNativeFontInfo *fontInfo = GetNativeFontInfo();
if ( fontInfo )
wxString wxFontBase::GetNativeFontInfoUserDesc() const
{
+ wxCHECK_MSG( IsOk(), wxEmptyString, wxT("invalid font") );
+
wxString fontDesc;
const wxNativeFontInfo *fontInfo = GetNativeFontInfo();
if ( fontInfo )
// have different ref datas but still describe the same font
return IsSameAs(font) ||
(
- Ok() == font.Ok() &&
+ IsOk() == font.IsOk() &&
GetPointSize() == font.GetPointSize() &&
// in wxGTK1 GetPixelSize() calls GetInternalFont() which uses
// operator==() resulting in infinite recursion so we can't use it
wxString wxFontBase::GetFamilyString() const
{
- wxCHECK_MSG( Ok(), wxT("wxDEFAULT"), wxT("invalid font") );
+ wxCHECK_MSG( IsOk(), "wxFONTFAMILY_DEFAULT", "invalid font" );
switch ( GetFamily() )
{
- case wxDECORATIVE: return wxT("wxDECORATIVE");
- case wxROMAN: return wxT("wxROMAN");
- case wxSCRIPT: return wxT("wxSCRIPT");
- case wxSWISS: return wxT("wxSWISS");
- case wxMODERN: return wxT("wxMODERN");
- case wxTELETYPE: return wxT("wxTELETYPE");
- default: return wxT("wxDEFAULT");
+ case wxFONTFAMILY_DECORATIVE: return "wxFONTFAMILY_DECORATIVE";
+ case wxFONTFAMILY_ROMAN: return "wxFONTFAMILY_ROMAN";
+ case wxFONTFAMILY_SCRIPT: return "wxFONTFAMILY_SCRIPT";
+ 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";
}
}
wxString wxFontBase::GetStyleString() const
{
- wxCHECK_MSG( Ok(), wxT("wxDEFAULT"), wxT("invalid font") );
+ wxCHECK_MSG( IsOk(), "wxFONTSTYLE_DEFAULT", "invalid font" );
switch ( GetStyle() )
{
- case wxNORMAL: return wxT("wxNORMAL");
- case wxSLANT: return wxT("wxSLANT");
- case wxITALIC: return wxT("wxITALIC");
- default: return wxT("wxDEFAULT");
+ case wxFONTSTYLE_NORMAL: return "wxFONTSTYLE_NORMAL";
+ case wxFONTSTYLE_SLANT: return "wxFONTSTYLE_SLANT";
+ case wxFONTSTYLE_ITALIC: return "wxFONTSTYLE_ITALIC";
+ default: return "wxFONTSTYLE_DEFAULT";
}
}
wxString wxFontBase::GetWeightString() const
{
- wxCHECK_MSG( Ok(), wxT("wxDEFAULT"), wxT("invalid font") );
+ wxCHECK_MSG( IsOk(), "wxFONTWEIGHT_DEFAULT", "invalid font" );
switch ( GetWeight() )
{
- case wxNORMAL: return wxT("wxNORMAL");
- case wxBOLD: return wxT("wxBOLD");
- case wxLIGHT: return wxT("wxLIGHT");
- default: return wxT("wxDEFAULT");
+ case wxFONTWEIGHT_NORMAL: return "wxFONTWEIGHT_NORMAL";
+ case wxFONTWEIGHT_BOLD: return "wxFONTWEIGHT_BOLD";
+ case wxFONTWEIGHT_LIGHT: return "wxFONTWEIGHT_LIGHT";
+ default: return "wxFONTWEIGHT_DEFAULT";
}
}
#if wxUSE_FONTENUM
if (!wxFontEnumerator::IsValidFacename(facename))
{
- UnRef(); // make Ok() return false
+ UnRef(); // make IsOk() return false
return false;
}
#else // !wxUSE_FONTENUM
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
{
long l;
- wxStringTokenizer tokenizer(s, _T(";"));
+ wxStringTokenizer tokenizer(s, wxT(";"));
wxString token = tokenizer.GetNextToken();
//
{
wxString s;
- s.Printf(_T("%d;%d;%d;%d;%d;%d;%s;%d"),
+ s.Printf(wxT("%d;%d;%d;%d;%d;%d;%s;%d"),
0, // version
pointSize,
family,
// format there anyhow (but there is a well-defined standard for X11 fonts used
// by wxGTK and wxMotif)
-#if defined(wxNO_NATIVE_FONTINFO) || defined(__WXMSW__) || defined (__WXPM__)
+#if defined(wxNO_NATIVE_FONTINFO) || defined(__WXMSW__) || defined (__WXPM__) || defined(__WXOSX__)
wxString wxNativeFontInfo::ToUserString() const
{
switch ( GetWeight() )
{
default:
- wxFAIL_MSG( _T("unknown font weight") );
+ wxFAIL_MSG( wxT("unknown font weight") );
// fall through
case wxFONTWEIGHT_NORMAL:
switch ( GetStyle() )
{
default:
- wxFAIL_MSG( _T("unknown font style") );
+ wxFAIL_MSG( wxT("unknown font style") );
// fall through
case wxFONTSTYLE_NORMAL:
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 << wxT(" '") << face << _("'");
+ }
+ else
+ desc << wxT(' ') << 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();
if ( size != wxNORMAL_FONT->GetPointSize() )
{
- desc << _T(' ') << size;
+ desc << wxT(' ') << size;
}
#if wxUSE_FONTMAP
wxFontEncoding enc = GetEncoding();
if ( enc != wxFONTENCODING_DEFAULT && enc != wxFONTENCODING_SYSTEM )
{
- desc << _T(' ') << wxFontMapper::GetEncodingName(enc);
+ desc << wxT(' ') << wxFontMapper::GetEncodingName(enc);
}
#endif // wxUSE_FONTMAP
// 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, wxT(";, "), wxTOKEN_STRTOK);
wxString face;
unsigned long size;
#if wxUSE_FONTMAP
bool encodingfound = false;
#endif
+ bool insideQuotes = false;
while ( tokenizer.HasMoreTokens() )
{
// 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 ( token == _T("underlined") || token == _("underlined") )
+ if ( insideQuotes )
+ {
+ // only the facename may be quoted:
+ face += " " + token;
+ continue;
+ }
+ if ( token == wxT("underlined") || token == _("underlined") )
{
SetUnderlined(true);
}
- else if ( token == _T("light") || token == _("light") )
+ else if ( token == wxT("light") || token == _("light") )
{
SetWeight(wxFONTWEIGHT_LIGHT);
weightfound = true;
}
- else if ( token == _T("bold") || token == _("bold") )
+ else if ( token == wxT("bold") || token == _("bold") )
{
SetWeight(wxFONTWEIGHT_BOLD);
weightfound = true;
}
- else if ( token == _T("italic") || token == _("italic") )
+ else if ( token == wxT("italic") || token == _("italic") )
{
SetStyle(wxFONTSTYLE_ITALIC);
}
// assume it is the face name
if ( !face.empty() )
{
- face += _T(' ');
+ face += wxT(' ');
}
face += token;
// 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
bool wxFromString(const wxString& str, wxFontBase *font)
{
- wxCHECK_MSG( font, false, _T("NULL output parameter") );
+ wxCHECK_MSG( font, false, wxT("NULL output parameter") );
if ( str.empty() )
{