///////////////////////////////////////////////////////////////////////////// // Name: plot.h // Purpose: wxPlotWindow // Author: Robert Roebling // Modified by: // Created: 12/1/2000 // Copyright: (c) Robert Roebling // RCS-ID: $Id$ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_PLOT_H_ #define _WX_PLOT_H_ #ifdef __GNUG__ #pragma interface "plot.h" #endif #include "wx/defs.h" #if wxUSE_PLOT #include "wx/scrolwin.h" #include "wx/event.h" #include "wx/dynarray.h" //----------------------------------------------------------------------------- // classes //----------------------------------------------------------------------------- class WXDLLEXPORT wxPlotEvent; class WXDLLEXPORT wxPlotCurve; class WXDLLEXPORT wxPlotValues; class WXDLLEXPORT wxPlotArea; class WXDLLEXPORT wxPlotXAxisArea; class WXDLLEXPORT wxPlotYAxisArea; class WXDLLEXPORT wxPlotWindow; //----------------------------------------------------------------------------- // consts //----------------------------------------------------------------------------- #define wxPLOT_X_AXIS 0x0004 #define wxPLOT_Y_AXIS 0x0008 #define wxPLOT_BUTTON_MOVE 0x0010 #define wxPLOT_BUTTON_ZOOM 0x0020 #define wxPLOT_BUTTON_ENLARGE 0x0040 #define wxPLOT_BUTTON_ALL (wxPLOT_BUTTON_MOVE|wxPLOT_BUTTON_ZOOM|wxPLOT_BUTTON_ENLARGE) #define wxPLOT_DEFAULT (wxPLOT_X_AXIS|wxPLOT_Y_AXIS | wxPLOT_BUTTON_ALL) //----------------------------------------------------------------------------- // wxPlotEvent //----------------------------------------------------------------------------- class WXDLLEXPORT wxPlotEvent: public wxNotifyEvent { public: wxPlotEvent( wxEventType commandType = wxEVT_NULL, int id = 0 ); wxPlotCurve *GetCurve() { return m_curve; } void SetCurve( wxPlotCurve *curve ) { m_curve = curve; } double GetZoom() { return m_zoom; } void SetZoom( double zoom ) { m_zoom = zoom; } wxInt32 GetPosition() { return m_position; } void SetPosition( wxInt32 pos ) { m_position = pos; } private: wxPlotCurve *m_curve; double m_zoom; wxInt32 m_position; }; //----------------------------------------------------------------------------- // wxPlotCurve //----------------------------------------------------------------------------- class WXDLLEXPORT wxPlotCurve: public wxObject { public: wxPlotCurve( int offsetY, double startY, double endY ); virtual wxInt32 GetStartX() = 0; virtual wxInt32 GetEndX() = 0; virtual double GetY( wxInt32 x ) = 0; void SetStartY( double startY ) { m_startY = startY; } double GetStartY() { return m_startY; } void SetEndY( double endY ) { m_endY = endY; } double GetEndY() { return m_endY; } void SetOffsetY( int offsetY ) { m_offsetY = offsetY; } int GetOffsetY() { return m_offsetY; } void SetPenNormal( const wxPen &pen ) { m_penNormal = pen; } void SetPenSelected( const wxPen &pen ) { m_penSelected = pen; } private: int m_offsetY; double m_startY; double m_endY; wxPen m_penNormal; wxPen m_penSelected; DECLARE_ABSTRACT_CLASS(wxPlotCurve) }; //----------------------------------------------------------------------------- // wxPlotOnOffCurve //----------------------------------------------------------------------------- class WXDLLEXPORT wxPlotOnOff { public: wxPlotOnOff() { } wxInt32 m_on; wxInt32 m_off; void *m_clientData; }; WX_DECLARE_EXPORTED_OBJARRAY(wxPlotOnOff, wxArrayPlotOnOff); class WXDLLEXPORT wxPlotOnOffCurve: public wxObject { public: wxPlotOnOffCurve( int offsetY ); wxInt32 GetStartX() { return m_minX; } wxInt32 GetEndX() { return m_maxX; } void SetOffsetY( int offsetY ) { m_offsetY = offsetY; } int GetOffsetY() { return m_offsetY; } void Add( wxInt32 on, wxInt32 off, void *clientData = NULL ); size_t GetCount(); wxInt32 GetOn( size_t index ); wxInt32 GetOff( size_t index ); void* GetClientData( size_t index ); wxPlotOnOff *GetAt( size_t index ); virtual void DrawOnLine( wxDC &dc, wxCoord y, wxCoord start, wxCoord end, void *clientData ); virtual void DrawOffLine( wxDC &dc, wxCoord y, wxCoord start, wxCoord end ); private: int m_offsetY; wxInt32 m_minX; wxInt32 m_maxX; wxArrayPlotOnOff m_marks; DECLARE_CLASS(wxPlotOnOffCurve) }; //----------------------------------------------------------------------------- // wxPlotArea //----------------------------------------------------------------------------- class WXDLLEXPORT wxPlotArea: public wxWindow { public: wxPlotArea() {} wxPlotArea( wxPlotWindow *parent ); void OnPaint( wxPaintEvent &event ); void OnMouse( wxMouseEvent &event ); void DrawCurve( wxDC *dc, wxPlotCurve *curve, int from = -1, int to = -1 ); void DrawOnOffCurve( wxDC *dc, wxPlotOnOffCurve *curve, int from = -1, int to = -1 ); void DeleteCurve( wxPlotCurve *curve, int from = -1, int to = -1 ); virtual void ScrollWindow( int dx, int dy, const wxRect *rect ); private: wxPlotWindow *m_owner; bool m_zooming; DECLARE_CLASS(wxPlotArea) DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- // wxPlotXAxisArea //----------------------------------------------------------------------------- class WXDLLEXPORT wxPlotXAxisArea: public wxWindow { public: wxPlotXAxisArea() {} wxPlotXAxisArea( wxPlotWindow *parent ); void OnPaint( wxPaintEvent &event ); void OnMouse( wxMouseEvent &event ); private: wxPlotWindow *m_owner; DECLARE_CLASS(wxPlotXAxisArea) DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- // wxPlotYAxisArea //----------------------------------------------------------------------------- class WXDLLEXPORT wxPlotYAxisArea: public wxWindow { public: wxPlotYAxisArea() {} wxPlotYAxisArea( wxPlotWindow *parent ); void OnPaint( wxPaintEvent &event ); void OnMouse( wxMouseEvent &event ); private: wxPlotWindow *m_owner; DECLARE_CLASS(wxPlotYAxisArea) DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- // wxPlotWindow //----------------------------------------------------------------------------- class WXDLLEXPORT wxPlotWindow: public wxScrolledWindow { public: wxPlotWindow() {} wxPlotWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flags = wxPLOT_DEFAULT ); ~wxPlotWindow(); // curve accessors // --------------- void Add( wxPlotCurve *curve ); void Delete( wxPlotCurve* curve ); size_t GetCount(); wxPlotCurve *GetAt( size_t n ); void SetCurrent( wxPlotCurve* current ); wxPlotCurve *GetCurrent(); // mark list accessors // ------------------- void Add( wxPlotOnOffCurve *curve ); void Delete( wxPlotOnOffCurve* curve ); size_t GetOnOffCurveCount(); wxPlotOnOffCurve *GetOnOffCurveAt( size_t n ); // vertical representation // ----------------------- void Move( wxPlotCurve* curve, int pixels_up ); void Enlarge( wxPlotCurve *curve, double factor ); // horizontal representation // ------------------------- void SetUnitsPerValue( double upv ); double GetUnitsPerValue() { return m_xUnitsPerValue; } void SetZoom( double zoom ); double GetZoom() { return m_xZoom; } // options // ------- void SetScrollOnThumbRelease( bool scrollOnThumbRelease = TRUE ) { m_scrollOnThumbRelease = scrollOnThumbRelease; } bool GetScrollOnThumbRelease() { return m_scrollOnThumbRelease; } void SetEnlargeAroundWindowCentre( bool enlargeAroundWindowCentre = TRUE ) { m_enlargeAroundWindowCentre = enlargeAroundWindowCentre; } bool GetEnlargeAroundWindowCentre() { return m_enlargeAroundWindowCentre; } // events (may be overridden) // -------------------------- void OnMoveUp( wxCommandEvent& event ); void OnMoveDown( wxCommandEvent& event ); void OnEnlarge( wxCommandEvent& event ); void OnShrink( wxCommandEvent& event ); void OnZoomIn( wxCommandEvent& event ); void OnZoomOut( wxCommandEvent& event ); void OnScroll2( wxScrollWinEvent& event ); // utilities // --------- void RedrawEverything(); void RedrawXAxis(); void RedrawYAxis(); void ResetScrollbar(); private: friend class wxPlotArea; friend class wxPlotXAxisArea; friend class wxPlotYAxisArea; double m_xUnitsPerValue; double m_xZoom; wxList m_curves; wxList m_onOffCurves; wxPlotArea *m_area; wxPlotXAxisArea *m_xaxis; wxPlotYAxisArea *m_yaxis; wxPlotCurve *m_current; bool m_scrollOnThumbRelease; bool m_enlargeAroundWindowCentre; DECLARE_CLASS(wxPlotWindow) DECLARE_EVENT_TABLE() }; // ---------------------------------------------------------------------------- // plot event macros // ---------------------------------------------------------------------------- typedef void (wxEvtHandler::*wxPlotEventFunction)(wxPlotEvent&); #define EVT_PLOT(id, fn) { wxEVT_PLOT_DOUBLECLICKED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_SEL_CHANGING(id, fn) { wxEVT_PLOT_SEL_CHANGING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_SEL_CHANGED(id, fn) { wxEVT_PLOT_SEL_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_CLICKED(id, fn) { wxEVT_PLOT_CLICKED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_DOUBLECLICKED(id, fn) { wxEVT_PLOT_DOUBLECLICKED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_ZOOM_IN(id, fn) { wxEVT_PLOT_ZOOM_IN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_ZOOM_OUT(id, fn) { wxEVT_PLOT_ZOOM_OUT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_VALUE_SEL_CREATING(id, fn) { wxEVT_PLOT_VALUE_SEL_CREATING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_VALUE_SEL_CREATED(id, fn) { wxEVT_PLOT_VALUE_SEL_CREATED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_VALUE_SEL_CHANGING(id, fn) { wxEVT_PLOT_VALUE_SEL_CHANGING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_VALUE_SEL_CHANGED(id, fn) { wxEVT_PLOT_VALUE_SEL_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_AREA_SEL_CREATING(id, fn) { wxEVT_PLOT_AREA_SEL_CREATING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_AREA_SEL_CREATED(id, fn) { wxEVT_PLOT_AREA_SEL_CREATED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_AREA_SEL_CHANGING(id, fn) { wxEVT_PLOT_AREA_SEL_CHANGING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_AREA_SEL_CHANGED(id, fn) { wxEVT_PLOT_AREA_SEL_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_BEGIN_X_LABEL_EDIT(id, fn) { wxEVT_PLOT_BEGIN_X_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_END_X_LABEL_EDIT(id, fn) { wxEVT_PLOT_END_X_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_BEGIN_Y_LABEL_EDIT(id, fn) { wxEVT_PLOT_BEGIN_Y_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_END_Y_LABEL_EDIT(id, fn) { wxEVT_PLOT_END_Y_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_BEGIN_TITLE_EDIT(id, fn) { wxEVT_PLOT_BEGIN_TITLE_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #define EVT_PLOT_END_TITLE_EDIT(id, fn) { wxEVT_PLOT_END_TITLE_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) (wxPlotEventFunction) & fn, (wxObject *) NULL }, #endif // wxUSE_PLOT #endif // _WX_PLOT_H_