]>
Commit | Line | Data |
---|---|---|
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 |
28 | BEGIN_EVENT_TABLE(MywxCanvasObjectRef,wxCanvasObjectRef) |
29 | EVT_MOUSE_EVENTS( MywxCanvasObjectRef::OnMouseEvent ) | |
30 | END_EVENT_TABLE() | |
6a2c1874 | 31 | |
f9032263 | 32 | IMPLEMENT_DYNAMIC_CLASS(MywxCanvasObjectRef, wxCanvasObjectRef) |
9f3b9298 | 33 | |
f9032263 RR |
34 | MywxCanvasObjectRef::MywxCanvasObjectRef(double x, double y,wxCanvasObjectGroup* group) |
35 | :wxCanvasObjectRef(x,y,group) | |
9f3b9298 | 36 | { |
f9032263 | 37 | } |
9f3b9298 | 38 | |
f9032263 RR |
39 | MywxCanvasObjectRef::MywxCanvasObjectRef() |
40 | :wxCanvasObjectRef(0,0,NULL) | |
41 | { | |
42 | } | |
9f3b9298 | 43 | |
f9032263 | 44 | MywxCanvasObjectRef::~MywxCanvasObjectRef() |
9f3b9298 KH |
45 | { |
46 | } | |
47 | ||
f9032263 | 48 | void 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 |
96 | BEGIN_EVENT_TABLE(MyEventHandler,wxEvtHandler) |
97 | EVT_MOUSE_EVENTS( MyEventHandler::OnMouseEvent ) | |
fcbb6b37 KH |
98 | END_EVENT_TABLE() |
99 | ||
f9032263 | 100 | MyEventHandler::MyEventHandler() |
fcbb6b37 KH |
101 | { |
102 | } | |
103 | ||
f9032263 | 104 | void 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 |
153 | class MyApp; |
154 | class MyCanvas; | |
fcbb6b37 | 155 | |
f9032263 RR |
156 | BEGIN_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) | |
169 | END_EVENT_TABLE() | |
6a2c1874 | 170 | |
f9032263 RR |
171 | // My frame constructor |
172 | MyFrame::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 | 237 | wxBitmap bitmap( smile_xpm ); |
a977709b | 238 | wxImage image( bitmap.ConvertToImage() ); |
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 | ||
541 | MyFrame::~MyFrame() | |
542 | { | |
f9032263 RR |
543 | m_datatree->RemoveLastEventHandler( FALSE ); |
544 | delete m_eventhandler; | |
6a2c1874 RR |
545 | delete m_timer; |
546 | } | |
547 | ||
f9032263 RR |
548 | void MyFrame::Quit(wxCommandEvent& WXUNUSED(event) ) |
549 | { | |
550 | Close(TRUE); | |
551 | } | |
552 | ||
553 | void 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 | ||
563 | void 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 | ||
573 | void MyFrame::Unsplit(wxCommandEvent& WXUNUSED(event) ) | |
574 | { | |
575 | if ( m_splitter->IsSplit() ) | |
576 | m_splitter->Unsplit(); | |
577 | SetStatusText("No splitter"); | |
578 | } | |
579 | ||
580 | void 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 | ||
594 | void MyFrame::UpdateUIHorizontal(wxUpdateUIEvent& event) | |
595 | { | |
596 | event.Enable( ( (!m_splitter->IsSplit()) || (m_splitter->GetSplitMode() != wxSPLIT_HORIZONTAL) ) ); | |
597 | } | |
598 | ||
599 | void MyFrame::UpdateUIVertical(wxUpdateUIEvent& event) | |
600 | { | |
601 | event.Enable( ( (!m_splitter->IsSplit()) || (m_splitter->GetSplitMode() != wxSPLIT_VERTICAL) ) ); | |
602 | } | |
603 | ||
604 | void MyFrame::UpdateUIUnsplit(wxUpdateUIEvent& event) | |
605 | { | |
606 | event.Enable( m_splitter->IsSplit() ); | |
607 | } | |
608 | ||
609 | void MyFrame::UpdatePosition() | |
610 | { | |
611 | wxString str; | |
612 | str.Printf( "Sash position = %d", m_splitter->GetSashPosition()); | |
613 | SetStatusText(str); | |
614 | } | |
615 | ||
6a2c1874 RR |
616 | void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) ) |
617 | { | |
618 | Close( TRUE ); | |
619 | } | |
620 | ||
621 | void 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 | ||
636 | void 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 | 650 | BEGIN_EVENT_TABLE(MyCanvas,wxVectorCanvas) |
f9032263 RR |
651 | EVT_MOUSE_EVENTS (MyCanvas::OnMouseEvent) |
652 | END_EVENT_TABLE() | |
653 | ||
654 | MyCanvas::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 | ||
661 | void 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 | ||
722 | IMPLEMENT_APP(MyApp) | |
723 | ||
6a2c1874 RR |
724 | bool 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 |