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
 | 
						|
 |