1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
|
/* -*- Mode: C++ -*-
KDChart - a multi-platform charting engine
*/
/****************************************************************************
** Copyright (C) 2001-2003 Klarälvdalens Datakonsult AB. All rights reserved.
**
** This file is part of the KDChart library.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid commercial KDChart licenses may use this file in
** accordance with the KDChart Commercial License Agreement provided with
** the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.klaralvdalens-datakonsult.se/?page=products for
** information about KDChart Commercial License Agreements.
**
** Contact info@klaralvdalens-datakonsult.se if any conditions of this
** licensing are not clear to you.
**
**********************************************************************/
#ifndef __KDCHARTPAINTER_H__
#define __KDCHARTPAINTER_H__
#include <qmap.h>
#include <qrect.h>
#include <qdatetime.h>
#include <qregion.h>
#include <qstring.h>
#include "KDChartGlobal.h"
#include "KDChartUnknownTypeException.h"
#include "KDChartNotEnoughSpaceException.h"
#include "KDChartTable.h"
#include "KDChartDataRegion.h"
#include "KDChartParams.h"
class KDChartTableDataBase;
class KDChartCustomBox;
class KDChartTextPiece;
class KDChartPropertySet;
class KDChartAxisParams;
class QPainter;
struct internal__KDChart__CalcValues {
bool processThisAxis;
bool bSteadyCalc;
bool bLogarithmic;
bool bDecreasing;
KDChartAxisParams::AxisPos basicPos;
QPoint orig;
QPoint dest;
double pXDeltaFactor;
double pYDeltaFactor;
double pXDelimDeltaFaktor;
double pYDelimDeltaFaktor;
double nSubDelimFactor;
double pDelimDelta;
double nTxtHeight;
double pTextsX;
double pTextsY;
double pTextsW;
double pTextsH;
int textAlign;
bool isDateTime;
bool autoDtLabels;
QDateTime dtLow;
QDateTime dtHigh;
KDChartAxisParams::ValueScale dtDeltaScale;
double nLow;
double nHigh;
double nDelta;
double nDeltaPix;
double pLastX;
double pLastY;
};
class KDCHART_EXPORT KDChartPainter
{
public:
static KDChartPainter* create( KDChartParams* params,
bool make2nd = false );
virtual ~KDChartPainter();
static void registerPainter( const QString& painterName,
KDChartPainter* painter );
static void unregisterPainter( const QString& painterName );
virtual void setupGeometry ( QPainter* painter,
KDChartTableDataBase* data,
const QRect& rect );
virtual void paint( QPainter* painter, KDChartTableDataBase* data,
bool paintFirst,
bool paintLast,
KDChartDataRegionList* regions = 0,
const QRect* rect = 0,
bool mustCalculateGeometry = true );
virtual QRect outermostRect() const { return _outermostRect; }
static void drawMarker( QPainter* painter,
int style,
const QColor& color,
const QPoint& p,
const QSize& size,
uint align = Qt::AlignCenter );
protected:
KDChartPainter( KDChartParams* );
// Note: dataRow, dataCol (and data3rd, resp.)
// must only be set if area == KDChartEnums::AreaChartDataRegion
virtual void paintArea( QPainter* painter,
uint area,
KDChartDataRegionList* regions = 0,
uint dataRow = 0,
uint dataCol = 0,
uint data3rd = 0 );
virtual void paintDataRegionAreas( QPainter* painter,
KDChartDataRegionList* regions );
virtual void paintAreaWithGap( QPainter* painter,
QRect rect,
const KDChartParams::KDChartFrameSettings& settings );
virtual void paintCustomBoxes( QPainter* painter,
KDChartDataRegionList* regions );
virtual void paintData( QPainter* painter, KDChartTableDataBase* data,
bool paint2nd,
KDChartDataRegionList* regions = 0 ) = 0;
virtual void paintDataValues( QPainter* painter,
KDChartTableDataBase* data,
KDChartDataRegionList* regions );
virtual void paintAxes( QPainter* painter,
KDChartTableDataBase* data );
virtual void paintLegend( QPainter* painter,
KDChartTableDataBase* data );
virtual void paintHeaderFooter( QPainter* painter,
KDChartTableDataBase* data );
virtual bool axesOverlapping( int axis1, int axis2 );
virtual void findChartDatasets( KDChartTableDataBase* data,
bool paint2nd,
uint chart,
uint& chartDatasetStart,
uint& chartDatasetEnd );
virtual void calculateAllAxesRects( QPainter* painter,
bool finalPrecision,
KDChartTableDataBase* data );
virtual QPoint calculateAnchor( const KDChartCustomBox & box,
KDChartDataRegionList* regions = 0 ) const;
virtual QRect calculateAreaRect( bool & allCustomBoxes,
uint area,
uint dataRow,
uint dataCol,
uint data3rd,
KDChartDataRegionList* regions ) const;
virtual QString fallbackLegendText( uint dataset ) const;
virtual uint numLegendFallbackTexts( KDChartTableDataBase* data ) const;
static QPoint pointOnCircle( const QRect& rect, double angle );
static void makeArc( QPointArray& points,
const QRect& rect,
double startAngle, double angles );
const KDChartParams* params() const
{
return _params;
}
QRect _outermostRect; /* The Outermost rect covers the complete
area of the painter. */
QRect _innermostRect; /* The Innermost rect covers the area of
the painter MINUS the the global
left/top/right/bottom leading.
ALL following ones are INSIDE the Innermost.
*/
QRect _dataRect;
QRect _axesRect; /* The Axes rect contains the Data rect. Up to 4
axes might be at the left and bottom as well
as at the right and/or at the to top of the
chart.
*/
QRect _legendRect; /* The legend position depends on the parameter
settings. If it is not directly to the left or
to the right of the data display, it will be
below the headers and on top of the footers.
*/
int _legendEMSpace; // an em space in the legend font
int _legendSpacing; // the line spacing in the legend font
int _legendHeight; // the font height in the legend font
int _legendLeading; // the font leading in the legend font
// int _legendTitleSpacing; // the line spacing in the legend title font
// int _legendTitleLeading; // the font leading in the legend title font
KDChartTextPiece* _legendTitle;
int _numLegendTexts; // the number of legend items to show
int _logicalWidth;
int _logicalHeight;
double _areaWidthP1000;
double _areaHeightP1000;
QMap < int, QString > _legendTexts; // precomputed legend texts
internal__KDChart__CalcValues calcVal[ KDCHART_MAX_AXES ];
virtual bool calculateAllAxesLabelTextsAndCalcValues(
QPainter* painter,
KDChartTableDataBase* data,
double areaWidthP1000,
double areaHeightP1000,
double& delimLen );
virtual void drawExtraLinesAndMarkers(
KDChartPropertySet& propSet,
const QPen& defaultPen,
const KDChartParams::LineMarkerStyle& defaultMarkerStyle,
int myPointX,
int myPointY,
QPainter* painter,
const KDChartAxisParams* abscissaPara,
const KDChartAxisParams* ordinatePara,
const double areaWidthP1000,
const double areaHeightP1000,
bool bDrawInFront = FALSE );
static KDChartDataRegion* drawMarker( QPainter* painter,
const KDChartParams* params,
double areaWidthP1000,
double areaHeightP1000,
int deltaX,
int deltaY,
int style,
const QColor& color,
const QPoint& p,
uint dataset, uint value, uint chart,
KDChartDataRegionList* regions = 0,
int* width = 0,
int* height = 0,
uint align = Qt::AlignCenter );
private:
// disallow copy-construction and assignment
KDChartPainter( const KDChartPainter& );
KDChartPainter& operator=( const KDChartPainter& );
QMap < QString, KDChartPainter* > _customPainters;
KDChartParams* _params;
QRect trueFrameRect( const QRect& orgRect,
const KDChartParams::KDChartFrameSettings* settings ) const;
int legendTitleVertGap() const;
QFont trueLegendTitleFont() const;
QFont trueLegendFont() const;
void calculateHorizontalLegendSize( QPainter* painter,
QSize& size,
bool& legendNewLinesStartAtLeft ) const;
bool mustDrawVerticalLegend() const;
void findLegendTexts( KDChartTableDataBase* );
int calculateHdFtRects( QPainter* painter,
double averageValueP1000,
int xposLeft,
int xposRight,
bool bHeader,
int& yposTop,
int& yposBottom );
bool _legendNewLinesStartAtLeft;
int _legendTitleHeight;
int _legendTitleWidth;
int _legendTitleMetricsHeight; // the font height in the legend title font
int _hdLeading;
int _ftLeading;
};
#endif
|