X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/801d040762d0d875126935b79d660d4e2fe1b177..e9d7a889634ee5cbe90bcc639c6197a29169be3a:/samples/font/font.cpp diff --git a/samples/font/font.cpp b/samples/font/font.cpp index df30e1b671..4c78adc24d 100644 --- a/samples/font/font.cpp +++ b/samples/font/font.cpp @@ -31,9 +31,17 @@ #include "wx/encconv.h" #include "wx/splitter.h" #include "wx/textfile.h" +#include "wx/settings.h" -#undef wxFontDialog -#include "wx/mac/fontdlg.h" +#include "../sample.xpm" + +#ifdef __WXMAC__ + #undef wxFontDialog + #include "wx/osx/fontdlg.h" +#endif + +// used as title for several dialog boxes +static const wxChar SAMPLE_TITLE[] = wxT("wxWidgets Font Sample"); // ---------------------------------------------------------------------------- // private classes @@ -57,7 +65,7 @@ class MyCanvas: public wxWindow { public: MyCanvas( wxWindow *parent ); - virtual ~MyCanvas(); + virtual ~MyCanvas(){}; // accessors for the frame const wxFont& GetTextFont() const { return m_font; } @@ -93,11 +101,18 @@ public: void OnDecFont(wxCommandEvent& WXUNUSED(event)) { DoResizeFont(-2); } void OnBold(wxCommandEvent& event); + void OnLight(wxCommandEvent& event); + void OnItalic(wxCommandEvent& event); + void OnSlant(wxCommandEvent& event); + void OnUnderline(wxCommandEvent& event); + void OnStrikethrough(wxCommandEvent& event); void OnwxPointerFont(wxCommandEvent& event); + void OnwxSystemSettingsFont(wxCommandEvent& event); + void OnTestTextValue(wxCommandEvent& event); void OnViewMsg(wxCommandEvent& event); void OnSelectFont(wxCommandEvent& event); void OnEnumerateFamiliesForEncoding(wxCommandEvent& event); @@ -107,7 +122,12 @@ public: { DoEnumerateFamilies(true); } void OnEnumerateEncodings(wxCommandEvent& event); - void OnCheckNativeToFromString(wxCommandEvent& event); + void OnSetNativeDesc(wxCommandEvent& event); + void OnSetNativeUserDesc(wxCommandEvent& event); + + void OnSetFamily(wxCommandEvent& event); + void OnSetFaceName(wxCommandEvent& event); + void OnSetEncoding(wxCommandEvent& event); protected: bool DoEnumerateFamilies(bool fixedWidthOnly, @@ -117,6 +137,14 @@ protected: void DoResizeFont(int diff); void DoChangeFont(const wxFont& font, const wxColour& col = wxNullColour); + // ask the user to choose an encoding and return it or + // wxFONTENCODING_SYSTEM if the dialog was cancelled + wxFontEncoding GetEncodingFromUser(); + + // ask the user to choose a font family and return it or + // wxFONTFAMILY_DEFAULT if the dialog was cancelled + wxFontFamily GetFamilyFromUser(); + size_t m_fontSize; // in points wxTextCtrl *m_textctrl; @@ -135,26 +163,50 @@ private: enum { // menu items - Font_Quit = 1, - Font_About, - Font_ViewMsg, + Font_Quit = wxID_EXIT, + Font_About = wxID_ABOUT, + + Font_ViewMsg = wxID_HIGHEST+1, + Font_TestTextValue, + Font_IncSize, Font_DecSize, + Font_Bold, + Font_Light, + Font_Italic, + Font_Slant, + Font_Underlined, + Font_Strikethrough, + + // standard global wxFont objects: Font_wxNORMAL_FONT, Font_wxSMALL_FONT, Font_wxITALIC_FONT, Font_wxSWISS_FONT, Font_Standard, + // wxSystemSettings::GetFont possible objects: + Font_wxSYS_OEM_FIXED_FONT, + Font_wxSYS_ANSI_FIXED_FONT, + Font_wxSYS_ANSI_VAR_FONT, + Font_wxSYS_SYSTEM_FONT, + Font_wxSYS_DEVICE_DEFAULT_FONT, + Font_wxSYS_DEFAULT_GUI_FONT, + Font_SystemSettings, + Font_Choose = 100, Font_EnumFamiliesForEncoding, Font_EnumFamilies, Font_EnumFixedFamilies, Font_EnumEncodings, - Font_CheckNativeToFromString, + Font_SetNativeDesc, + Font_SetNativeUserDesc, + Font_SetFamily, + Font_SetFaceName, + Font_SetEncoding, Font_Max }; @@ -167,21 +219,39 @@ enum // simple menu events like this the static method is much simpler. BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(Font_Quit, MyFrame::OnQuit) + EVT_MENU(Font_TestTextValue, MyFrame::OnTestTextValue) EVT_MENU(Font_ViewMsg, MyFrame::OnViewMsg) EVT_MENU(Font_About, MyFrame::OnAbout) EVT_MENU(Font_IncSize, MyFrame::OnIncFont) EVT_MENU(Font_DecSize, MyFrame::OnDecFont) + EVT_MENU(Font_Bold, MyFrame::OnBold) + EVT_MENU(Font_Light, MyFrame::OnLight) + EVT_MENU(Font_Italic, MyFrame::OnItalic) + EVT_MENU(Font_Slant, MyFrame::OnSlant) + EVT_MENU(Font_Underlined, MyFrame::OnUnderline) + EVT_MENU(Font_Strikethrough, MyFrame::OnStrikethrough) EVT_MENU(Font_wxNORMAL_FONT, MyFrame::OnwxPointerFont) EVT_MENU(Font_wxSMALL_FONT, MyFrame::OnwxPointerFont) EVT_MENU(Font_wxITALIC_FONT, MyFrame::OnwxPointerFont) EVT_MENU(Font_wxSWISS_FONT, MyFrame::OnwxPointerFont) - EVT_MENU(Font_CheckNativeToFromString, MyFrame::OnCheckNativeToFromString) + EVT_MENU(Font_wxSYS_OEM_FIXED_FONT, MyFrame::OnwxSystemSettingsFont) + EVT_MENU(Font_wxSYS_ANSI_FIXED_FONT, MyFrame::OnwxSystemSettingsFont) + EVT_MENU(Font_wxSYS_ANSI_VAR_FONT, MyFrame::OnwxSystemSettingsFont) + EVT_MENU(Font_wxSYS_SYSTEM_FONT, MyFrame::OnwxSystemSettingsFont) + EVT_MENU(Font_wxSYS_DEVICE_DEFAULT_FONT, MyFrame::OnwxSystemSettingsFont) + EVT_MENU(Font_wxSYS_DEFAULT_GUI_FONT, MyFrame::OnwxSystemSettingsFont) + + EVT_MENU(Font_SetNativeDesc, MyFrame::OnSetNativeDesc) + EVT_MENU(Font_SetNativeUserDesc, MyFrame::OnSetNativeUserDesc) + EVT_MENU(Font_SetFamily, MyFrame::OnSetFamily) + EVT_MENU(Font_SetFaceName, MyFrame::OnSetFaceName) + EVT_MENU(Font_SetEncoding, MyFrame::OnSetEncoding) EVT_MENU(Font_Choose, MyFrame::OnSelectFont) EVT_MENU(Font_EnumFamiliesForEncoding, MyFrame::OnEnumerateFamiliesForEncoding) @@ -208,13 +278,15 @@ IMPLEMENT_APP(MyApp) // `Main program' equivalent: the program execution "starts" here bool MyApp::OnInit() { + if ( !wxApp::OnInit() ) + return false; + // Create the main application window MyFrame *frame = new MyFrame(wxT("Font wxWidgets demo"), wxPoint(50, 50), wxSize(600, 400)); - // Show it and tell the application that it's our main window + // Show it frame->Show(true); - SetTopWindow(frame); // success: wxApp::OnRun() will be called which will enter the main message // loop and the application will run. If we returned 'false' here, the @@ -230,15 +302,19 @@ bool MyApp::OnInit() MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame((wxFrame *)NULL, wxID_ANY, title, pos, size), m_textctrl(NULL) { - m_fontSize = 12; + m_fontSize = wxNORMAL_FONT->GetPointSize(); + + SetIcon(wxICON(sample)); // create a menu bar wxMenu *menuFile = new wxMenu; + menuFile->Append(Font_TestTextValue, wxT("&Test text value"), + wxT("Verify that getting and setting text value doesn't change it")); menuFile->Append(Font_ViewMsg, wxT("&View...\tCtrl-V"), wxT("View an email message file")); menuFile->AppendSeparator(); - menuFile->Append(Font_About, wxT("&About...\tCtrl-A"), wxT("Show about dialog")); + menuFile->Append(Font_About, wxT("&About\tCtrl-A"), wxT("Show about dialog")); menuFile->AppendSeparator(); menuFile->Append(Font_Quit, wxT("E&xit\tAlt-X"), wxT("Quit this program")); @@ -247,17 +323,32 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) menuFont->Append(Font_DecSize, wxT("&Decrease font size by 2 points\tCtrl-D")); menuFont->AppendSeparator(); menuFont->AppendCheckItem(Font_Bold, wxT("&Bold\tCtrl-B"), wxT("Toggle bold state")); + menuFont->AppendCheckItem(Font_Light, wxT("&Light\tCtrl-L"), wxT("Toggle light state")); + menuFont->AppendSeparator(); menuFont->AppendCheckItem(Font_Italic, wxT("&Oblique\tCtrl-O"), wxT("Toggle italic state")); +#ifndef __WXMSW__ + // under wxMSW slant == italic so there's no reason to provide another menu item for the same thing + menuFont->AppendCheckItem(Font_Slant, wxT("&Slant\tCtrl-S"), wxT("Toggle slant state")); +#endif + menuFont->AppendSeparator(); menuFont->AppendCheckItem(Font_Underlined, wxT("&Underlined\tCtrl-U"), - wxT("Toggle underlined state")); + wxT("Toggle underlined state")); + menuFont->AppendCheckItem(Font_Strikethrough, wxT("&Strikethrough"), + wxT("Toggle strikethrough state")); menuFont->AppendSeparator(); - menuFont->Append(Font_CheckNativeToFromString, - wxT("Check Native Font Info To/From String")); + menuFont->Append(Font_SetNativeDesc, + wxT("Set native font &description\tShift-Ctrl-D")); + menuFont->Append(Font_SetNativeUserDesc, + wxT("Set &user font description\tShift-Ctrl-U")); + menuFont->AppendSeparator(); + menuFont->Append(Font_SetFamily, wxT("Set font family")); + menuFont->Append(Font_SetFaceName, wxT("Set font face name")); + menuFont->Append(Font_SetEncoding, wxT("Set font &encoding\tShift-Ctrl-E")); wxMenu *menuSelect = new wxMenu; menuSelect->Append(Font_Choose, wxT("&Select font...\tCtrl-S"), - wxT("Select a standard font")); + wxT("Select a standard font")); wxMenu *menuStdFonts = new wxMenu; menuStdFonts->Append(Font_wxNORMAL_FONT, wxT("wxNORMAL_FONT"), wxT("Normal font used by wxWidgets")); @@ -266,6 +357,22 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) menuStdFonts->Append(Font_wxSWISS_FONT, wxT("wxSWISS_FONT"), wxT("Swiss font used by wxWidgets")); menuSelect->Append(Font_Standard, wxT("Standar&d fonts"), menuStdFonts); + wxMenu *menuSettingFonts = new wxMenu; + menuSettingFonts->Append(Font_wxSYS_OEM_FIXED_FONT, wxT("wxSYS_OEM_FIXED_FONT"), + wxT("Original equipment manufacturer dependent fixed-pitch font.")); + menuSettingFonts->Append(Font_wxSYS_ANSI_FIXED_FONT, wxT("wxSYS_ANSI_FIXED_FONT"), + wxT("Windows fixed-pitch (monospaced) font. ")); + menuSettingFonts->Append(Font_wxSYS_ANSI_VAR_FONT, wxT("wxSYS_ANSI_VAR_FONT"), + wxT("Windows variable-pitch (proportional) font.")); + menuSettingFonts->Append(Font_wxSYS_SYSTEM_FONT, wxT("wxSYS_SYSTEM_FONT"), + wxT("System font.")); + menuSettingFonts->Append(Font_wxSYS_DEVICE_DEFAULT_FONT, wxT("wxSYS_DEVICE_DEFAULT_FONT"), + wxT("Device-dependent font.")); + menuSettingFonts->Append(Font_wxSYS_DEFAULT_GUI_FONT, wxT("wxSYS_DEFAULT_GUI_FONT"), + wxT("Default font for user interface objects such as menus and dialog boxes. ")); + menuSelect->Append(Font_SystemSettings, wxT("System fonts"), menuSettingFonts); + + menuSelect->AppendSeparator(); menuSelect->Append(Font_EnumFamilies, wxT("Enumerate font &families\tCtrl-F")); menuSelect->Append(Font_EnumFixedFamilies, @@ -380,6 +487,7 @@ bool MyFrame::DoEnumerateFamilies(bool fixedWidthOnly, } wxString facename; + if ( silent ) { // choose the first @@ -393,8 +501,14 @@ bool MyFrame::DoEnumerateFamilies(bool fixedWidthOnly, for ( n = 0; n < nFacenames; n++ ) facenames[n] = fontEnumerator.GetFacenames().Item(n); - n = wxGetSingleChoiceIndex(wxT("Choose a facename"), wxT("Font demo"), - nFacenames, facenames, this); + n = wxGetSingleChoiceIndex + ( + wxT("Choose a facename"), + SAMPLE_TITLE, + nFacenames, + facenames, + this + ); if ( n != -1 ) facename = facenames[n]; @@ -402,9 +516,10 @@ bool MyFrame::DoEnumerateFamilies(bool fixedWidthOnly, delete [] facenames; } - if ( !facename.IsEmpty() ) + if ( !facename.empty() ) { - wxFont font(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, + wxFont font(wxNORMAL_FONT->GetPointSize(), + wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, facename, encoding); DoChangeFont(font); @@ -422,63 +537,159 @@ bool MyFrame::DoEnumerateFamilies(bool fixedWidthOnly, void MyFrame::OnEnumerateFamiliesForEncoding(wxCommandEvent& WXUNUSED(event)) { - static wxFontEncoding encodings[] = + wxFontEncoding enc = GetEncodingFromUser(); + if ( enc != wxFONTENCODING_SYSTEM ) { - wxFONTENCODING_ISO8859_1, - wxFONTENCODING_ISO8859_2, - wxFONTENCODING_ISO8859_5, - wxFONTENCODING_ISO8859_7, - wxFONTENCODING_ISO8859_15, - wxFONTENCODING_KOI8, - wxFONTENCODING_KOI8_U, - wxFONTENCODING_CP1250, - wxFONTENCODING_CP1251, - wxFONTENCODING_CP1252, - }; - - static const wxString encodingNames[] = + DoEnumerateFamilies(false, enc); + } +} + +void MyFrame::OnSetNativeDesc(wxCommandEvent& WXUNUSED(event)) +{ + wxString fontInfo = wxGetTextFromUser + ( + wxT("Enter native font string"), + wxT("Input font description"), + m_canvas->GetTextFont().GetNativeFontInfoDesc(), + this + ); + if ( fontInfo.empty() ) + return; // user clicked "Cancel" - do nothing + + wxFont font; + font.SetNativeFontInfo(fontInfo); + if ( !font.IsOk() ) { - wxT("Western European (ISO-8859-1)"), - wxT("Central European (ISO-8859-2)"), - wxT("Cyrillic (ISO-8859-5)"), - wxT("Greek (ISO-8859-7)"), - wxT("Western European with Euro (ISO-8859-15)"), - wxT("KOI8-R"), - wxT("KOI8-U"), - wxT("Windows Central European (CP 1250)"), - wxT("Windows Cyrillic (CP 1251)"), - wxT("Windows Western European (CP 1252)"), - }; - - int n = wxGetSingleChoiceIndex(wxT("Choose an encoding"), wxT("Font demo"), - WXSIZEOF(encodingNames), - encodingNames, - this); - - if ( n != -1 ) + wxLogError(wxT("Font info string \"%s\" is invalid."), + fontInfo.c_str()); + return; + } + + DoChangeFont(font); +} + +void MyFrame::OnSetNativeUserDesc(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.IsOk(), wxT("The font should now be valid")); + DoChangeFont(font); + } + else { - DoEnumerateFamilies(false, encodings[n]); + wxASSERT_MSG(!font.IsOk(), wxT("The font should now be invalid")); + wxMessageBox(wxT("Error trying to create a font with such description...")); } } -void MyFrame::OnCheckNativeToFromString(wxCommandEvent& WXUNUSED(event)) +void MyFrame::OnSetFamily(wxCommandEvent& WXUNUSED(event)) { - wxString fontInfo = m_canvas->GetTextFont().GetNativeFontInfoDesc(); + wxFontFamily f = GetFamilyFromUser(); - if ( fontInfo.IsEmpty() ) + wxFont font = m_canvas->GetTextFont(); + font.SetFamily(f); + DoChangeFont(font); +} + +void MyFrame::OnSetFaceName(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 { - wxLogError(wxT("Native font info string is empty!")); + wxASSERT_MSG(font.IsOk(), wxT("The font should now be valid")); + DoChangeFont(font); } else { - wxFont *font = wxFont::New(fontInfo); - if ( fontInfo != font->GetNativeFontInfoDesc() ) - wxLogError(wxT("wxNativeFontInfo ToString()/FromString() broken!")); - else - wxLogMessage(wxT("wxNativeFontInfo works: %s"), fontInfo.c_str()); + wxASSERT_MSG(!font.IsOk(), 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::OnSetEncoding(wxCommandEvent& WXUNUSED(event)) +{ + wxFontEncoding enc = GetEncodingFromUser(); + if ( enc == wxFONTENCODING_SYSTEM ) + return; + + wxFont font = m_canvas->GetTextFont(); + font.SetEncoding(enc); + DoChangeFont(font); +} + +wxFontEncoding MyFrame::GetEncodingFromUser() +{ + wxArrayString names; + wxArrayInt encodings; + + const size_t count = wxFontMapper::GetSupportedEncodingsCount(); + names.reserve(count); + encodings.reserve(count); - delete font; - } + for ( size_t n = 0; n < count; n++ ) + { + wxFontEncoding enc = wxFontMapper::GetEncoding(n); + encodings.push_back(enc); + names.push_back(wxFontMapper::GetEncodingName(enc)); + } + + int i = wxGetSingleChoiceIndex + ( + wxT("Choose the encoding"), + SAMPLE_TITLE, + names, + this + ); + + return i == -1 ? wxFONTENCODING_SYSTEM : (wxFontEncoding)encodings[i]; +} + +wxFontFamily MyFrame::GetFamilyFromUser() +{ + wxArrayString names; + wxArrayInt families; + + families.push_back(wxFONTFAMILY_DECORATIVE); + families.push_back(wxFONTFAMILY_ROMAN); + families.push_back(wxFONTFAMILY_SCRIPT); + families.push_back(wxFONTFAMILY_SWISS); + families.push_back(wxFONTFAMILY_MODERN); + families.push_back(wxFONTFAMILY_TELETYPE); + + names.push_back("DECORATIVE"); + names.push_back("ROMAN"); + names.push_back("SCRIPT"); + names.push_back("SWISS"); + names.push_back("MODERN"); + names.push_back("TELETYPE"); + + int i = wxGetSingleChoiceIndex + ( + wxT("Choose the family"), + SAMPLE_TITLE, + names, + this + ); + + return i == -1 ? wxFONTFAMILY_DEFAULT : (wxFontFamily)families[i]; } void MyFrame::DoResizeFont(int diff) @@ -497,6 +708,14 @@ void MyFrame::OnBold(wxCommandEvent& event) DoChangeFont(font); } +void MyFrame::OnLight(wxCommandEvent& event) +{ + wxFont font = m_canvas->GetTextFont(); + + font.SetWeight(event.IsChecked() ? wxFONTWEIGHT_LIGHT : wxFONTWEIGHT_NORMAL); + DoChangeFont(font); +} + void MyFrame::OnItalic(wxCommandEvent& event) { wxFont font = m_canvas->GetTextFont(); @@ -505,6 +724,14 @@ void MyFrame::OnItalic(wxCommandEvent& event) DoChangeFont(font); } +void MyFrame::OnSlant(wxCommandEvent& event) +{ + wxFont font = m_canvas->GetTextFont(); + + font.SetStyle(event.IsChecked() ? wxFONTSTYLE_SLANT : wxFONTSTYLE_NORMAL); + DoChangeFont(font); +} + void MyFrame::OnUnderline(wxCommandEvent& event) { wxFont font = m_canvas->GetTextFont(); @@ -513,22 +740,77 @@ void MyFrame::OnUnderline(wxCommandEvent& event) DoChangeFont(font); } +void MyFrame::OnStrikethrough(wxCommandEvent& event) +{ + wxFont font = m_canvas->GetTextFont(); + font.SetStrikethrough(event.IsChecked()); + DoChangeFont(font); +} + void MyFrame::OnwxPointerFont(wxCommandEvent& event) { wxFont font; - switch (event.GetId()) + switch ( event.GetId() ) { - case Font_wxNORMAL_FONT : font = wxFont(*wxNORMAL_FONT); break; - case Font_wxSMALL_FONT : font = wxFont(*wxSMALL_FONT); break; - case Font_wxITALIC_FONT : font = wxFont(*wxITALIC_FONT); break; - case Font_wxSWISS_FONT : font = wxFont(*wxSWISS_FONT); break; - default : font = wxFont(*wxNORMAL_FONT); break; + case Font_wxNORMAL_FONT: + font = *wxNORMAL_FONT; + break; + + case Font_wxSMALL_FONT: + font = *wxSMALL_FONT; + break; + + case Font_wxITALIC_FONT: + font = *wxITALIC_FONT; + break; + + case Font_wxSWISS_FONT: + font = *wxSWISS_FONT; + break; + + default: + wxFAIL_MSG( wxT("unknown standard font") ); + return; } - GetMenuBar()->Check(Font_Bold, false); - GetMenuBar()->Check(Font_Italic, false); - GetMenuBar()->Check(Font_Underlined, false); + DoChangeFont(font); +} + +void MyFrame::OnwxSystemSettingsFont(wxCommandEvent& event) +{ + wxFont font; + + switch ( event.GetId() ) + { + case Font_wxSYS_OEM_FIXED_FONT: + font = wxSystemSettings::GetFont(wxSYS_OEM_FIXED_FONT); + break; + + case Font_wxSYS_ANSI_FIXED_FONT: + font = wxSystemSettings::GetFont(wxSYS_ANSI_FIXED_FONT); + break; + + case Font_wxSYS_ANSI_VAR_FONT: + font = wxSystemSettings::GetFont(wxSYS_ANSI_VAR_FONT); + break; + + case Font_wxSYS_SYSTEM_FONT: + font = wxSystemSettings::GetFont(wxSYS_SYSTEM_FONT); + break; + + case Font_wxSYS_DEVICE_DEFAULT_FONT: + font = wxSystemSettings::GetFont(wxSYS_DEVICE_DEFAULT_FONT); + break; + + case Font_wxSYS_DEFAULT_GUI_FONT: + font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + break; + + default: + wxFAIL_MSG( wxT("unknown standard font") ); + return; + } DoChangeFont(font); } @@ -536,13 +818,30 @@ void MyFrame::OnwxPointerFont(wxCommandEvent& event) void MyFrame::DoChangeFont(const wxFont& font, const wxColour& col) { m_canvas->SetTextFont(font); - if ( col.Ok() ) + if ( col.IsOk() ) m_canvas->SetColour(col); m_canvas->Refresh(); m_textctrl->SetFont(font); - if ( col.Ok() ) + if ( col.IsOk() ) m_textctrl->SetForegroundColour(col); + m_textctrl->Refresh(); + + // update the state of the bold/italic/underlined menu items + wxMenuBar *mbar = GetMenuBar(); + if ( mbar ) + { + mbar->Check(Font_Light, font.GetWeight() == wxFONTWEIGHT_LIGHT); + mbar->Check(Font_Bold, font.GetWeight() == wxFONTWEIGHT_BOLD); + + mbar->Check(Font_Italic, font.GetStyle() == wxFONTSTYLE_ITALIC); +#ifndef __WXMSW__ + mbar->Check(Font_Slant, font.GetStyle() == wxFONTSTYLE_SLANT); +#endif + + mbar->Check(Font_Underlined, font.GetUnderlined()); + mbar->Check(Font_Strikethrough, font.GetStrikethrough()); + } } void MyFrame::OnSelectFont(wxCommandEvent& WXUNUSED(event)) @@ -559,15 +858,6 @@ void MyFrame::OnSelectFont(wxCommandEvent& WXUNUSED(event)) wxColour colour = retData.GetColour(); 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()); - } } } @@ -577,8 +867,19 @@ void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) Close(true); } +void MyFrame::OnTestTextValue(wxCommandEvent& WXUNUSED(event)) +{ + wxString value = m_textctrl->GetValue(); + m_textctrl->SetValue(value); + if ( m_textctrl->GetValue() != value ) + { + wxLogError(wxT("Text value changed after getting and setting it")); + } +} + void MyFrame::OnViewMsg(wxCommandEvent& WXUNUSED(event)) { +#if wxUSE_FILEDLG // first, choose the file static wxString s_dir, s_file; wxFileDialog dialog(this, wxT("Open an email message file"), @@ -677,10 +978,11 @@ void MyFrame::OnViewMsg(wxCommandEvent& WXUNUSED(event)) // and now create the correct font if ( !DoEnumerateFamilies(false, fontenc, true /* silent */) ) { - wxFont font(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, + wxFont font(wxNORMAL_FONT->GetPointSize(), + wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false /* !underlined */, wxEmptyString /* facename */, fontenc); - if ( font.Ok() ) + if ( font.IsOk() ) { DoChangeFont(font); } @@ -690,13 +992,14 @@ void MyFrame::OnViewMsg(wxCommandEvent& WXUNUSED(event)) wxFontMapper::GetEncodingDescription(fontenc).c_str()); } } +#endif // wxUSE_FILEDLG } void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { - wxMessageBox(wxT("wxWidgets font demo\n") - wxT("(c) 1999 Vadim Zeitlin"), - wxT("About Font"), + wxMessageBox(wxT("wxWidgets font sample\n") + wxT("(c) 1999-2006 Vadim Zeitlin"), + wxString(wxT("About ")) + SAMPLE_TITLE, wxOK | wxICON_INFORMATION, this); } @@ -714,10 +1017,6 @@ MyCanvas::MyCanvas( wxWindow *parent ) { } -MyCanvas::~MyCanvas() -{ -} - void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) { wxPaintDC dc(this); @@ -726,6 +1025,7 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) // set background dc.SetBackground(wxBrush(wxT("white"), wxSOLID)); dc.Clear(); + dc.SetFont(m_font); // one text line height wxCoord hLine = dc.GetCharHeight(); @@ -736,24 +1036,32 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) // output the font name/info wxString fontInfo; - fontInfo.Printf(wxT("Font size is %d points, family: %s, encoding: %s"), + + fontInfo.Printf(wxT("Face name: %s, family: %s"), + m_font.GetFaceName().c_str(), + m_font.GetFamilyString().c_str()); + + dc.DrawText(fontInfo, x, y); + y += hLine; + + fontInfo.Printf(wxT("Size: %d points or %d pixels; %d*%d average char size"), m_font.GetPointSize(), - m_font.GetFamilyString().c_str(), - wxFontMapper::Get()-> - GetEncodingDescription(m_font.GetEncoding()).c_str()); + m_font.GetPixelSize().y, + dc.GetCharWidth(), dc.GetCharHeight()); dc.DrawText(fontInfo, x, y); y += hLine; - fontInfo.Printf(wxT("Style: %s, weight: %s, fixed width: %s"), + fontInfo.Printf(wxT("Style: %s, weight: %s, fixed width: %s, encoding: %s"), m_font.GetStyleString().c_str(), m_font.GetWeightString().c_str(), - m_font.IsFixedWidth() ? _T("yes") : _T("no")); + m_font.IsFixedWidth() ? wxT("yes") : wxT("no"), + wxFontMapper::GetEncodingDescription(m_font.GetEncoding())); dc.DrawText(fontInfo, x, y); y += hLine; - if ( m_font.Ok() ) + if ( m_font.IsOk() ) { const wxNativeFontInfo *info = m_font.GetNativeFontInfo(); if ( info ) @@ -769,11 +1077,10 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) y += hLine; // prepare to draw the font - dc.SetFont(m_font); dc.SetTextForeground(m_colour); // the size of one cell (Normally biggest char + small margin) - long maxCharWidth, maxCharHeight; + wxCoord maxCharWidth, maxCharHeight; dc.GetTextExtent(wxT("W"), &maxCharWidth, &maxCharHeight); int w = maxCharWidth + 5, h = maxCharHeight + 4; @@ -784,9 +1091,9 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) { for ( int j = 0; j < 32; j++ ) { - wxChar c = 32 * (i + 1) + j; + wxChar c = (wxChar)(32 * (i + 1) + j); - long charWidth, charHeight; + wxCoord charWidth, charHeight; dc.GetTextExtent(c, &charWidth, &charHeight); dc.DrawText ( @@ -798,7 +1105,7 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) } // draw the lines between them - dc.SetPen(wxPen(wxColour(_T("blue")), 1, wxSOLID)); + dc.SetPen(wxPen(wxColour(wxT("blue")), 1, wxSOLID)); int l; // horizontal