X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/85ab460e7d62b52b105b3dc0bbdd36cebc14fb4b..06f89fe437580928d874c063fb737f3875950de9:/samples/font/font.cpp diff --git a/samples/font/font.cpp b/samples/font/font.cpp index 7fe8717618..f6c8d5f32d 100644 --- a/samples/font/font.cpp +++ b/samples/font/font.cpp @@ -35,10 +35,13 @@ #include "../sample.xpm" #ifdef __WXMAC__ -#undef wxFontDialog -#include "wx/mac/fontdlg.h" + #undef wxFontDialog + #include "wx/osx/fontdlg.h" #endif +// used as title for several dialog boxes +static const wxChar SAMPLE_TITLE[] = _T("wxWidgets Font Sample"); + // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- @@ -102,6 +105,7 @@ public: void OnwxPointerFont(wxCommandEvent& event); + void OnTestTextValue(wxCommandEvent& event); void OnViewMsg(wxCommandEvent& event); void OnSelectFont(wxCommandEvent& event); void OnEnumerateFamiliesForEncoding(wxCommandEvent& event); @@ -111,9 +115,10 @@ public: { DoEnumerateFamilies(true); } void OnEnumerateEncodings(wxCommandEvent& event); - void OnCheckNativeToFromString(wxCommandEvent& event); - void OnCheckNativeToFromUserString(wxCommandEvent& event); - void OnCheckFaceName(wxCommandEvent& event); + void OnSetNativeDesc(wxCommandEvent& event); + void OnSetNativeUserDesc(wxCommandEvent& event); + void OnSetFaceName(wxCommandEvent& event); + void OnSetEncoding(wxCommandEvent& event); protected: bool DoEnumerateFamilies(bool fixedWidthOnly, @@ -123,6 +128,11 @@ 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(); + + size_t m_fontSize; // in points wxTextCtrl *m_textctrl; @@ -144,6 +154,8 @@ enum Font_Quit = 1, Font_About, Font_ViewMsg, + Font_TestTextValue, + Font_IncSize, Font_DecSize, Font_Bold, @@ -160,9 +172,10 @@ enum Font_EnumFamilies, Font_EnumFixedFamilies, Font_EnumEncodings, - Font_CheckNativeToFromString, - Font_CheckNativeToFromUserString, - Font_CheckFaceName, + Font_SetNativeDesc, + Font_SetNativeUserDesc, + Font_SetFaceName, + Font_SetEncoding, Font_Max }; @@ -175,6 +188,7 @@ 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) @@ -190,9 +204,10 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(Font_wxSWISS_FONT, MyFrame::OnwxPointerFont) - EVT_MENU(Font_CheckNativeToFromString, MyFrame::OnCheckNativeToFromString) - EVT_MENU(Font_CheckNativeToFromUserString, MyFrame::OnCheckNativeToFromUserString) - EVT_MENU(Font_CheckFaceName, MyFrame::OnCheckFaceName) + EVT_MENU(Font_SetNativeDesc, MyFrame::OnSetNativeDesc) + EVT_MENU(Font_SetNativeUserDesc, MyFrame::OnSetNativeUserDesc) + EVT_MENU(Font_SetFaceName, MyFrame::OnSetFaceName) + EVT_MENU(Font_SetEncoding, MyFrame::OnSetEncoding) EVT_MENU(Font_Choose, MyFrame::OnSelectFont) EVT_MENU(Font_EnumFamiliesForEncoding, MyFrame::OnEnumerateFamiliesForEncoding) @@ -219,6 +234,9 @@ 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)); @@ -241,13 +259,15 @@ 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_xpm)); // 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(); @@ -265,12 +285,12 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) wxT("Toggle underlined state")); menuFont->AppendSeparator(); - menuFont->Append(Font_CheckNativeToFromString, - 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")); + 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->Append(Font_SetFaceName, wxT("Check 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"), @@ -411,8 +431,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]; @@ -422,7 +448,8 @@ bool MyFrame::DoEnumerateFamilies(bool fixedWidthOnly, 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); @@ -440,66 +467,38 @@ bool MyFrame::DoEnumerateFamilies(bool fixedWidthOnly, void MyFrame::OnEnumerateFamiliesForEncoding(wxCommandEvent& WXUNUSED(event)) { - static wxFontEncoding encodings[] = - { - 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[] = + wxFontEncoding enc = GetEncodingFromUser(); + if ( enc != wxFONTENCODING_SYSTEM ) { - 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 ) - { - DoEnumerateFamilies(false, encodings[n]); + DoEnumerateFamilies(false, enc); } } -void MyFrame::OnCheckNativeToFromString(wxCommandEvent& WXUNUSED(event)) +void MyFrame::OnSetNativeDesc(wxCommandEvent& WXUNUSED(event)) { - wxString fontInfo = m_canvas->GetTextFont().GetNativeFontInfoDesc(); - + 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.Ok() ) { - wxLogError(wxT("Native font info string is empty!")); + wxLogError(wxT("Font info string \"%s\" is invalid."), + fontInfo.c_str()); + return; } - 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()); - delete font; - } + DoChangeFont(font); } -void MyFrame::OnCheckFaceName(wxCommandEvent& WXUNUSED(event)) +void MyFrame::OnSetFaceName(wxCommandEvent& WXUNUSED(event)) { wxString facename = GetCanvas()->GetTextFont().GetFaceName(); wxString newFaceName = wxGetTextFromUser( @@ -523,7 +522,7 @@ void MyFrame::OnCheckFaceName(wxCommandEvent& WXUNUSED(event)) } } -void MyFrame::OnCheckNativeToFromUserString(wxCommandEvent& WXUNUSED(event)) +void MyFrame::OnSetNativeUserDesc(wxCommandEvent& WXUNUSED(event)) { wxString fontdesc = GetCanvas()->GetTextFont().GetNativeFontInfoUserDesc(); wxString fontUserInfo = wxGetTextFromUser( @@ -546,6 +545,44 @@ void MyFrame::OnCheckNativeToFromUserString(wxCommandEvent& WXUNUSED(event)) } } +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); + + 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]; +} + void MyFrame::DoResizeFont(int diff) { wxFont font = m_canvas->GetTextFont(); @@ -582,13 +619,27 @@ 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; } DoChangeFont(font); @@ -638,6 +689,16 @@ 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 @@ -739,7 +800,8 @@ 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() ) @@ -757,9 +819,9 @@ void MyFrame::OnViewMsg(wxCommandEvent& WXUNUSED(event)) 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); } @@ -832,7 +894,7 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) 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; @@ -845,7 +907,7 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) { wxChar c = (wxChar)(32 * (i + 1) + j); - long charWidth, charHeight; + wxCoord charWidth, charHeight; dc.GetTextExtent(c, &charWidth, &charHeight); dc.DrawText (