+// conversion to/from user-readable string: this is used in the generic
+// versions and under MSW as well because there is no standard font description
+// 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__)
+
+wxString wxNativeFontInfo::ToUserString() const
+{
+ wxString desc;
+
+ // first put the adjectives, if any - this is English-centric, of course,
+ // but what else can we do?
+ if ( GetUnderlined() )
+ {
+ desc << _("underlined ");
+ }
+
+ switch ( GetWeight() )
+ {
+ default:
+ wxFAIL_MSG( _T("unknown font weight") );
+ // fall through
+
+ case wxFONTWEIGHT_NORMAL:
+ break;
+
+ case wxFONTWEIGHT_LIGHT:
+ desc << _("light ");
+ break;
+
+ case wxFONTWEIGHT_BOLD:
+ desc << _("bold ");
+ break;
+ }
+
+ switch ( GetStyle() )
+ {
+ default:
+ wxFAIL_MSG( _T("unknown font style") );
+ // fall through
+
+ case wxFONTSTYLE_NORMAL:
+ break;
+
+ // we don't distinguish between the two for now anyhow...
+ case wxFONTSTYLE_ITALIC:
+ case wxFONTSTYLE_SLANT:
+ desc << _("italic");
+ break;
+ }
+
+ wxString face = GetFaceName();
+ if ( !face.empty() )
+ {
+ desc << _T(' ') << face;
+ }
+
+ int size = GetPointSize();
+ if ( size != wxNORMAL_FONT->GetPointSize() )
+ {
+ desc << _T(' ') << size;
+ }
+
+#if wxUSE_FONTMAP
+ wxFontEncoding enc = GetEncoding();
+ if ( enc != wxFONTENCODING_DEFAULT && enc != wxFONTENCODING_SYSTEM )
+ {
+ desc << _T(' ') << wxFontMapper::Get()->GetEncodingName(enc);
+ }
+#endif // wxUSE_FONTMAP
+
+ return desc;
+}
+
+bool wxNativeFontInfo::FromUserString(const wxString& s)
+{
+ // reset to the default state
+ Init();
+
+ // parse a more or less free form string
+ //
+ // TODO: we should handle at least the quoted facenames
+ wxStringTokenizer tokenizer(s, _T(";, "), wxTOKEN_STRTOK);
+
+ wxString face;
+ unsigned long size;
+
+#if wxUSE_FONTMAP
+ wxFontEncoding encoding;
+#endif // wxUSE_FONTMAP
+
+ while ( tokenizer.HasMoreTokens() )
+ {
+ wxString token = tokenizer.GetNextToken();
+
+ // normalize it
+ token.Trim(true).Trim(false).MakeLower();
+
+ // look for the known tokens
+ if ( token == _T("underlined") || token == _("underlined") )
+ {
+ SetUnderlined(true);
+ }
+ else if ( token == _T("light") || token == _("light") )
+ {
+ SetWeight(wxFONTWEIGHT_LIGHT);
+ }
+ else if ( token == _T("bold") || token == _("bold") )
+ {
+ SetWeight(wxFONTWEIGHT_BOLD);
+ }
+ else if ( token == _T("italic") || token == _("italic") )
+ {
+ SetStyle(wxFONTSTYLE_ITALIC);
+ }
+ else if ( token.ToULong(&size) )
+ {
+ SetPointSize(size);
+ }
+#if wxUSE_FONTMAP
+ else if ( (encoding = wxFontMapper::Get()->CharsetToEncoding(token, false))
+ != wxFONTENCODING_DEFAULT )
+ {
+ SetEncoding(encoding);
+ }
+#endif // wxUSE_FONTMAP
+ else // assume it is the face name
+ {
+ if ( !face.empty() )
+ {
+ face += _T(' ');
+ }
+
+ face += token;
+
+ // skip the code which resets face below
+ continue;
+ }
+
+ // if we had had the facename, we shouldn't continue appending tokens
+ // to it (i.e. "foo bold bar" shouldn't result in the facename "foo
+ // bar")
+ if ( !face.empty() )
+ {
+ SetFaceName(face);
+ face.clear();
+ }
+ }
+
+ // we might not have flushed it inside the loop
+ if ( !face.empty() )
+ {
+ SetFaceName(face);
+ }
+
+ return true;
+}
+
+#endif // generic or wxMSW or wxOS2
+