]> git.saurik.com Git - wxWidgets.git/blob - contrib/samples/canvas/test/test.cpp
Some more tests and mouse events for wxCanvas.
[wxWidgets.git] / contrib / samples / canvas / test / test.cpp
1 /*
2 * Program: canvas
3 *
4 * Author: Robert Roebling
5 *
6 * Copyright: (C) 1998, Robert Roebling
7 *
8 */
9 // For compilers that support precompilation, includes "wx/wx.h".
10 #include "wx/wxprec.h"
11
12 #ifdef __BORLANDC__
13 #pragma hdrstop
14 #endif
15
16 #ifndef WX_PRECOMP
17 #include "wx/wx.h"
18 #endif
19
20 #include <wx/image.h>
21 #include <wx/file.h>
22 #include <wx/timer.h>
23 #include <wx/log.h>
24 #include "wx/image.h"
25
26
27 #include "smile.xpm"
28
29 #include "wx/canvas/canvas.h"
30
31 // derived classes
32
33
34 class MywxCanvasImage: public wxCanvasImage
35 {
36 public:
37 MywxCanvasImage( const wxImage &image, double x, double y, double w, double h );
38
39 void MywxCanvasImage::OnMouse(wxMouseEvent &event);
40
41 DECLARE_EVENT_TABLE()
42 };
43
44 BEGIN_EVENT_TABLE(MywxCanvasImage,wxCanvasImage)
45 EVT_MOUSE_EVENTS( MywxCanvasImage::OnMouse )
46 END_EVENT_TABLE()
47
48 MywxCanvasImage::MywxCanvasImage( const wxImage &image, double x, double y, double w, double h )
49 :wxCanvasImage( image, x, y, w, h )
50 {
51 }
52
53 void MywxCanvasImage::OnMouse(wxMouseEvent &event)
54 {
55 static int dx=0;
56 static int dy=0;
57
58 int x = event.GetX();
59 int y = event.GetY();
60 if (event.LeftDown())
61 {
62 dx=x;
63 dy=y;
64 CaptureMouse();
65 }
66 else if (event.LeftUp())
67 {
68 ReleaseMouse();
69 }
70 else if (IsCapturedMouse())
71 {
72 Move(m_area.x+x-dx,m_area.y+y-dy);
73 m_owner->UpdateNow();
74 }
75 }
76
77 class MywxCanvasObjectGroupRef: public wxCanvasObjectGroupRef
78 {
79 public:
80 MywxCanvasObjectGroupRef(double x, double y, wxCanvasObjectGroup* group);
81
82 void OnMouse(wxMouseEvent &event);
83
84 DECLARE_EVENT_TABLE()
85 };
86
87 BEGIN_EVENT_TABLE(MywxCanvasObjectGroupRef,wxCanvasObjectGroupRef)
88 EVT_MOUSE_EVENTS( MywxCanvasObjectGroupRef::OnMouse )
89 END_EVENT_TABLE()
90
91 MywxCanvasObjectGroupRef::MywxCanvasObjectGroupRef(double x, double y,wxCanvasObjectGroup* group)
92 :wxCanvasObjectGroupRef(x,y,group)
93 {
94 }
95
96 void MywxCanvasObjectGroupRef::OnMouse(wxMouseEvent &event)
97 {
98 static int dx=0;
99 static int dy=0;
100
101 //new position of object
102 int x = m_owner->GetDeviceX( event.GetX());
103 int y = m_owner->GetDeviceY( event.GetY());
104
105 if (event.LeftDown())
106 {
107 dx=x;
108 dy=y;
109 CaptureMouse();
110 }
111 else if (event.LeftUp())
112 {
113 ReleaseMouse();
114 }
115 else if (IsCapturedMouse())
116 {
117 Move(m_x+x-dx,m_y+y-dy);
118 m_owner->UpdateNow();
119 }
120 }
121
122 class MyFrame;
123 class MyApp;
124
125 // MyFrame
126
127 class MyFrame: public wxFrame
128 {
129 public:
130 MyFrame();
131 ~MyFrame();
132
133 void OnAbout( wxCommandEvent &event );
134 void OnNewFrame( wxCommandEvent &event );
135 void OnQuit( wxCommandEvent &event );
136 void OnTimer( wxTimerEvent &event );
137
138 wxCanvas *m_canvas;
139 wxCanvasObject *m_sm1;
140 wxCanvasObject *m_sm2;
141 wxCanvasObject *m_sm3;
142 wxCanvasObject *m_sm4;
143
144 MywxCanvasObjectGroupRef *m_ref;
145 MywxCanvasObjectGroupRef *m_ref2;
146
147 wxTimer *m_timer;
148 wxTextCtrl *m_log;
149
150 private:
151 DECLARE_DYNAMIC_CLASS(MyFrame)
152 DECLARE_EVENT_TABLE()
153 };
154
155 // MyApp
156
157 class MyApp: public wxApp
158 {
159 public:
160 virtual bool OnInit();
161
162 const wxString& GetFontPath() const { return m_fontpath; }
163
164 private:
165 wxString m_fontpath;
166 };
167
168 // main program
169
170 IMPLEMENT_APP(MyApp)
171
172 // MyFrame
173
174 const int ID_QUIT = 108;
175 const int ID_ABOUT = 109;
176
177 IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame )
178
179 BEGIN_EVENT_TABLE(MyFrame,wxFrame)
180 EVT_MENU (ID_ABOUT, MyFrame::OnAbout)
181 EVT_MENU (ID_QUIT, MyFrame::OnQuit)
182 EVT_TIMER (-1, MyFrame::OnTimer)
183 END_EVENT_TABLE()
184
185 MyFrame::MyFrame()
186 : wxFrame( (wxFrame *)NULL, -1, "wxCanvas sample",
187 wxPoint(20,20), wxSize(470,460) )
188 {
189 wxMenu *file_menu = new wxMenu();
190 file_menu->Append( ID_ABOUT, "&About...");
191 file_menu->AppendSeparator();
192 file_menu->Append( ID_QUIT, "E&xit");
193
194 wxMenuBar *menu_bar = new wxMenuBar();
195 menu_bar->Append(file_menu, "&File");
196
197 SetMenuBar( menu_bar );
198
199 CreateStatusBar(2);
200 int widths[] = { -1, 100 };
201 SetStatusWidths( 2, widths );
202
203 m_canvas = new wxCanvas( this, -1, wxPoint(0,0), wxSize(10,10) );
204
205 m_canvas->SetArea( 1000,1000 );
206 m_canvas->SetColour( 255, 255, 255 );
207
208
209 wxBitmap bitmap( smile_xpm );
210 wxImage image( bitmap );
211
212 m_sm1 = new wxCanvasImage( image, 0,70,16,16 );
213 m_canvas->Append( m_sm1 );
214
215 int i;
216 for (i = 10; i < 300; i+=10)
217 m_canvas->Append( new wxCanvasRect( i,50,3,140, 255,0,0 ) );
218
219 m_sm2 = new wxCanvasImage( image, 0,140,24,24 );
220 m_canvas->Append( m_sm2 );
221
222 for (i = 15; i < 300; i+=10)
223 m_canvas->Append( new wxCanvasRect( i,50,3,140, 255,0,0 ) );
224
225 wxButton *button = new wxButton( m_canvas, -1, "Hello", wxPoint(80,50) );
226 m_canvas->Append( new wxCanvasControl( button ) );
227
228 m_canvas->Append( new wxCanvasText( "Hello", 180, 50,
229 wxGetApp().GetFontPath() + "/times.ttf", 20 ) );
230
231 m_sm3 = new wxCanvasImage( image, 0,210,32,32 );
232 m_canvas->Append( m_sm3 );
233
234 for (i = 10; i < 300; i+=10)
235 m_canvas->Append( new wxCanvasLine( 10,-15,i,300, 0,255,0 ) );
236
237 m_sm4 = new MywxCanvasImage( image, 0,270,64,32 );
238 m_canvas->Append( m_sm4 );
239
240
241 // m_canvas->Append( new wxCanvasLine( 10,-1500e6,50,300000e6, 0,255,0 ) );
242 // m_canvas->Append( new wxCanvasLine( 10,-150000,50,300000, 0,255,0 ) );
243
244 //make a group of wxCanvasObjects
245 wxCanvasObjectGroup* group1 = new wxCanvasObjectGroup();
246 group1->Prepend( new wxCanvasLine( 10,-35,50,190,100,255,0 ) );
247 group1->Prepend( new wxCanvasImage( image, 4,38,32,32 ) );
248 group1->Prepend( new wxCanvasRect(20,-20,50,170,0,20,240 ) );
249
250
251 //make another group of wxCanvasObjects
252 wxCanvasObjectGroup* group2 = new wxCanvasObjectGroup();
253 group2->Prepend( new wxCanvasImage( image, 60,38,52,32 ) );
254 group2->Prepend( new wxCanvasRect(10,20,104,52,10,40,10 ) );
255
256 //this a reference to group2 put into group1
257 wxCanvasObjectGroupRef* m_subref = new wxCanvasObjectGroupRef(60,50, group2);
258 group1->Prepend( m_subref );
259
260 //now make two refrences to group1 into root group of the canvas
261 /*
262 m_ref = new MywxCanvasObjectGroupRef(40,200, group1);
263 m_canvas->Prepend( m_ref );
264 */
265
266 m_ref2 = new MywxCanvasObjectGroupRef(80,350, group1);
267 m_canvas->Prepend( m_ref2 );
268
269 m_log = new wxTextCtrl( this, -1, "", wxPoint(0,0), wxSize(100,100), wxTE_MULTILINE );
270 wxLog *old_log = wxLog::SetActiveTarget( new wxLogTextCtrl( m_log ) );
271 delete old_log;
272
273 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
274
275 topsizer->Add( m_canvas, 1, wxEXPAND );
276 topsizer->Add( m_log, 0, wxEXPAND );
277
278 SetAutoLayout( TRUE );
279 SetSizer( topsizer );
280
281 m_timer = new wxTimer( this );
282 m_timer->Start( 100, FALSE );
283 }
284
285 MyFrame::~MyFrame()
286 {
287 delete m_timer;
288 }
289
290 void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) )
291 {
292 Close( TRUE );
293 }
294
295 void MyFrame::OnTimer( wxTimerEvent &WXUNUSED(event) )
296 {
297 m_sm1->Move( m_sm1->GetX()+1, m_sm1 ->GetY() );
298 m_sm2->Move( m_sm2->GetX()+1, m_sm2->GetY() );
299 m_sm3->Move( m_sm3->GetX()+1, m_sm3->GetY() );
300 m_sm4->Move( m_sm4->GetX()+2, m_sm4->GetY() );
301 /*
302 m_ref->Move( m_ref->GetPosX()+1, m_ref->GetPosY() );
303 m_ref2->Move( m_ref2->GetPosX()+2, m_ref2->GetPosY() );
304 */
305
306 wxWakeUpIdle();
307 }
308
309 void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) )
310 {
311 (void)wxMessageBox( "wxCanvas demo\n"
312 "Robert Roebling (c) 1998,2000",
313 "About wxCanvas Demo", wxICON_INFORMATION | wxOK );
314 }
315
316 //-----------------------------------------------------------------------------
317 // MyApp
318 //-----------------------------------------------------------------------------
319
320 bool MyApp::OnInit()
321 {
322 m_fontpath = getenv("TRUETYPE");
323 if ( !m_fontpath )
324 {
325 wxLogError("Please set env var TRUETYPE to the path where times.ttf lives.");
326
327 return FALSE;
328
329 }
330
331 #if wxUSE_LIBPNG
332 wxImage::AddHandler( new wxPNGHandler );
333 #endif
334
335 wxFrame *frame = new MyFrame();
336 frame->Show( TRUE );
337
338 return TRUE;
339 }
340
341