]> git.saurik.com Git - wxWidgets.git/blame - samples/font/font.cpp
ugh. Nesting the (per class) plugin sentries can require them to
[wxWidgets.git] / samples / font / font.cpp
CommitLineData
1ccd74da
VZ
1/////////////////////////////////////////////////////////////////////////////
2// Name: font.cpp
3// Purpose: wxFont demo
4// Author: Vadim Zeitlin
5// Modified by:
6// Created: 30.09.99
7// RCS-ID: $Id$
36f210c8 8// Copyright: (c) 1999 Vadim Zeitlin
1ccd74da
VZ
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// For compilers that support precompilation, includes "wx/wx.h".
92a19c2e 13#include "wx/wxprec.h"
1ccd74da
VZ
14
15#ifdef __BORLANDC__
16 #pragma hdrstop
17#endif
18
19// for all others, include the necessary headers (this file is usually all you
20// need because it includes almost all <standard< wxWindows headers
21#ifndef WX_PRECOMP
84e89e2a 22 #include "wx/wx.h"
1ccd74da 23
84e89e2a 24 #include "wx/log.h"
1ccd74da
VZ
25#endif
26
84e89e2a
GD
27#include "wx/choicdlg.h"
28#include "wx/fontdlg.h"
29#include "wx/fontenum.h"
30#include "wx/fontmap.h"
31#include "wx/encconv.h"
32#include "wx/splitter.h"
33#include "wx/textfile.h"
1ccd74da
VZ
34
35// ----------------------------------------------------------------------------
36// private classes
37// ----------------------------------------------------------------------------
38
39// Define a new application type, each program should derive a class from wxApp
40class MyApp : public wxApp
41{
42public:
43 // override base class virtuals
44 // ----------------------------
45
46 // this one is called on application startup and is a good place for the app
47 // initialization (doing it here and not in the ctor allows to have an error
48 // return: if OnInit() returns false, the application terminates)
49 virtual bool OnInit();
50};
51
52// MyCanvas is a canvas on which we show the font sample
53class MyCanvas: public wxWindow
54{
55public:
56 MyCanvas( wxWindow *parent );
57 ~MyCanvas();
58
59 // accessors for the frame
60 const wxFont& GetTextFont() const { return m_font; }
61 const wxColour& GetColour() const { return m_colour; }
62 void SetTextFont(const wxFont& font) { m_font = font; }
63 void SetColour(const wxColour& colour) { m_colour = colour; }
64
65 // event handlers
66 void OnPaint( wxPaintEvent &event );
67
68private:
69 wxColour m_colour;
70 wxFont m_font;
71
72 DECLARE_EVENT_TABLE()
73};
74
75// Define a new frame type: this is going to be our main frame
76class MyFrame : public wxFrame
77{
78public:
79 // ctor(s)
80 MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
81
82 // accessors
83 MyCanvas *GetCanvas() const { return m_canvas; }
84
85 // event handlers (these functions should _not_ be virtual)
86 void OnQuit(wxCommandEvent& event);
87 void OnAbout(wxCommandEvent& event);
f6bcfd97
BP
88 void OnIncFont(wxCommandEvent& event) { DoResizeFont(+2); }
89 void OnDecFont(wxCommandEvent& event) { DoResizeFont(-2); }
90
3c1866e8 91 void OnViewMsg(wxCommandEvent& event);
1ccd74da 92 void OnSelectFont(wxCommandEvent& event);
36f210c8 93 void OnEnumerateFamiliesForEncoding(wxCommandEvent& event);
ddc8c2e3
VZ
94 void OnEnumerateFamilies(wxCommandEvent& WXUNUSED(event))
95 { DoEnumerateFamilies(FALSE); }
96 void OnEnumerateFixedFamilies(wxCommandEvent& WXUNUSED(event))
97 { DoEnumerateFamilies(TRUE); }
d111a89a 98 void OnEnumerateEncodings(wxCommandEvent& event);
1ccd74da 99
30764ab5
VZ
100 void OnCheckNativeToFromString(wxCommandEvent& event);
101
1ccd74da 102protected:
7beba2fc
VZ
103 bool DoEnumerateFamilies(bool fixedWidthOnly,
104 wxFontEncoding encoding = wxFONTENCODING_SYSTEM,
105 bool silent = FALSE);
36f210c8 106
f6bcfd97 107 void DoResizeFont(int diff);
a1d58ddc
VZ
108 void DoChangeFont(const wxFont& font, const wxColour& col = wxNullColour);
109
f6bcfd97
BP
110 size_t m_fontSize; // in points
111
36f210c8
VZ
112 wxTextCtrl *m_textctrl;
113 MyCanvas *m_canvas;
1ccd74da
VZ
114
115private:
116 // any class wishing to process wxWindows events must use this macro
117 DECLARE_EVENT_TABLE()
118};
119
1ccd74da
VZ
120// ----------------------------------------------------------------------------
121// constants
122// ----------------------------------------------------------------------------
123
124// IDs for the controls and the menu commands
125enum
126{
127 // menu items
128 Font_Quit = 1,
129 Font_About,
3c1866e8 130 Font_ViewMsg,
f6bcfd97
BP
131 Font_IncSize,
132 Font_DecSize,
1ccd74da 133 Font_Choose = 100,
36f210c8 134 Font_EnumFamiliesForEncoding,
ddc8c2e3
VZ
135 Font_EnumFamilies,
136 Font_EnumFixedFamilies,
d111a89a 137 Font_EnumEncodings,
189e08b4
VZ
138 Font_CheckNativeToFromString,
139 Font_Max
1ccd74da
VZ
140};
141
142// ----------------------------------------------------------------------------
143// event tables and other macros for wxWindows
144// ----------------------------------------------------------------------------
145
146// the event tables connect the wxWindows events with the functions (event
147// handlers) which process them. It can be also done at run-time, but for the
148// simple menu events like this the static method is much simpler.
149BEGIN_EVENT_TABLE(MyFrame, wxFrame)
150 EVT_MENU(Font_Quit, MyFrame::OnQuit)
151 EVT_MENU(Font_About, MyFrame::OnAbout)
f6bcfd97
BP
152 EVT_MENU(Font_IncSize, MyFrame::OnIncFont)
153 EVT_MENU(Font_DecSize, MyFrame::OnDecFont)
3c1866e8 154 EVT_MENU(Font_ViewMsg, MyFrame::OnViewMsg)
1ccd74da 155 EVT_MENU(Font_Choose, MyFrame::OnSelectFont)
36f210c8 156 EVT_MENU(Font_EnumFamiliesForEncoding, MyFrame::OnEnumerateFamiliesForEncoding)
ddc8c2e3
VZ
157 EVT_MENU(Font_EnumFamilies, MyFrame::OnEnumerateFamilies)
158 EVT_MENU(Font_EnumFixedFamilies, MyFrame::OnEnumerateFixedFamilies)
d111a89a 159 EVT_MENU(Font_EnumEncodings, MyFrame::OnEnumerateEncodings)
30764ab5 160 EVT_MENU(Font_CheckNativeToFromString, MyFrame::OnCheckNativeToFromString)
1ccd74da
VZ
161END_EVENT_TABLE()
162
163// Create a new application object: this macro will allow wxWindows to create
164// the application object during program execution (it's better than using a
165// static object for many reasons) and also declares the accessor function
166// wxGetApp() which will return the reference of the right type (i.e. MyApp and
167// not wxApp)
168IMPLEMENT_APP(MyApp)
169
170// ============================================================================
171// implementation
172// ============================================================================
173
174// ----------------------------------------------------------------------------
175// the application class
176// ----------------------------------------------------------------------------
177
178// `Main program' equivalent: the program execution "starts" here
179bool MyApp::OnInit()
180{
181 // Create the main application window
ddc8c2e3 182 MyFrame *frame = new MyFrame("Font wxWindows demo",
1ccd74da
VZ
183 wxPoint(50, 50), wxSize(450, 340));
184
185 // Show it and tell the application that it's our main window
186 frame->Show(TRUE);
187 SetTopWindow(frame);
188
189 // success: wxApp::OnRun() will be called which will enter the main message
190 // loop and the application will run. If we returned FALSE here, the
191 // application would exit immediately.
192 return TRUE;
193}
194
195// ----------------------------------------------------------------------------
196// main frame
197// ----------------------------------------------------------------------------
198
199// frame constructor
200MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
a1d58ddc 201 : wxFrame((wxFrame *)NULL, -1, title, pos, size), m_textctrl(NULL)
1ccd74da 202{
f6bcfd97
BP
203 m_fontSize = 12;
204
1ccd74da
VZ
205 // create a menu bar
206 wxMenu *menuFile = new wxMenu;
207
3c1866e8
VZ
208 menuFile->Append(Font_ViewMsg, "&View...\tCtrl-V",
209 "View an email message file");
210 menuFile->AppendSeparator();
1ccd74da
VZ
211 menuFile->Append(Font_About, "&About...\tCtrl-A", "Show about dialog");
212 menuFile->AppendSeparator();
213 menuFile->Append(Font_Quit, "E&xit\tAlt-X", "Quit this program");
214
215 wxMenu *menuFont = new wxMenu;
f6bcfd97
BP
216 menuFont->Append(Font_IncSize, "&Increase font size by 2 points\tCtrl-I");
217 menuFont->Append(Font_DecSize, "&Decrease font size by 2 points\tCtrl-D");
218 menuFont->AppendSeparator();
ddc8c2e3 219 menuFont->Append(Font_Choose, "&Select font...\tCtrl-S",
1ccd74da 220 "Select a standard font");
ddc8c2e3 221 menuFont->AppendSeparator();
d111a89a 222 menuFont->Append(Font_EnumFamilies, "Enumerate font &families\tCtrl-F");
ddc8c2e3 223 menuFont->Append(Font_EnumFixedFamilies,
f6bcfd97 224 "Enumerate fi&xed font families\tCtrl-X");
d111a89a
VZ
225 menuFont->Append(Font_EnumEncodings,
226 "Enumerate &encodings\tCtrl-E");
36f210c8
VZ
227 menuFont->Append(Font_EnumFamiliesForEncoding,
228 "Find font for en&coding...\tCtrl-C",
229 "Find font families for given encoding");
30764ab5
VZ
230 menuFont->AppendSeparator();
231 menuFont->Append(Font_CheckNativeToFromString,
232 "Check Native Font Info To/From String");
1ccd74da
VZ
233
234 // now append the freshly created menu to the menu bar...
235 wxMenuBar *menuBar = new wxMenuBar;
236 menuBar->Append(menuFile, "&File");
237 menuBar->Append(menuFont, "F&ont");
238
239 // ... and attach this menu bar to the frame
240 SetMenuBar(menuBar);
241
75421bf1
VZ
242 wxSplitterWindow *splitter = new wxSplitterWindow(this);
243
244 m_textctrl = new wxTextCtrl(splitter, -1,
36f210c8
VZ
245 "Paste text here to see how it looks\n"
246 "like in the given font",
247 wxDefaultPosition, wxDefaultSize,
248 wxTE_MULTILINE);
249
75421bf1
VZ
250 m_canvas = new MyCanvas(splitter);
251
252 splitter->SplitHorizontally(m_textctrl, m_canvas, 100);
1ccd74da
VZ
253
254 // create a status bar just for fun (by default with 1 pane only)
a1d58ddc
VZ
255 CreateStatusBar();
256 SetStatusText("Welcome to wxWindows font demo!");
1ccd74da
VZ
257}
258
e680a378 259// --------------------------------------------------------
1ccd74da 260
e680a378 261class MyEncodingEnumerator : public wxFontEnumerator
d111a89a 262{
e680a378 263public:
bb84929e 264 MyEncodingEnumerator()
e680a378 265 { m_n = 0; }
d111a89a 266
bb84929e 267 const wxString& GetText() const
e680a378 268 { return m_text; }
d111a89a 269
e680a378
RR
270protected:
271 virtual bool OnFontEncoding(const wxString& facename,
272 const wxString& encoding)
273 {
274 wxString text;
4693b20c 275 text.Printf(wxT("Encoding %d: %s (available in facename '%s')\n"),
e680a378
RR
276 ++m_n, encoding.c_str(), facename.c_str());
277 m_text += text;
278 return TRUE;
279 }
d111a89a 280
e680a378
RR
281private:
282 size_t m_n;
283 wxString m_text;
284};
d111a89a 285
e680a378
RR
286void MyFrame::OnEnumerateEncodings(wxCommandEvent& WXUNUSED(event))
287{
288 MyEncodingEnumerator fontEnumerator;
d111a89a
VZ
289
290 fontEnumerator.EnumerateEncodings();
291
4693b20c 292 wxLogMessage(wxT("Enumerating all available encodings:\n%s"),
d111a89a
VZ
293 fontEnumerator.GetText().c_str());
294}
1ccd74da 295
e680a378 296// -------------------------------------------------------------
36f210c8 297
e680a378
RR
298class MyFontEnumerator : public wxFontEnumerator
299{
300public:
bb84929e 301 bool GotAny() const
e680a378 302 { return !m_facenames.IsEmpty(); }
d111a89a 303
bb84929e 304 const wxArrayString& GetFacenames() const
e680a378 305 { return m_facenames; }
ddc8c2e3 306
e680a378
RR
307protected:
308 virtual bool OnFacename(const wxString& facename)
309 {
310 m_facenames.Add(facename);
311 return TRUE;
312 }
ddc8c2e3
VZ
313
314 private:
a1d58ddc 315 wxArrayString m_facenames;
e680a378
RR
316} fontEnumerator;
317
318bool MyFrame::DoEnumerateFamilies(bool fixedWidthOnly,
319 wxFontEncoding encoding,
320 bool silent)
321{
322 MyFontEnumerator fontEnumerator;
ddc8c2e3 323
3c1866e8 324 fontEnumerator.EnumerateFacenames(encoding, fixedWidthOnly);
d111a89a 325
36f210c8
VZ
326 if ( fontEnumerator.GotAny() )
327 {
ea9144a3
VZ
328 int nFacenames = fontEnumerator.GetFacenames().GetCount();
329 if ( !silent )
330 {
4693b20c
MB
331 wxLogStatus(this, wxT("Found %d %sfonts"),
332 nFacenames, fixedWidthOnly ? wxT("fixed width ") : wxT(""));
ea9144a3 333 }
a1d58ddc 334
ea9144a3 335 wxString facename;
7beba2fc 336 if ( silent )
ea9144a3
VZ
337 {
338 // choose the first
339 facename = fontEnumerator.GetFacenames().Item(0);
340 }
7beba2fc 341 else
ea9144a3
VZ
342 {
343 // let the user choose
344 wxString *facenames = new wxString[nFacenames];
345 int n;
346 for ( n = 0; n < nFacenames; n++ )
347 facenames[n] = fontEnumerator.GetFacenames().Item(n);
348
7beba2fc
VZ
349 n = wxGetSingleChoiceIndex("Choose a facename", "Font demo",
350 nFacenames, facenames, this);
ea9144a3
VZ
351
352 if ( n != -1 )
353 facename = facenames[n];
354
355 delete [] facenames;
356 }
357
358 if ( !facename.IsEmpty() )
a1d58ddc 359 {
ea9144a3
VZ
360 wxFont font(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL,
361 wxFONTWEIGHT_NORMAL, FALSE, facename, encoding);
a1d58ddc
VZ
362
363 DoChangeFont(font);
364 }
365
7beba2fc 366 return TRUE;
36f210c8 367 }
7beba2fc 368 else if ( !silent )
36f210c8 369 {
4693b20c 370 wxLogWarning(wxT("No such fonts found."));
36f210c8 371 }
7beba2fc
VZ
372
373 return FALSE;
ddc8c2e3
VZ
374}
375
36f210c8 376void MyFrame::OnEnumerateFamiliesForEncoding(wxCommandEvent& WXUNUSED(event))
1ccd74da 377{
36f210c8
VZ
378 static wxFontEncoding encodings[] =
379 {
380 wxFONTENCODING_ISO8859_1,
381 wxFONTENCODING_ISO8859_2,
382 wxFONTENCODING_ISO8859_5,
383 wxFONTENCODING_ISO8859_7,
384 wxFONTENCODING_ISO8859_15,
385 wxFONTENCODING_KOI8,
386 wxFONTENCODING_CP1250,
387 wxFONTENCODING_CP1251,
388 wxFONTENCODING_CP1252,
389 };
390
30764ab5 391 static const wxString encodingNames[] =
36f210c8 392 {
03424b1b
VZ
393 "Western European (ISO-8859-1)",
394 "Central European (ISO-8859-2)",
395 "Cyrillic (ISO-8859-5)",
396 "Greek (ISO-8859-7)",
397 "Western European with Euro (ISO-8859-15)",
36f210c8 398 "KOI8-R",
03424b1b
VZ
399 "Windows Central European (CP 1250)",
400 "Windows Cyrillic (CP 1251)",
401 "Windows Western European (CP 1252)",
36f210c8
VZ
402 };
403
404 int n = wxGetSingleChoiceIndex("Choose an encoding", "Font demo",
a1d58ddc 405 WXSIZEOF(encodingNames),
30764ab5 406 encodingNames,
36f210c8
VZ
407 this);
408
409 if ( n != -1 )
410 {
411 DoEnumerateFamilies(FALSE, encodings[n]);
412 }
1ccd74da
VZ
413}
414
30764ab5
VZ
415void MyFrame::OnCheckNativeToFromString(wxCommandEvent& WXUNUSED(event))
416{
7826e2dd 417 wxString fontInfo = m_canvas->GetTextFont().GetNativeFontInfoDesc();
30764ab5 418
7826e2dd
VZ
419 if ( fontInfo.IsEmpty() )
420 {
4693b20c 421 wxLogError(wxT("Native font info string is empty!"));
7826e2dd 422 }
30764ab5
VZ
423 else
424 {
7826e2dd
VZ
425 wxFont *font = wxFont::New(fontInfo);
426 if ( fontInfo != font->GetNativeFontInfoDesc() )
4693b20c 427 wxLogError(wxT("wxNativeFontInfo ToString()/FromString() broken!"));
30764ab5 428 else
4693b20c 429 wxLogError(wxT("wxNativeFontInfo works: %s"), fontInfo.c_str());
7826e2dd 430 delete font;
30764ab5
VZ
431 }
432}
433
f6bcfd97
BP
434void MyFrame::DoResizeFont(int diff)
435{
436 wxFont fontOld = m_canvas->GetTextFont();
437
438 DoChangeFont(
439 wxFont(
440 fontOld.GetPointSize() + diff,
441 fontOld.GetFamily(),
442 fontOld.GetStyle(),
443 fontOld.GetWeight(),
444 fontOld.GetUnderlined(),
445 fontOld.GetFaceName(),
446 fontOld.GetEncoding()
447 )
448 );
449}
450
a1d58ddc
VZ
451void MyFrame::DoChangeFont(const wxFont& font, const wxColour& col)
452{
a1d58ddc
VZ
453 m_canvas->SetTextFont(font);
454 if ( col.Ok() )
455 m_canvas->SetColour(col);
456 m_canvas->Refresh();
457
458 m_textctrl->SetFont(font);
459 if ( col.Ok() )
460 m_textctrl->SetForegroundColour(col);
461}
462
1ccd74da
VZ
463void MyFrame::OnSelectFont(wxCommandEvent& WXUNUSED(event))
464{
465 wxFontData data;
466 data.SetInitialFont(m_canvas->GetTextFont());
467 data.SetColour(m_canvas->GetColour());
468
469 wxFontDialog dialog(this, &data);
470 if ( dialog.ShowModal() == wxID_OK )
471 {
472 wxFontData retData = dialog.GetFontData();
36f210c8
VZ
473 wxFont font = retData.GetChosenFont();
474 wxColour colour = retData.GetColour();
475
a1d58ddc 476 DoChangeFont(font, colour);
1ccd74da
VZ
477 }
478}
479
480void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
481{
482 // TRUE is to force the frame to close
483 Close(TRUE);
484}
485
3c1866e8
VZ
486void MyFrame::OnViewMsg(wxCommandEvent& WXUNUSED(event))
487{
488 // first, choose the file
489 static wxString s_dir, s_file;
490 wxFileDialog dialog(this, "Open an email message file",
491 s_dir, s_file);
492 if ( dialog.ShowModal() != wxID_OK )
493 return;
494
495 // save for the next time
496 s_dir = dialog.GetDirectory();
497 s_file = dialog.GetFilename();
498
499 wxString filename = dialog.GetPath();
500
501 // load it and search for Content-Type header
502 wxTextFile file(filename);
503 if ( !file.Open() )
504 return;
505
506 wxString charset;
507
508 static const char *prefix = "Content-Type: text/plain; charset=";
509 const size_t len = strlen(prefix);
510
511 size_t n, count = file.GetLineCount();
512 for ( n = 0; n < count; n++ )
513 {
514 wxString line = file[n];
515
516 if ( !line )
517 {
518 // if it is an email message, headers are over, no need to parse
519 // all the file
520 break;
521 }
522
523 if ( line.Left(len) == prefix )
524 {
525 // found!
4693b20c 526 const wxChar *pc = line.c_str() + len;
3c1866e8
VZ
527 if ( *pc == '"' )
528 pc++;
529
530 while ( *pc && *pc != '"' )
531 {
532 charset += *pc++;
533 }
534
535 break;
536 }
537 }
538
539 if ( !charset )
540 {
4693b20c 541 wxLogError(wxT("The file '%s' doesn't contain charset information."),
3c1866e8
VZ
542 filename.c_str());
543
544 return;
545 }
546
547 // ok, now get the corresponding encoding
7beba2fc 548 wxFontEncoding fontenc = wxTheFontMapper->CharsetToEncoding(charset);
3c1866e8
VZ
549 if ( fontenc == wxFONTENCODING_SYSTEM )
550 {
4693b20c 551 wxLogError(wxT("Charset '%s' is unsupported."), charset.c_str());
3c1866e8
VZ
552 return;
553 }
554
7337790c
VS
555 m_textctrl->LoadFile(filename);
556
bb84929e
VZ
557 if ( fontenc == wxFONTENCODING_UTF8 ||
558 !wxTheFontMapper->IsEncodingAvailable(fontenc) )
7337790c
VS
559 {
560 // try to find some similar encoding:
3e2dd3db
VZ
561 wxFontEncoding encAlt;
562 if ( wxTheFontMapper->GetAltForEncoding(fontenc, &encAlt) )
7337790c
VS
563 {
564 wxEncodingConverter conv;
bb84929e 565
3e2dd3db 566 if (conv.Init(fontenc, encAlt))
7337790c 567 {
3e2dd3db 568 fontenc = encAlt;
7337790c
VS
569 m_textctrl -> SetValue(conv.Convert(m_textctrl -> GetValue()));
570 }
571 else
3e2dd3db 572 {
4693b20c 573 wxLogWarning(wxT("Cannot convert from '%s' to '%s'."),
7337790c 574 wxFontMapper::GetEncodingDescription(fontenc).c_str(),
3e2dd3db
VZ
575 wxFontMapper::GetEncodingDescription(encAlt).c_str());
576 }
7337790c
VS
577 }
578 else
4693b20c 579 wxLogWarning(wxT("No fonts for encoding '%s' on this system."),
7337790c
VS
580 wxFontMapper::GetEncodingDescription(fontenc).c_str());
581 }
582
3c1866e8 583 // and now create the correct font
7beba2fc
VZ
584 if ( !DoEnumerateFamilies(FALSE, fontenc, TRUE /* silent */) )
585 {
ea9144a3 586 wxFont font(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL,
7beba2fc
VZ
587 wxFONTWEIGHT_NORMAL, FALSE /* !underlined */,
588 wxEmptyString /* facename */, fontenc);
589 if ( font.Ok() )
590 {
591 DoChangeFont(font);
592 }
593 else
594 {
4693b20c 595 wxLogWarning(wxT("No fonts for encoding '%s' on this system."),
7beba2fc
VZ
596 wxFontMapper::GetEncodingDescription(fontenc).c_str());
597 }
598 }
3c1866e8
VZ
599}
600
1ccd74da
VZ
601void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
602{
36f210c8
VZ
603 wxMessageBox("wxWindows font demo\n"
604 "(c) 1999 Vadim Zeitlin",
605 "About Font",
1ccd74da
VZ
606 wxOK | wxICON_INFORMATION, this);
607}
608
1ccd74da
VZ
609// ----------------------------------------------------------------------------
610// MyCanvas
611// ----------------------------------------------------------------------------
612
613BEGIN_EVENT_TABLE(MyCanvas, wxWindow)
614 EVT_PAINT(MyCanvas::OnPaint)
615END_EVENT_TABLE()
616
617MyCanvas::MyCanvas( wxWindow *parent )
11c7d5b6
VZ
618 : wxWindow( parent, -1 ),
619 m_colour(*wxRED), m_font(*wxNORMAL_FONT)
1ccd74da 620{
1ccd74da
VZ
621}
622
623MyCanvas::~MyCanvas()
624{
625}
626
627void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
628{
629 wxPaintDC dc(this);
630 PrepareDC(dc);
631
632 // set background
a60b1f5d 633 dc.SetBackground(wxBrush(wxT("white"), wxSOLID));
1ccd74da
VZ
634 dc.Clear();
635
636 // output the font name/info
637 wxString fontInfo;
75421bf1 638 fontInfo.Printf(wxT("Font size is %d points, family is %s, encoding is '%s', style %s, weight %s"),
f6bcfd97 639 m_font.GetPointSize(),
1ccd74da 640 m_font.GetFamilyString().c_str(),
75421bf1
VZ
641 wxTheFontMapper->
642 GetEncodingDescription(m_font.GetEncoding()).c_str(),
1ccd74da
VZ
643 m_font.GetStyleString().c_str(),
644 m_font.GetWeightString().c_str());
645
646 dc.DrawText(fontInfo, 5, 5);
647
7826e2dd 648 if ( m_font.Ok() )
30764ab5 649 {
7826e2dd 650 wxString fontDesc = m_font.GetNativeFontInfoDesc();
249af798 651 dc.SetFont(m_font);
4693b20c 652 fontInfo.Printf(wxT("Native font info: %s"), fontDesc.c_str());
7826e2dd 653 dc.DrawText(fontInfo, 5, 5 + dc.GetCharHeight());
30764ab5
VZ
654 }
655
1ccd74da
VZ
656 // prepare to draw the font
657 dc.SetFont(m_font);
658 dc.SetTextForeground(m_colour);
659
660 // the size of one cell (char + small margin)
661 int w = dc.GetCharWidth() + 5,
662 h = dc.GetCharHeight() + 4;
663
664 // the origin for our table
665 int x = 5,
36f210c8 666 y = 2*h;
1ccd74da
VZ
667
668 // print all font symbols from 32 to 256 in 7 rows of 32 chars each
669 for ( int i = 1; i < 8; i++ )
670 {
671 for ( int j = 0; j < 32; j++ )
672 {
4693b20c 673 dc.DrawText(wxChar(32*i + j), x + w*j, y + h*i);
1ccd74da
VZ
674 }
675 }
676
677 // draw the lines between them
678 dc.SetPen(wxPen(wxColour("blue"), 1, wxSOLID));
679 int l;
680
681 // horizontal
682 y += h;
683 for ( l = 0; l < 8; l++ )
684 {
685 int yl = y + h*l - 2;
686 dc.DrawLine(x - 2, yl, x + 32*w - 2, yl);
687 }
688
689 // and vertical
690 for ( l = 0; l < 33; l++ )
691 {
692 int xl = x + w*l - 2;
693 dc.DrawLine(xl, y, xl, y + 7*h - 2);
694 }
695}