]> git.saurik.com Git - wxWidgets.git/blame - contrib/samples/canvas/test/test.cpp
post wxUniv merge fix
[wxWidgets.git] / contrib / samples / canvas / test / test.cpp
CommitLineData
6a2c1874
RR
1/*
2 * Program: canvas
3 *
4 * Author: Robert Roebling
5 *
6 * Copyright: (C) 1998, Robert Roebling
7 *
8 */
6a2c1874 9
f9032263
RR
10#ifdef __GNUG__
11 #pragma implementation "test.cpp"
6a2c1874
RR
12#endif
13
f9032263
RR
14// For compilers that support precompilation
15#include "wx/wxprec.h"
239c1f50 16
f9032263
RR
17#ifdef __BORLANDC__
18 #pragma hdrstop
19#endif
6a2c1874 20
f9032263 21#include "test.h"
6a2c1874
RR
22#include "smile.xpm"
23
f9032263
RR
24//-----------------------------------------------------
25// class MywxCanvasObjectRef
26//-----------------------------------------------------
6a2c1874 27
f9032263
RR
28BEGIN_EVENT_TABLE(MywxCanvasObjectRef,wxCanvasObjectRef)
29 EVT_MOUSE_EVENTS( MywxCanvasObjectRef::OnMouseEvent )
30END_EVENT_TABLE()
6a2c1874 31
f9032263 32IMPLEMENT_DYNAMIC_CLASS(MywxCanvasObjectRef, wxCanvasObjectRef)
9f3b9298 33
f9032263
RR
34MywxCanvasObjectRef::MywxCanvasObjectRef(double x, double y,wxCanvasObjectGroup* group)
35 :wxCanvasObjectRef(x,y,group)
9f3b9298 36{
f9032263 37}
9f3b9298 38
f9032263
RR
39MywxCanvasObjectRef::MywxCanvasObjectRef()
40 :wxCanvasObjectRef(0,0,NULL)
41{
42}
9f3b9298 43
f9032263 44MywxCanvasObjectRef::~MywxCanvasObjectRef()
9f3b9298
KH
45{
46}
47
f9032263 48void MywxCanvasObjectRef::OnMouseEvent(wxMouseEvent &event)
9f3b9298 49{
f9032263
RR
50 if (!m_dragable)
51 {
52 event.Skip();
53 return;
54 }
55
56 static double xprev;
57 static double yprev;
58
59 //new position of the mouse relative within the object
60 double x = m_admin->DeviceToLogicalX(event.GetX());
61 double y = m_admin->DeviceToLogicalY(event.GetY());
9f3b9298 62
872f1044 63 if (event.LeftDown())
f9032263 64 {
9f3b9298 65 CaptureMouse();
b5789150 66 if (m_dragmode != wxDRAG_REDRAW)
f9032263
RR
67 DragStart();
68 }
872f1044
RR
69 else if (event.LeftUp())
70 {
71 ReleaseMouse();
b5789150 72 if (m_dragmode != wxDRAG_REDRAW)
f9032263 73 DragEnd();
9f3b9298
KH
74 }
75 else if (IsCapturedMouse())
76 {
b5789150 77 if (m_dragmode != wxDRAG_REDRAW)
f9032263
RR
78 DragRelative(x-xprev,y-yprev);
79 else
80 MoveRelative(x-xprev,y-yprev);
81 m_admin->UpdateNow();
9f3b9298 82 }
f9032263
RR
83 xprev=x;
84 yprev=y;
85 //well do something extra
86 if (IsCapturedMouse())
87 m_admin->GetActive()->SetCursor(*wxHOURGLASS_CURSOR);
88 else
89 m_admin->GetActive()->SetCursor(*wxSTANDARD_CURSOR);
9f3b9298
KH
90}
91
f9032263
RR
92//---------------------------------------------------
93// class MyEventHandler
94//---------------------------------------------------
fcbb6b37 95
f9032263
RR
96BEGIN_EVENT_TABLE(MyEventHandler,wxEvtHandler)
97 EVT_MOUSE_EVENTS( MyEventHandler::OnMouseEvent )
fcbb6b37
KH
98END_EVENT_TABLE()
99
f9032263 100MyEventHandler::MyEventHandler()
fcbb6b37
KH
101{
102}
103
f9032263 104void MyEventHandler::OnMouseEvent(wxMouseEvent &event)
fcbb6b37 105{
f9032263
RR
106 wxCanvasObject* obj=(wxCanvasObject*)event.GetEventObject();
107
108 if (!obj->GetDraggable())
109 return;
fcbb6b37 110
f9032263
RR
111 static double xprev;
112 static double yprev;
113
114 wxCanvasAdmin* adm=obj->GetAdmin();
115
116 //new position of the mouse relative within the object
117 double x = adm->DeviceToLogicalX(event.GetX());
118 double y = adm->DeviceToLogicalY(event.GetY());
fcbb6b37 119
872f1044 120 if (event.LeftDown())
f9032263
RR
121 {
122 obj->CaptureMouse();
b5789150 123 if (obj->GetDragMode() != wxDRAG_REDRAW)
f9032263
RR
124 obj->DragStart();
125 }
872f1044
RR
126 else if (event.LeftUp())
127 {
f9032263 128 obj->ReleaseMouse();
b5789150 129 if (obj->GetDragMode() != wxDRAG_REDRAW)
f9032263 130 obj->DragEnd();
fcbb6b37 131 }
f9032263 132 else if (obj->IsCapturedMouse())
fcbb6b37 133 {
b5789150 134 if (obj->GetDragMode() != wxDRAG_REDRAW)
f9032263
RR
135 obj->DragRelative(x-xprev,y-yprev);
136 else
137 obj->MoveRelative(x-xprev,y-yprev);
138 adm->UpdateNow();
fcbb6b37 139 }
f9032263
RR
140 xprev=x;
141 yprev=y;
142 //well do something extra
143 if (obj->IsCapturedMouse())
144 obj->GetAdmin()->GetActive()->SetCursor(*wxHOURGLASS_CURSOR);
145 else
146 obj->GetAdmin()->GetActive()->SetCursor(*wxSTANDARD_CURSOR);
fcbb6b37
KH
147}
148
f9032263
RR
149//------------------------------------------------
150// class MyFrame
151//------------------------------------------------
6a2c1874 152
f9032263
RR
153class MyApp;
154class MyCanvas;
fcbb6b37 155
f9032263
RR
156BEGIN_EVENT_TABLE(MyFrame, wxFrame)
157 EVT_MENU(SPLIT_VERTICAL, MyFrame::SplitVertical)
158 EVT_MENU(SPLIT_HORIZONTAL, MyFrame::SplitHorizontal)
159 EVT_MENU(SPLIT_UNSPLIT, MyFrame::Unsplit)
160 EVT_MENU(SPLIT_QUIT, MyFrame::Quit)
161 EVT_MENU(SPLIT_SETMINSIZE, MyFrame::SetMinSize)
6a2c1874 162
f9032263
RR
163 EVT_UPDATE_UI(SPLIT_VERTICAL, MyFrame::UpdateUIVertical)
164 EVT_UPDATE_UI(SPLIT_HORIZONTAL, MyFrame::UpdateUIHorizontal)
165 EVT_UPDATE_UI(SPLIT_UNSPLIT, MyFrame::UpdateUIUnsplit)
6a2c1874 166
f9032263
RR
167 EVT_MENU (ID_ABOUT, MyFrame::OnAbout)
168 EVT_TIMER (-1, MyFrame::OnTimer)
169END_EVENT_TABLE()
6a2c1874 170
f9032263
RR
171// My frame constructor
172MyFrame::MyFrame(wxFrame* frame, const wxString& title, const wxPoint& pos, const wxSize& size):
173 wxFrame(frame, SPLITTER_FRAME, title, pos, size)
6a2c1874 174{
f9032263 175 m_eventhandler =new MyEventHandler();
cba349dc 176
f9032263
RR
177 wxPathList pathList;
178 pathList.Add(".");
179 pathList.Add("..");
cba349dc 180
f9032263
RR
181 wxString path = pathList.FindValidPath("pat36.bmp");
182 gs_bmp36_mono.LoadFile(path, wxBITMAP_TYPE_BMP);
183 wxMask* mask36 = new wxMask(gs_bmp36_mono, *wxBLACK);
184 /* associate a monochrome mask with this bitmap */
185 gs_bmp36_mono.SetMask(mask36);
6a2c1874 186
f9032263 187 CreateStatusBar(2);
6a2c1874 188
f9032263
RR
189 // Make a menubar
190 fileMenu = new wxMenu;
191 fileMenu->Append(SPLIT_VERTICAL, "Split &Vertically\tCtrl-V", "Split vertically");
192 fileMenu->Append(SPLIT_HORIZONTAL, "Split &Horizontally\tCtrl-H", "Split horizontally");
193 fileMenu->Append(SPLIT_UNSPLIT, "&Unsplit", "Unsplit");
194// fileMenu->Append(SPLIT_UNSPLIT, "&Unsplit\tCtrl-U", "Unsplit");
195 fileMenu->AppendSeparator();
196 fileMenu->Append(SPLIT_SETMINSIZE, "Set &min size", "Set minimum pane size");
197 fileMenu->AppendSeparator();
198 fileMenu->Append(SPLIT_QUIT, "E&xit\tAlt-X", "Exit");
199 fileMenu->Append( ID_ABOUT, "&About...");
6a2c1874 200
6a2c1874 201
f9032263
RR
202 menuBar = new wxMenuBar;
203 menuBar->Append(fileMenu, "&File");
6a2c1874 204
f9032263 205 SetMenuBar(menuBar);
6a2c1874 206
f9032263 207 m_splitter = new MySplitterWindow(this, SPLITTER_WINDOW);
6a2c1874 208
f9032263 209 m_canvas1 = new MyCanvas(&m_canvasadmin, m_splitter, CANVAS1, wxPoint(0, 0), wxSize(400, 400),wxHSCROLL|wxVSCROLL);
b5789150 210 m_canvas1->SetYaxis(FALSE);
f9032263
RR
211 m_canvas1->SetMappingScroll(-300,-300,500,500,false);
212 m_canvas1->SetScroll(-400,-400,600,600);
213 m_canvas1->SetColour(wxColour(255, 255, 255) );
214 m_canvas1->SetCursor(wxCursor(wxCURSOR_MAGNIFIER));
239c1f50 215
f9032263
RR
216 m_canvas2 = new MyCanvas(&m_canvasadmin, m_splitter, CANVAS2, wxPoint(0, 0), wxSize(400, 400),wxHSCROLL|wxVSCROLL);
217 m_canvas2->SetMappingScroll(-100,-100,500,500,false);
218 m_canvas2->SetScroll(-400,-400,600,600);
219 m_canvas2->SetColour( wxColour(187, 215, 243) );
220 m_canvas2->Show(FALSE);
239c1f50 221
f9032263
RR
222 m_canvasadmin.Append(m_canvas1);
223 m_canvasadmin.Append(m_canvas2);
224 m_canvasadmin.SetActive(m_canvas1);
225
226 m_splitter->Initialize(m_canvas1);
227 SetStatusText("Min pane size = 0", 1);
239c1f50 228
239c1f50
RR
229 int widths[] = { -1, 100 };
230 SetStatusWidths( 2, widths );
231
f9032263
RR
232 //root group always at 0,0
233 m_datatree = new wxCanvasObjectGroup(0,0);
234 m_datatree->DeleteContents( TRUE );
235 m_datatree->SetAdmin(&m_canvasadmin);
fcbb6b37 236
239c1f50
RR
237 wxBitmap bitmap( smile_xpm );
238 wxImage image( bitmap );
6a2c1874 239
f9032263
RR
240// m_sm1 = new wxCanvasImage( image, 0,70,32,32 );
241// m_datatree->Append( m_sm1 );
fcbb6b37 242
239c1f50
RR
243 int i;
244 for (i = 10; i < 300; i+=10)
27d1065d
RR
245 {
246 wxCanvasRect *r = new wxCanvasRect( i,50,3,140 );
247 r->SetBrush( *wxRED_BRUSH );
f9032263 248 m_datatree->Append( r );
27d1065d 249 }
6a2c1874 250
f9032263
RR
251
252// m_sm2 = new wxCanvasImage( image, 0,140,24,24 );
253// m_datatree->Append( m_sm2 );
6a2c1874 254
239c1f50 255 for (i = 15; i < 300; i+=10)
f9032263
RR
256 {
257 wxCanvasRect* rec= new wxCanvasRect( i,50,3,140 );
258 rec->SetBrush(wxBrush(wxColour(0,10+i,2+i),wxSOLID));
259 rec->SetDraggable(FALSE);
260 m_datatree->Append( rec );
261 }
cba349dc 262
f9032263
RR
263/*
264 wxButton *button = new wxButton( m_canvas1, -1, "Hello", wxPoint(80,50) );
265 m_datatree->Append( new wxCanvasControl( button ) );
cba349dc 266
f9032263
RR
267 m_datatree->Append( new wxCanvasText( "Hello", 180, 50,
268 wxGetApp().GetFontPath() + "/times.ttf", 20 ) );
269
270 m_datatree->Append( new wxCanvasText( "How are you?", 180, 10,
96f5fca9
RR
271 wxGetApp().GetFontPath() + "/times.ttf", 8 ) );
272
f9032263 273 m_datatree->Append( new wxCanvasText( "How are you?", 180, 20,
96f5fca9
RR
274 wxGetApp().GetFontPath() + "/times.ttf", 10 ) );
275
f9032263 276 m_datatree->Append( new wxCanvasText( "How are you?", 180, 30,
96f5fca9 277 wxGetApp().GetFontPath() + "/times.ttf", 12 ) );
4dbd4ee6 278 m_sm3 = new wxCanvasImage( image, 0,210,32,32 );
f9032263
RR
279 m_datatree->Append( m_sm3 );
280*/
239c1f50 281 for (i = 10; i < 300; i+=10)
f9032263
RR
282 m_datatree->Append( new wxCanvasLine( 10,-15,i,300 ) );
283/*
284 m_sm4 = new wxCanvasImage( image, 0,270,64,32 );
b5789150 285 m_sm4->SetDragMode(wxDRAG_RECTANGLE);
f9032263
RR
286 m_datatree->Append( m_sm4 );
287*/
fcbb6b37 288
61b64bd9
RR
289// m_canvas->Append( new wxCanvasLine( 10,-1500e6,50,300000e6, 0,255,0 ) );
290// m_canvas->Append( new wxCanvasLine( 10,-150000,50,300000, 0,255,0 ) );
291
f9032263 292
fcbb6b37 293 //make a group of wxCanvasObjects
f9032263
RR
294 wxCanvasObjectGroup* group1 = new wxCanvasObjectGroup(0,0);
295
296 wxCanvasLine* line = new wxCanvasLine( 10,-35,50,190);
297 line->SetPen(wxPen(wxColour(255,161,5),5,wxDOT_DASH ));
298 group1->Prepend( line );
fcbb6b37 299 group1->Prepend( new wxCanvasImage( image, 4,38,32,32 ) );
f9032263
RR
300 wxCanvasRect* rec3 = new wxCanvasRect(20,-20,50,170);
301 rec3->SetBrush(wxBrush(wxColour(0,120,240),wxSOLID));
302 rec3->SetPen(wxPen(wxColour(252,54,252 ),3,wxSOLID));
303 group1->Prepend( rec3 );
304
305 wxCanvasRect* rec2 = new wxCanvasRect(10,20,104,52);
306 rec2->SetBrush(wxBrush(wxColour(0,240,240),wxSOLID));
307 rec2->SetPen(wxPen(wxColour(210,40,50 ),1,wxSOLID));
308 group1->Prepend( rec2 );
309
310
311
312 wxPoint2DDouble* todraw2 = new wxPoint2DDouble[3];
313 todraw2[0].m_x=230;
314 todraw2[0].m_y=220;
315 todraw2[1].m_x=300;
316 todraw2[1].m_y=200;
317 todraw2[2].m_x=300;
318 todraw2[2].m_y=300;
319 wxCanvasPolyline* poly2= new wxCanvasPolyline(3,todraw2);
320 poly2->SetPen(wxPen(wxColour(200,0,64 ),4,wxDOT));
321 m_datatree->Prepend( poly2 );
322
323
fcbb6b37 324
fcbb6b37 325 //make another group of wxCanvasObjects
f9032263 326 wxCanvasObjectGroup* group2 = new wxCanvasObjectGroup(0,0);
fcbb6b37 327 group2->Prepend( new wxCanvasImage( image, 60,38,52,32 ) );
f9032263
RR
328 wxCanvasRect* rr = new wxCanvasRect(10,20,104,52,30);
329 rr->SetBrush(wxBrush(wxColour(10,17,255),wxHORIZONTAL_HATCH ));
330 rr->SetPen(wxPen(wxColour(9,115,64 ),4,wxSOLID));
331 group2->Prepend( rr );
332
fcbb6b37
KH
333
334 //this a reference to group2 put into group1
f9032263
RR
335 MywxCanvasObjectRef* m_subref = new MywxCanvasObjectRef(60,50, group2);
336 m_subref->SetRotation(35);
337 m_subref->SetRotation(0);
fcbb6b37
KH
338 group1->Prepend( m_subref );
339
fcbb6b37 340
f9032263
RR
341 wxPoint2DDouble* todraw = new wxPoint2DDouble[5];
342 todraw[0].m_x=-30;
343 todraw[0].m_y=-20;
344 todraw[1].m_x=100;
345 todraw[1].m_y=0;
346 todraw[2].m_x=100;
347 todraw[2].m_y=100;
348 todraw[3].m_x=50;
349 todraw[3].m_y=150;
350 todraw[4].m_x=0;
351 todraw[4].m_y=100;
352
353 wxCanvasPolygon* poly= new wxCanvasPolygon(5,todraw);
354 poly->SetBrush(wxBrush(wxColour(100,17,255),wxCROSSDIAG_HATCH ));
355 poly->SetPen(wxPen(wxColour(9,115,64 ),4,wxSOLID));
356 group1->Prepend( poly );
357
358 wxPoint2DDouble* todraw4 = new wxPoint2DDouble[4];
359
360 todraw4[0].m_x=-50;
361 todraw4[0].m_y=-30;
362 todraw4[1].m_x=-50;
363 todraw4[1].m_y=70;
364 todraw4[2].m_x=150;
365 todraw4[2].m_y=70;
366 todraw4[3].m_x=150;
367 todraw4[3].m_y=-30;
368
369 wxCanvasPolygon* poly5= new wxCanvasPolygon(4,todraw4);
370 poly5->SetBrush(wxBrush(wxColour(100,17,255),wxCROSSDIAG_HATCH ));
371// poly5->SetBrush(wxBrush(wxColour(100,17,255),wxSOLID ));
372// poly5->SetPen(wxPen(wxColour(9,115,64 ),1,wxSOLID));
373 poly5->SetPen(wxPen(wxColour(9,115,64 ),4,wxSOLID));
374 wxCanvasObjectGroup* group3 = new wxCanvasObjectGroup(0,0);
375 group3->Prepend( poly5 );
376
377 wxList* pointlist = new wxList();
378 wxPoint2DDouble* point = new wxPoint2DDouble(0,0);
379 pointlist->Append((wxObject*)point);
380 point = new wxPoint2DDouble(-300,100);
381 pointlist->Append((wxObject*)point);
382 point = new wxPoint2DDouble(-100,100);
383 pointlist->Append((wxObject*)point);
384 point = new wxPoint2DDouble(-100,0);
385 pointlist->Append((wxObject*)point);
386 point = new wxPoint2DDouble(-200,50);
387 pointlist->Append((wxObject*)point);
388
389 wxCanvasPolygonL* poly15= new wxCanvasPolygonL(pointlist,TRUE);
390 poly15->SetColour1(wxColour(250,78,216 ));
391 poly15->SetColour2(*wxRED);
392 poly15->SetBrush(wxBrush(gs_bmp36_mono));
393 poly15->SetTransParent(TRUE);
394 poly15->SetPen(wxPen(*wxRED,4,wxSOLID));
395 group1->Prepend( poly15 );
396
397 wxList* pointlist2 = new wxList();
398 wxPoint2DDouble* point2 = new wxPoint2DDouble(-400,100);
399 pointlist2->Append((wxObject*)point2);
400 point2 = new wxPoint2DDouble(-400,200);
401 pointlist2->Append((wxObject*)point2);
402 point2 = new wxPoint2DDouble(0,200);
403 pointlist2->Append((wxObject*)point2);
404 point2 = new wxPoint2DDouble(0,100);
405 pointlist2->Append((wxObject*)point2);
406 point2 = new wxPoint2DDouble(-200,175);
407 pointlist2->Append((wxObject*)point2);
408
409 wxCanvasPolylineL* poly16= new wxCanvasPolylineL(pointlist2,TRUE);
410 poly16->SetPen(wxPen(wxColour(9,115,64 ),4,wxSOLID));
411 m_datatree->Prepend( poly16 );
412
413
414 wxPoint2DDouble* todraw6 = new wxPoint2DDouble[5];
415 todraw6[0].m_x=50;
416 todraw6[0].m_y=305;
417 todraw6[1].m_x=-200;
418 todraw6[1].m_y=200;
419 todraw6[2].m_x=0;
420 todraw6[2].m_y=500;
421 todraw6[3].m_x=300;
422 todraw6[3].m_y=200;
423 todraw6[4].m_x=-300;
424 todraw6[4].m_y=-300;
425
426 wxCanvasPolygon* poly17= new wxCanvasPolygon(5,todraw6,TRUE);
427 poly17->SetBrush(wxBrush(wxColour(100,17,255),wxSOLID));
428 poly17->SetPen(wxPen(wxColour(10,17,25),16,wxLONG_DASH ));
429 poly17->SetColour1(*wxGREEN);
430 poly17->SetColour2(*wxRED);
431 poly17->SetGradient(TRUE,wxPen(wxColour(0,0,0),0,wxSOLID),0);
432 wxCanvasObjectRef* m_refc = new wxCanvasObjectRef(0,-200, poly17);
433 m_refc->SetRotation(90);
434 m_datatree->Prepend( m_refc );
435 wxCanvasObjectRef* m_refd = new wxCanvasObjectRef(200,-50, poly17);
436 m_refd->SetRotation(0);
437 m_datatree->Append( m_refd );
438
439 //now make two references to group1 into root group of the canvas
440 m_ref = new MywxCanvasObjectRef(350,-200, group1);
441 m_ref->SetRotation(25);
442 //TODO if rotation is 0 scaling is weird
443// m_ref->SetScale(2,3.2);
444 m_datatree->Append( m_ref );
445
446 group3->Prepend( m_ref );
447
448
449 //this a reference to group2 put into group1
450 MywxCanvasObjectRef* subref2 = new MywxCanvasObjectRef(20,130, group2);
451 subref2->SetRotation(15);
452 group3->Prepend( subref2 );
453 m_datatree->Prepend( subref2 );
454
455 m_ref2 = new MywxCanvasObjectRef(80,450, group1);
456 m_ref2->SetRotation(-35);
b5789150 457 m_ref2->SetDragMode(wxDRAG_RECTANGLE);
f9032263
RR
458 m_datatree->Prepend( m_ref2 );
459
460 wxCanvasCircle* cir = new wxCanvasCircle( -100, -150, 100 );
461 cir->SetBrush(wxBrush(wxColour(19,215,6),wxHORIZONTAL_HATCH ));
462 cir->SetPen(wxPen(wxColour(198,3,105 ),30,wxSOLID));
b5789150 463 cir->SetDragMode(wxDRAG_REDRAW);
f9032263
RR
464 m_datatree->Prepend( cir );
465
466 wxCanvasEllipse* elp = new wxCanvasEllipse( -100, 250, 100,300 );
467 elp->SetBrush(wxBrush(wxColour(100,17,55),wxVERTICAL_HATCH ));
468 elp->SetPen(wxPen(wxColour(2,255,6 ),10,wxDOT));
469 m_datatree->Prepend( elp );
470
471 wxCanvasEllipticArc* aelp = new wxCanvasEllipticArc( -230, 250, 100,300, 30,270 );
472 aelp->SetBrush(wxBrush(wxColour(100,17,155),wxSOLID ));
473 aelp->SetPen(wxPen(wxColour(1,215,6 ),10,wxSOLID));
474 m_datatree->Prepend( aelp );
475
476 //HOW BAD DO THINGS GET
477 int kk;
478 for (kk=0;kk<100;kk++)
479 {
480// MywxCanvasObjectRef* m_refx = new MywxCanvasObjectRef(180,50+kk*30, group1);
481// m_refx->SetRotation(-35);
482// m_datatree->Prepend( m_refx );
483 }
fcbb6b37 484
f9032263 485/*
239c1f50
RR
486 m_log = new wxTextCtrl( this, -1, "", wxPoint(0,0), wxSize(100,100), wxTE_MULTILINE );
487 wxLog *old_log = wxLog::SetActiveTarget( new wxLogTextCtrl( m_log ) );
488 delete old_log;
9f3b9298 489
239c1f50 490 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
9f3b9298 491
239c1f50
RR
492 topsizer->Add( m_canvas, 1, wxEXPAND );
493 topsizer->Add( m_log, 0, wxEXPAND );
d1f9b206 494
239c1f50
RR
495 SetAutoLayout( TRUE );
496 SetSizer( topsizer );
f9032263
RR
497*/
498
499 //fancy background
500 wxPoint2DDouble* todraw8 = new wxPoint2DDouble[4];
501 todraw8[0].m_x=-350;
502 todraw8[0].m_y=-350;
503 todraw8[1].m_x=-350;
504 todraw8[1].m_y=550;
505 todraw8[2].m_x=550;
506 todraw8[2].m_y=550;
507 todraw8[3].m_x=550;
508 todraw8[3].m_y=-350;
509
510 wxCanvasPolygon* poly18= new wxCanvasPolygon(4,todraw8);
511 poly18->SetPen(wxPen(wxColour(10,17,25),16,wxTRANSPARENT ));
512 poly18->SetColour1(wxColour(0,0,0));
513 poly18->SetColour2(wxColour(0,255,255));
514 poly18->SetGradient(TRUE,wxPen(wxColour(0,0,0),0,wxSOLID),0);
515
516 wxCanvasObjectRef* m_refb = new wxCanvasObjectRef(200,0, poly18);
517 m_refb->SetRotation(90);
518
519 m_datatree->Prepend( m_refb );
520
521/*
522 wxCanvasCircle* cir = new wxCanvasCircle( -100, -150, 100 );
523 cir->SetBrush(wxBrush(wxColour(19,215,6),wxHORIZONTAL_HATCH ));
524 cir->SetPen(wxPen(wxColour(198,3,105 ),30,wxSOLID));
525 m_datatree->Prepend( cir );
526*/
527 m_datatree->SetAdmin(&m_canvasadmin);
528 m_datatree->AppendEventHandler( m_eventhandler );
529 m_canvas1->SetRoot(m_datatree);
530
531 //wxCanvasObjectGroup* group3 = new wxCanvasObjectGroup(0,0);
532 // group3->Prepend( cir );
533
534 group3->SetAdmin(&m_canvasadmin);
535 m_canvas2->SetRoot(group3);
cba349dc 536
239c1f50 537 m_timer = new wxTimer( this );
f9032263 538 //m_timer->Start( 100, FALSE );
6a2c1874
RR
539}
540
541MyFrame::~MyFrame()
542{
f9032263
RR
543 m_datatree->RemoveLastEventHandler( FALSE );
544 delete m_eventhandler;
6a2c1874
RR
545 delete m_timer;
546}
547
f9032263
RR
548void MyFrame::Quit(wxCommandEvent& WXUNUSED(event) )
549{
550 Close(TRUE);
551}
552
553void MyFrame::SplitHorizontal(wxCommandEvent& WXUNUSED(event) )
554{
555 if ( m_splitter->IsSplit() )
556 m_splitter->Unsplit();
557 m_canvas1->Show(TRUE);
558 m_canvas2->Show(TRUE);
559 m_splitter->SplitHorizontally( m_canvas1, m_canvas2 );
560 UpdatePosition();
561}
562
563void MyFrame::SplitVertical(wxCommandEvent& WXUNUSED(event) )
564{
565 if ( m_splitter->IsSplit() )
566 m_splitter->Unsplit();
567 m_canvas1->Show(TRUE);
568 m_canvas2->Show(TRUE);
569 m_splitter->SplitVertically( m_canvas1, m_canvas2 );
570 UpdatePosition();
571}
572
573void MyFrame::Unsplit(wxCommandEvent& WXUNUSED(event) )
574{
575 if ( m_splitter->IsSplit() )
576 m_splitter->Unsplit();
577 SetStatusText("No splitter");
578}
579
580void MyFrame::SetMinSize(wxCommandEvent& WXUNUSED(event) )
581{
582 wxString str;
583 str.Printf( _T("%d"), m_splitter->GetMinimumPaneSize());
584 str = wxGetTextFromUser("Enter minimal size for panes:", "", str, this);
585 if ( str.IsEmpty() )
586 return;
587
588 int minsize = wxStrtol( str, (wxChar**)NULL, 10 );
589 m_splitter->SetMinimumPaneSize(minsize);
590 str.Printf( _T("Min pane size = %d"), minsize);
591 SetStatusText(str, 1);
592}
593
594void MyFrame::UpdateUIHorizontal(wxUpdateUIEvent& event)
595{
596 event.Enable( ( (!m_splitter->IsSplit()) || (m_splitter->GetSplitMode() != wxSPLIT_HORIZONTAL) ) );
597}
598
599void MyFrame::UpdateUIVertical(wxUpdateUIEvent& event)
600{
601 event.Enable( ( (!m_splitter->IsSplit()) || (m_splitter->GetSplitMode() != wxSPLIT_VERTICAL) ) );
602}
603
604void MyFrame::UpdateUIUnsplit(wxUpdateUIEvent& event)
605{
606 event.Enable( m_splitter->IsSplit() );
607}
608
609void MyFrame::UpdatePosition()
610{
611 wxString str;
612 str.Printf( "Sash position = %d", m_splitter->GetSashPosition());
613 SetStatusText(str);
614}
615
6a2c1874
RR
616void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) )
617{
618 Close( TRUE );
619}
620
621void MyFrame::OnTimer( wxTimerEvent &WXUNUSED(event) )
622{
f9032263
RR
623 m_sm1->MoveRelative( 1, 0);
624 m_sm2->MoveRelative( 1, 0);
625 m_sm3->MoveRelative( 1, 0);
626 m_sm4->MoveRelative( 2, 0);
627
628// m_ref->MoveRelative( 1, 0 );
629 m_ref2->MoveRelative( 2, 0 );
630 m_canvas1->UpdateNow();
631
632
6a2c1874
RR
633 wxWakeUpIdle();
634}
635
636void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) )
637{
638 (void)wxMessageBox( "wxCanvas demo\n"
f9032263 639 "Robert Roebling (c) 1998,2000 \n Modified by Klaas Holwerda 2000",
6a2c1874
RR
640 "About wxCanvas Demo", wxICON_INFORMATION | wxOK );
641}
642
f9032263
RR
643
644//------------------------------------------------
645// class MyCanvas
646//------------------------------------------------
647
648// the event tables connect the wxWindows events with the functions (event
649// handlers) which process them.
8636c073 650BEGIN_EVENT_TABLE(MyCanvas,wxVectorCanvas)
f9032263
RR
651 EVT_MOUSE_EVENTS (MyCanvas::OnMouseEvent)
652END_EVENT_TABLE()
653
654MyCanvas::MyCanvas(wxCanvasAdmin* admin, MySplitterWindow *parent, wxWindowID id,
655 const wxPoint &position, const wxSize& size, long style ) :
8636c073 656 wxVectorCanvas( admin, parent, id, position, size, style )
f9032263
RR
657{
658 m_parent=parent;
659}
660
661void MyCanvas::OnMouseEvent(wxMouseEvent& event)
662{
663 wxClientDC dc(this);
664 PrepareDC(dc);
665
666 wxPoint pos = event.GetPosition();
667
668 m_mouse_worldx = DeviceToLogicalX( pos.x );
669 m_mouse_worldy = DeviceToLogicalY( pos.y );
670
671 wxString str;
672 str.Printf( "Current mouse position: %f,%f", m_mouse_worldx, m_mouse_worldy );
673 m_parent->SetStatusText( str );
674
675 if (!event.m_controlDown && !GetCaptured())
676 {
677 if (event.LeftDown())
678 {
679 m_zoom_x1=m_zoom_x2=pos.x;
680 m_zoom_y1=m_zoom_y2=pos.y;
681 }
682 if (event.RightDown())
683 {
684 SetMappingScroll(m_virtm_minX,m_virtm_minY,m_virtm_maxX,m_virtm_maxY,0);
685 Update( 0,0, GetBufferWidth(), GetBufferHeight(), TRUE );
686 UpdateNow();
687 }
688 if (event.LeftUp())
689 {
690 m_zoom_x2=pos.x;
691 m_zoom_y2=pos.y;
692 double x_virt_min=DeviceToLogicalX(m_zoom_x1);
693 double y_virt_min=DeviceToLogicalY(m_zoom_y2);
694 double x_virt_max=DeviceToLogicalX(m_zoom_x2);
695 double y_virt_max=DeviceToLogicalY(m_zoom_y1);
696 SetMappingScroll(x_virt_min,y_virt_min,x_virt_max,y_virt_max,0);
697 Update( 0,0, GetBufferWidth(), GetBufferHeight(), TRUE );
698 UpdateNow();
699 }
700 if (event.Dragging()&& event.m_leftDown)
701 {
702 dc.SetLogicalFunction(wxINVERT);
703 dc.DrawRectangle(m_zoom_x1,m_zoom_y1,m_zoom_x2-m_zoom_x1,m_zoom_y2-m_zoom_y1 );
704 m_zoom_x2=pos.x;
705 m_zoom_y2=pos.y;
706 dc.DrawRectangle(m_zoom_x1,m_zoom_y1,m_zoom_x2-m_zoom_x1,m_zoom_y2-m_zoom_y1 );
707 }
708 }
709 else
710 {
8636c073 711 wxVectorCanvas::OnMouse(event);
f9032263
RR
712 }
713}
714
715
6a2c1874
RR
716//-----------------------------------------------------------------------------
717// MyApp
718//-----------------------------------------------------------------------------
719
f9032263
RR
720// main program
721
722IMPLEMENT_APP(MyApp)
723
6a2c1874
RR
724bool MyApp::OnInit()
725{
cba349dc 726 m_fontpath = getenv("TRUETYPE");
f9032263 727 m_fontpath = "c:/WINNT/Fonts/times.ttf";
cba349dc
VZ
728 if ( !m_fontpath )
729 {
730 wxLogError("Please set env var TRUETYPE to the path where times.ttf lives.");
731
732 return FALSE;
733
734 }
735
6a2c1874
RR
736#if wxUSE_LIBPNG
737 wxImage::AddHandler( new wxPNGHandler );
738#endif
739
f9032263 740 wxFrame *frame = new MyFrame((wxFrame *) NULL, "wxCanvas Example", wxPoint(0,0), wxSize(400,500));
6a2c1874
RR
741 frame->Show( TRUE );
742
f9032263
RR
743 SetTopWindow(frame);
744
6a2c1874
RR
745 return TRUE;
746}
747