00001
00002
00003
00004
00005
00006
00007
00009
00010 #ifndef AXIS_H_
00011 #define AXIS_H_
00012
00013 #include <wx/wxfreechartdefs.h>
00014 #include <wx/dataset.h>
00015
00016 #include <wx/dynarray.h>
00017
00018 #include <wx/drawobject.h>
00019 #include <wx/observable.h>
00020
00021 enum AXIS_LOCATION {
00022 AXIS_LEFT = 1,
00023 AXIS_RIGHT,
00024 AXIS_TOP,
00025 AXIS_BOTTOM,
00026 };
00027
00028 class WXDLLIMPEXP_FREECHART Axis;
00029
00033 class WXDLLIMPEXP_FREECHART AxisObserver
00034 {
00035 public:
00036 AxisObserver();
00037 virtual ~AxisObserver();
00038
00043 virtual void AxisChanged(Axis *axis) = 0;
00044
00049 virtual void BoundsChanged(Axis *axis) = 0;
00050 };
00051
00062 class WXDLLIMPEXP_FREECHART Axis : public wxObject, public Observable<AxisObserver>
00063 {
00064 DECLARE_CLASS(Axis)
00065
00066 friend class Plot;
00067 friend class AxisShare;
00068 public:
00073 Axis(AXIS_LOCATION location);
00074 virtual ~Axis();
00075
00080 AXIS_LOCATION GetLocation()
00081 {
00082 return m_location;
00083 }
00084
00089 bool IsVertical()
00090 {
00091 return (m_location == AXIS_LEFT) || (m_location == AXIS_RIGHT);
00092 }
00093
00098 bool IsHorizontal()
00099 {
00100 return !IsVertical();
00101 }
00102
00109 void SetMargins(wxCoord marginMin, wxCoord marginMax);
00110
00111
00112
00113
00118 size_t GetDatasetCount();
00119
00125 Dataset *GetDataset(size_t index);
00126
00127
00128
00129
00130
00135 void SetWindowWidth(double winWidth)
00136 {
00137 SetWindow(m_winPos, winWidth);
00138 }
00139
00144 double GetWindowWidth()
00145 {
00146 return m_winWidth;
00147 }
00148
00153 void SetWindowPosition(double winPos)
00154 {
00155 SetWindow(winPos, m_winWidth);
00156 }
00157
00162 double GetWindowPosition()
00163 {
00164 return m_winPos;
00165 }
00166
00171 void SetUseWindow(bool useWin)
00172 {
00173 if (m_useWin != useWin) {
00174 m_useWin = useWin;
00175 FireAxisChanged();
00176 }
00177 }
00178
00184 void SetWindow(double winPos, double winWidth)
00185 {
00186 if (m_winPos != winPos || m_winWidth != winWidth) {
00187 m_winPos = winPos;
00188 m_winWidth = winWidth;
00189 FireAxisChanged();
00190 }
00191 }
00192
00199 bool IntersectsWindow(double v0, double v1);
00200
00207 void GetWindowBounds(double &winMin, double &winMax)
00208 {
00209 double minValue, maxValue;
00210 GetDataBounds(minValue, maxValue);
00211
00212 if (m_useWin) {
00213 winMin = m_winPos;
00214 winMax = wxMin(maxValue, winMin + m_winWidth);
00215 }
00216 else {
00217 winMin = minValue;
00218 winMax = maxValue;
00219 }
00220 }
00221
00225 void AddDataset(Dataset *dataset)
00226 {
00227 if (AcceptDataset(dataset)) {
00228 m_datasets.Add(dataset);
00229 }
00230 }
00231
00237 virtual void GetDataBounds(double &minValue, double &maxValue) = 0;
00238
00245 virtual wxCoord GetExtent(wxDC &dc) = 0;
00246
00252 virtual bool IsVisible(double value);
00253
00259 virtual double BoundValue(double value);
00260
00269 virtual wxCoord ToGraphics(wxDC &dc, int minCoord, int gRange, double value);
00270
00279 virtual double ToData(wxDC &dc, int minCoord, int gRange, wxCoord g);
00280
00284 virtual void UpdateBounds() = 0;
00285
00291 virtual void Draw(wxDC &dc, wxRect rc) = 0;
00292
00298 virtual void DrawGridLines(wxDC &dc, wxRect rcData) = 0;
00299
00300 protected:
00308 virtual bool AcceptDataset(Dataset *dataset) = 0;
00309
00310 DatasetArray m_datasets;
00311 wxPen m_gridLinesPen;
00312
00313 wxCoord m_marginMin;
00314 wxCoord m_marginMax;
00315
00316 double m_winPos;
00317 double m_winWidth;
00318 bool m_useWin;
00319
00320 FIRE_WITH_THIS(AxisChanged);
00321 FIRE_WITH_THIS(BoundsChanged);
00322
00323 private:
00324 AXIS_LOCATION m_location;
00325
00326 size_t m_shareCount;
00327 };
00328
00329 WX_DECLARE_USER_EXPORTED_OBJARRAY(Axis *, AxisArray, WXDLLIMPEXP_FREECHART);
00330
00335 class WXDLLIMPEXP_FREECHART AxisShare : public Axis
00336 {
00337 public:
00338 AxisShare(Axis *axis);
00339 virtual ~AxisShare();
00340
00346 void SetShareVisible(bool shareVisible);
00347
00348
00349
00350
00351
00352 virtual void GetDataBounds(double &minValue, double &maxValue);
00353
00354 virtual wxCoord GetExtent(wxDC &dc);
00355
00356 virtual bool IsVisible(double value);
00357
00358 virtual double BoundValue(double value);
00359
00360 virtual wxCoord ToGraphics(wxDC &dc, int minCoord, int gRange, double value);
00361
00362 virtual double ToData(wxDC &dc, int minCoord, int gRange, wxCoord g);
00363
00364 virtual void UpdateBounds();
00365
00366 virtual void Draw(wxDC &dc, wxRect rc);
00367
00368 virtual void DrawGridLines(wxDC &dc, wxRect rcData);
00369
00370 protected:
00371 virtual bool AcceptDataset(Dataset *dataset);
00372
00373 private:
00374 bool m_shareVisible;
00375
00376 Axis *m_axis;
00377 };
00378
00379 wxCoord ToGraphics(int minCoord, int gRange, double minValue, double maxValue, wxCoord margin, bool vertical, double value);
00380 double ToData(int minCoord, int gRange, double minValue, double maxValue, wxCoord margin, bool vertical, wxCoord g);
00381
00382 #endif