]>
Commit | Line | Data |
---|---|---|
6a2c1874 RR |
1 | ///////////////////////////////////////////////////////////////////////////// |
2 | // Name: canvas.h | |
3 | // Author: Robert Roebling | |
4 | // Created: XX/XX/XX | |
5 | // Copyright: 2000 (c) Robert Roebling | |
6 | // Licence: wxWindows Licence | |
7 | ///////////////////////////////////////////////////////////////////////////// | |
8 | ||
9 | #ifndef __WXCANVAS_H__ | |
10 | #define __WXCANVAS_H__ | |
11 | ||
12 | #ifdef __GNUG__ | |
13 | #pragma interface "canvas.cpp" | |
14 | #endif | |
15 | ||
16 | #ifndef WX_PRECOMP | |
17 | #include "wx/wx.h" | |
18 | #endif | |
19 | ||
20 | #include "wx/image.h" | |
21 | #include "wx/txtstrm.h" | |
5143c96b | 22 | #include "wx/geometry.h" |
09cc749c RR |
23 | #include "wx/matrix.h" |
24 | #include "bbox.h" | |
5143c96b | 25 | |
dc16900b | 26 | |
33ebcd80 RR |
27 | //---------------------------------------------------------------------------- |
28 | // decls | |
29 | //---------------------------------------------------------------------------- | |
30 | ||
33ebcd80 | 31 | class wxCanvas; |
09cc749c | 32 | class wxCanvasAdmin; |
6a2c1874 RR |
33 | |
34 | //---------------------------------------------------------------------------- | |
35 | // wxCanvasObject | |
36 | //---------------------------------------------------------------------------- | |
b5789150 RR |
37 | enum wxDRAG_MODE |
38 | { | |
39 | wxDRAG_RECTANGLE, | |
40 | wxDRAG_ONTOP, | |
41 | wxDRAG_REDRAW | |
42 | }; | |
09cc749c RR |
43 | |
44 | //:defenition | |
45 | // wxCanvasObject is the base class for Canvas Objects. | |
46 | // All Objects for drawing one the canvas are derived from this class. | |
47 | // It supports dragging and moving methods that can be used in derived | |
48 | // classes for defining several ways of dragging. | |
49 | // Also it is possible to plug in events handlers to do this for all derived classes at once. | |
50 | // | |
51 | // wxCanvasObjects have themselves as their event handlers by default, | |
52 | // but their event handlers could be set to another object entirely. This | |
53 | // separation can reduce the amount of derivation required, and allow | |
54 | // alteration of a wxCanvasObject functionality | |
6a2c1874 RR |
55 | class wxCanvasObject: public wxEvtHandler |
56 | { | |
57 | public: | |
dc16900b | 58 | |
09cc749c | 59 | wxCanvasObject(); |
1e1af41e | 60 | |
09cc749c RR |
61 | //If the position (x,y) is within the object this return a pointer to the object |
62 | //Normally this function needs to be defined for each derived wxCanvasObject. | |
63 | //The default is a simple bounding box test. | |
64 | virtual wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 ); | |
65 | ||
66 | //render this object to the canvas (either on its buffer or directly on the canvas) | |
67 | //this depends on the wxDC that is set for the active canvas. | |
68 | virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height ); | |
69 | ||
70 | //x position in world coordinates of the object | |
71 | virtual double GetPosX()=0; | |
72 | //y position in world coordinates of the object | |
73 | virtual double GetPosY()=0; | |
74 | ||
75 | //set position in world coordinates for the object | |
76 | virtual void SetPosXY( double x, double y)=0; | |
77 | ||
78 | //absolute moving the object to position x,y in world coordinates | |
79 | //also does an update of the old and new area | |
80 | virtual void MoveAbsolute( double x, double y ); | |
81 | ||
82 | //relative moving the object to position x,y in world coordinates | |
83 | //also does an update of the old and new area | |
84 | virtual void MoveRelative( double x, double y ); | |
85 | ||
86 | //relative translate the object to position x,y in world coordinates | |
87 | //does NOT update the old and new area | |
88 | //this function must be defined for each derived object, | |
89 | //it is used internally for dragging and moving objects. | |
90 | virtual void TransLate( double x, double y )=0; | |
91 | ||
92 | //choose one of the three diffrenet drag methods | | |
93 | //DRAG_RECTANGLE = as a rectangle when drag is in progress | | |
94 | //DRAG_ONTOP = only redraw the object when dragging | | |
95 | //DRAG_REDRAW = redraw the damaged areas when dragging | |
b5789150 | 96 | void SetDragMode(wxDRAG_MODE mode) { m_dragmode=mode; }; |
09cc749c RR |
97 | |
98 | //return the dragmode | |
b5789150 | 99 | wxDRAG_MODE GetDragMode() { return m_dragmode; }; |
09cc749c RR |
100 | |
101 | //called when starting a drag | |
102 | virtual void DragStart(); | |
103 | //called when dragging is in progress | |
104 | virtual void DragRelative( double x, double y); | |
105 | //called when dragging is ended | |
106 | virtual void DragEnd(); | |
107 | ||
108 | //return the object if it is part of the given object or | |
109 | //if the given object is part of a group within this object. | |
110 | //For group objects this means recursively search for it. | |
111 | virtual wxCanvasObject* Contains( wxCanvasObject* obj ); | |
112 | ||
113 | //calculate the boundingbox in world coordinates | |
114 | virtual void CalcBoundingBox()=0; | |
115 | ||
116 | //write the object as SVG (scalable vector grafhics | |
6a2c1874 | 117 | virtual void WriteSVG( wxTextOutputStream &stream ); |
dc16900b | 118 | |
09cc749c RR |
119 | //get the administrator for the object, |
120 | //this will give access to the canvas's where it is displayed upon. | |
121 | //It is used to render the object to the active canvas. | |
122 | //Conversion from world to Device coordinates and visa versa is | |
123 | //done using the Active canvas at that moment. | |
124 | wxCanvasAdmin *GetAdmin() { return m_admin; } | |
125 | ||
126 | //set the administrator | |
127 | virtual void SetAdmin( wxCanvasAdmin *admin ) { m_admin = admin; } | |
dc16900b | 128 | |
09cc749c | 129 | //is this a control type of canvas object |
6a2c1874 | 130 | bool IsControl() { return m_isControl; } |
09cc749c | 131 | //is this a vector type of canvas object |
6a2c1874 | 132 | bool IsVector() { return m_isVector; } |
09cc749c | 133 | //is this an Image type of canvas object |
6a2c1874 | 134 | bool IsImage() { return m_isImage; } |
6a2c1874 | 135 | |
09cc749c RR |
136 | //get minimum X of the boundingbox in world coordinates |
137 | inline double GetXMin() { return m_bbox.GetMinX(); } | |
138 | //get minimum Y of the boundingbox in world coordinates | |
139 | inline double GetYMin() { return m_bbox.GetMinY(); } | |
140 | //get maximum X of the boundingbox in world coordinates | |
141 | inline double GetXMax() { return m_bbox.GetMaxX(); } | |
142 | //get maximum Y of the boundingbox in world coordinates | |
143 | inline double GetYMax() { return m_bbox.GetMaxY(); } | |
144 | ||
145 | //get boundingbox | |
146 | inline wxBoundingBox GetBbox() { return m_bbox; } | |
147 | ||
148 | //redirect all mouse events for the canvas to this object | |
dc16900b | 149 | void CaptureMouse(); |
09cc749c | 150 | //release the mouse capture for this object |
dc16900b | 151 | void ReleaseMouse(); |
09cc749c | 152 | //is the mouse captured for this object |
dc16900b KH |
153 | bool IsCapturedMouse(); |
154 | ||
09cc749c RR |
155 | //set if this object will visible (be rendered or not) |
156 | inline void SetVisible(bool visible) { m_visible=visible; } | |
157 | //get visibility | |
158 | inline bool GetVisible() {return m_visible; } | |
159 | ||
160 | //can the object be dragged | |
161 | inline void SetDraggable(bool drag) { m_dragable=drag; } | |
162 | //get if the object can be dragged | |
163 | inline bool GetDraggable() {return m_dragable; } | |
164 | ||
165 | //get absolute area in the device coordinates where the object | |
166 | //its boundingbox in world coordinates is first translated using the matrix. | |
167 | wxRect GetAbsoluteArea(const wxTransformMatrix& cworld); | |
168 | ||
169 | //get currently used eventhandler (always the first in the list) | |
170 | wxEvtHandler *GetEventHandler() const { return m_eventHandler; } | |
171 | ||
172 | //process an event for the object, starting with the first eventhandler | |
173 | // in the list. | |
174 | bool ProcessCanvasObjectEvent(wxEvent& event); | |
175 | ||
176 | // push/pop event handler: allows to chain a custom event handler to | |
177 | // already existing ones | |
178 | void PushEventHandler( wxEvtHandler *handler ); | |
179 | ||
180 | //remove first eventhandler in the list (one will be always stay in) | |
181 | wxEvtHandler *PopEventHandler( bool deleteHandler = FALSE ); | |
182 | //append an eventhandler to the list, this event handler will be called | |
183 | //if the other skipped the event to process. | |
184 | void AppendEventHandler(wxEvtHandler *handler); | |
185 | //remove last event handler in the list (one will always stay in) | |
186 | wxEvtHandler *RemoveLastEventHandler(bool deleteHandler); | |
187 | ||
6a2c1874 | 188 | protected: |
fcbb6b37 | 189 | |
09cc749c RR |
190 | //administator for rendering and accessing the canvas's |
191 | wxCanvasAdmin* m_admin; | |
dc16900b | 192 | |
09cc749c RR |
193 | //active event handler, default the object itself |
194 | wxEvtHandler* m_eventHandler; | |
6a2c1874 | 195 | |
09cc749c RR |
196 | bool m_isControl:1; |
197 | bool m_isVector:1; | |
198 | bool m_isImage:1; | |
199 | bool m_visible:1; | |
200 | bool m_dragable:1; | |
b5789150 | 201 | wxDRAG_MODE m_dragmode:3; |
fcbb6b37 | 202 | |
09cc749c RR |
203 | //boundingbox in world coordinates |
204 | wxBoundingBox m_bbox; | |
205 | ||
206 | //used for dragging | |
207 | wxBitmap m_atnewpos; | |
208 | }; | |
209 | ||
210 | //:defenition | |
211 | // wxCanvasObjectGroup is a container for wxCanvas derived Objects. | |
212 | // It renders itself by calling the render methods of the wxCanvasObjects it contains. | |
213 | // It can have nested groups also, in the same way as the other wxCanvasObjects it already contains. | |
214 | // The group has a matrix to position/rotate/scale the group. | |
215 | class wxCanvasObjectGroup: public wxCanvasObject | |
fcbb6b37 KH |
216 | { |
217 | public: | |
09cc749c | 218 | wxCanvasObjectGroup(double x, double y); |
21840a6c | 219 | virtual ~wxCanvasObjectGroup(); |
fcbb6b37 | 220 | |
09cc749c | 221 | void SetAdmin(wxCanvasAdmin* admin); |
fcbb6b37 | 222 | |
09cc749c | 223 | //prepend a wxCanvasObject to this group |
fcbb6b37 | 224 | virtual void Prepend( wxCanvasObject* obj ); |
09cc749c | 225 | //append a wxCanvasObject to this group |
fcbb6b37 | 226 | virtual void Append( wxCanvasObject* obj ); |
09cc749c | 227 | //insert a wxCanvasObject to this group |
fcbb6b37 | 228 | virtual void Insert( size_t before, wxCanvasObject* obj ); |
09cc749c | 229 | //remove the given object from the group |
fcbb6b37 KH |
230 | virtual void Remove( wxCanvasObject* obj ); |
231 | ||
09cc749c RR |
232 | //those this group contain the given object. |
233 | //in case of nested groups also search in there to the lowwest level. | |
234 | virtual wxCanvasObject* Contains( wxCanvasObject* obj ); | |
235 | ||
236 | //returns index of the given wxCanvasObject in this group | |
237 | virtual int IndexOf( wxCanvasObject* obj ); | |
fcbb6b37 | 238 | |
09cc749c RR |
239 | double GetPosX() { return lworld.GetValue(2,0); } |
240 | double GetPosY() { return lworld.GetValue(2,1); } | |
241 | void SetPosXY( double x, double y) {lworld.SetValue(2,0,x);lworld.SetValue(2,1,y);CalcBoundingBox();}; | |
fcbb6b37 | 242 | |
09cc749c RR |
243 | void TransLate( double x, double y ); |
244 | ||
245 | void CalcBoundingBox(); | |
246 | //remove all wxCanvasObjects from the group (flag for deletion of the objectsalso) | |
247 | void DeleteContents( bool ); | |
248 | virtual void Render(wxTransformMatrix* cworld,int x, int y, int width, int height ); | |
249 | virtual void WriteSVG( wxTextOutputStream &stream ); | |
250 | ||
251 | //recursive call the IsHitWorld on all contained objects, the first | |
252 | //one that is hit will be returned | |
253 | wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 ); | |
254 | ||
255 | //recursive calls for contained objects to set eventhandlers, | |
256 | //and also sets its own eventhandler | |
257 | void PushEventHandler( wxEvtHandler *handler ); | |
258 | //recursive calls for contained objects to set eventhandlers, | |
259 | //and also sets its own eventhandler | |
260 | wxEvtHandler *PopEventHandler( bool deleteHandler = FALSE ); | |
261 | //recursive calls for contained objects to set eventhandlers, | |
262 | //and also sets its own eventhandler | |
263 | void AppendEventHandler(wxEvtHandler *handler); | |
264 | //recursive calls for contained objects to set eventhandlers, | |
265 | //and also sets its own eventhandler | |
266 | wxEvtHandler *RemoveLastEventHandler(bool deleteHandler); | |
fcbb6b37 KH |
267 | |
268 | protected: | |
fcbb6b37 | 269 | |
09cc749c RR |
270 | //to position the object |
271 | wxTransformMatrix lworld; | |
fcbb6b37 KH |
272 | |
273 | wxList m_objects; | |
274 | ||
275 | friend class wxCanvas; | |
276 | }; | |
277 | ||
09cc749c RR |
278 | //:defenition |
279 | // wxCanvasObjectRef is a reference to any wxCanvasObject derived class. | |
280 | // It does not duplicate the referenced object. | |
281 | // It has a matrix to reposition/rotate/scale the object it references. | |
282 | // The position/matrix of the referenced Object is accumulated with the one here. | |
283 | class wxCanvasObjectRef: public wxCanvasObject | |
fcbb6b37 KH |
284 | { |
285 | public: | |
09cc749c | 286 | wxCanvasObjectRef(double x, double y,wxCanvasObject* obj); |
fcbb6b37 | 287 | |
09cc749c RR |
288 | //set rotation for the reference |
289 | void SetRotation(double rotation); | |
fcbb6b37 | 290 | |
09cc749c RR |
291 | //set scale in x and y ( > zero) |
292 | void SetScale( double scalex, double scaley ); | |
fcbb6b37 | 293 | |
09cc749c | 294 | void SetAdmin(wxCanvasAdmin* admin); |
fcbb6b37 | 295 | |
09cc749c RR |
296 | double GetPosX() { return lworld.GetValue(2,0); } |
297 | double GetPosY() { return lworld.GetValue(2,1); } | |
298 | void SetPosXY( double x, double y) {lworld.SetValue(2,0,x);lworld.SetValue(2,1,y);CalcBoundingBox();}; | |
fcbb6b37 | 299 | |
09cc749c RR |
300 | void TransLate( double x, double y ); |
301 | void CalcBoundingBox(); | |
302 | virtual void Render(wxTransformMatrix* cworld,int x, int y, int width, int height ); | |
303 | virtual void WriteSVG( wxTextOutputStream &stream ); | |
fcbb6b37 | 304 | |
09cc749c RR |
305 | //return this object if one of the objects it references is hit |
306 | wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 ); | |
307 | virtual wxCanvasObject* Contains( wxCanvasObject* obj ); | |
308 | ||
309 | //recursive calls for contained objects to set eventhandlers, | |
310 | //and also sets its own eventhandler | |
311 | void PushEventHandler( wxEvtHandler *handler ); | |
312 | //recursive calls for contained objects to set eventhandlers, | |
313 | //and also sets its own eventhandler | |
314 | wxEvtHandler *PopEventHandler( bool deleteHandler = FALSE ); | |
315 | //recursive calls for contained objects to set eventhandlers, | |
316 | //and also sets its own eventhandler | |
317 | void AppendEventHandler(wxEvtHandler *handler); | |
318 | //recursive calls for contained objects to set eventhandlers, | |
319 | //and also sets its own eventhandler | |
320 | wxEvtHandler *RemoveLastEventHandler(bool deleteHandler); | |
fcbb6b37 | 321 | |
09cc749c | 322 | protected: |
fcbb6b37 | 323 | |
09cc749c RR |
324 | //to position the object |
325 | wxTransformMatrix lworld; | |
fcbb6b37 | 326 | |
09cc749c RR |
327 | //reference to another wxCanvasObject |
328 | wxCanvasObject* m_obj; | |
329 | }; | |
5143c96b | 330 | |
09cc749c RR |
331 | //:defenition |
332 | // wxCanvasRect | |
333 | class wxCanvasRect: public wxCanvasObject | |
5143c96b KH |
334 | { |
335 | public: | |
09cc749c RR |
336 | wxCanvasRect( double x, double y, double w, double h , double radius=0 ); |
337 | void SetBrush( const wxBrush& brush) { m_brush = brush; }; | |
338 | void SetPen( const wxPen& pen) { m_pen = pen; CalcBoundingBox(); }; | |
5143c96b | 339 | |
09cc749c RR |
340 | double GetPosX() { return m_x; } |
341 | double GetPosY() { return m_y; } | |
342 | void SetPosXY( double x, double y) {m_x=x; m_y=y; CalcBoundingBox();}; | |
5143c96b | 343 | |
09cc749c RR |
344 | void TransLate( double x, double y ); |
345 | void CalcBoundingBox(); | |
346 | ||
347 | virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height ); | |
5143c96b KH |
348 | virtual void WriteSVG( wxTextOutputStream &stream ); |
349 | ||
350 | private: | |
5143c96b | 351 | wxPen m_pen; |
09cc749c | 352 | wxBrush m_brush; |
5143c96b | 353 | |
09cc749c RR |
354 | double m_x; |
355 | double m_y; | |
356 | double m_width; | |
357 | double m_height; | |
358 | double m_radius; | |
5143c96b KH |
359 | }; |
360 | ||
361 | //---------------------------------------------------------------------------- | |
09cc749c | 362 | // wxCanvasCircle |
5143c96b | 363 | //---------------------------------------------------------------------------- |
09cc749c | 364 | class wxCanvasCircle: public wxCanvasObject |
5143c96b KH |
365 | { |
366 | public: | |
09cc749c RR |
367 | wxCanvasCircle( double x, double y, double radius ); |
368 | void SetBrush( const wxBrush& brush) { m_brush = brush; }; | |
369 | void SetPen( const wxPen& pen) { m_pen = pen; CalcBoundingBox(); }; | |
370 | ||
371 | double GetPosX() { return m_x; } | |
372 | double GetPosY() { return m_y; } | |
373 | void SetPosXY( double x, double y) {m_x=x; m_y=y;CalcBoundingBox(); }; | |
5143c96b | 374 | |
09cc749c | 375 | void TransLate( double x, double y ); |
5143c96b | 376 | |
09cc749c RR |
377 | void CalcBoundingBox(); |
378 | ||
379 | virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height ); | |
5143c96b KH |
380 | virtual void WriteSVG( wxTextOutputStream &stream ); |
381 | ||
09cc749c | 382 | wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 ); |
5143c96b | 383 | |
09cc749c | 384 | private: |
5143c96b | 385 | wxPen m_pen; |
09cc749c RR |
386 | wxBrush m_brush; |
387 | ||
388 | double m_x; | |
389 | double m_y; | |
390 | double m_radius; | |
391 | }; | |
5143c96b | 392 | |
09cc749c RR |
393 | //:defenition |
394 | // wxCanvasEllipse | |
395 | class wxCanvasEllipse: public wxCanvasObject | |
396 | { | |
397 | public: | |
398 | wxCanvasEllipse( double x, double y, double width, double height ); | |
399 | void SetBrush( const wxBrush& brush) { m_brush = brush; }; | |
400 | void SetPen( const wxPen& pen) { m_pen = pen; CalcBoundingBox(); }; | |
5143c96b | 401 | |
09cc749c RR |
402 | double GetPosX() { return m_x; } |
403 | double GetPosY() { return m_y; } | |
404 | void SetPosXY( double x, double y) {m_x=x; m_y=y; CalcBoundingBox();}; | |
5143c96b | 405 | |
09cc749c | 406 | void TransLate( double x, double y ); |
5143c96b | 407 | |
09cc749c | 408 | void CalcBoundingBox(); |
5143c96b | 409 | |
09cc749c RR |
410 | virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height ); |
411 | virtual void WriteSVG( wxTextOutputStream &stream ); | |
5143c96b | 412 | |
09cc749c | 413 | wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 ); |
21544859 | 414 | |
09cc749c RR |
415 | private: |
416 | wxPen m_pen; | |
417 | wxBrush m_brush; | |
418 | ||
419 | double m_x; | |
420 | double m_y; | |
421 | double m_width; | |
422 | double m_height; | |
423 | }; | |
424 | ||
425 | //:defenition | |
426 | // wxCanvasEllipticArc | |
427 | class wxCanvasEllipticArc: public wxCanvasObject | |
21544859 RR |
428 | { |
429 | public: | |
09cc749c RR |
430 | wxCanvasEllipticArc( double x, double y, double width, double height, double start, double end ); |
431 | void SetBrush( const wxBrush& brush) { m_brush = brush; }; | |
432 | void SetPen( const wxPen& pen) { m_pen = pen; CalcBoundingBox(); }; | |
433 | ||
434 | double GetPosX() { return m_x; } | |
435 | double GetPosY() { return m_y; } | |
436 | void SetPosXY( double x, double y) {m_x=x; m_y=y; CalcBoundingBox();}; | |
dc16900b | 437 | |
09cc749c RR |
438 | void TransLate( double x, double y ); |
439 | void CalcBoundingBox(); | |
dc16900b | 440 | |
09cc749c | 441 | virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height ); |
21544859 | 442 | virtual void WriteSVG( wxTextOutputStream &stream ); |
dc16900b | 443 | |
09cc749c RR |
444 | wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 ); |
445 | ||
21544859 | 446 | private: |
27d1065d RR |
447 | wxPen m_pen; |
448 | wxBrush m_brush; | |
449 | ||
4dbd4ee6 RR |
450 | double m_x; |
451 | double m_y; | |
452 | double m_width; | |
dc16900b | 453 | double m_height; |
09cc749c RR |
454 | double m_start; |
455 | double m_end; | |
21544859 RR |
456 | }; |
457 | ||
09cc749c | 458 | //:defenition |
239c1f50 | 459 | // wxCanvasLine |
239c1f50 RR |
460 | class wxCanvasLine: public wxCanvasObject |
461 | { | |
462 | public: | |
27d1065d | 463 | wxCanvasLine( double x1, double y1, double x2, double y2 ); |
09cc749c RR |
464 | void SetPen( const wxPen& pen) { m_pen = pen; CalcBoundingBox(); }; |
465 | ||
466 | ||
467 | double GetPosX() { return m_x1; } | |
468 | double GetPosY() { return m_y1; } | |
469 | void SetPosXY( double x, double y) {m_x1=x; m_y1=y; CalcBoundingBox();}; | |
dc16900b | 470 | |
09cc749c | 471 | void TransLate( double x, double y ); |
dc16900b | 472 | |
09cc749c RR |
473 | void CalcBoundingBox(); |
474 | ||
475 | virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height ); | |
239c1f50 | 476 | virtual void WriteSVG( wxTextOutputStream &stream ); |
09cc749c RR |
477 | |
478 | wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 ); | |
479 | ||
239c1f50 | 480 | private: |
27d1065d RR |
481 | wxPen m_pen; |
482 | ||
4dbd4ee6 RR |
483 | double m_x1; |
484 | double m_y1; | |
485 | double m_x2; | |
486 | double m_y2; | |
239c1f50 RR |
487 | }; |
488 | ||
09cc749c | 489 | //:defenition |
6a2c1874 | 490 | // wxCanvasImage |
6a2c1874 RR |
491 | class wxCanvasImage: public wxCanvasObject |
492 | { | |
493 | public: | |
4dbd4ee6 | 494 | wxCanvasImage( const wxImage &image, double x, double y, double w, double h ); |
09cc749c RR |
495 | |
496 | double GetPosX() { return m_x; } | |
497 | double GetPosY() { return m_y; } | |
880d870e | 498 | void SetPosXY( double x, double y); |
09cc749c RR |
499 | |
500 | void TransLate( double x, double y ); | |
501 | ||
502 | void CalcBoundingBox(); | |
503 | ||
504 | virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height ); | |
6a2c1874 | 505 | virtual void WriteSVG( wxTextOutputStream &stream ); |
09cc749c | 506 | |
6a2c1874 | 507 | private: |
4dbd4ee6 RR |
508 | double m_x; |
509 | double m_y; | |
510 | double m_width; | |
511 | double m_height; | |
09cc749c | 512 | |
6a2c1874 | 513 | wxImage m_image; |
09cc749c | 514 | int m_orgw,m_orgh; |
880d870e RR |
515 | |
516 | // cache | |
517 | wxBitmap m_cBitmap; | |
518 | wxImage m_cImage; | |
519 | int m_cW; | |
520 | int m_cH; | |
521 | double m_cR; | |
6a2c1874 RR |
522 | }; |
523 | ||
3b111dbe RR |
524 | //---------------------------------------------------------------------------- |
525 | // wxCanvasControl | |
526 | //---------------------------------------------------------------------------- | |
527 | ||
528 | class wxCanvasControl: public wxCanvasObject | |
529 | { | |
530 | public: | |
531 | wxCanvasControl( wxWindow *control ); | |
532 | ~wxCanvasControl(); | |
09cc749c RR |
533 | |
534 | double GetPosX(); | |
535 | double GetPosY(); | |
536 | void SetPosXY( double x, double y); | |
537 | ||
538 | void TransLate( double x, double y ); | |
539 | void MoveRelative( double x, double y ); | |
540 | ||
541 | void CalcBoundingBox(); | |
542 | ||
3b111dbe RR |
543 | private: |
544 | wxWindow *m_control; | |
545 | }; | |
546 | ||
09cc749c | 547 | //:defenition |
d1f9b206 | 548 | // wxCanvasText |
d1f9b206 RR |
549 | class wxCanvasText: public wxCanvasObject |
550 | { | |
551 | public: | |
4dbd4ee6 | 552 | wxCanvasText( const wxString &text, double x, double y, const wxString &foneFile, int size ); |
d1f9b206 | 553 | ~wxCanvasText(); |
dc16900b | 554 | |
09cc749c RR |
555 | double GetPosX() { return m_x; } |
556 | double GetPosY() { return m_y; } | |
557 | void SetPosXY( double x, double y) {m_x=x; m_y=y;CalcBoundingBox(); }; | |
dc16900b | 558 | |
09cc749c RR |
559 | void TransLate( double x, double y ); |
560 | ||
561 | void CalcBoundingBox(); | |
562 | ||
563 | virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height ); | |
d1f9b206 | 564 | virtual void WriteSVG( wxTextOutputStream &stream ); |
09cc749c | 565 | |
d1f9b206 RR |
566 | void SetRGB( unsigned char red, unsigned char green, unsigned char blue ); |
567 | void SetFlag( int flag ); | |
239c1f50 | 568 | int GetFlag() { return m_flag; } |
dc16900b | 569 | |
d1f9b206 RR |
570 | private: |
571 | wxString m_text; | |
4dbd4ee6 RR |
572 | double m_x; |
573 | double m_y; | |
d1f9b206 RR |
574 | unsigned char *m_alpha; |
575 | void *m_faceData; | |
576 | int m_flag; | |
577 | int m_red; | |
578 | int m_green; | |
579 | int m_blue; | |
cb281cfc RR |
580 | wxString m_fontFileName; |
581 | int m_size; | |
d1f9b206 RR |
582 | }; |
583 | ||
09cc749c RR |
584 | //:defenition |
585 | // wxCanvas is used to display a wxCanvasGroupObject, which contains wxCanvasObject derived | |
586 | // drawable objects. The group to draw is called the root. | |
587 | // All objects are defined in world coordinates, relative to its parent (e.g. nested groups) | |
588 | // There are methods to convert from world to device coordinates and visa versa. | |
589 | // Rendering a draw is normally started on the root, it to a buffer, afterwords | |
590 | // an update of the damaged parts will blitted from the buffer to the screen. | |
591 | // This is done in Idle time, but can also be forced. | |
592 | // World coordinates can be with the Y axis going up are down. | |
593 | // The area of the drawing in world coordinates that is visible on the canvas | |
594 | // can be set. Parts of this area can be zoomed into resulting in scroll bars | |
595 | // to be displayed. | |
8636c073 | 596 | class wxCanvas: public wxScrolledWindow |
6a2c1874 RR |
597 | { |
598 | public: | |
599 | // constructors and destructors | |
09cc749c | 600 | wxCanvas( wxCanvasAdmin* admin ,wxWindow *parent, wxWindowID id = -1, |
6a2c1874 RR |
601 | const wxPoint& pos = wxDefaultPosition, |
602 | const wxSize& size = wxDefaultSize, | |
603 | long style = wxScrolledWindowStyle ); | |
604 | virtual ~wxCanvas(); | |
dc16900b | 605 | |
09cc749c RR |
606 | //background colour for the canvas |
607 | virtual void SetColour( const wxColour& background ); | |
608 | ||
609 | //update the area given in device coordinates | |
41328253 | 610 | virtual void Update( int x, int y, int width, int height, bool blit = TRUE ); |
09cc749c RR |
611 | |
612 | //blit all updated areas now to the screen, else it will happen in idle time. | |
613 | //Use this to support dragging for instance, becuase in such cases idle time | |
614 | //will take to long. | |
6a2c1874 | 615 | virtual void UpdateNow(); |
dc16900b | 616 | |
09cc749c | 617 | //prevent canvas activety |
239c1f50 | 618 | virtual void Freeze(); |
09cc749c | 619 | //allow canvas activety |
239c1f50 | 620 | virtual void Thaw(); |
dc16900b | 621 | |
09cc749c | 622 | //get the buffer that is used for rendering in general |
33ebcd80 | 623 | inline wxBitmap *GetBuffer() { return &m_buffer; } |
09cc749c RR |
624 | //get the DC that is used for rendering |
625 | inline wxDC *GetDC() { return m_renderDC; } | |
626 | //set the DC that is used for rendering | |
627 | inline void SetDC(wxDC* dc) { m_renderDC=dc; } | |
09cc749c | 628 | |
41328253 RR |
629 | inline int GetBufferWidth() { return m_buffer.GetWidth(); } |
630 | inline int GetBufferHeight() { return m_buffer.GetHeight(); } | |
09cc749c RR |
631 | |
632 | //updating is needed for the canvas if the buffer did change | |
6a2c1874 | 633 | bool NeedUpdate() { return m_needUpdate; } |
1e1af41e | 634 | bool IsFrozen() { return m_frozen; } |
dc16900b | 635 | |
09cc749c | 636 | //blit damaged areas in the buffer to the screen |
3b111dbe | 637 | void BlitBuffer( wxDC &dc ); |
dc16900b | 638 | |
09cc749c | 639 | //redirect events to this canvas object |
dc16900b | 640 | void SetCaptureMouse( wxCanvasObject *obj ); |
09cc749c RR |
641 | //are events redirected, if so return the object else NULL |
642 | inline wxCanvasObject* GetCaptured() { return m_captureMouse;} | |
643 | ||
644 | //set the root group where the objects for this canvas are stored | |
645 | void SetRoot(wxCanvasObjectGroup* aroot){m_root=aroot;} | |
646 | ||
647 | //get root group that is displayed on the canvas | |
648 | wxCanvasObjectGroup* GetRoot(){return m_root;} | |
dc16900b | 649 | |
8636c073 RR |
650 | //scroll the window in device coordinates |
651 | virtual void ScrollWindow( int dx, int dy, | |
652 | const wxRect* rect = (wxRect *) NULL ); | |
653 | ||
654 | //get y axis orientation | |
655 | virtual bool GetYaxis() { return FALSE; } | |
656 | ||
657 | //get the visible part in world coordinates | |
658 | virtual double GetMinX() const; | |
659 | virtual double GetMinY() const; | |
660 | virtual double GetMaxX() const; | |
661 | virtual double GetMaxY() const; | |
662 | ||
663 | //convert from window to virtual coordinates | |
664 | virtual double DeviceToLogicalX(int x) const; | |
665 | virtual double DeviceToLogicalY(int y) const; | |
666 | virtual double DeviceToLogicalXRel(int x) const; | |
667 | virtual double DeviceToLogicalYRel(int y) const; | |
668 | virtual int LogicalToDeviceX(double x) const; | |
669 | virtual int LogicalToDeviceY(double y) const; | |
670 | virtual int LogicalToDeviceXRel(double x) const; | |
671 | virtual int LogicalToDeviceYRel(double y) const; | |
672 | ||
673 | protected: | |
674 | wxBitmap m_buffer; | |
675 | ||
676 | //always available and m_buffer selected | |
677 | wxDC* m_renderDC; | |
678 | ||
679 | bool m_needUpdate; | |
680 | wxList m_updateRects; | |
681 | wxCanvasObjectGroup* m_root; | |
682 | ||
683 | wxColour m_background; | |
684 | bool m_frozen; | |
685 | wxCanvasObject *m_lastMouse; | |
686 | wxCanvasObject *m_captureMouse; | |
687 | ||
688 | int m_oldDeviceX,m_oldDeviceY; | |
689 | ||
690 | wxCanvasAdmin* m_admin; | |
691 | ||
692 | private: | |
693 | int m_bufferX,m_bufferY; | |
694 | ||
695 | protected: | |
696 | void OnMouse( wxMouseEvent &event ); | |
697 | void OnPaint( wxPaintEvent &event ); | |
698 | void OnSize( wxSizeEvent &event ); | |
699 | void OnIdle( wxIdleEvent &event ); | |
700 | void OnSetFocus( wxFocusEvent &event ); | |
701 | void OnKillFocus( wxFocusEvent &event ); | |
702 | void OnEraseBackground( wxEraseEvent &event ); | |
703 | ||
704 | private: | |
705 | DECLARE_CLASS(wxCanvas) | |
706 | DECLARE_EVENT_TABLE() | |
707 | }; | |
708 | ||
709 | ||
710 | ||
711 | class wxVectorCanvas: public wxCanvas | |
712 | { | |
713 | public: | |
714 | // constructors and destructors | |
715 | wxVectorCanvas( wxCanvasAdmin* admin ,wxWindow *parent, wxWindowID id = -1, | |
716 | const wxPoint& pos = wxDefaultPosition, | |
717 | const wxSize& size = wxDefaultSize, | |
718 | long style = wxScrolledWindowStyle ); | |
719 | ||
09cc749c | 720 | //scroll the window in device coordinates |
41328253 RR |
721 | virtual void ScrollWindow( int dx, int dy, |
722 | const wxRect* rect = (wxRect *) NULL ); | |
dc16900b | 723 | |
09cc749c | 724 | //set if the Yaxis goes up or down |
8636c073 | 725 | void SetYaxis(bool up) { m_yaxis=up; } |
09cc749c RR |
726 | |
727 | //get currently used Yaxis setting | |
8636c073 | 728 | virtual bool GetYaxis() { return m_yaxis; } |
09cc749c RR |
729 | |
730 | //to set the total area in world coordinates that can be scrolled. | |
731 | // when totaly zoomed out (SetMappingScroll same size as given here), | |
732 | // this will be the area displayed. | |
733 | // To display all of a drawing, set this here to the boundingbox of the root group | |
734 | // of the canvas. | |
735 | void SetScroll(double vx1,double vy1,double vx2,double vy2); | |
736 | ||
737 | //given the virtual size to be displayed, the mappingmatrix will be calculated | |
738 | //in such a manner that it fits (same ratio in width and height) to the window size. | |
739 | //The window size is used to intitialize the mapping. | |
740 | //The virtual size is just an indication, it will be ajusted to fit in the client window ratio. | |
741 | //When border is set an extra margin is added so that the drawing will fit nicely. | |
742 | // To display all of a drawing, set this here to the boundingbox of the root group | |
743 | // of the canvas. | |
744 | void SetMappingScroll(double vx1,double vy1,double vx2,double vy2,bool border); | |
745 | ||
746 | //matrix for calculating the virtual coordinate given a screen coordinate | |
747 | wxTransformMatrix GetInverseMappingMatrix(); | |
748 | ||
749 | //matrix for calculating the screen coordinate given a virtual coordinate | |
750 | wxTransformMatrix GetMappingMatrix(); | |
751 | ||
752 | //get minimum X of the visible part in world coordinates | |
8636c073 RR |
753 | virtual double GetMinX() const; |
754 | virtual double GetMinY() const; | |
755 | virtual double GetMaxX() const; | |
756 | virtual double GetMaxY() const; | |
757 | ||
758 | //convert from window to virtual coordinates and back | |
759 | virtual double DeviceToLogicalX(int x) const; | |
760 | virtual double DeviceToLogicalY(int y) const; | |
761 | virtual double DeviceToLogicalXRel(int x) const; | |
762 | virtual double DeviceToLogicalYRel(int y) const; | |
763 | virtual int LogicalToDeviceX(double x) const; | |
764 | virtual int LogicalToDeviceY(double y) const; | |
765 | virtual int LogicalToDeviceXRel(double x) const; | |
766 | virtual int LogicalToDeviceYRel(double y) const; | |
09cc749c RR |
767 | |
768 | protected: | |
8636c073 | 769 | // up or down |
09cc749c RR |
770 | bool m_yaxis; |
771 | ||
772 | // holds the matrix for mapping from virtual to screen coordinates | |
773 | wxTransformMatrix m_mapping_matrix; | |
774 | ||
775 | // holds the inverse of the mapping matrix | |
776 | wxTransformMatrix m_inverse_mapping; | |
777 | ||
778 | //virtual coordinates of total drawing | |
779 | double m_virtm_minX, m_virtm_minY, m_virtm_maxX, m_virtm_maxY; | |
780 | ||
781 | // virtual coordinates box | |
782 | double m_virt_minX, m_virt_minY, m_virt_maxX, m_virt_maxY; | |
783 | ||
784 | // bounding box | |
785 | double m_minX, m_minY, m_maxX, m_maxY; | |
786 | ||
787 | //are scroll bars active? | |
788 | bool m_scrolled; | |
789 | ||
6a2c1874 | 790 | private: |
8636c073 | 791 | void OnScroll(wxScrollWinEvent& event); |
6a2c1874 | 792 | void OnChar( wxKeyEvent &event ); |
6a2c1874 | 793 | void OnSize( wxSizeEvent &event ); |
6a2c1874 RR |
794 | |
795 | private: | |
8636c073 | 796 | DECLARE_CLASS(wxVectorCanvas) |
6a2c1874 RR |
797 | DECLARE_EVENT_TABLE() |
798 | }; | |
799 | ||
800 | ||
8636c073 | 801 | |
09cc749c RR |
802 | //:defenition |
803 | //Contains a list of wxCanvas Objects that will be maintained through this class. | |
804 | //Each wxCanvasObject can be displayed on several wxCanvas Objects at the same time. | |
805 | //The active wxCanvas is used to render and convert coordinates from world to device. | |
806 | //So it is important to set the active wxCanvas based on the wxCanvas that has the focus | |
807 | //or is scrolled etc. This is normally done within wxCanvas when appropriate. | |
808 | class wxCanvasAdmin | |
809 | { | |
810 | public: | |
811 | // constructors and destructors | |
812 | wxCanvasAdmin(); | |
813 | virtual ~wxCanvasAdmin(); | |
814 | ||
815 | //convert from window to virtual coordinates | |
816 | double DeviceToLogicalX(int x) const; | |
817 | //convert from window to virtual coordinates | |
818 | double DeviceToLogicalY(int y) const; | |
819 | //convert from window to virtual coordinates relatif | |
820 | double DeviceToLogicalXRel(int x) const; | |
821 | //convert from window to virtual coordinates relatif | |
822 | double DeviceToLogicalYRel(int y) const; | |
823 | //convert from virtual to window coordinates | |
824 | int LogicalToDeviceX(double x) const; | |
825 | //convert from virtual to window coordinates | |
826 | int LogicalToDeviceY(double y) const; | |
827 | //convert from virtual to window coordinates relatif | |
828 | int LogicalToDeviceXRel(double x) const; | |
829 | //convert from virtual to window coordinates relatif | |
830 | int LogicalToDeviceYRel(double y) const; | |
831 | ||
832 | //update in the buffer off all canvases, the area given in world coordinates | |
833 | virtual void Update(wxCanvasObject* obj, double x, double y, double width, double height); | |
834 | ||
835 | //blit all updated areas now to the screen, else it will happen in idle time. | |
836 | //Use this to support dragging for instance, becuase in such cases idle time | |
837 | //will take to long. | |
838 | virtual void UpdateNow(); | |
839 | ||
840 | //append another canvas | |
841 | virtual void Append( wxCanvas* canvas ); | |
842 | ||
843 | //remove a canvas | |
844 | virtual void Remove( wxCanvas* canvas ); | |
845 | ||
846 | //set the given canvas as active (for rendering, coordinate conversion etc.) | |
847 | void SetActive(wxCanvas* activate); | |
848 | ||
849 | //get active canvas | |
850 | inline wxCanvas* GetActive() {return m_active;}; | |
851 | ||
852 | private: | |
853 | wxList m_canvaslist; | |
854 | wxCanvas* m_active; | |
855 | }; | |
856 | ||
6a2c1874 RR |
857 | #endif |
858 | // WXCANVAS | |
859 |