]> git.saurik.com Git - wxWidgets.git/blame - samples/svg/svgtest.cpp
Don't include wxUniversal configurations in MSVC project files.
[wxWidgets.git] / samples / svg / svgtest.cpp
CommitLineData
cdf3a589
CE
1/////////////////////////////////////////////////////////////////////////////
2// Name: svgtest.cpp
3// Purpose: SVG sample
4// Author: Chris Elliott
5// Modified by:
6// RCS-ID: $Id$
526954c5 7// Licence: wxWindows licence
cdf3a589
CE
8/////////////////////////////////////////////////////////////////////////////
9
10// ===========================================================================
11// declarations
12// ===========================================================================
13
14// ---------------------------------------------------------------------------
15// headers
16// ---------------------------------------------------------------------------
17
18// For compilers that support precompilation, includes "wx/wx.h".
19#include "wx/wxprec.h"
20
21#ifdef __BORLANDC__
22#pragma hdrstop
23#endif
24
25#ifndef WX_PRECOMP
26#include "wx/wx.h"
27#include "wx/mdi.h"
28#endif
29
ae0fbcee 30#include "wx/toolbar.h"
18cea871 31#include "wx/dcsvg.h"
49e3b82c 32#include "wx/vector.h"
cdf3a589
CE
33
34#include "bitmaps/new.xpm"
35#include "bitmaps/save.xpm"
36#include "bitmaps/help.xpm"
37#include "SVGlogo24.xpm"
a5e6cfa8 38
e7092398 39#ifndef wxHAS_IMAGES_IN_RESOURCES
3cb332c1
VZ
40 #include "../sample.xpm"
41#endif
42
66815259
VZ
43#include <math.h>
44
cdf3a589 45class MyChild;
49e3b82c
FM
46class MyCanvas;
47
48// ---------------------------------------------------------------------------
49// classes
50// ---------------------------------------------------------------------------
cdf3a589 51
cdf3a589
CE
52class MyApp : public wxApp
53{
49e3b82c
FM
54public:
55 bool OnInit();
cdf3a589
CE
56};
57
cdf3a589
CE
58class MyFrame : public wxMDIParentFrame
59{
49e3b82c
FM
60public:
61 MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title,
cdf3a589
CE
62 const wxPoint& pos, const wxSize& size, const long style);
63
49e3b82c
FM
64 void InitToolBar(wxToolBar* toolBar);
65
66 void OnSize(wxSizeEvent& event);
67 void OnAbout(wxCommandEvent& event);
68 void OnNewWindow(wxCommandEvent& event);
69 void OnQuit(wxCommandEvent& event);
70 void FileSavePicture (wxCommandEvent& event);
ce00f59b 71
49e3b82c
FM
72 unsigned int GetCountOfChildren() const
73 { return m_nWinCreated; }
74
75private:
76 unsigned int m_nWinCreated;
ce00f59b 77
49e3b82c 78 DECLARE_EVENT_TABLE()
cdf3a589
CE
79};
80
49e3b82c 81class MyChild: public wxMDIChildFrame
cdf3a589 82{
49e3b82c 83public:
ce00f59b
VZ
84 MyChild(wxMDIParentFrame *parent, const wxString& title,
85 const wxPoint& pos = wxDefaultPosition,
86 const wxSize& size = wxDefaultSize,
49e3b82c
FM
87 const long style = wxDEFAULT_FRAME_STYLE);
88 ~MyChild();
89
90 void OnActivate(wxActivateEvent& event);
91 void OnQuit(wxCommandEvent& event);
92 bool OnSave(wxString filename);
ce00f59b 93
49e3b82c
FM
94 MyFrame* GetFrame()
95 { return m_frame; }
96
97private:
98 MyCanvas *m_canvas;
99 MyFrame *m_frame;
100
101 DECLARE_EVENT_TABLE()
cdf3a589
CE
102};
103
49e3b82c 104class MyCanvas : public wxScrolledWindow
cdf3a589 105{
49e3b82c
FM
106public:
107 MyCanvas(MyChild *parent, const wxPoint& pos, const wxSize& size);
108 virtual void OnDraw(wxDC& dc);
109
110private:
111 int m_index;
112 MyChild* m_child;
ce00f59b 113
49e3b82c 114 DECLARE_EVENT_TABLE()
cdf3a589
CE
115};
116
49e3b82c
FM
117// ---------------------------------------------------------------------------
118// constants
119// ---------------------------------------------------------------------------
120
cdf3a589
CE
121// menu items ids
122enum
123{
124 MDI_QUIT = 100,
125 MDI_NEW_WINDOW,
126 MDI_SAVE,
127 MDI_REFRESH,
128 MDI_CHILD_QUIT,
129 MDI_ABOUT
130};
131
cdf3a589
CE
132// ---------------------------------------------------------------------------
133// event tables
134// ---------------------------------------------------------------------------
135
136BEGIN_EVENT_TABLE(MyFrame, wxMDIParentFrame)
49e3b82c
FM
137 EVT_MENU(MDI_ABOUT, MyFrame::OnAbout)
138 EVT_MENU(MDI_NEW_WINDOW, MyFrame::OnNewWindow)
139 EVT_MENU(MDI_QUIT, MyFrame::OnQuit)
140 EVT_MENU (MDI_SAVE, MyFrame::FileSavePicture)
cdf3a589 141
49e3b82c 142 EVT_SIZE(MyFrame::OnSize)
cdf3a589
CE
143END_EVENT_TABLE()
144
145// ===========================================================================
146// implementation
147// ===========================================================================
148
149// ---------------------------------------------------------------------------
150// MyApp
151// ---------------------------------------------------------------------------
152
49e3b82c
FM
153IMPLEMENT_APP(MyApp)
154
cdf3a589
CE
155bool MyApp::OnInit()
156{
157 // Create the main frame window
158
49e3b82c
FM
159 MyFrame* frame = new MyFrame((wxFrame *)NULL, -1, wxT("SVG Demo"),
160 wxDefaultPosition, wxSize(500, 400),
161 wxDEFAULT_FRAME_STYLE | wxHSCROLL | wxVSCROLL);
cdf3a589 162
d96cdd4a 163 frame->Show(true);
cdf3a589 164
c54e5eb0 165 return true;
cdf3a589
CE
166}
167
168
169// ---------------------------------------------------------------------------
170// MyFrame
171// ---------------------------------------------------------------------------
172
173// Define my frame constructor
174MyFrame::MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title,
49e3b82c 175 const wxPoint& pos, const wxSize& size, const long style)
cdf3a589
CE
176 : wxMDIParentFrame(parent, id, title, pos, size, style)
177{
49e3b82c 178 m_nWinCreated = 0;
cdf3a589 179
3cb332c1 180 SetIcon(wxICON(sample));
cdf3a589 181
49e3b82c
FM
182 // Make a menubar
183 wxMenu *file_menu = new wxMenu;
cdf3a589 184
49e3b82c
FM
185 file_menu->Append(MDI_NEW_WINDOW, wxT("&New test\tCtrl+N"));
186 file_menu->Append(MDI_QUIT, wxT("&Exit\tAlt+X"));
cdf3a589 187
49e3b82c
FM
188 wxMenu *help_menu = new wxMenu;
189 help_menu->Append(MDI_ABOUT, wxT("&About"));
cdf3a589 190
49e3b82c 191 wxMenuBar *menu_bar = new wxMenuBar;
cdf3a589 192
49e3b82c
FM
193 menu_bar->Append(file_menu, wxT("&File"));
194 menu_bar->Append(help_menu, wxT("&Help"));
195
196 // Associate the menu bar with the frame
197 SetMenuBar(menu_bar);
198
199#if wxUSE_STATUSBAR
200 CreateStatusBar();
201#endif // wxUSE_STATUSBAR
202
203 CreateToolBar(wxNO_BORDER | wxTB_FLAT | wxTB_HORIZONTAL);
204 InitToolBar(GetToolBar());
205}
cdf3a589
CE
206
207void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
208{
209 Close();
210}
211
cdf3a589
CE
212void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
213{
49e3b82c
FM
214 (void)wxMessageBox(wxT("wxWidgets SVG sample\n")
215 wxT("Author: Chris Elliott (c) 2002-2009\n")
ce00f59b 216 wxT("Usage: click File|New to show tests"),
49e3b82c 217 wxT("About SVG Test"));
cdf3a589
CE
218}
219
cdf3a589
CE
220void MyFrame::OnNewWindow(wxCommandEvent& WXUNUSED(event) )
221{
222 // Make another frame, containing a canvas
49e3b82c 223 MyChild *subframe = new MyChild(this, wxT("SVG Frame"));
cdf3a589 224
cdf3a589 225 wxString title;
49e3b82c 226 title.Printf(wxT("SVG Test Window %d"), m_nWinCreated );
ce00f59b 227
cdf3a589 228 // counts number of children previously, even if now closed
49e3b82c 229 m_nWinCreated ++;
cdf3a589
CE
230
231 // Give it a title and icon
232 subframe->SetTitle(title);
3cb332c1 233 subframe->SetIcon(wxICON(sample));
cdf3a589
CE
234
235 // Make a menubar
236 wxMenu *file_menu = new wxMenu;
237
238 file_menu->Append(MDI_NEW_WINDOW, wxT("&Another test\tCtrl+N"));
239 file_menu->Append(MDI_SAVE, wxT("&Save\tCtrl+S"), wxT("Save in SVG format"));
240 file_menu->Append(MDI_CHILD_QUIT, wxT("&Close child\tCtrl+F4"));
241 file_menu->Append(MDI_QUIT, wxT("&Exit\tAlt+X"));
242
243 wxMenu *help_menu = new wxMenu;
244 help_menu->Append(MDI_ABOUT, wxT("&About"));
245
246 wxMenuBar *menu_bar = new wxMenuBar;
247
248 menu_bar->Append(file_menu, wxT("&File"));
249 menu_bar->Append(help_menu, wxT("&Help"));
250
251 // Associate the menu bar with the frame
252 subframe->SetMenuBar(menu_bar);
253
c54e5eb0 254 subframe->Show(true);
cdf3a589
CE
255}
256
756d3e7f 257void MyFrame::OnSize(wxSizeEvent& event)
cdf3a589
CE
258{
259 int w, h;
260 GetClientSize(&w, &h);
261
262 GetClientWindow()->SetSize(0, 0, w, h);
756d3e7f 263 event.Skip();
cdf3a589
CE
264}
265
cdf3a589
CE
266void MyFrame::InitToolBar(wxToolBar* toolBar)
267{
49e3b82c 268 const int maxBitmaps = 3;
cdf3a589
CE
269 wxBitmap* bitmaps[maxBitmaps];
270
271 bitmaps[0] = new wxBitmap( new_xpm );
272 bitmaps[1] = new wxBitmap( save_xpm );
273 bitmaps[2] = new wxBitmap( help_xpm );
274
bbe28fbb
PC
275 toolBar->AddTool(MDI_NEW_WINDOW, wxEmptyString, *(bitmaps[0]), wxS("New SVG test window"));
276 toolBar->AddTool(MDI_SAVE, wxEmptyString, *bitmaps[1], wxS("Save test in SVG format"));
a5e6cfa8 277 toolBar->AddSeparator();
bbe28fbb 278 toolBar->AddTool(MDI_ABOUT, wxEmptyString, *bitmaps[2], wxS("Help"));
cdf3a589
CE
279
280 toolBar->Realize();
281
282 int i;
283 for (i = 0; i < maxBitmaps; i++)
284 delete bitmaps[i];
285}
286
cdf3a589
CE
287void MyFrame::FileSavePicture (wxCommandEvent & WXUNUSED(event) )
288{
c54e5eb0 289#if wxUSE_FILEDLG
49e3b82c 290 MyChild * pChild = (MyChild *)GetActiveChild();
a5e6cfa8 291 if (pChild == NULL)
cdf3a589 292 {
49e3b82c 293 return;
cdf3a589
CE
294 }
295
296 wxFileDialog dialog(this, wxT("Save Picture as"), wxEmptyString, pChild->GetTitle(),
297 wxT("SVG vector picture files (*.svg)|*.svg"),
ff3e84ff 298 wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
cdf3a589
CE
299
300 if (dialog.ShowModal() == wxID_OK)
301 {
49e3b82c 302 if (!pChild->OnSave ( dialog.GetPath() ))
cdf3a589 303 {
49e3b82c 304 return;
cdf3a589
CE
305 }
306 }
49e3b82c 307 return;
c54e5eb0 308#endif // wxUSE_FILEDLG
cdf3a589
CE
309}
310
311
cdf3a589
CE
312// ---------------------------------------------------------------------------
313// MyCanvas
314// ---------------------------------------------------------------------------
315
49e3b82c
FM
316BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
317END_EVENT_TABLE()
318
cdf3a589 319// Define a constructor for my canvas
49e3b82c
FM
320MyCanvas::MyCanvas(MyChild *parent, const wxPoint& pos, const wxSize& size)
321 : wxScrolledWindow(parent, wxID_ANY, pos, size, wxSUNKEN_BORDER|wxVSCROLL|wxHSCROLL)
cdf3a589 322{
ea92bb67 323 SetBackgroundColour(*wxWHITE);
cdf3a589 324
49e3b82c 325 m_child = parent;
614e38db 326 m_index = m_child->GetFrame()->GetCountOfChildren() % 9;
49e3b82c 327}
cdf3a589
CE
328
329// Define the repainting behaviour
330void MyCanvas::OnDraw(wxDC& dc)
331{
332 // vars to use ...
d96cdd4a 333#if wxUSE_STATUSBAR
49e3b82c 334 wxString s;
d96cdd4a 335#endif // wxUSE_STATUSBAR
49e3b82c
FM
336 wxPen wP;
337 wxBrush wB;
cdf3a589
CE
338 wxPoint points[6];
339 wxColour wC;
49e3b82c 340 wxFont wF;
cdf3a589
CE
341
342 dc.SetFont(*wxSWISS_FONT);
343 dc.SetPen(*wxGREEN_PEN);
344
cdf3a589
CE
345 switch (m_index)
346 {
347 default:
348 case 0:
349 // draw lines to make a cross
350 dc.DrawLine(0, 0, 200, 200);
351 dc.DrawLine(200, 0, 0, 200);
352 // draw point colored line and spline
49e3b82c 353 wP = *wxCYAN_PEN;
cdf3a589
CE
354 wP.SetWidth(3);
355 dc.SetPen(wP);
356
49e3b82c 357 dc.DrawPoint (25,15);
cdf3a589
CE
358 dc.DrawLine(50, 30, 200, 30);
359 dc.DrawSpline(50, 200, 50, 100, 200, 10);
d96cdd4a 360#if wxUSE_STATUSBAR
cdf3a589 361 s = wxT("Green Cross, Cyan Line and spline");
d96cdd4a 362#endif // wxUSE_STATUSBAR
49e3b82c 363 break;
cdf3a589
CE
364
365 case 1:
366 // draw standard shapes
367 dc.SetBrush(*wxCYAN_BRUSH);
368 dc.SetPen(*wxRED_PEN);
369 dc.DrawRectangle(10, 10, 100, 70);
9a83f860 370 wB = wxBrush (wxT("DARK ORCHID"), wxBRUSHSTYLE_TRANSPARENT);
cdf3a589
CE
371 dc.SetBrush (wB);
372 dc.DrawRoundedRectangle(50, 50, 100, 70, 20);
9a83f860 373 dc.SetBrush (wxBrush(wxT("GOLDENROD")) );
cdf3a589
CE
374 dc.DrawEllipse(100, 100, 100, 50);
375
376 points[0].x = 100; points[0].y = 200;
377 points[1].x = 70; points[1].y = 260;
378 points[2].x = 160; points[2].y = 230;
379 points[3].x = 40; points[3].y = 230;
380 points[4].x = 130; points[4].y = 260;
381 points[5].x = 100; points[5].y = 200;
382
383 dc.DrawPolygon(5, points);
384 dc.DrawLines (6, points, 160);
d96cdd4a 385#if wxUSE_STATUSBAR
cdf3a589 386 s = wxT("Blue rectangle, red edge, clear rounded rectangle, gold ellipse, gold and clear stars");
d96cdd4a 387#endif // wxUSE_STATUSBAR
49e3b82c 388 break;
cdf3a589
CE
389
390 case 2:
391 // draw text in Arial or similar font
392 dc.DrawLine(50,25,50,35);
393 dc.DrawLine(45,30,55,30);
394 dc.DrawText(wxT("This is a Swiss-style string"), 50, 30);
49e3b82c 395 wC = dc.GetTextForeground();
9a83f860 396 dc.SetTextForeground (wxT("FIREBRICK"));
a5e6cfa8 397
cdf3a589 398 // no effect in msw ??
9a83f860 399 dc.SetTextBackground (wxT("WHEAT"));
cdf3a589
CE
400 dc.DrawText(wxT("This is a Red string"), 50, 200);
401 dc.DrawRotatedText(wxT("This is a 45 deg string"), 50, 200, 45);
402 dc.DrawRotatedText(wxT("This is a 90 deg string"), 50, 200, 90);
c54e5eb0 403 wF = wxFont ( 18, wxROMAN, wxITALIC, wxBOLD, false, wxT("Times New Roman"));
cdf3a589 404 dc.SetFont(wF);
49e3b82c 405 dc.SetTextForeground (wC);
cdf3a589 406 dc.DrawText(wxT("This is a Times-style string"), 50, 60);
d96cdd4a 407#if wxUSE_STATUSBAR
cdf3a589 408 s = wxT("Swiss, Times text; red text, rotated and colored orange");
d96cdd4a 409#endif // wxUSE_STATUSBAR
49e3b82c 410 break;
cdf3a589
CE
411
412 case 3 :
413 // four arcs start and end points, center
414 dc.SetBrush(*wxGREEN_BRUSH);
216db41f 415 dc.DrawArc ( 200,300, 370,230, 300,300 );
cdf3a589 416 dc.SetBrush(*wxBLUE_BRUSH);
216db41f 417 dc.DrawArc ( 270-50, 270-86, 270-86, 270-50, 270,270 );
cdf3a589 418 dc.SetDeviceOrigin(-10,-10);
216db41f 419 dc.DrawArc ( 270-50, 270-86, 270-86, 270-50, 270,270 );
cdf3a589
CE
420 dc.SetDeviceOrigin(0,0);
421
9a83f860 422 wP.SetColour (wxT("CADET BLUE"));
cdf3a589 423 dc.SetPen(wP);
216db41f 424 dc.DrawArc ( 75,125, 110, 40, 75, 75 );
cdf3a589 425
9a83f860 426 wP.SetColour (wxT("SALMON"));
cdf3a589
CE
427 dc.SetPen(wP);
428 dc.SetBrush(*wxRED_BRUSH);
429 //top left corner, width and height, start and end angle
430 // 315 same center and x-radius as last pie-arc, half Y radius
49e3b82c 431 dc.DrawEllipticArc(25,50,100,50,180.0,45.0);
cdf3a589 432
49e3b82c 433 wP = *wxCYAN_PEN;
cdf3a589
CE
434 wP.SetWidth(3);
435 dc.SetPen(wP);
436 //wxTRANSPARENT));
9a83f860 437 dc.SetBrush (wxBrush (wxT("SALMON")));
49e3b82c 438 dc.DrawEllipticArc(300, 0,200,100, 0.0,145.0);
cdf3a589 439 //same end point
49e3b82c
FM
440 dc.DrawEllipticArc(300, 50,200,100,90.0,145.0);
441 dc.DrawEllipticArc(300,100,200,100,90.0,345.0);
cdf3a589 442
d96cdd4a 443#if wxUSE_STATUSBAR
cdf3a589 444 s = wxT("This is an arc test page");
d96cdd4a 445#endif // wxUSE_STATUSBAR
49e3b82c 446 break;
cdf3a589
CE
447
448 case 4:
449 dc.DrawCheckMark ( 30,30,25,25);
9a83f860 450 dc.SetBrush (wxBrush (wxT("SALMON"),wxBRUSHSTYLE_TRANSPARENT));
cdf3a589
CE
451 dc.DrawCheckMark ( 80,50,75,75);
452 dc.DrawRectangle ( 80,50,75,75);
d96cdd4a 453#if wxUSE_STATUSBAR
cdf3a589 454 s = wxT("Two check marks");
d96cdd4a 455#endif // wxUSE_STATUSBAR
49e3b82c 456 break;
cdf3a589
CE
457
458 case 5:
c54e5eb0 459 wF = wxFont ( 18, wxROMAN, wxITALIC, wxBOLD, false, wxT("Times New Roman"));
cdf3a589
CE
460 dc.SetFont(wF);
461 dc.DrawLine(0, 0, 200, 200);
462 dc.DrawLine(200, 0, 0, 200);
463 dc.DrawText(wxT("This is an 18pt string"), 50, 60);
464
465 // rescale and draw in blue
49e3b82c 466 wP = *wxCYAN_PEN;
cdf3a589
CE
467 dc.SetPen(wP);
468 dc.SetUserScale (2.0,0.5);
469 dc.SetDeviceOrigin(200,0);
470 dc.DrawLine(0, 0, 200, 200);
471 dc.DrawLine(200, 0, 0, 200);
472 dc.DrawText(wxT("This is an 18pt string 2 x 0.5 UserScaled"), 50, 60);
473 dc.SetUserScale (2.0,2.0);
474 dc.SetDeviceOrigin(200,200);
475 dc.DrawText(wxT("This is an 18pt string 2 x 2 UserScaled"), 50, 60);
476
49e3b82c 477 wP = *wxRED_PEN;
cdf3a589
CE
478 dc.SetPen(wP);
479 dc.SetUserScale (1.0,1.0);
480 dc.SetDeviceOrigin(0,10);
49e3b82c 481 dc.SetMapMode (wxMM_METRIC); //svg ignores this
cdf3a589
CE
482 dc.DrawLine(0, 0, 200, 200);
483 dc.DrawLine(200, 0, 0, 200);
a5e6cfa8 484 dc.DrawText(wxT("This is an 18pt string in MapMode"), 50, 60);
d96cdd4a 485#if wxUSE_STATUSBAR
cdf3a589 486 s = wxT("Scaling test page");
d96cdd4a 487#endif // wxUSE_STATUSBAR
49e3b82c 488 break;
cdf3a589
CE
489
490 case 6:
3cb332c1 491 dc.DrawIcon( wxICON(sample), 10, 10 );
756d3e7f 492 dc.DrawBitmap ( wxBitmap(svgbitmap_xpm), 50,15);
d96cdd4a 493#if wxUSE_STATUSBAR
cdf3a589 494 s = wxT("Icon and Bitmap ");
d96cdd4a 495#endif // wxUSE_STATUSBAR
49e3b82c 496 break;
cdf3a589 497
66815259 498 case 7:
614e38db
VZ
499 dc.SetTextForeground(wxT("RED"));
500 dc.DrawText(wxT("Red = Clipping Off"), 30, 5);
501 dc.SetTextForeground(wxT("GREEN"));
502 dc.DrawText(wxT("Green = Clipping On"), 30, 25);
503
504 dc.SetTextForeground(wxT("BLACK"));
505
506 dc.SetPen(*wxRED_PEN);
507 dc.SetBrush (wxBrush (wxT("SALMON"),wxBRUSHSTYLE_TRANSPARENT));
508 dc.DrawCheckMark ( 80,50,75,75);
509 dc.DrawRectangle ( 80,50,75,75);
510
511 dc.SetPen(*wxGREEN_PEN);
512
513 // Clipped checkmarks
514 dc.DrawRectangle(180,50,75,75);
515 dc.SetClippingRegion(180,50,75,75); // x,y,width,height version
516 dc.DrawCheckMark ( 180,50,75,75);
517 dc.DestroyClippingRegion();
518
519 dc.DrawRectangle(wxRect(80,150,75,75));
520 dc.SetClippingRegion(wxPoint(80,150),wxSize(75,75)); // pt,size version
521 dc.DrawCheckMark ( 80,150,75,75);
522 dc.DestroyClippingRegion();
523
524 dc.DrawRectangle(wxRect(180,150,75,75));
525 dc.SetClippingRegion(wxRect(180,150,75,75)); // rect version
526 dc.DrawCheckMark ( 180,150,75,75);
527 dc.DestroyClippingRegion();
528
529 dc.DrawRectangle(wxRect( 80,250,50,65));
530 dc.DrawRectangle(wxRect(105,260,50,65));
531 dc.SetClippingRegion(wxRect( 80,250,50,65)); // second call to SetClippingRegion
532 dc.SetClippingRegion(wxRect(105,260,50,65)); // forms intersection with previous
533 dc.DrawCheckMark(80,250,75,75);
534 dc.DestroyClippingRegion(); // only one call to destroy (there's no stack)
535
536 /*
537 ** Clipping by wxRegion not implemented for SVG. Should be
538 ** possible, but need to access points that define the wxRegion
539 ** from inside DoSetDeviceClippingRegion() and wxRegion does not
540 ** implement anything like getPoints().
541 points[0].x = 180; points[0].y = 250;
542 points[1].x = 255; points[1].y = 250;
543 points[2].x = 180; points[2].y = 325;
544 points[3].x = 255; points[3].y = 325;
545 points[4].x = 180; points[4].y = 250;
546
547 dc.DrawLines (5, points);
548 wxRegion reg = wxRegion(5,points);
549
550 dc.SetClippingRegion(reg);
551 dc.DrawCheckMark ( 180,250,75,75);
552 dc.DestroyClippingRegion();
553 */
554
555#if wxUSE_STATUSBAR
556 s = wxT("Clipping region");
557#endif // wxUSE_STATUSBAR
558 break;
559
560 case 8:
66815259
VZ
561 wxString txtStr;
562 wxCoord txtX, txtY, txtW, txtH, txtDescent, txtEL;
563 wxCoord txtPad = 0;
564
565 wP = *wxRED_PEN;
566 dc.SetPen(wP);
567 //dc.SetBackgroundMode(wxBRUSHSTYLE_SOLID);
568 //dc.SetTextBackground(*wxBLUE);
569
570 // Horizontal text
571 txtStr = wxT("Horizontal string");
572 dc.GetTextExtent(txtStr, &txtW, &txtH, &txtDescent, &txtEL);
573 txtX = 50;
574 txtY = 300;
575 dc.DrawRectangle(txtX, txtY, txtW + 2*txtPad, txtH + 2*txtPad);
576 dc.DrawText(txtStr, txtX + txtPad, txtY + txtPad);
577
578 // Vertical text
579 txtStr = wxT("Vertical string");
580 dc.GetTextExtent(txtStr, &txtW, &txtH, &txtDescent, &txtEL);
581 txtX = 50;
582 txtY = 250;
583 dc.DrawRectangle(txtX, txtY - (txtW + 2*txtPad), txtH + 2*txtPad, txtW + 2*txtPad);
584 dc.DrawRotatedText(txtStr, txtX + txtPad, txtY - txtPad, 90);
585
586 // 45 degree text
587 txtStr = wxT("45 deg string");
588 dc.GetTextExtent(txtStr, &txtW, &txtH, &txtDescent, &txtEL);
589 double lenW = (double)(txtW + 2*txtPad) / sqrt(2.0);
590 double lenH = (double)(txtH + 2*txtPad) / sqrt(2.0);
591 double padding = (double)txtPad / sqrt(2.0);
592 txtX = 150;
593 txtY = 200;
594 dc.DrawLine(txtX - padding, txtY, txtX + lenW, txtY - lenW); // top
595 dc.DrawLine(txtX + lenW, txtY - lenW, txtX - padding + lenH + lenW, txtY + (lenH - lenW));
596 dc.DrawLine(txtX - padding, txtY, txtX - padding + lenH, txtY + lenH);
597 dc.DrawLine(txtX - padding + lenH, txtY + lenH, txtX - padding + lenH + lenW, txtY + (lenH - lenW)); // bottom
598 dc.DrawRotatedText(txtStr, txtX, txtY, 45);
599#if wxUSE_STATUSBAR
600 s = wxT("Text position test page");
601#endif // wxUSE_STATUSBAR
602 break;
cdf3a589 603 }
d96cdd4a 604#if wxUSE_STATUSBAR
cdf3a589 605 m_child->SetStatusText(s);
d96cdd4a 606#endif // wxUSE_STATUSBAR
cdf3a589
CE
607}
608
609
cdf3a589
CE
610// ---------------------------------------------------------------------------
611// MyChild
612// ---------------------------------------------------------------------------
613
49e3b82c
FM
614// Note that MDI_NEW_WINDOW and MDI_ABOUT commands get passed
615// to the parent window for processing, so no need to
616// duplicate event handlers here.
617BEGIN_EVENT_TABLE(MyChild, wxMDIChildFrame)
618 EVT_MENU(MDI_CHILD_QUIT, MyChild::OnQuit)
619END_EVENT_TABLE()
620
cdf3a589 621MyChild::MyChild(wxMDIParentFrame *parent, const wxString& title,
49e3b82c
FM
622 const wxPoint& pos, const wxSize& size,
623 const long style)
624 : wxMDIChildFrame(parent, wxID_ANY, title, pos, size, style)
cdf3a589 625{
49e3b82c 626 m_frame = (MyFrame *) parent;
ce00f59b 627
d96cdd4a 628#if wxUSE_STATUSBAR
cdf3a589 629 CreateStatusBar();
a5e6cfa8 630 SetStatusText(title);
d96cdd4a 631#endif // wxUSE_STATUSBAR
cdf3a589 632
49e3b82c 633 m_canvas = new MyCanvas(this, wxPoint(0, 0), GetClientSize());
ce00f59b 634
cdf3a589
CE
635 // Give it scrollbars
636 m_canvas->SetScrollbars(20, 20, 50, 50);
cdf3a589
CE
637}
638
cdf3a589
CE
639MyChild::~MyChild()
640{
cdf3a589
CE
641}
642
cdf3a589
CE
643void MyChild::OnQuit(wxCommandEvent& WXUNUSED(event))
644{
c54e5eb0 645 Close(true);
cdf3a589
CE
646}
647
cdf3a589
CE
648bool MyChild::OnSave(wxString filename)
649{
49e3b82c 650 wxSVGFileDC svgDC (filename, 600, 650);
cdf3a589 651 m_canvas->OnDraw (svgDC);
22e43568 652 return svgDC.IsOk();
cdf3a589
CE
653}
654
cdf3a589
CE
655void MyChild::OnActivate(wxActivateEvent& event)
656{
657 if ( event.GetActive() && m_canvas )
658 m_canvas->SetFocus();
659}
660