miscellaneous wxFont enhancements (patch 1496606):

- made SetFaceName() bool and return false if the face name is not available
- corrected To/FromUserString() to complement each other


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39411 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2006-05-29 00:03:36 +00:00
parent 7aa7d2d407
commit 85ab460e7d
31 changed files with 378 additions and 104 deletions

View File

@@ -304,8 +304,8 @@ family identifiers.
\constfunc{wxString}{GetNativeFontInfoDesc}{\void} \constfunc{wxString}{GetNativeFontInfoDesc}{\void}
Returns the platform-dependent string completely describing this font or an Returns the platform-dependent string completely describing this font.
empty string if the font wasn't constructed using the native font description. Returned string is always non-empty.
Note that the returned string is not meant to be shown or edited by the user: a typical Note that the returned string is not meant to be shown or edited by the user: a typical
use of this function is for serializing in string-form a wxFont object. use of this function is for serializing in string-form a wxFont object.
@@ -318,7 +318,8 @@ use of this function is for serializing in string-form a wxFont object.
\func{wxString}{GetNativeFontInfoUserDesc}{\void} \func{wxString}{GetNativeFontInfoUserDesc}{\void}
Returns a user-friendly string for this font object. Some examples of the formats of returned strings (which are platform-dependent) are in \helpref{SetNativeFontInfoUserDesc}{wxfontsetnativefontinfouserdesc}. Returns a user-friendly string for this font object. Returned string is always non-empty.
Some examples of the formats of returned strings (which are platform-dependent) are in \helpref{SetNativeFontInfoUserDesc}{wxfontsetnativefontinfouserdesc}.
\wxheading{See also} \wxheading{See also}
@@ -417,9 +418,10 @@ Sets the default font encoding.
\membersection{wxFont::SetFaceName}\label{wxfontsetfacename} \membersection{wxFont::SetFaceName}\label{wxfontsetfacename}
\func{void}{SetFaceName}{\param{const wxString\& }{faceName}} \func{bool}{SetFaceName}{\param{const wxString\& }{faceName}}
Sets the facename for the font. Sets the facename for the font.
Returns \true if the given face name exists; \false otherwise.
\wxheading{Parameters} \wxheading{Parameters}
@@ -465,9 +467,10 @@ Sets the font family.
\membersection{wxFont::SetNativeFontInfo}\label{wxfontsetnativefontinfo} \membersection{wxFont::SetNativeFontInfo}\label{wxfontsetnativefontinfo}
\func{void}{SetNativeFontInfo}{\param{const wxString\& }{info}} \func{bool}{SetNativeFontInfo}{\param{const wxString\& }{info}}
Creates the font corresponding to the given native font description string Creates the font corresponding to the given native font description string and returns \true if
the creation was successful.
which must have been previously returned by which must have been previously returned by
\helpref{GetNativeFontInfoDesc}{wxfontgetnativefontinfodesc}. If the string is \helpref{GetNativeFontInfoDesc}{wxfontgetnativefontinfodesc}. If the string is
invalid, font is unchanged. This function is typically used for de-serializing a wxFont invalid, font is unchanged. This function is typically used for de-serializing a wxFont
@@ -480,9 +483,10 @@ object previously saved in a string-form.
\membersection{wxFont::SetNativeFontInfoUserDesc}\label{wxfontsetnativefontinfouserdesc} \membersection{wxFont::SetNativeFontInfoUserDesc}\label{wxfontsetnativefontinfouserdesc}
\func{void}{SetNativeFontInfoUserDesc}{\param{const wxString\& }{info}} \func{bool}{SetNativeFontInfoUserDesc}{\param{const wxString\& }{info}}
Creates the font corresponding to the given native font description string. Creates the font corresponding to the given native font description string and returns \true if
the creation was successful.
Unlike \helpref{SetNativeFontInfo}{wxfontsetnativefontinfo}, this function accepts Unlike \helpref{SetNativeFontInfo}{wxfontsetnativefontinfo}, this function accepts
strings which are user-friendly. strings which are user-friendly.
Examples of accepted string formats are: Examples of accepted string formats are:

View File

@@ -91,6 +91,14 @@ Return array of strings containing all facenames found by
\helpref{EnumerateFacenames}{wxfontenumeratorenumeratefacenames}. \helpref{EnumerateFacenames}{wxfontenumeratorenumeratefacenames}.
\membersection{wxFontEnumerator::IsValidFacename}\label{wxfontenumeratorisvalidfacename}
\func{static bool}{IsValidFacename}{\param{const wxString \&}{ facename}}
Returns \true if the given string is valid face name, i.e. it's the face name of an installed
font and it can safely be used with \helpref{wxFont::SetFaceName}{wxfontsetfacename}.
\membersection{wxFontEnumerator::OnFacename}\label{wxfontenumeratoronfacename} \membersection{wxFontEnumerator::OnFacename}\label{wxfontenumeratoronfacename}
\func{virtual bool}{OnFacename}{\param{const wxString\& }{font}} \func{virtual bool}{OnFacename}{\param{const wxString\& }{font}}

View File

@@ -141,7 +141,7 @@ public:
virtual void SetFamily(int family); virtual void SetFamily(int family);
virtual void SetStyle(int style); virtual void SetStyle(int style);
virtual void SetWeight(int weight); virtual void SetWeight(int weight);
virtual void SetFaceName(const wxString& faceName); virtual bool SetFaceName(const wxString& faceName);
virtual void SetUnderlined(bool underlined); virtual void SetUnderlined(bool underlined);
virtual void SetEncoding(wxFontEncoding encoding); virtual void SetEncoding(wxFontEncoding encoding);

View File

@@ -106,7 +106,7 @@ enum
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
class WXDLLEXPORT wxFontRefData; class WXDLLEXPORT wxFontRefData;
struct WXDLLEXPORT wxNativeFontInfo; class WXDLLEXPORT wxNativeFontInfo;
class WXDLLEXPORT wxFontBase : public wxGDIObject class WXDLLEXPORT wxFontBase : public wxGDIObject
{ {
@@ -186,14 +186,14 @@ public:
virtual void SetFamily( int family ) = 0; virtual void SetFamily( int family ) = 0;
virtual void SetStyle( int style ) = 0; virtual void SetStyle( int style ) = 0;
virtual void SetWeight( int weight ) = 0; virtual void SetWeight( int weight ) = 0;
virtual void SetFaceName( const wxString& faceName ) = 0;
virtual void SetUnderlined( bool underlined ) = 0; virtual void SetUnderlined( bool underlined ) = 0;
virtual void SetEncoding(wxFontEncoding encoding) = 0; virtual void SetEncoding(wxFontEncoding encoding) = 0;
virtual bool SetFaceName( const wxString& faceName );
void SetNativeFontInfo(const wxNativeFontInfo& info) void SetNativeFontInfo(const wxNativeFontInfo& info)
{ DoSetNativeFontInfo(info); } { DoSetNativeFontInfo(info); }
void SetNativeFontInfo(const wxString& info); bool SetNativeFontInfo(const wxString& info);
void SetNativeFontInfoUserDesc(const wxString& info); bool SetNativeFontInfoUserDesc(const wxString& info);
// translate the fonts into human-readable string (i.e. GetStyleString() // translate the fonts into human-readable string (i.e. GetStyleString()
// will return "wxITALIC" for an italic font, ...) // will return "wxITALIC" for an italic font, ...)

View File

@@ -67,6 +67,10 @@ public:
// convenience function that returns array of all available encodings. // convenience function that returns array of all available encodings.
static wxArrayString GetEncodings(const wxString& facename = wxEmptyString); static wxArrayString GetEncodings(const wxString& facename = wxEmptyString);
// convenience function that returns true if the given face name exist
// in the user's system
static bool IsValidFacename(const wxString &str);
private: private:
DECLARE_NO_COPY_CLASS(wxFontEnumerator) DECLARE_NO_COPY_CLASS(wxFontEnumerator)
}; };

View File

@@ -64,11 +64,9 @@ enum wxXLFDField
// functions, the user code can only get the objects of this type from // functions, the user code can only get the objects of this type from
// somewhere and pass it somewhere else (possibly save them somewhere using // somewhere and pass it somewhere else (possibly save them somewhere using
// ToString() and restore them using FromString()) // ToString() and restore them using FromString())
// class WXDLLEXPORT wxNativeFontInfo
// NB: it is a POD currently for max efficiency but if it continues to grow
// further it might make sense to make it a real class with virtual methods
struct WXDLLEXPORT wxNativeFontInfo
{ {
public:
#if wxUSE_PANGO #if wxUSE_PANGO
PangoFontDescription *description; PangoFontDescription *description;
#elif defined(_WX_X_FONTLIKE) #elif defined(_WX_X_FONTLIKE)
@@ -195,10 +193,17 @@ public:
void SetStyle(wxFontStyle style); void SetStyle(wxFontStyle style);
void SetWeight(wxFontWeight weight); void SetWeight(wxFontWeight weight);
void SetUnderlined(bool underlined); void SetUnderlined(bool underlined);
void SetFaceName(const wxString& facename); bool SetFaceName(const wxString& facename);
void SetFamily(wxFontFamily family); void SetFamily(wxFontFamily family);
void SetEncoding(wxFontEncoding encoding); void SetEncoding(wxFontEncoding encoding);
// sets the first facename in the given array which is found
// to be valid. If no valid facename is given, sets the
// first valid facename returned by wxFontEnumerator::GetFacenames().
// Does not return a bool since it cannot fail.
void SetFaceName(const wxArrayString &facenames);
// it is important to be able to serialize wxNativeFontInfo objects to be // it is important to be able to serialize wxNativeFontInfo objects to be
// able to store them (in config file, for example) // able to store them (in config file, for example)
bool FromString(const wxString& s); bool FromString(const wxString& s);

View File

@@ -78,7 +78,7 @@ public:
virtual void SetFamily( int family ); virtual void SetFamily( int family );
virtual void SetStyle( int style ); virtual void SetStyle( int style );
virtual void SetWeight( int weight ); virtual void SetWeight( int weight );
virtual void SetFaceName( const wxString& faceName ); virtual bool SetFaceName( const wxString& faceName );
virtual void SetUnderlined( bool underlined ); virtual void SetUnderlined( bool underlined );
virtual void SetEncoding(wxFontEncoding encoding); virtual void SetEncoding(wxFontEncoding encoding);

View File

@@ -79,7 +79,7 @@ public:
virtual void SetFamily( int family ); virtual void SetFamily( int family );
virtual void SetStyle( int style ); virtual void SetStyle( int style );
virtual void SetWeight( int weight ); virtual void SetWeight( int weight );
virtual void SetFaceName( const wxString& faceName ); virtual bool SetFaceName( const wxString& faceName );
virtual void SetUnderlined( bool underlined ); virtual void SetUnderlined( bool underlined );
virtual void SetEncoding(wxFontEncoding encoding); virtual void SetEncoding(wxFontEncoding encoding);

View File

@@ -68,7 +68,7 @@ public:
virtual void SetFamily(int family); virtual void SetFamily(int family);
virtual void SetStyle(int style); virtual void SetStyle(int style);
virtual void SetWeight(int weight); virtual void SetWeight(int weight);
virtual void SetFaceName(const wxString& faceName); virtual bool SetFaceName(const wxString& faceName);
virtual void SetUnderlined(bool underlined); virtual void SetUnderlined(bool underlined);
virtual void SetEncoding(wxFontEncoding encoding); virtual void SetEncoding(wxFontEncoding encoding);

View File

@@ -66,7 +66,7 @@ public:
virtual void SetFamily(int family); virtual void SetFamily(int family);
virtual void SetStyle(int style); virtual void SetStyle(int style);
virtual void SetWeight(int weight); virtual void SetWeight(int weight);
virtual void SetFaceName(const wxString& faceName); virtual bool SetFaceName(const wxString& faceName);
virtual void SetUnderlined(bool underlined); virtual void SetUnderlined(bool underlined);
virtual void SetEncoding(wxFontEncoding encoding); virtual void SetEncoding(wxFontEncoding encoding);

View File

@@ -75,7 +75,7 @@ public:
virtual void SetFamily(int family); virtual void SetFamily(int family);
virtual void SetStyle(int style); virtual void SetStyle(int style);
virtual void SetWeight(int weight); virtual void SetWeight(int weight);
virtual void SetFaceName(const wxString& faceName); virtual bool SetFaceName(const wxString& faceName);
virtual void SetUnderlined(bool underlined); virtual void SetUnderlined(bool underlined);
virtual void SetEncoding(wxFontEncoding encoding); virtual void SetEncoding(wxFontEncoding encoding);

View File

@@ -71,7 +71,7 @@ public:
virtual void SetFamily(int family); virtual void SetFamily(int family);
virtual void SetStyle(int style); virtual void SetStyle(int style);
virtual void SetWeight(int weight); virtual void SetWeight(int weight);
virtual void SetFaceName(const wxString& faceName); virtual bool SetFaceName(const wxString& faceName);
virtual void SetUnderlined(bool underlined); virtual void SetUnderlined(bool underlined);
virtual void SetEncoding(wxFontEncoding encoding); virtual void SetEncoding(wxFontEncoding encoding);

View File

@@ -82,6 +82,10 @@ public:
virtual ~wxFont(); virtual ~wxFont();
// wxFontBase overridden functions
virtual wxString GetNativeFontInfoDesc() const;
virtual wxString GetNativeFontInfoUserDesc() const;
// implement base class pure virtuals // implement base class pure virtuals
virtual int GetPointSize() const; virtual int GetPointSize() const;
virtual wxSize GetPixelSize() const; virtual wxSize GetPixelSize() const;
@@ -99,7 +103,7 @@ public:
virtual void SetFamily(int family); virtual void SetFamily(int family);
virtual void SetStyle(int style); virtual void SetStyle(int style);
virtual void SetWeight(int weight); virtual void SetWeight(int weight);
virtual void SetFaceName(const wxString& faceName); virtual bool SetFaceName(const wxString& faceName);
virtual void SetUnderlined(bool underlined); virtual void SetUnderlined(bool underlined);
virtual void SetEncoding(wxFontEncoding encoding); virtual void SetEncoding(wxFontEncoding encoding);

View File

@@ -88,7 +88,7 @@ public:
virtual void SetFamily(int nFamily); virtual void SetFamily(int nFamily);
virtual void SetStyle(int nStyle); virtual void SetStyle(int nStyle);
virtual void SetWeight(int nWeight); virtual void SetWeight(int nWeight);
virtual void SetFaceName(const wxString& rsFaceName); virtual bool SetFaceName(const wxString& rsFaceName);
virtual void SetUnderlined(bool bUnderlined); virtual void SetUnderlined(bool bUnderlined);
virtual void SetEncoding(wxFontEncoding vEncoding); virtual void SetEncoding(wxFontEncoding vEncoding);

View File

@@ -99,7 +99,7 @@ public:
virtual void SetFamily(int family); virtual void SetFamily(int family);
virtual void SetStyle(int style); virtual void SetStyle(int style);
virtual void SetWeight(int weight); virtual void SetWeight(int weight);
virtual void SetFaceName(const wxString& faceName); virtual bool SetFaceName(const wxString& faceName);
virtual void SetUnderlined(bool underlined); virtual void SetUnderlined(bool underlined);
virtual void SetEncoding(wxFontEncoding encoding); virtual void SetEncoding(wxFontEncoding encoding);

View File

@@ -69,7 +69,7 @@ public:
virtual void SetFamily(int family); virtual void SetFamily(int family);
virtual void SetStyle(int style); virtual void SetStyle(int style);
virtual void SetWeight(int weight); virtual void SetWeight(int weight);
virtual void SetFaceName(const wxString& faceName); virtual bool SetFaceName(const wxString& faceName);
virtual void SetUnderlined(bool underlined); virtual void SetUnderlined(bool underlined);
virtual void SetEncoding(wxFontEncoding encoding); virtual void SetEncoding(wxFontEncoding encoding);

View File

@@ -112,6 +112,8 @@ public:
void OnEnumerateEncodings(wxCommandEvent& event); void OnEnumerateEncodings(wxCommandEvent& event);
void OnCheckNativeToFromString(wxCommandEvent& event); void OnCheckNativeToFromString(wxCommandEvent& event);
void OnCheckNativeToFromUserString(wxCommandEvent& event);
void OnCheckFaceName(wxCommandEvent& event);
protected: protected:
bool DoEnumerateFamilies(bool fixedWidthOnly, bool DoEnumerateFamilies(bool fixedWidthOnly,
@@ -159,6 +161,8 @@ enum
Font_EnumFixedFamilies, Font_EnumFixedFamilies,
Font_EnumEncodings, Font_EnumEncodings,
Font_CheckNativeToFromString, Font_CheckNativeToFromString,
Font_CheckNativeToFromUserString,
Font_CheckFaceName,
Font_Max Font_Max
}; };
@@ -185,7 +189,10 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(Font_wxITALIC_FONT, MyFrame::OnwxPointerFont) EVT_MENU(Font_wxITALIC_FONT, MyFrame::OnwxPointerFont)
EVT_MENU(Font_wxSWISS_FONT, MyFrame::OnwxPointerFont) EVT_MENU(Font_wxSWISS_FONT, MyFrame::OnwxPointerFont)
EVT_MENU(Font_CheckNativeToFromString, MyFrame::OnCheckNativeToFromString) EVT_MENU(Font_CheckNativeToFromString, MyFrame::OnCheckNativeToFromString)
EVT_MENU(Font_CheckNativeToFromUserString, MyFrame::OnCheckNativeToFromUserString)
EVT_MENU(Font_CheckFaceName, MyFrame::OnCheckFaceName)
EVT_MENU(Font_Choose, MyFrame::OnSelectFont) EVT_MENU(Font_Choose, MyFrame::OnSelectFont)
EVT_MENU(Font_EnumFamiliesForEncoding, MyFrame::OnEnumerateFamiliesForEncoding) EVT_MENU(Font_EnumFamiliesForEncoding, MyFrame::OnEnumerateFamiliesForEncoding)
@@ -260,6 +267,10 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
menuFont->AppendSeparator(); menuFont->AppendSeparator();
menuFont->Append(Font_CheckNativeToFromString, menuFont->Append(Font_CheckNativeToFromString,
wxT("Check Native Font Info To/From String")); wxT("Check Native Font Info To/From String"));
menuFont->Append(Font_CheckNativeToFromUserString,
wxT("Check Native Font Info User String"));
menuFont->Append(Font_CheckFaceName,
wxT("Check font face name"));
wxMenu *menuSelect = new wxMenu; wxMenu *menuSelect = new wxMenu;
menuSelect->Append(Font_Choose, wxT("&Select font...\tCtrl-S"), menuSelect->Append(Font_Choose, wxT("&Select font...\tCtrl-S"),
@@ -488,6 +499,53 @@ void MyFrame::OnCheckNativeToFromString(wxCommandEvent& WXUNUSED(event))
} }
} }
void MyFrame::OnCheckFaceName(wxCommandEvent& WXUNUSED(event))
{
wxString facename = GetCanvas()->GetTextFont().GetFaceName();
wxString newFaceName = wxGetTextFromUser(
wxT("Here you can edit current font face name."),
wxT("Input font facename"), facename,
this);
if (newFaceName.IsEmpty())
return; // user clicked "Cancel" - do nothing
wxFont font(GetCanvas()->GetTextFont());
if (font.SetFaceName(newFaceName)) // change facename only
{
wxASSERT_MSG(font.Ok(), wxT("The font should now be valid"));
DoChangeFont(font);
}
else
{
wxASSERT_MSG(!font.Ok(), wxT("The font should now be invalid"));
wxMessageBox(wxT("There is no font with such face name..."),
wxT("Invalid face name"), wxOK|wxICON_ERROR, this);
}
}
void MyFrame::OnCheckNativeToFromUserString(wxCommandEvent& WXUNUSED(event))
{
wxString fontdesc = GetCanvas()->GetTextFont().GetNativeFontInfoUserDesc();
wxString fontUserInfo = wxGetTextFromUser(
wxT("Here you can edit current font description"),
wxT("Input font description"), fontdesc,
this);
if (fontUserInfo.IsEmpty())
return; // user clicked "Cancel" - do nothing
wxFont font;
if (font.SetNativeFontInfoUserDesc(fontUserInfo))
{
wxASSERT_MSG(font.Ok(), wxT("The font should now be valid"));
DoChangeFont(font);
}
else
{
wxASSERT_MSG(!font.Ok(), wxT("The font should now be invalid"));
wxMessageBox(wxT("Error trying to create a font with such description..."));
}
}
void MyFrame::DoResizeFont(int diff) void MyFrame::DoResizeFont(int diff)
{ {
wxFont font = m_canvas->GetTextFont(); wxFont font = m_canvas->GetTextFont();
@@ -533,10 +591,6 @@ void MyFrame::OnwxPointerFont(wxCommandEvent& event)
default : font = wxFont(*wxNORMAL_FONT); break; default : font = wxFont(*wxNORMAL_FONT); break;
} }
GetMenuBar()->Check(Font_Bold, false);
GetMenuBar()->Check(Font_Italic, false);
GetMenuBar()->Check(Font_Underlined, false);
DoChangeFont(font); DoChangeFont(font);
} }
@@ -550,6 +604,15 @@ void MyFrame::DoChangeFont(const wxFont& font, const wxColour& col)
m_textctrl->SetFont(font); m_textctrl->SetFont(font);
if ( col.Ok() ) if ( col.Ok() )
m_textctrl->SetForegroundColour(col); m_textctrl->SetForegroundColour(col);
// update the state of the bold/italic/underlined menu items
wxMenuBar *mbar = GetMenuBar();
if ( mbar )
{
mbar->Check(Font_Bold, font.GetWeight() == wxFONTWEIGHT_BOLD);
mbar->Check(Font_Italic, font.GetStyle() == wxFONTSTYLE_ITALIC);
mbar->Check(Font_Underlined, font.GetUnderlined());
}
} }
void MyFrame::OnSelectFont(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnSelectFont(wxCommandEvent& WXUNUSED(event))
@@ -566,15 +629,6 @@ void MyFrame::OnSelectFont(wxCommandEvent& WXUNUSED(event))
wxColour colour = retData.GetColour(); wxColour colour = retData.GetColour();
DoChangeFont(font, colour); DoChangeFont(font, colour);
// update the state of the bold/italic/underlined menu items
wxMenuBar *mbar = GetMenuBar();
if ( mbar )
{
mbar->Check(Font_Bold, font.GetWeight() == wxFONTWEIGHT_BOLD);
mbar->Check(Font_Italic, font.GetStyle() == wxFONTSTYLE_ITALIC);
mbar->Check(Font_Underlined, font.GetUnderlined());
}
} }
} }

View File

@@ -160,13 +160,15 @@ void wxFont::SetWeight(int weight)
RealizeResource(); RealizeResource();
} }
void wxFont::SetFaceName(const wxString& faceName) bool wxFont::SetFaceName(const wxString& faceName)
{ {
Unshare(); Unshare();
M_FONTDATA->m_faceName = faceName; M_FONTDATA->m_faceName = faceName;
RealizeResource(); RealizeResource();
return wxFontBase::SetFaceName(faceName);
} }
void wxFont::SetUnderlined(bool underlined) void wxFont::SetUnderlined(bool underlined)

View File

@@ -41,6 +41,7 @@
#include "wx/fontutil.h" // for wxNativeFontInfo #include "wx/fontutil.h" // for wxNativeFontInfo
#include "wx/fontmap.h" #include "wx/fontmap.h"
#include "wx/fontenum.h"
#include "wx/tokenzr.h" #include "wx/tokenzr.h"
@@ -266,6 +267,11 @@ wxString wxFontBase::GetNativeFontInfoDesc() const
if ( fontInfo ) if ( fontInfo )
{ {
fontDesc = fontInfo->ToString(); fontDesc = fontInfo->ToString();
wxASSERT_MSG(!fontDesc.IsEmpty(), wxT("This should be a non-empty string!"));
}
else
{
wxASSERT_MSG(0, wxT("Derived class should have created the wxNativeFontInfo!"));
} }
return fontDesc; return fontDesc;
@@ -278,27 +284,40 @@ wxString wxFontBase::GetNativeFontInfoUserDesc() const
if ( fontInfo ) if ( fontInfo )
{ {
fontDesc = fontInfo->ToUserString(); fontDesc = fontInfo->ToUserString();
wxASSERT_MSG(!fontDesc.IsEmpty(), wxT("This should be a non-empty string!"));
}
else
{
wxASSERT_MSG(0, wxT("Derived class should have created the wxNativeFontInfo!"));
} }
return fontDesc; return fontDesc;
} }
void wxFontBase::SetNativeFontInfo(const wxString& info) bool wxFontBase::SetNativeFontInfo(const wxString& info)
{ {
wxNativeFontInfo fontInfo; wxNativeFontInfo fontInfo;
if ( !info.empty() && fontInfo.FromString(info) ) if ( !info.empty() && fontInfo.FromString(info) )
{ {
SetNativeFontInfo(fontInfo); SetNativeFontInfo(fontInfo);
} return true;
} }
void wxFontBase::SetNativeFontInfoUserDesc(const wxString& info) UnRef();
return false;
}
bool wxFontBase::SetNativeFontInfoUserDesc(const wxString& info)
{ {
wxNativeFontInfo fontInfo; wxNativeFontInfo fontInfo;
if ( !info.empty() && fontInfo.FromUserString(info) ) if ( !info.empty() && fontInfo.FromUserString(info) )
{ {
SetNativeFontInfo(fontInfo); SetNativeFontInfo(fontInfo);
return true;
} }
UnRef();
return false;
} }
bool wxFontBase::operator==(const wxFont& font) const bool wxFontBase::operator==(const wxFont& font) const
@@ -313,7 +332,7 @@ bool wxFontBase::operator==(const wxFont& font) const
GetStyle() == font.GetStyle() && GetStyle() == font.GetStyle() &&
GetWeight() == font.GetWeight() && GetWeight() == font.GetWeight() &&
GetUnderlined() == font.GetUnderlined() && GetUnderlined() == font.GetUnderlined() &&
GetFaceName() == font.GetFaceName() && GetFaceName().IsSameAs(font.GetFaceName(), false) &&
GetEncoding() == font.GetEncoding() GetEncoding() == font.GetEncoding()
); );
} }
@@ -365,10 +384,41 @@ wxString wxFontBase::GetWeightString() const
} }
} }
bool wxFontBase::SetFaceName(const wxString &facename)
{
if (!wxFontEnumerator::IsValidFacename(facename))
{
UnRef(); // make Ok() return false
return false;
}
return true;
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxNativeFontInfo // wxNativeFontInfo
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// Up to now, there are no native implementations of this function:
void wxNativeFontInfo::SetFaceName(const wxArrayString &facenames)
{
for (size_t i=0; i < facenames.GetCount(); i++)
{
if (wxFontEnumerator::IsValidFacename(facenames[i]))
{
SetFaceName(facenames[i]);
return;
}
}
// set the first valid facename we can find on this system
wxString validfacename = wxFontEnumerator::GetFacenames().Item(0);
wxLogTrace(wxT("font"), wxT("Falling back to '%s'"), validfacename.c_str());
SetFaceName(validfacename);
}
#ifdef wxNO_NATIVE_FONTINFO #ifdef wxNO_NATIVE_FONTINFO
// These are the generic forms of FromString()/ToString. // These are the generic forms of FromString()/ToString.
@@ -510,9 +560,10 @@ void wxNativeFontInfo::SetUnderlined(bool underlined_)
underlined = underlined_; underlined = underlined_;
} }
void wxNativeFontInfo::SetFaceName(const wxString& facename_) bool wxNativeFontInfo::SetFaceName(const wxString& facename_)
{ {
faceName = facename_; faceName = facename_;
return true;
} }
void wxNativeFontInfo::SetFamily(wxFontFamily family_) void wxNativeFontInfo::SetFamily(wxFontFamily family_)
@@ -599,7 +650,7 @@ wxString wxNativeFontInfo::ToUserString() const
} }
#endif // wxUSE_FONTMAP #endif // wxUSE_FONTMAP
return desc; return desc.Strip(wxString::both).MakeLower();
} }
bool wxNativeFontInfo::FromUserString(const wxString& s) bool wxNativeFontInfo::FromUserString(const wxString& s)
@@ -614,10 +665,7 @@ bool wxNativeFontInfo::FromUserString(const wxString& s)
wxString face; wxString face;
unsigned long size; unsigned long size;
bool weightfound = false, pointsizefound = false, encodingfound = false;
#if wxUSE_FONTMAP
wxFontEncoding encoding;
#endif // wxUSE_FONTMAP
while ( tokenizer.HasMoreTokens() ) while ( tokenizer.HasMoreTokens() )
{ {
@@ -634,10 +682,12 @@ bool wxNativeFontInfo::FromUserString(const wxString& s)
else if ( token == _T("light") || token == _("light") ) else if ( token == _T("light") || token == _("light") )
{ {
SetWeight(wxFONTWEIGHT_LIGHT); SetWeight(wxFONTWEIGHT_LIGHT);
weightfound = true;
} }
else if ( token == _T("bold") || token == _("bold") ) else if ( token == _T("bold") || token == _("bold") )
{ {
SetWeight(wxFONTWEIGHT_BOLD); SetWeight(wxFONTWEIGHT_BOLD);
weightfound = true;
} }
else if ( token == _T("italic") || token == _("italic") ) else if ( token == _T("italic") || token == _("italic") )
{ {
@@ -646,16 +696,24 @@ bool wxNativeFontInfo::FromUserString(const wxString& s)
else if ( token.ToULong(&size) ) else if ( token.ToULong(&size) )
{ {
SetPointSize(size); SetPointSize(size);
pointsizefound = true;
} }
else
{
#if wxUSE_FONTMAP #if wxUSE_FONTMAP
else if ( (encoding = wxFontMapper::Get()->CharsetToEncoding(token, false)) // try to interpret this as an encoding
!= wxFONTENCODING_DEFAULT ) wxFontEncoding encoding = wxFontMapper::Get()->CharsetToEncoding(token, false);
if ( encoding != wxFONTENCODING_DEFAULT &&
encoding != wxFONTENCODING_SYSTEM ) // returned when the recognition failed
{ {
SetEncoding(encoding); SetEncoding(encoding);
encodingfound = true;
} }
#endif // wxUSE_FONTMAP else
else // assume it is the face name
{ {
#endif // wxUSE_FONTMAP
// assume it is the face name
if ( !face.empty() ) if ( !face.empty() )
{ {
face += _T(' '); face += _T(' ');
@@ -665,6 +723,10 @@ bool wxNativeFontInfo::FromUserString(const wxString& s)
// skip the code which resets face below // skip the code which resets face below
continue; continue;
#if wxUSE_FONTMAP
}
#endif // wxUSE_FONTMAP
} }
// if we had had the facename, we shouldn't continue appending tokens // if we had had the facename, we shouldn't continue appending tokens
@@ -672,7 +734,12 @@ bool wxNativeFontInfo::FromUserString(const wxString& s)
// bar") // bar")
if ( !face.empty() ) if ( !face.empty() )
{ {
SetFaceName(face); // 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 (!wxFontEnumerator::IsValidFacename(face) ||
!SetFaceName(face))
SetFaceName(wxNORMAL_FONT->GetFaceName());
face.clear(); face.clear();
} }
} }
@@ -680,9 +747,28 @@ bool wxNativeFontInfo::FromUserString(const wxString& s)
// we might not have flushed it inside the loop // we might not have flushed it inside the loop
if ( !face.empty() ) if ( !face.empty() )
{ {
SetFaceName(face); // 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 (!wxFontEnumerator::IsValidFacename(face) ||
!SetFaceName(face))
SetFaceName(wxNORMAL_FONT->GetFaceName());
} }
// set point size to default value if size was not given
if ( !pointsizefound )
SetPointSize(wxNORMAL_FONT->GetPointSize());
// set font weight to default value if weight was not given
if ( !weightfound )
SetWeight(wxFONTWEIGHT_NORMAL);
#if wxUSE_FONTMAP
// set font encoding to default value if encoding was not given
if ( !encodingfound )
SetEncoding(wxFONTENCODING_SYSTEM);
#endif // wxUSE_FONTMAP
return true; return true;
} }

View File

@@ -72,3 +72,31 @@ wxArrayString wxFontEnumerator::GetEncodings(const wxString& facename)
temp.EnumerateEncodings(facename); temp.EnumerateEncodings(facename);
return temp.m_arrEncodings; return temp.m_arrEncodings;
} }
/* static */
bool wxFontEnumerator::IsValidFacename(const wxString &facename)
{
// we cache the result of wxFontEnumerator::GetFacenames supposing that
// the array of face names won't change in the session of this program
static wxArrayString s_arr = wxFontEnumerator::GetFacenames();
#ifdef __WXMSW__
// Quoting the MSDN:
// "MS Shell Dlg is a mapping mechanism that enables
// U.S. English Microsoft Windows NT, and Microsoft Windows 2000 to
// support locales that have characters that are not contained in code
// page 1252. It is not a font but a face name for a nonexistent font."
// Thus we need to consider "Ms Shell Dlg" and "Ms Shell Dlg 2" as valid
// font face names even if they are enumerated by wxFontEnumerator
if (facename.IsSameAs(wxT("Ms Shell Dlg"), false) ||
facename.IsSameAs(wxT("Ms Shell Dlg 2"), false))
return true;
#endif
// is given font face name a valid one ?
if (s_arr.Index(facename, false) == wxNOT_FOUND)
return false;
return true;
}

View File

@@ -88,7 +88,7 @@ public:
void SetStyle(int style); void SetStyle(int style);
void SetWeight(int weight); void SetWeight(int weight);
void SetUnderlined(bool underlined); void SetUnderlined(bool underlined);
void SetFaceName(const wxString& facename); bool SetFaceName(const wxString& facename);
void SetEncoding(wxFontEncoding encoding); void SetEncoding(wxFontEncoding encoding);
void SetNoAntiAliasing( bool no = true ) { m_noAA = no; } void SetNoAntiAliasing( bool no = true ) { m_noAA = no; }
@@ -321,11 +321,11 @@ void wxFontRefData::SetUnderlined(bool underlined)
// the XLFD doesn't have "underlined" field anyhow // the XLFD doesn't have "underlined" field anyhow
} }
void wxFontRefData::SetFaceName(const wxString& facename) bool wxFontRefData::SetFaceName(const wxString& facename)
{ {
m_faceName = facename; m_faceName = facename;
m_nativeFontInfo.SetFaceName(facename); return m_nativeFontInfo.SetFaceName(facename);
} }
void wxFontRefData::SetEncoding(wxFontEncoding encoding) void wxFontRefData::SetEncoding(wxFontEncoding encoding)
@@ -548,11 +548,12 @@ void wxFont::SetWeight(int weight)
M_FONTDATA->SetWeight(weight); M_FONTDATA->SetWeight(weight);
} }
void wxFont::SetFaceName(const wxString& faceName) bool wxFont::SetFaceName(const wxString& faceName)
{ {
Unshare(); Unshare();
M_FONTDATA->SetFaceName(faceName); return M_FONTDATA->SetFaceName(faceName) &&
wxFontBase::SetFaceName(faceName);
} }
void wxFont::SetUnderlined(bool underlined) void wxFont::SetUnderlined(bool underlined)

View File

@@ -88,7 +88,7 @@ public:
void SetStyle(int style); void SetStyle(int style);
void SetWeight(int weight); void SetWeight(int weight);
void SetUnderlined(bool underlined); void SetUnderlined(bool underlined);
void SetFaceName(const wxString& facename); bool SetFaceName(const wxString& facename);
void SetEncoding(wxFontEncoding encoding); void SetEncoding(wxFontEncoding encoding);
void SetNoAntiAliasing( bool no = true ) { m_noAA = no; } void SetNoAntiAliasing( bool no = true ) { m_noAA = no; }
@@ -436,7 +436,7 @@ void wxFontRefData::SetUnderlined(bool underlined)
// the XLFD doesn't have "underlined" field anyhow // the XLFD doesn't have "underlined" field anyhow
} }
void wxFontRefData::SetFaceName(const wxString& facename) bool wxFontRefData::SetFaceName(const wxString& facename)
{ {
m_faceName = facename; m_faceName = facename;
@@ -444,6 +444,8 @@ void wxFontRefData::SetFaceName(const wxString& facename)
{ {
m_nativeFontInfo.SetXFontComponent(wxXLFD_FAMILY, facename); m_nativeFontInfo.SetXFontComponent(wxXLFD_FAMILY, facename);
} }
return true;
} }
void wxFontRefData::SetEncoding(wxFontEncoding encoding) void wxFontRefData::SetEncoding(wxFontEncoding encoding)
@@ -688,11 +690,12 @@ void wxFont::SetWeight(int weight)
M_FONTDATA->SetWeight(weight); M_FONTDATA->SetWeight(weight);
} }
void wxFont::SetFaceName(const wxString& faceName) bool wxFont::SetFaceName(const wxString& faceName)
{ {
Unshare(); Unshare();
M_FONTDATA->SetFaceName(faceName); return M_FONTDATA->SetFaceName(faceName) &&
wxFontBase::SetFaceName(faceName);
} }
void wxFont::SetUnderlined(bool underlined) void wxFont::SetUnderlined(bool underlined)

View File

@@ -473,13 +473,15 @@ void wxFont::SetWeight(int weight)
RealizeResource(); RealizeResource();
} }
void wxFont::SetFaceName(const wxString& faceName) bool wxFont::SetFaceName(const wxString& faceName)
{ {
Unshare(); Unshare();
M_FONTDATA->m_faceName = faceName; M_FONTDATA->m_faceName = faceName;
RealizeResource(); RealizeResource();
return wxFontBase::SetFaceName(faceName);
} }
void wxFont::SetUnderlined(bool underlined) void wxFont::SetUnderlined(bool underlined)

View File

@@ -339,13 +339,15 @@ void wxFont::SetWeight(int weight)
RealizeResource(); RealizeResource();
} }
void wxFont::SetFaceName(const wxString& faceName) bool wxFont::SetFaceName(const wxString& faceName)
{ {
Unshare(); Unshare();
M_FONTDATA->m_faceName = faceName; M_FONTDATA->m_faceName = faceName;
RealizeResource(); RealizeResource();
return wxFontBase::SetFaceName(faceName);
} }
void wxFont::SetUnderlined(bool underlined) void wxFont::SetUnderlined(bool underlined)

View File

@@ -311,12 +311,14 @@ void wxFont::SetWeight(int weight)
M_FONTDATA->m_valid = false; M_FONTDATA->m_valid = false;
} }
void wxFont::SetFaceName(const wxString& faceName) bool wxFont::SetFaceName(const wxString& faceName)
{ {
AllocExclusive(); AllocExclusive();
M_FONTDATA->m_faceName = faceName; M_FONTDATA->m_faceName = faceName;
M_FONTDATA->m_valid = false; M_FONTDATA->m_valid = false;
return wxFontBase::SetFaceName(faceName);
} }
void wxFont::SetUnderlined(bool underlined) void wxFont::SetUnderlined(bool underlined)

View File

@@ -393,12 +393,14 @@ void wxFont::SetWeight(int weight)
M_FONTDATA->m_nativeFontInfo.GetXFontName().Clear(); // invalid now M_FONTDATA->m_nativeFontInfo.GetXFontName().Clear(); // invalid now
} }
void wxFont::SetFaceName(const wxString& faceName) bool wxFont::SetFaceName(const wxString& faceName)
{ {
Unshare(); Unshare();
M_FONTDATA->m_faceName = faceName; M_FONTDATA->m_faceName = faceName;
M_FONTDATA->m_nativeFontInfo.GetXFontName().Clear(); // invalid now M_FONTDATA->m_nativeFontInfo.GetXFontName().Clear(); // invalid now
return wxFontBase::SetFaceName(faceName);
} }
void wxFont::SetUnderlined(bool underlined) void wxFont::SetUnderlined(bool underlined)

View File

@@ -256,12 +256,13 @@ public:
m_weight = weight; m_weight = weight;
} }
void SetFaceName(const wxString& faceName) bool SetFaceName(const wxString& faceName)
{ {
if ( m_nativeFontInfoOk ) if ( m_nativeFontInfoOk )
m_nativeFontInfo.SetFaceName(faceName); return m_nativeFontInfo.SetFaceName(faceName);
else
m_faceName = faceName; m_faceName = faceName;
return true;
} }
void SetUnderlined(bool underlined) void SetUnderlined(bool underlined)
@@ -385,12 +386,10 @@ bool wxFontRefData::Alloc(wxFont *font)
if ( !hfont ) if ( !hfont )
{ {
wxLogLastError(wxT("CreateFont")); wxLogLastError(wxT("CreateFont"));
return false; return false;
} }
m_hFont = (WXHFONT)hfont; m_hFont = (WXHFONT)hfont;
return true; return true;
} }
@@ -561,42 +560,66 @@ void wxNativeFontInfo::SetUnderlined(bool underlined)
lf.lfUnderline = underlined; lf.lfUnderline = underlined;
} }
void wxNativeFontInfo::SetFaceName(const wxString& facename) bool wxNativeFontInfo::SetFaceName(const wxString& facename)
{ {
wxStrncpy(lf.lfFaceName, facename, WXSIZEOF(lf.lfFaceName)); size_t len = WXSIZEOF(lf.lfFaceName);
wxStrncpy(lf.lfFaceName, facename, len);
lf.lfFaceName[len - 1] = '\0'; // truncate the face name
return true;
} }
void wxNativeFontInfo::SetFamily(wxFontFamily family) void wxNativeFontInfo::SetFamily(wxFontFamily family)
{ {
BYTE ff_family; BYTE ff_family;
wxString facename; wxArrayString facename;
// the list of fonts associated with a family was partially
// taken from http://www.codestyle.org/css/font-family
switch ( family ) switch ( family )
{ {
case wxSCRIPT: case wxSCRIPT:
ff_family = FF_SCRIPT; ff_family = FF_SCRIPT;
facename = _T("Script"); facename.Add(_T("Script"));
facename.Add(_T("Brush Script MT"));
facename.Add(_T("Comic Sans MS"));
facename.Add(_T("Lucida Handwriting"));
break; break;
case wxDECORATIVE: case wxDECORATIVE:
ff_family = FF_DECORATIVE; ff_family = FF_DECORATIVE;
facename = _T("Old English Text MT"); facename.Add(_T("Old English Text MT"));
facename.Add(_T("Comic Sans MS"));
facename.Add(_T("Lucida Handwriting"));
break; break;
case wxROMAN: case wxROMAN:
ff_family = FF_ROMAN; ff_family = FF_ROMAN;
facename = _T("Times New Roman"); facename.Add(_T("Times New Roman"));
facename.Add(_T("Georgia"));
facename.Add(_T("Garamond"));
facename.Add(_T("Bookman Old Style"));
facename.Add(_T("Book Antiqua"));
break; break;
case wxTELETYPE: case wxTELETYPE:
case wxMODERN: case wxMODERN:
ff_family = FF_MODERN; ff_family = FF_MODERN;
facename = _T("Courier New"); facename.Add(_T("Courier New"));
facename.Add(_T("Lucida Console"));
facename.Add(_T("Andale Mono"));
facename.Add(_T("OCR A Extended"));
facename.Add(_T("Terminal"));
break; break;
case wxSWISS: case wxSWISS:
ff_family = FF_SWISS; ff_family = FF_SWISS;
facename = _T("Arial"); facename.Add(_T("Arial"));
facename.Add(_T("Century Gothic"));
facename.Add(_T("Lucida Sans Unicode"));
facename.Add(_T("Tahoma"));
facename.Add(_T("Trebuchet MS"));
facename.Add(_T("Verdana"));
break; break;
case wxDEFAULT: case wxDEFAULT:
@@ -607,9 +630,15 @@ void wxNativeFontInfo::SetFamily(wxFontFamily family)
int verMaj; int verMaj;
ff_family = FF_SWISS; ff_family = FF_SWISS;
if(wxGetOsVersion(&verMaj) == wxWINDOWS_NT && verMaj >= 5) if(wxGetOsVersion(&verMaj) == wxWINDOWS_NT && verMaj >= 5)
facename = _T("MS Shell Dlg 2"); facename.Add(_T("MS Shell Dlg 2"));
else else
facename = _T("MS Shell Dlg"); facename.Add(_T("MS Shell Dlg"));
// Quoting the MSDN:
// "MS Shell Dlg is a mapping mechanism that enables
// U.S. English Microsoft Windows NT, and Microsoft Windows 2000 to
// support locales that have characters that are not contained in code
// page 1252. It is not a font but a face name for a nonexistent font."
} }
} }
@@ -920,13 +949,22 @@ void wxFont::SetWeight(int weight)
RealizeResource(); RealizeResource();
} }
void wxFont::SetFaceName(const wxString& faceName) bool wxFont::SetFaceName(const wxString& faceName)
{ {
Unshare(); Unshare();
M_FONTDATA->SetFaceName(faceName); bool refdataok = M_FONTDATA->SetFaceName(faceName);
RealizeResource(); RealizeResource();
// NB: using win32's GetObject() API on M_FONTDATA->GetHFONT()
// to retrieve a LOGFONT and then compare lf.lfFaceName
// with given facename is not reliable at all:
// Windows copies the facename given to ::CreateFontIndirect()
// without any validity check.
// Thus we use wxFontBase::SetFaceName to check if facename
// is valid...
return refdataok && wxFontBase::SetFaceName(faceName);
} }
void wxFont::SetUnderlined(bool underlined) void wxFont::SetUnderlined(bool underlined)
@@ -1029,6 +1067,20 @@ const wxNativeFontInfo *wxFont::GetNativeFontInfo() const
: NULL; : NULL;
} }
wxString wxFont::GetNativeFontInfoDesc() const
{
// be sure we have an HFONT associated...
wxConstCast(this, wxFont)->RealizeResource();
return wxFontBase::GetNativeFontInfoDesc();
}
wxString wxFont::GetNativeFontInfoUserDesc() const
{
// be sure we have an HFONT associated...
wxConstCast(this, wxFont)->RealizeResource();
return wxFontBase::GetNativeFontInfoUserDesc();
}
bool wxFont::IsFixedWidth() const bool wxFont::IsFixedWidth() const
{ {
if ( M_FONTDATA->HasNativeFontInfo() ) if ( M_FONTDATA->HasNativeFontInfo() )
@@ -1043,3 +1095,4 @@ bool wxFont::IsFixedWidth() const
return wxFontBase::IsFixedWidth(); return wxFontBase::IsFixedWidth();
} }

View File

@@ -195,12 +195,13 @@ public:
m_nWeight = nWeight; m_nWeight = nWeight;
} }
inline void SetFaceName(const wxString& sFaceName) inline bool SetFaceName(const wxString& sFaceName)
{ {
if (m_bNativeFontInfoOk) if (m_bNativeFontInfoOk)
m_vNativeFontInfo.SetFaceName(sFaceName); return m_vNativeFontInfo.SetFaceName(sFaceName);
else else
m_sFaceName = sFaceName; m_sFaceName = sFaceName;
return true;
} }
inline void SetUnderlined(bool bUnderlined) inline void SetUnderlined(bool bUnderlined)
@@ -689,11 +690,12 @@ void wxNativeFontInfo::SetUnderlined(
fa.fsSelection |= FATTR_SEL_UNDERSCORE; fa.fsSelection |= FATTR_SEL_UNDERSCORE;
} // end of wxNativeFontInfo::SetUnderlined } // end of wxNativeFontInfo::SetUnderlined
void wxNativeFontInfo::SetFaceName( bool wxNativeFontInfo::SetFaceName(
const wxString& sFacename const wxString& sFacename
) )
{ {
wxStrncpy((wxChar*)fa.szFacename, sFacename, WXSIZEOF(fa.szFacename)); wxStrncpy((wxChar*)fa.szFacename, sFacename, WXSIZEOF(fa.szFacename));
return true;
} // end of wxNativeFontInfo::SetFaceName } // end of wxNativeFontInfo::SetFaceName
void wxNativeFontInfo::SetFamily( void wxNativeFontInfo::SetFamily(
@@ -1023,15 +1025,17 @@ void wxFont::SetWeight(
RealizeResource(); RealizeResource();
} // end of wxFont::SetWeight } // end of wxFont::SetWeight
void wxFont::SetFaceName( bool wxFont::SetFaceName(
const wxString& rsFaceName const wxString& rsFaceName
) )
{ {
Unshare(); Unshare();
M_FONTDATA->SetFaceName(rsFaceName); bool refdataok = M_FONTDATA->SetFaceName(rsFaceName);
RealizeResource(); RealizeResource();
return refdataok && wxFontBase::SetFaceName(rsFaceName);
} // end of wxFont::SetFaceName } // end of wxFont::SetFaceName
void wxFont::SetUnderlined( void wxFont::SetUnderlined(

View File

@@ -251,7 +251,7 @@ public:
m_weight = weight; m_weight = weight;
} }
void SetFaceName(const wxString& faceName) bool SetFaceName(const wxString& faceName)
{ {
if ( m_nativeFontInfoOk ) if ( m_nativeFontInfoOk )
m_nativeFontInfo.SetFaceName(faceName); m_nativeFontInfo.SetFaceName(faceName);
@@ -444,8 +444,9 @@ void wxFont::SetWeight(int weight)
{ {
} }
void wxFont::SetFaceName(const wxString& faceName) bool wxFont::SetFaceName(const wxString& faceName)
{ {
return true;
} }
void wxFont::SetUnderlined(bool underlined) void wxFont::SetUnderlined(bool underlined)

View File

@@ -37,6 +37,7 @@
#include "wx/fontmap.h" #include "wx/fontmap.h"
#include "wx/tokenzr.h" #include "wx/tokenzr.h"
#include "wx/module.h" #include "wx/module.h"
#include "wx/fontenum.h"
#if wxUSE_PANGO #if wxUSE_PANGO
@@ -260,9 +261,10 @@ void wxNativeFontInfo::SetUnderlined(bool WXUNUSED(underlined))
wxFAIL_MSG( _T("not implemented") ); wxFAIL_MSG( _T("not implemented") );
} }
void wxNativeFontInfo::SetFaceName(const wxString& facename) bool wxNativeFontInfo::SetFaceName(const wxString& facename)
{ {
pango_font_description_set_family(description, wxGTK_CONV_SYS(facename)); pango_font_description_set_family(description, wxGTK_CONV_SYS(facename));
return true;
} }
void wxNativeFontInfo::SetFamily(wxFontFamily WXUNUSED(family)) void wxNativeFontInfo::SetFamily(wxFontFamily WXUNUSED(family))
@@ -309,6 +311,10 @@ bool wxNativeFontInfo::FromString(const wxString& s)
description = pango_font_description_from_string( wxGTK_CONV_SYS( str ) ); description = pango_font_description_from_string( wxGTK_CONV_SYS( str ) );
// ensure a valid facename is selected
if (!wxFontEnumerator::IsValidFacename(GetFaceName()))
SetFaceName(wxNORMAL_FONT->GetFaceName());
return true; return true;
} }
@@ -776,9 +782,10 @@ void wxNativeFontInfo::SetUnderlined(bool WXUNUSED(underlined))
// can't do this under X // can't do this under X
} }
void wxNativeFontInfo::SetFaceName(const wxString& facename) bool wxNativeFontInfo::SetFaceName(const wxString& facename)
{ {
SetXFontComponent(wxXLFD_FAMILY, facename); SetXFontComponent(wxXLFD_FAMILY, facename);
return true;
} }
void wxNativeFontInfo::SetFamily(wxFontFamily WXUNUSED(family)) void wxNativeFontInfo::SetFamily(wxFontFamily WXUNUSED(family))

View File

@@ -121,7 +121,7 @@ public:
void SetStyle(int style); void SetStyle(int style);
void SetWeight(int weight); void SetWeight(int weight);
void SetUnderlined(bool underlined); void SetUnderlined(bool underlined);
void SetFaceName(const wxString& facename); bool SetFaceName(const wxString& facename);
void SetEncoding(wxFontEncoding encoding); void SetEncoding(wxFontEncoding encoding);
void SetNoAntiAliasing( bool no = true ) { m_noAA = no; } void SetNoAntiAliasing( bool no = true ) { m_noAA = no; }
@@ -503,9 +503,10 @@ void wxFontRefData::SetUnderlined(bool underlined)
// the XLFD doesn't have "underlined" field anyhow // the XLFD doesn't have "underlined" field anyhow
} }
void wxFontRefData::SetFaceName(const wxString& facename) bool wxFontRefData::SetFaceName(const wxString& facename)
{ {
m_faceName = facename; m_faceName = facename;
return true;
} }
void wxFontRefData::SetEncoding(wxFontEncoding encoding) void wxFontRefData::SetEncoding(wxFontEncoding encoding)
@@ -816,11 +817,12 @@ void wxFont::SetWeight(int weight)
M_FONTDATA->SetWeight(weight); M_FONTDATA->SetWeight(weight);
} }
void wxFont::SetFaceName(const wxString& faceName) bool wxFont::SetFaceName(const wxString& faceName)
{ {
Unshare(); Unshare();
M_FONTDATA->SetFaceName(faceName); return M_FONTDATA->SetFaceName(faceName) &&
wxFontBase::SetFaceName(faceName);
} }
void wxFont::SetUnderlined(bool underlined) void wxFont::SetUnderlined(bool underlined)