b578915045
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9166 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
860 lines
29 KiB
C++
860 lines
29 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: canvas.h
|
|
// Author: Robert Roebling
|
|
// Created: XX/XX/XX
|
|
// Copyright: 2000 (c) Robert Roebling
|
|
// Licence: wxWindows Licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef __WXCANVAS_H__
|
|
#define __WXCANVAS_H__
|
|
|
|
#ifdef __GNUG__
|
|
#pragma interface "canvas.cpp"
|
|
#endif
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/wx.h"
|
|
#endif
|
|
|
|
#include "wx/image.h"
|
|
#include "wx/txtstrm.h"
|
|
#include "wx/geometry.h"
|
|
#include "wx/matrix.h"
|
|
#include "bbox.h"
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
// decls
|
|
//----------------------------------------------------------------------------
|
|
|
|
class wxCanvas;
|
|
class wxCanvasAdmin;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// wxCanvasObject
|
|
//----------------------------------------------------------------------------
|
|
enum wxDRAG_MODE
|
|
{
|
|
wxDRAG_RECTANGLE,
|
|
wxDRAG_ONTOP,
|
|
wxDRAG_REDRAW
|
|
};
|
|
|
|
//:defenition
|
|
// wxCanvasObject is the base class for Canvas Objects.
|
|
// All Objects for drawing one the canvas are derived from this class.
|
|
// It supports dragging and moving methods that can be used in derived
|
|
// classes for defining several ways of dragging.
|
|
// Also it is possible to plug in events handlers to do this for all derived classes at once.
|
|
//
|
|
// wxCanvasObjects have themselves as their event handlers by default,
|
|
// but their event handlers could be set to another object entirely. This
|
|
// separation can reduce the amount of derivation required, and allow
|
|
// alteration of a wxCanvasObject functionality
|
|
class wxCanvasObject: public wxEvtHandler
|
|
{
|
|
public:
|
|
|
|
wxCanvasObject();
|
|
|
|
//If the position (x,y) is within the object this return a pointer to the object
|
|
//Normally this function needs to be defined for each derived wxCanvasObject.
|
|
//The default is a simple bounding box test.
|
|
virtual wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 );
|
|
|
|
//render this object to the canvas (either on its buffer or directly on the canvas)
|
|
//this depends on the wxDC that is set for the active canvas.
|
|
virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height );
|
|
|
|
//x position in world coordinates of the object
|
|
virtual double GetPosX()=0;
|
|
//y position in world coordinates of the object
|
|
virtual double GetPosY()=0;
|
|
|
|
//set position in world coordinates for the object
|
|
virtual void SetPosXY( double x, double y)=0;
|
|
|
|
//absolute moving the object to position x,y in world coordinates
|
|
//also does an update of the old and new area
|
|
virtual void MoveAbsolute( double x, double y );
|
|
|
|
//relative moving the object to position x,y in world coordinates
|
|
//also does an update of the old and new area
|
|
virtual void MoveRelative( double x, double y );
|
|
|
|
//relative translate the object to position x,y in world coordinates
|
|
//does NOT update the old and new area
|
|
//this function must be defined for each derived object,
|
|
//it is used internally for dragging and moving objects.
|
|
virtual void TransLate( double x, double y )=0;
|
|
|
|
//choose one of the three diffrenet drag methods |
|
|
//DRAG_RECTANGLE = as a rectangle when drag is in progress |
|
|
//DRAG_ONTOP = only redraw the object when dragging |
|
|
//DRAG_REDRAW = redraw the damaged areas when dragging
|
|
void SetDragMode(wxDRAG_MODE mode) { m_dragmode=mode; };
|
|
|
|
//return the dragmode
|
|
wxDRAG_MODE GetDragMode() { return m_dragmode; };
|
|
|
|
//called when starting a drag
|
|
virtual void DragStart();
|
|
//called when dragging is in progress
|
|
virtual void DragRelative( double x, double y);
|
|
//called when dragging is ended
|
|
virtual void DragEnd();
|
|
|
|
//return the object if it is part of the given object or
|
|
//if the given object is part of a group within this object.
|
|
//For group objects this means recursively search for it.
|
|
virtual wxCanvasObject* Contains( wxCanvasObject* obj );
|
|
|
|
//calculate the boundingbox in world coordinates
|
|
virtual void CalcBoundingBox()=0;
|
|
|
|
//write the object as SVG (scalable vector grafhics
|
|
virtual void WriteSVG( wxTextOutputStream &stream );
|
|
|
|
//get the administrator for the object,
|
|
//this will give access to the canvas's where it is displayed upon.
|
|
//It is used to render the object to the active canvas.
|
|
//Conversion from world to Device coordinates and visa versa is
|
|
//done using the Active canvas at that moment.
|
|
wxCanvasAdmin *GetAdmin() { return m_admin; }
|
|
|
|
//set the administrator
|
|
virtual void SetAdmin( wxCanvasAdmin *admin ) { m_admin = admin; }
|
|
|
|
//is this a control type of canvas object
|
|
bool IsControl() { return m_isControl; }
|
|
//is this a vector type of canvas object
|
|
bool IsVector() { return m_isVector; }
|
|
//is this an Image type of canvas object
|
|
bool IsImage() { return m_isImage; }
|
|
|
|
//get minimum X of the boundingbox in world coordinates
|
|
inline double GetXMin() { return m_bbox.GetMinX(); }
|
|
//get minimum Y of the boundingbox in world coordinates
|
|
inline double GetYMin() { return m_bbox.GetMinY(); }
|
|
//get maximum X of the boundingbox in world coordinates
|
|
inline double GetXMax() { return m_bbox.GetMaxX(); }
|
|
//get maximum Y of the boundingbox in world coordinates
|
|
inline double GetYMax() { return m_bbox.GetMaxY(); }
|
|
|
|
//get boundingbox
|
|
inline wxBoundingBox GetBbox() { return m_bbox; }
|
|
|
|
//redirect all mouse events for the canvas to this object
|
|
void CaptureMouse();
|
|
//release the mouse capture for this object
|
|
void ReleaseMouse();
|
|
//is the mouse captured for this object
|
|
bool IsCapturedMouse();
|
|
|
|
//set if this object will visible (be rendered or not)
|
|
inline void SetVisible(bool visible) { m_visible=visible; }
|
|
//get visibility
|
|
inline bool GetVisible() {return m_visible; }
|
|
|
|
//can the object be dragged
|
|
inline void SetDraggable(bool drag) { m_dragable=drag; }
|
|
//get if the object can be dragged
|
|
inline bool GetDraggable() {return m_dragable; }
|
|
|
|
//get absolute area in the device coordinates where the object
|
|
//its boundingbox in world coordinates is first translated using the matrix.
|
|
wxRect GetAbsoluteArea(const wxTransformMatrix& cworld);
|
|
|
|
//get currently used eventhandler (always the first in the list)
|
|
wxEvtHandler *GetEventHandler() const { return m_eventHandler; }
|
|
|
|
//process an event for the object, starting with the first eventhandler
|
|
// in the list.
|
|
bool ProcessCanvasObjectEvent(wxEvent& event);
|
|
|
|
// push/pop event handler: allows to chain a custom event handler to
|
|
// already existing ones
|
|
void PushEventHandler( wxEvtHandler *handler );
|
|
|
|
//remove first eventhandler in the list (one will be always stay in)
|
|
wxEvtHandler *PopEventHandler( bool deleteHandler = FALSE );
|
|
//append an eventhandler to the list, this event handler will be called
|
|
//if the other skipped the event to process.
|
|
void AppendEventHandler(wxEvtHandler *handler);
|
|
//remove last event handler in the list (one will always stay in)
|
|
wxEvtHandler *RemoveLastEventHandler(bool deleteHandler);
|
|
|
|
protected:
|
|
|
|
//administator for rendering and accessing the canvas's
|
|
wxCanvasAdmin* m_admin;
|
|
|
|
//active event handler, default the object itself
|
|
wxEvtHandler* m_eventHandler;
|
|
|
|
bool m_isControl:1;
|
|
bool m_isVector:1;
|
|
bool m_isImage:1;
|
|
bool m_visible:1;
|
|
bool m_dragable:1;
|
|
wxDRAG_MODE m_dragmode:3;
|
|
|
|
//boundingbox in world coordinates
|
|
wxBoundingBox m_bbox;
|
|
|
|
//used for dragging
|
|
wxBitmap m_atnewpos;
|
|
};
|
|
|
|
//:defenition
|
|
// wxCanvasObjectGroup is a container for wxCanvas derived Objects.
|
|
// It renders itself by calling the render methods of the wxCanvasObjects it contains.
|
|
// It can have nested groups also, in the same way as the other wxCanvasObjects it already contains.
|
|
// The group has a matrix to position/rotate/scale the group.
|
|
class wxCanvasObjectGroup: public wxCanvasObject
|
|
{
|
|
public:
|
|
wxCanvasObjectGroup(double x, double y);
|
|
virtual ~wxCanvasObjectGroup();
|
|
|
|
void SetAdmin(wxCanvasAdmin* admin);
|
|
|
|
//prepend a wxCanvasObject to this group
|
|
virtual void Prepend( wxCanvasObject* obj );
|
|
//append a wxCanvasObject to this group
|
|
virtual void Append( wxCanvasObject* obj );
|
|
//insert a wxCanvasObject to this group
|
|
virtual void Insert( size_t before, wxCanvasObject* obj );
|
|
//remove the given object from the group
|
|
virtual void Remove( wxCanvasObject* obj );
|
|
|
|
//those this group contain the given object.
|
|
//in case of nested groups also search in there to the lowwest level.
|
|
virtual wxCanvasObject* Contains( wxCanvasObject* obj );
|
|
|
|
//returns index of the given wxCanvasObject in this group
|
|
virtual int IndexOf( wxCanvasObject* obj );
|
|
|
|
double GetPosX() { return lworld.GetValue(2,0); }
|
|
double GetPosY() { return lworld.GetValue(2,1); }
|
|
void SetPosXY( double x, double y) {lworld.SetValue(2,0,x);lworld.SetValue(2,1,y);CalcBoundingBox();};
|
|
|
|
void TransLate( double x, double y );
|
|
|
|
void CalcBoundingBox();
|
|
//remove all wxCanvasObjects from the group (flag for deletion of the objectsalso)
|
|
void DeleteContents( bool );
|
|
virtual void Render(wxTransformMatrix* cworld,int x, int y, int width, int height );
|
|
virtual void WriteSVG( wxTextOutputStream &stream );
|
|
|
|
//recursive call the IsHitWorld on all contained objects, the first
|
|
//one that is hit will be returned
|
|
wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 );
|
|
|
|
//recursive calls for contained objects to set eventhandlers,
|
|
//and also sets its own eventhandler
|
|
void PushEventHandler( wxEvtHandler *handler );
|
|
//recursive calls for contained objects to set eventhandlers,
|
|
//and also sets its own eventhandler
|
|
wxEvtHandler *PopEventHandler( bool deleteHandler = FALSE );
|
|
//recursive calls for contained objects to set eventhandlers,
|
|
//and also sets its own eventhandler
|
|
void AppendEventHandler(wxEvtHandler *handler);
|
|
//recursive calls for contained objects to set eventhandlers,
|
|
//and also sets its own eventhandler
|
|
wxEvtHandler *RemoveLastEventHandler(bool deleteHandler);
|
|
|
|
protected:
|
|
|
|
//to position the object
|
|
wxTransformMatrix lworld;
|
|
|
|
wxList m_objects;
|
|
|
|
friend class wxCanvas;
|
|
};
|
|
|
|
//:defenition
|
|
// wxCanvasObjectRef is a reference to any wxCanvasObject derived class.
|
|
// It does not duplicate the referenced object.
|
|
// It has a matrix to reposition/rotate/scale the object it references.
|
|
// The position/matrix of the referenced Object is accumulated with the one here.
|
|
class wxCanvasObjectRef: public wxCanvasObject
|
|
{
|
|
public:
|
|
wxCanvasObjectRef(double x, double y,wxCanvasObject* obj);
|
|
|
|
//set rotation for the reference
|
|
void SetRotation(double rotation);
|
|
|
|
//set scale in x and y ( > zero)
|
|
void SetScale( double scalex, double scaley );
|
|
|
|
void SetAdmin(wxCanvasAdmin* admin);
|
|
|
|
double GetPosX() { return lworld.GetValue(2,0); }
|
|
double GetPosY() { return lworld.GetValue(2,1); }
|
|
void SetPosXY( double x, double y) {lworld.SetValue(2,0,x);lworld.SetValue(2,1,y);CalcBoundingBox();};
|
|
|
|
void TransLate( double x, double y );
|
|
void CalcBoundingBox();
|
|
virtual void Render(wxTransformMatrix* cworld,int x, int y, int width, int height );
|
|
virtual void WriteSVG( wxTextOutputStream &stream );
|
|
|
|
//return this object if one of the objects it references is hit
|
|
wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 );
|
|
virtual wxCanvasObject* Contains( wxCanvasObject* obj );
|
|
|
|
//recursive calls for contained objects to set eventhandlers,
|
|
//and also sets its own eventhandler
|
|
void PushEventHandler( wxEvtHandler *handler );
|
|
//recursive calls for contained objects to set eventhandlers,
|
|
//and also sets its own eventhandler
|
|
wxEvtHandler *PopEventHandler( bool deleteHandler = FALSE );
|
|
//recursive calls for contained objects to set eventhandlers,
|
|
//and also sets its own eventhandler
|
|
void AppendEventHandler(wxEvtHandler *handler);
|
|
//recursive calls for contained objects to set eventhandlers,
|
|
//and also sets its own eventhandler
|
|
wxEvtHandler *RemoveLastEventHandler(bool deleteHandler);
|
|
|
|
protected:
|
|
|
|
//to position the object
|
|
wxTransformMatrix lworld;
|
|
|
|
//reference to another wxCanvasObject
|
|
wxCanvasObject* m_obj;
|
|
};
|
|
|
|
//:defenition
|
|
// wxCanvasRect
|
|
class wxCanvasRect: public wxCanvasObject
|
|
{
|
|
public:
|
|
wxCanvasRect( double x, double y, double w, double h , double radius=0 );
|
|
void SetBrush( const wxBrush& brush) { m_brush = brush; };
|
|
void SetPen( const wxPen& pen) { m_pen = pen; CalcBoundingBox(); };
|
|
|
|
double GetPosX() { return m_x; }
|
|
double GetPosY() { return m_y; }
|
|
void SetPosXY( double x, double y) {m_x=x; m_y=y; CalcBoundingBox();};
|
|
|
|
void TransLate( double x, double y );
|
|
void CalcBoundingBox();
|
|
|
|
virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height );
|
|
virtual void WriteSVG( wxTextOutputStream &stream );
|
|
|
|
private:
|
|
wxPen m_pen;
|
|
wxBrush m_brush;
|
|
|
|
double m_x;
|
|
double m_y;
|
|
double m_width;
|
|
double m_height;
|
|
double m_radius;
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
// wxCanvasCircle
|
|
//----------------------------------------------------------------------------
|
|
class wxCanvasCircle: public wxCanvasObject
|
|
{
|
|
public:
|
|
wxCanvasCircle( double x, double y, double radius );
|
|
void SetBrush( const wxBrush& brush) { m_brush = brush; };
|
|
void SetPen( const wxPen& pen) { m_pen = pen; CalcBoundingBox(); };
|
|
|
|
double GetPosX() { return m_x; }
|
|
double GetPosY() { return m_y; }
|
|
void SetPosXY( double x, double y) {m_x=x; m_y=y;CalcBoundingBox(); };
|
|
|
|
void TransLate( double x, double y );
|
|
|
|
void CalcBoundingBox();
|
|
|
|
virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height );
|
|
virtual void WriteSVG( wxTextOutputStream &stream );
|
|
|
|
wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 );
|
|
|
|
private:
|
|
wxPen m_pen;
|
|
wxBrush m_brush;
|
|
|
|
double m_x;
|
|
double m_y;
|
|
double m_radius;
|
|
};
|
|
|
|
//:defenition
|
|
// wxCanvasEllipse
|
|
class wxCanvasEllipse: public wxCanvasObject
|
|
{
|
|
public:
|
|
wxCanvasEllipse( double x, double y, double width, double height );
|
|
void SetBrush( const wxBrush& brush) { m_brush = brush; };
|
|
void SetPen( const wxPen& pen) { m_pen = pen; CalcBoundingBox(); };
|
|
|
|
double GetPosX() { return m_x; }
|
|
double GetPosY() { return m_y; }
|
|
void SetPosXY( double x, double y) {m_x=x; m_y=y; CalcBoundingBox();};
|
|
|
|
void TransLate( double x, double y );
|
|
|
|
void CalcBoundingBox();
|
|
|
|
virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height );
|
|
virtual void WriteSVG( wxTextOutputStream &stream );
|
|
|
|
wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 );
|
|
|
|
private:
|
|
wxPen m_pen;
|
|
wxBrush m_brush;
|
|
|
|
double m_x;
|
|
double m_y;
|
|
double m_width;
|
|
double m_height;
|
|
};
|
|
|
|
//:defenition
|
|
// wxCanvasEllipticArc
|
|
class wxCanvasEllipticArc: public wxCanvasObject
|
|
{
|
|
public:
|
|
wxCanvasEllipticArc( double x, double y, double width, double height, double start, double end );
|
|
void SetBrush( const wxBrush& brush) { m_brush = brush; };
|
|
void SetPen( const wxPen& pen) { m_pen = pen; CalcBoundingBox(); };
|
|
|
|
double GetPosX() { return m_x; }
|
|
double GetPosY() { return m_y; }
|
|
void SetPosXY( double x, double y) {m_x=x; m_y=y; CalcBoundingBox();};
|
|
|
|
void TransLate( double x, double y );
|
|
void CalcBoundingBox();
|
|
|
|
virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height );
|
|
virtual void WriteSVG( wxTextOutputStream &stream );
|
|
|
|
wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 );
|
|
|
|
private:
|
|
wxPen m_pen;
|
|
wxBrush m_brush;
|
|
|
|
double m_x;
|
|
double m_y;
|
|
double m_width;
|
|
double m_height;
|
|
double m_start;
|
|
double m_end;
|
|
};
|
|
|
|
//:defenition
|
|
// wxCanvasLine
|
|
class wxCanvasLine: public wxCanvasObject
|
|
{
|
|
public:
|
|
wxCanvasLine( double x1, double y1, double x2, double y2 );
|
|
void SetPen( const wxPen& pen) { m_pen = pen; CalcBoundingBox(); };
|
|
|
|
|
|
double GetPosX() { return m_x1; }
|
|
double GetPosY() { return m_y1; }
|
|
void SetPosXY( double x, double y) {m_x1=x; m_y1=y; CalcBoundingBox();};
|
|
|
|
void TransLate( double x, double y );
|
|
|
|
void CalcBoundingBox();
|
|
|
|
virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height );
|
|
virtual void WriteSVG( wxTextOutputStream &stream );
|
|
|
|
wxCanvasObject* IsHitWorld( double x, double y, double margin = 0 );
|
|
|
|
private:
|
|
wxPen m_pen;
|
|
|
|
double m_x1;
|
|
double m_y1;
|
|
double m_x2;
|
|
double m_y2;
|
|
};
|
|
|
|
//:defenition
|
|
// wxCanvasImage
|
|
class wxCanvasImage: public wxCanvasObject
|
|
{
|
|
public:
|
|
wxCanvasImage( const wxImage &image, double x, double y, double w, double h );
|
|
|
|
double GetPosX() { return m_x; }
|
|
double GetPosY() { return m_y; }
|
|
void SetPosXY( double x, double y);
|
|
|
|
void TransLate( double x, double y );
|
|
|
|
void CalcBoundingBox();
|
|
|
|
virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height );
|
|
virtual void WriteSVG( wxTextOutputStream &stream );
|
|
|
|
private:
|
|
double m_x;
|
|
double m_y;
|
|
double m_width;
|
|
double m_height;
|
|
|
|
wxImage m_image;
|
|
int m_orgw,m_orgh;
|
|
|
|
// cache
|
|
wxBitmap m_cBitmap;
|
|
wxImage m_cImage;
|
|
int m_cW;
|
|
int m_cH;
|
|
double m_cR;
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
// wxCanvasControl
|
|
//----------------------------------------------------------------------------
|
|
|
|
class wxCanvasControl: public wxCanvasObject
|
|
{
|
|
public:
|
|
wxCanvasControl( wxWindow *control );
|
|
~wxCanvasControl();
|
|
|
|
double GetPosX();
|
|
double GetPosY();
|
|
void SetPosXY( double x, double y);
|
|
|
|
void TransLate( double x, double y );
|
|
void MoveRelative( double x, double y );
|
|
|
|
void CalcBoundingBox();
|
|
|
|
private:
|
|
wxWindow *m_control;
|
|
};
|
|
|
|
//:defenition
|
|
// wxCanvasText
|
|
class wxCanvasText: public wxCanvasObject
|
|
{
|
|
public:
|
|
wxCanvasText( const wxString &text, double x, double y, const wxString &foneFile, int size );
|
|
~wxCanvasText();
|
|
|
|
double GetPosX() { return m_x; }
|
|
double GetPosY() { return m_y; }
|
|
void SetPosXY( double x, double y) {m_x=x; m_y=y;CalcBoundingBox(); };
|
|
|
|
void TransLate( double x, double y );
|
|
|
|
void CalcBoundingBox();
|
|
|
|
virtual void Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height );
|
|
virtual void WriteSVG( wxTextOutputStream &stream );
|
|
|
|
void SetRGB( unsigned char red, unsigned char green, unsigned char blue );
|
|
void SetFlag( int flag );
|
|
int GetFlag() { return m_flag; }
|
|
|
|
private:
|
|
wxString m_text;
|
|
double m_x;
|
|
double m_y;
|
|
unsigned char *m_alpha;
|
|
void *m_faceData;
|
|
int m_flag;
|
|
int m_red;
|
|
int m_green;
|
|
int m_blue;
|
|
wxString m_fontFileName;
|
|
int m_size;
|
|
};
|
|
|
|
//:defenition
|
|
// wxCanvas is used to display a wxCanvasGroupObject, which contains wxCanvasObject derived
|
|
// drawable objects. The group to draw is called the root.
|
|
// All objects are defined in world coordinates, relative to its parent (e.g. nested groups)
|
|
// There are methods to convert from world to device coordinates and visa versa.
|
|
// Rendering a draw is normally started on the root, it to a buffer, afterwords
|
|
// an update of the damaged parts will blitted from the buffer to the screen.
|
|
// This is done in Idle time, but can also be forced.
|
|
// World coordinates can be with the Y axis going up are down.
|
|
// The area of the drawing in world coordinates that is visible on the canvas
|
|
// can be set. Parts of this area can be zoomed into resulting in scroll bars
|
|
// to be displayed.
|
|
class wxCanvas: public wxScrolledWindow
|
|
{
|
|
public:
|
|
// constructors and destructors
|
|
wxCanvas( wxCanvasAdmin* admin ,wxWindow *parent, wxWindowID id = -1,
|
|
const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize,
|
|
long style = wxScrolledWindowStyle );
|
|
virtual ~wxCanvas();
|
|
|
|
//background colour for the canvas
|
|
virtual void SetColour( const wxColour& background );
|
|
|
|
//update the area given in device coordinates
|
|
virtual void Update( int x, int y, int width, int height, bool blit = TRUE );
|
|
|
|
//blit all updated areas now to the screen, else it will happen in idle time.
|
|
//Use this to support dragging for instance, becuase in such cases idle time
|
|
//will take to long.
|
|
virtual void UpdateNow();
|
|
|
|
//prevent canvas activety
|
|
virtual void Freeze();
|
|
//allow canvas activety
|
|
virtual void Thaw();
|
|
|
|
//get the buffer that is used for rendering in general
|
|
inline wxBitmap *GetBuffer() { return &m_buffer; }
|
|
//get the DC that is used for rendering
|
|
inline wxDC *GetDC() { return m_renderDC; }
|
|
//set the DC that is used for rendering
|
|
inline void SetDC(wxDC* dc) { m_renderDC=dc; }
|
|
|
|
inline int GetBufferWidth() { return m_buffer.GetWidth(); }
|
|
inline int GetBufferHeight() { return m_buffer.GetHeight(); }
|
|
|
|
//updating is needed for the canvas if the buffer did change
|
|
bool NeedUpdate() { return m_needUpdate; }
|
|
bool IsFrozen() { return m_frozen; }
|
|
|
|
//blit damaged areas in the buffer to the screen
|
|
void BlitBuffer( wxDC &dc );
|
|
|
|
//redirect events to this canvas object
|
|
void SetCaptureMouse( wxCanvasObject *obj );
|
|
//are events redirected, if so return the object else NULL
|
|
inline wxCanvasObject* GetCaptured() { return m_captureMouse;}
|
|
|
|
//set the root group where the objects for this canvas are stored
|
|
void SetRoot(wxCanvasObjectGroup* aroot){m_root=aroot;}
|
|
|
|
//get root group that is displayed on the canvas
|
|
wxCanvasObjectGroup* GetRoot(){return m_root;}
|
|
|
|
//scroll the window in device coordinates
|
|
virtual void ScrollWindow( int dx, int dy,
|
|
const wxRect* rect = (wxRect *) NULL );
|
|
|
|
//get y axis orientation
|
|
virtual bool GetYaxis() { return FALSE; }
|
|
|
|
//get the visible part in world coordinates
|
|
virtual double GetMinX() const;
|
|
virtual double GetMinY() const;
|
|
virtual double GetMaxX() const;
|
|
virtual double GetMaxY() const;
|
|
|
|
//convert from window to virtual coordinates
|
|
virtual double DeviceToLogicalX(int x) const;
|
|
virtual double DeviceToLogicalY(int y) const;
|
|
virtual double DeviceToLogicalXRel(int x) const;
|
|
virtual double DeviceToLogicalYRel(int y) const;
|
|
virtual int LogicalToDeviceX(double x) const;
|
|
virtual int LogicalToDeviceY(double y) const;
|
|
virtual int LogicalToDeviceXRel(double x) const;
|
|
virtual int LogicalToDeviceYRel(double y) const;
|
|
|
|
protected:
|
|
wxBitmap m_buffer;
|
|
|
|
//always available and m_buffer selected
|
|
wxDC* m_renderDC;
|
|
|
|
bool m_needUpdate;
|
|
wxList m_updateRects;
|
|
wxCanvasObjectGroup* m_root;
|
|
|
|
wxColour m_background;
|
|
bool m_frozen;
|
|
wxCanvasObject *m_lastMouse;
|
|
wxCanvasObject *m_captureMouse;
|
|
|
|
int m_oldDeviceX,m_oldDeviceY;
|
|
|
|
wxCanvasAdmin* m_admin;
|
|
|
|
private:
|
|
int m_bufferX,m_bufferY;
|
|
|
|
protected:
|
|
void OnMouse( wxMouseEvent &event );
|
|
void OnPaint( wxPaintEvent &event );
|
|
void OnSize( wxSizeEvent &event );
|
|
void OnIdle( wxIdleEvent &event );
|
|
void OnSetFocus( wxFocusEvent &event );
|
|
void OnKillFocus( wxFocusEvent &event );
|
|
void OnEraseBackground( wxEraseEvent &event );
|
|
|
|
private:
|
|
DECLARE_CLASS(wxCanvas)
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
|
|
|
|
class wxVectorCanvas: public wxCanvas
|
|
{
|
|
public:
|
|
// constructors and destructors
|
|
wxVectorCanvas( wxCanvasAdmin* admin ,wxWindow *parent, wxWindowID id = -1,
|
|
const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize,
|
|
long style = wxScrolledWindowStyle );
|
|
|
|
//scroll the window in device coordinates
|
|
virtual void ScrollWindow( int dx, int dy,
|
|
const wxRect* rect = (wxRect *) NULL );
|
|
|
|
//set if the Yaxis goes up or down
|
|
void SetYaxis(bool up) { m_yaxis=up; }
|
|
|
|
//get currently used Yaxis setting
|
|
virtual bool GetYaxis() { return m_yaxis; }
|
|
|
|
//to set the total area in world coordinates that can be scrolled.
|
|
// when totaly zoomed out (SetMappingScroll same size as given here),
|
|
// this will be the area displayed.
|
|
// To display all of a drawing, set this here to the boundingbox of the root group
|
|
// of the canvas.
|
|
void SetScroll(double vx1,double vy1,double vx2,double vy2);
|
|
|
|
//given the virtual size to be displayed, the mappingmatrix will be calculated
|
|
//in such a manner that it fits (same ratio in width and height) to the window size.
|
|
//The window size is used to intitialize the mapping.
|
|
//The virtual size is just an indication, it will be ajusted to fit in the client window ratio.
|
|
//When border is set an extra margin is added so that the drawing will fit nicely.
|
|
// To display all of a drawing, set this here to the boundingbox of the root group
|
|
// of the canvas.
|
|
void SetMappingScroll(double vx1,double vy1,double vx2,double vy2,bool border);
|
|
|
|
//matrix for calculating the virtual coordinate given a screen coordinate
|
|
wxTransformMatrix GetInverseMappingMatrix();
|
|
|
|
//matrix for calculating the screen coordinate given a virtual coordinate
|
|
wxTransformMatrix GetMappingMatrix();
|
|
|
|
//get minimum X of the visible part in world coordinates
|
|
virtual double GetMinX() const;
|
|
virtual double GetMinY() const;
|
|
virtual double GetMaxX() const;
|
|
virtual double GetMaxY() const;
|
|
|
|
//convert from window to virtual coordinates and back
|
|
virtual double DeviceToLogicalX(int x) const;
|
|
virtual double DeviceToLogicalY(int y) const;
|
|
virtual double DeviceToLogicalXRel(int x) const;
|
|
virtual double DeviceToLogicalYRel(int y) const;
|
|
virtual int LogicalToDeviceX(double x) const;
|
|
virtual int LogicalToDeviceY(double y) const;
|
|
virtual int LogicalToDeviceXRel(double x) const;
|
|
virtual int LogicalToDeviceYRel(double y) const;
|
|
|
|
protected:
|
|
// up or down
|
|
bool m_yaxis;
|
|
|
|
// holds the matrix for mapping from virtual to screen coordinates
|
|
wxTransformMatrix m_mapping_matrix;
|
|
|
|
// holds the inverse of the mapping matrix
|
|
wxTransformMatrix m_inverse_mapping;
|
|
|
|
//virtual coordinates of total drawing
|
|
double m_virtm_minX, m_virtm_minY, m_virtm_maxX, m_virtm_maxY;
|
|
|
|
// virtual coordinates box
|
|
double m_virt_minX, m_virt_minY, m_virt_maxX, m_virt_maxY;
|
|
|
|
// bounding box
|
|
double m_minX, m_minY, m_maxX, m_maxY;
|
|
|
|
//are scroll bars active?
|
|
bool m_scrolled;
|
|
|
|
private:
|
|
void OnScroll(wxScrollWinEvent& event);
|
|
void OnChar( wxKeyEvent &event );
|
|
void OnSize( wxSizeEvent &event );
|
|
|
|
private:
|
|
DECLARE_CLASS(wxVectorCanvas)
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
|
|
|
|
//:defenition
|
|
//Contains a list of wxCanvas Objects that will be maintained through this class.
|
|
//Each wxCanvasObject can be displayed on several wxCanvas Objects at the same time.
|
|
//The active wxCanvas is used to render and convert coordinates from world to device.
|
|
//So it is important to set the active wxCanvas based on the wxCanvas that has the focus
|
|
//or is scrolled etc. This is normally done within wxCanvas when appropriate.
|
|
class wxCanvasAdmin
|
|
{
|
|
public:
|
|
// constructors and destructors
|
|
wxCanvasAdmin();
|
|
virtual ~wxCanvasAdmin();
|
|
|
|
//convert from window to virtual coordinates
|
|
double DeviceToLogicalX(int x) const;
|
|
//convert from window to virtual coordinates
|
|
double DeviceToLogicalY(int y) const;
|
|
//convert from window to virtual coordinates relatif
|
|
double DeviceToLogicalXRel(int x) const;
|
|
//convert from window to virtual coordinates relatif
|
|
double DeviceToLogicalYRel(int y) const;
|
|
//convert from virtual to window coordinates
|
|
int LogicalToDeviceX(double x) const;
|
|
//convert from virtual to window coordinates
|
|
int LogicalToDeviceY(double y) const;
|
|
//convert from virtual to window coordinates relatif
|
|
int LogicalToDeviceXRel(double x) const;
|
|
//convert from virtual to window coordinates relatif
|
|
int LogicalToDeviceYRel(double y) const;
|
|
|
|
//update in the buffer off all canvases, the area given in world coordinates
|
|
virtual void Update(wxCanvasObject* obj, double x, double y, double width, double height);
|
|
|
|
//blit all updated areas now to the screen, else it will happen in idle time.
|
|
//Use this to support dragging for instance, becuase in such cases idle time
|
|
//will take to long.
|
|
virtual void UpdateNow();
|
|
|
|
//append another canvas
|
|
virtual void Append( wxCanvas* canvas );
|
|
|
|
//remove a canvas
|
|
virtual void Remove( wxCanvas* canvas );
|
|
|
|
//set the given canvas as active (for rendering, coordinate conversion etc.)
|
|
void SetActive(wxCanvas* activate);
|
|
|
|
//get active canvas
|
|
inline wxCanvas* GetActive() {return m_active;};
|
|
|
|
private:
|
|
wxList m_canvaslist;
|
|
wxCanvas* m_active;
|
|
};
|
|
|
|
#endif
|
|
// WXCANVAS
|
|
|