X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/846e1424e2f563b699e7fcb81d10cf6f2246487f..b58088819ba72c430ad028490fc45e1fc79694f0:/include/wx/generic/plot.h diff --git a/include/wx/generic/plot.h b/include/wx/generic/plot.h index da2436de3e..9f7c8d3d3d 100644 --- a/include/wx/generic/plot.h +++ b/include/wx/generic/plot.h @@ -16,15 +16,68 @@ #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 wxPlotCurve; -class wxPlotArea; -class wxPlotWindow; +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 @@ -34,7 +87,7 @@ class WXDLLEXPORT wxPlotCurve: public wxObject { public: wxPlotCurve( int offsetY, double startY, double endY ); - + virtual wxInt32 GetStartX() = 0; virtual wxInt32 GetEndX() = 0; @@ -52,15 +105,74 @@ public: { 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 //----------------------------------------------------------------------------- @@ -70,17 +182,64 @@ 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; + 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 //----------------------------------------------------------------------------- @@ -89,28 +248,132 @@ class WXDLLEXPORT wxPlotWindow: public wxScrolledWindow { public: wxPlotWindow() {} - wxPlotWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flags ); + 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 ); - void OnPaint( wxPaintEvent &event ); - + 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 wxPlotArea; + friend wxPlotXAxisArea; + friend 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; - wxList m_curves; - wxPlotArea *m_area; - wxPlotCurve *m_current; + bool m_scrollOnThumbRelease; + bool m_enlargeAroundWindowCentre; DECLARE_CLASS(wxPlotWindow) DECLARE_EVENT_TABLE() }; +// ---------------------------------------------------------------------------- +// calendar events macros +// ---------------------------------------------------------------------------- + +#define EVT_PLOT(id, fn) { wxEVT_PLOT_DOUBLECLICKED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_SEL_CHANGING(id, fn) { wxEVT_PLOT_SEL_CHANGING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_SEL_CHANGED(id, fn) { wxEVT_PLOT_SEL_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_CLICKED(id, fn) { wxEVT_PLOT_CLICKED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_DOUBLECLICKED(id, fn) { wxEVT_PLOT_DOUBLECLICKED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_ZOOM_IN(id, fn) { wxEVT_PLOT_ZOOM_IN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_ZOOM_OUT(id, fn) { wxEVT_PLOT_ZOOM_OUT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_VALUE_SEL_CREATING(id, fn) { wxEVT_PLOT_VALUE_SEL_CREATING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_VALUE_SEL_CREATED(id, fn) { wxEVT_PLOT_VALUE_SEL_CREATED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_VALUE_SEL_CHANGING(id, fn) { wxEVT_PLOT_VALUE_SEL_CHANGING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_VALUE_SEL_CHANGED(id, fn) { wxEVT_PLOT_VALUE_SEL_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_AREA_SEL_CREATING(id, fn) { wxEVT_PLOT_AREA_SEL_CREATING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_AREA_SEL_CREATED(id, fn) { wxEVT_PLOT_AREA_SEL_CREATED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_AREA_SEL_CHANGING(id, fn) { wxEVT_PLOT_AREA_SEL_CHANGING, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_AREA_SEL_CHANGED(id, fn) { wxEVT_PLOT_AREA_SEL_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_BEGIN_X_LABEL_EDIT(id, fn) { wxEVT_PLOT_BEGIN_X_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_END_X_LABEL_EDIT(id, fn) { wxEVT_PLOT_END_X_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_BEGIN_Y_LABEL_EDIT(id, fn) { wxEVT_PLOT_BEGIN_Y_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_END_Y_LABEL_EDIT(id, fn) { wxEVT_PLOT_END_Y_LABEL_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_BEGIN_TITLE_EDIT(id, fn) { wxEVT_PLOT_BEGIN_TITLE_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, +#define EVT_PLOT_END_TITLE_EDIT(id, fn) { wxEVT_PLOT_END_TITLE_EDIT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL }, + +#endif // wxUSE_PLOT + #endif // _WX_PLOT_H_