00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef CHART_H
00032 #define CHART_H
00033 #include <vdk/vdk.h>
00038 class Coord
00039 {
00040 public:
00041 double x,y;
00042 Coord(double x = 0.0, double y = 0.0):x(x),y(y) {}
00043 ~Coord() {}
00044 };
00045
00046 typedef VDKValueList<Coord> CoordList;
00047 typedef VDKValueListIterator<Coord> CoordListIterator;
00048 typedef VDKArray<double> Darray;
00049
00050 class VDKChart;
00052
00056 class Series: public CoordList
00057 {
00058 Coord max,min;
00059 VDKString title;
00060 public:
00064 VDKReadWriteValueProp<Series,VDKRgb> Color;
00072 VDKReadWriteValueProp<Series,GdkLineStyle> LineStyle;
00076 VDKReadWriteValueProp<Series,int> LineWidth;
00085 VDKReadWriteValueProp<Series,GdkCapStyle> LineCapStyle;
00093 VDKReadWriteValueProp<Series,GdkJoinStyle> LineJoinStyle;
00098 Series(char* title):
00099 CoordList(),
00100 title(title),
00101 Color("Color",this,VDKRgb(0,0,0)),
00102 LineStyle("LineStyle",this,GDK_LINE_SOLID),
00103 LineWidth("LineWidth",this,1),
00104 LineCapStyle("LineCapStyle",this,GDK_CAP_NOT_LAST),
00105 LineJoinStyle("LineJoinStyle",this,GDK_JOIN_MITER)
00106 {}
00110 ~Series() {}
00116 void Add(double x, double y);
00123 void Add(double* x, double* y, int n);
00127 Coord Min() { return min; }
00131 Coord Max() { return max; }
00135 char* Title() { return (char*) title; }
00139 bool operator==(Series& s) { return title == s.title; }
00140 };
00141
00142 typedef VDKList<Series> SeriesList;
00143 typedef VDKListiterator<Series> SeriesListIterator;
00144
00146
00150 class ChartAxis
00151 {
00152 VDKRect domain;
00153 VDKChart* owner;
00154 public:
00155 ChartAxis():owner((VDKChart*) NULL) {}
00156 ChartAxis(VDKChart* owner,int w, int h);
00157 ChartAxis(ChartAxis& a);
00158 ~ChartAxis() {}
00159 void Draw();
00160 VDKRect& Domain() { return domain; }
00161 };
00162
00163 enum
00164 {
00165 chart_class = 4096,
00166 linechart_class,
00167 scatteredchart_class,
00168 barchart_class
00169 };
00170
00172
00192 class VDKChart: public VDKCanvas
00193 {
00194
00195 protected:
00196 GtkWidget *tip_window;
00197 VDKPoint size;
00198 double xn1,yn1,xn2,yn2,xv1,yv1,xv2,yv2,kx,ky;
00199 Coord domainmax,domainmin;
00200 SeriesList series;
00201 bool OnConfigure(VDKObject* sender, GdkEvent* event);
00202 bool OnClick(VDKObject* sender, GdkEvent* event);
00203 bool OnClickRelease(VDKObject* sender, GdkEvent* event);
00204 ChartAxis axis;
00205 void ComputeDomainLimits(Series* s);
00206 virtual void DrawChart();
00207 void DrawTitle();
00208 void DrawTicks();
00209 void DrawLabels();
00210 public:
00215 VDKReadWriteValueProp<VDKChart, int> ChartBorder;
00219 VDKReadWriteValueProp<VDKChart, VDKString> Title;
00223 VDKReadWriteValueProp<VDKChart, VDKString> LabelX;
00227 VDKReadWriteValueProp<VDKChart, VDKString> LabelY;
00231 VDKReadWriteValueProp<VDKChart, int> LabelXDigits;
00235 VDKReadWriteValueProp<VDKChart, int> LabelYDigits;
00242 VDKChart(VDKForm* owner, int w = 100, int h = 100);
00246 virtual ~VDKChart();
00250 virtual int isA() { return chart_class; }
00259 void AddSeries(Series* s);
00263 void Clear();
00264 void SetChartBorder(int b);
00265 int GetChartBorder() { return ChartBorder; }
00269 GdkGC* GC() { return gc; }
00274 void SetColor(VDKRgb rgb);
00278 void SetLineAttributes(gint lineWidth,
00279 GdkLineStyle lineStyle,
00280 GdkCapStyle capStyle,
00281 GdkJoinStyle joinStyle);
00291 virtual void Plot(VDKPoint& p , int i, Series* s) {}
00292 DECLARE_EVENT_LIST(VDKChart);
00293 };
00295
00299 class VDKLineChart: public VDKChart
00300 {
00301 public:
00302 VDKLineChart(VDKForm* owner, int w = 100, int h = 100):
00303 VDKChart(owner,w,h) {}
00304 virtual ~VDKLineChart() {}
00308 virtual void Plot(VDKPoint& p, int t, Series*);
00312 virtual int isA() { return linechart_class; }
00313 };
00315
00319 class VDKScatteredChart: public VDKChart
00320 {
00321 public:
00322 VDKScatteredChart(VDKForm* owner, int w = 100, int h = 100):
00323 VDKChart(owner,w,h) {}
00324 virtual ~VDKScatteredChart() {}
00325 virtual void Plot(VDKPoint& p, int t, Series*);
00326 virtual int isA() { return scatteredchart_class; }
00327 };
00328
00330
00335 class VDKBarChart: public VDKChart
00336 {
00337 public:
00341 VDKReadWriteValueProp<VDKBarChart,int> BarWidth;
00342
00343
00344
00345 VDKReadWriteValueProp<VDKBarChart,bool> Labels;
00346
00347 VDKBarChart(VDKForm* owner, int w = 100, int h = 100):
00348 VDKChart(owner,w,h),
00349 BarWidth("BarWidth",this,20),
00350 Labels("Labels",this,true)
00351 {}
00352 virtual ~VDKBarChart() {}
00356 virtual void Plot(VDKPoint& p, int t, Series*);
00360 virtual int isA() { return barchart_class; }
00361 };
00362
00363 #endif
00364
00365