00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
#include <qlabel.h>
00013
#include "qwt_plot.h"
00014
#include "qwt_plot_dict.h"
00015
#include "qwt_legend.h"
00016
#include "qwt_scale.h"
00017
#include "qwt_plot_printfilter.h"
00018
00019
class QwtPlotPrintFilterCache
00020 {
00021
friend class QwtPlotPrintFilter;
00022
00023
protected:
00024 QwtPlotPrintFilterCache()
00025 {
00026 legendFonts.setAutoDelete(TRUE);
00027 curveColors.setAutoDelete(TRUE);
00028 curveSymbolBrushColors.setAutoDelete(TRUE);
00029 curveSymbolPenColors.setAutoDelete(TRUE);
00030 markerFonts.setAutoDelete(TRUE);
00031 markerLabelColors.setAutoDelete(TRUE);
00032 markerLineColors.setAutoDelete(TRUE);
00033 markerSymbolBrushColors.setAutoDelete(TRUE);
00034 markerSymbolPenColors.setAutoDelete(TRUE);
00035 }
00036
00037 QColor titleColor;
00038 QFont titleFont;
00039
00040 QColor scaleColor[4];
00041 QFont scaleFont[4];
00042 QColor scaleTitleColor[4];
00043 QFont scaleTitleFont[4];
00044
00045 QIntDict<QFont> legendFonts;
00046
00047 QColor widgetBackground;
00048 QColor canvasBackground;
00049 QColor gridColors[2];
00050
00051 QIntDict<QColor> curveColors;
00052 QIntDict<QColor> curveSymbolBrushColors;
00053 QIntDict<QColor> curveSymbolPenColors;
00054
00055 QIntDict<QFont> markerFonts;
00056 QIntDict<QColor> markerLabelColors;
00057 QIntDict<QColor> markerLineColors;
00058 QIntDict<QColor> markerSymbolBrushColors;
00059 QIntDict<QColor> markerSymbolPenColors;
00060 };
00061
00066 QwtPlotPrintFilter::QwtPlotPrintFilter():
00067 d_options(PrintAll),
00068 d_cache(0)
00069 {
00070 }
00071
00073 QwtPlotPrintFilter::~QwtPlotPrintFilter()
00074 {
00075
delete d_cache;
00076 }
00077
00090 QColor
QwtPlotPrintFilter::color(
const QColor &c, Item item,
int)
const
00091
{
00092
if ( !(
options() & PrintCanvasBackground))
00093 {
00094
switch(item)
00095 {
00096
case MajorGrid:
00097
return Qt::darkGray;
00098
case MinorGrid:
00099
return Qt::gray;
00100
default:;
00101 }
00102 }
00103
return c;
00104 }
00105
00115 QFont
QwtPlotPrintFilter::font(
const QFont &f, Item,
int)
const
00116
{
00117
return f;
00118 }
00119
00124 void QwtPlotPrintFilter::apply(
QwtPlot *plot)
const
00125
{
00126
QwtPlotPrintFilter *that = (
QwtPlotPrintFilter *)
this;
00127
00128
delete that->
d_cache;
00129 that->
d_cache =
new QwtPlotPrintFilterCache;
00130
00131 QwtPlotPrintFilterCache &cache = *that->
d_cache;
00132
00133
if ( plot->
d_lblTitle )
00134 {
00135 QPalette palette = plot->
d_lblTitle->palette();
00136 cache.titleColor = palette.color(
00137 QPalette::Active, QColorGroup::Foreground);
00138 palette.setColor(QPalette::Active, QColorGroup::Foreground,
00139
color(cache.titleColor, Title));
00140 plot->
d_lblTitle->setPalette(palette);
00141
00142 cache.titleFont = plot->
d_lblTitle->font();
00143 plot->
d_lblTitle->setFont(
font(cache.titleFont, Title));
00144 }
00145
if ( plot->
d_legend )
00146 {
00147 QIntDictIterator<QWidget> it = plot->
d_legend->
itemIterator();
00148
for ( QWidget *w = it.toFirst(); w != 0; w = ++it)
00149 {
00150
const int key = it.currentKey();
00151
00152 cache.legendFonts.insert(it.currentKey(),
new QFont(w->font()));
00153 w->setFont(
font(w->font(), Legend, key));
00154
00155
if ( w->inherits(
"QwtLegendButton") )
00156 {
00157
QwtLegendButton *btn = (
QwtLegendButton *)w;
00158
00159
QwtSymbol symbol = btn->
symbol();
00160 QPen pen = symbol.
pen();
00161 QBrush brush = symbol.
brush();
00162
00163 pen.setColor(
color(pen.color(), CurveSymbol, key));
00164 brush.setColor(
color(brush.color(), CurveSymbol, key));
00165
00166 symbol.
setPen(pen);
00167 symbol.
setBrush(brush);
00168 btn->
setSymbol(symbol);
00169
00170 pen = btn->
curvePen();
00171 pen.setColor(
color(pen.color(), Curve, key));
00172 btn->
setCurvePen(pen);
00173 }
00174 }
00175 }
00176
for (
int axis = 0; axis < QwtPlot::axisCnt; axis++ )
00177 {
00178
QwtScale *scale = plot->
d_scale[axis];
00179
if ( scale )
00180 {
00181 cache.scaleColor[axis] = scale->palette().color(
00182 QPalette::Active, QColorGroup::Foreground);
00183 QPalette palette = scale->palette();
00184 palette.setColor(QPalette::Active, QColorGroup::Foreground,
00185
color(cache.scaleColor[axis], AxisScale, axis));
00186 scale->setPalette(palette);
00187
00188 cache.scaleFont[axis] = scale->font();
00189 scale->setFont(
font(cache.scaleFont[axis], AxisScale, axis));
00190
00191 cache.scaleTitleColor[axis] = scale->
titleColor();
00192 scale->
setTitleColor(
00193
color(cache.scaleTitleColor[axis], AxisTitle, axis));
00194
00195 cache.scaleTitleFont[axis] = scale->
titleFont();
00196 scale->
setTitleFont(
00197
font(cache.scaleTitleFont[axis], AxisTitle, axis));
00198
00199
int startDist, endDist;
00200 scale->
minBorderDist(startDist, endDist);
00201 scale->
setBorderDist(startDist, endDist);
00202 }
00203 }
00204
00205 cache.widgetBackground = plot->backgroundColor();
00206 plot->setBackgroundColor(
color(cache.widgetBackground, WidgetBackground));
00207
00208 cache.canvasBackground = plot->
canvasBackground();
00209 plot->
setCanvasBackground(
color(cache.canvasBackground, CanvasBackground));
00210
00211 QPen pen = plot->
d_grid->
majPen();
00212 cache.gridColors[0] = pen.color();
00213 pen.setColor(
color(pen.color(), MajorGrid));
00214 plot->
d_grid->
setMajPen(pen);
00215
00216 pen = plot->
d_grid->
minPen();
00217 cache.gridColors[1] = pen.color();
00218 pen.setColor(
color(pen.color(), MinorGrid));
00219 plot->
d_grid->
setMinPen(pen);
00220
00221 QIntDictIterator<QwtPlotCurve> itc(*plot->
d_curves);
00222
for (
QwtPlotCurve *c = itc.toFirst(); c != 0; c = ++itc )
00223 {
00224
const int key = itc.currentKey();
00225
00226
QwtSymbol symbol = c->
symbol();
00227
00228 QPen pen = symbol.
pen();
00229 cache.curveSymbolPenColors.insert(key,
new QColor(pen.color()));
00230 pen.setColor(
color(pen.color(), CurveSymbol, key));
00231 symbol.
setPen(pen);
00232
00233 QBrush brush = symbol.
brush();
00234 cache.curveSymbolBrushColors.insert(key,
new QColor(brush.color()));
00235 brush.setColor(
color(brush.color(), CurveSymbol, key));
00236 symbol.
setBrush(brush);
00237
00238 c->
setSymbol(symbol);
00239
00240 pen = c->
pen();
00241 cache.curveColors.insert(key,
new QColor(pen.color()));
00242 pen.setColor(
color(pen.color(), Curve, key));
00243 c->
setPen(pen);
00244 }
00245
00246 QIntDictIterator<QwtPlotMarker> itm(*plot->
d_markers);
00247
for (
QwtPlotMarker *m = itm.toFirst(); m != 0; m = ++itm )
00248 {
00249
const int key = itm.currentKey();
00250
00251 cache.markerFonts.insert(key,
new QFont(m->
font()));
00252 m->
setFont(
font(m->
font(), Marker, key));
00253
00254 QPen pen = m->
labelPen();
00255 cache.markerLabelColors.insert(key,
new QColor(pen.color()));
00256 pen.setColor(
color(pen.color(), Marker, key));
00257 m->
setLabelPen(pen);
00258
00259 pen = m->
linePen();
00260 cache.markerLineColors.insert(key,
new QColor(pen.color()));
00261 pen.setColor(
color(pen.color(), Marker, key));
00262 m->
setLinePen(pen);
00263
00264
QwtSymbol symbol = m->
symbol();
00265
00266 pen = symbol.
pen();
00267 cache.markerSymbolPenColors.insert(key,
new QColor(pen.color()));
00268 pen.setColor(
color(pen.color(), MarkerSymbol, key));
00269 symbol.
setPen(pen);
00270
00271 QBrush brush = symbol.
brush();
00272 cache.markerSymbolBrushColors.insert(key,
new QColor(brush.color()));
00273 brush.setColor(
color(brush.color(), MarkerSymbol, key));
00274 symbol.
setBrush(brush);
00275
00276 m->
setSymbol(symbol);
00277 }
00278 }
00279
00284 void QwtPlotPrintFilter::reset(
QwtPlot *plot)
const
00285
{
00286
if ( d_cache == 0 )
00287
return;
00288
00289 QFont *
font;
00290 QColor *
color;
00291
00292
if ( plot->
d_lblTitle )
00293 {
00294 QPalette palette = plot->
d_lblTitle->palette();
00295 palette.setColor(
00296 QPalette::Active, QColorGroup::Foreground, d_cache->titleColor);
00297 plot->
d_lblTitle->setPalette(palette);
00298
00299 plot->
d_lblTitle->setFont(d_cache->titleFont);
00300 }
00301
00302
if ( plot->
d_legend )
00303 {
00304 QIntDictIterator<QWidget> it = plot->
d_legend->
itemIterator();
00305
for ( QWidget *w = it.toFirst(); w != 0; w = ++it)
00306 {
00307
const int key = it.currentKey();
00308
00309 font = d_cache->legendFonts.find(key);
00310
if ( font )
00311 w->setFont(*font);
00312
00313
if ( w->inherits(
"QwtLegendButton") )
00314 {
00315
QwtLegendButton *btn = (
QwtLegendButton *)w;
00316
00317
QwtSymbol symbol = btn->
symbol();
00318 color = d_cache->curveSymbolPenColors.find(key);
00319
if ( color )
00320 {
00321 QPen pen = symbol.
pen();
00322 pen.setColor(*color);
00323 symbol.
setPen(pen);
00324 }
00325
00326 color = d_cache->curveSymbolBrushColors.find(key);
00327
if ( color )
00328 {
00329 QBrush brush = symbol.
brush();
00330 brush.setColor(*color);
00331 symbol.
setBrush(brush);
00332 }
00333 btn->
setSymbol(symbol);
00334
00335 color = d_cache->curveColors.find(key);
00336
if ( color )
00337 {
00338 QPen pen = btn->
curvePen();
00339 pen.setColor(*color);
00340 btn->
setCurvePen(pen);
00341 }
00342 }
00343 }
00344 }
00345
for (
int axis = 0; axis < QwtPlot::axisCnt; axis++ )
00346 {
00347
QwtScale *scale = plot->
d_scale[axis];
00348
if ( scale )
00349 {
00350 QPalette palette = scale->palette();
00351 palette.setColor(QPalette::Active, QColorGroup::Foreground,
00352 d_cache->scaleColor[axis]);
00353 scale->setPalette(palette);
00354 scale->setFont(d_cache->scaleFont[axis]);
00355
00356 scale->
setTitleColor(d_cache->scaleTitleColor[axis]);
00357 scale->
setTitleFont(d_cache->scaleTitleFont[axis]);
00358
00359
int startDist, endDist;
00360 scale->
minBorderDist(startDist, endDist);
00361 scale->
setBorderDist(startDist, endDist);
00362 }
00363 }
00364
00365 plot->setBackgroundColor(d_cache->widgetBackground);
00366 plot->
setCanvasBackground(d_cache->canvasBackground);
00367
00368 QPen pen = plot->
d_grid->
majPen();
00369 pen.setColor(d_cache->gridColors[0]);
00370 plot->
d_grid->
setMajPen(pen);
00371
00372 pen = plot->
d_grid->
minPen();
00373 pen.setColor(d_cache->gridColors[1]);
00374 plot->
d_grid->
setMinPen(pen);
00375
00376 QIntDictIterator<QwtPlotCurve> itc(*plot->
d_curves);
00377
for (
QwtPlotCurve *c = itc.toFirst(); c != 0; c = ++itc )
00378 {
00379
const int key = itc.currentKey();
00380
00381
QwtSymbol symbol = c->
symbol();
00382
00383 color = d_cache->curveSymbolPenColors.find(key);
00384
if ( color )
00385 {
00386 QPen pen = symbol.
pen();
00387 pen.setColor(*color);
00388 symbol.
setPen(pen);
00389 }
00390
00391 color = d_cache->curveSymbolBrushColors.find(key);
00392
if ( color )
00393 {
00394 QBrush brush = symbol.
brush();
00395 brush.setColor(*color);
00396 symbol.
setBrush(brush);
00397 }
00398 c->
setSymbol(symbol);
00399
00400 color = d_cache->curveColors.find(key);
00401
if ( color )
00402 {
00403 QPen pen = c->
pen();
00404 pen.setColor(*color);
00405 c->
setPen(pen);
00406 }
00407 }
00408
00409 QIntDictIterator<QwtPlotMarker> itm(*plot->
d_markers);
00410
for (
QwtPlotMarker *m = itm.toFirst(); m != 0; m = ++itm )
00411 {
00412
const int key = itm.currentKey();
00413
00414 font = d_cache->markerFonts.find(key);
00415
if ( font )
00416 m->
setFont(*font);
00417
00418 color = d_cache->markerLabelColors.find(key);
00419
if ( color )
00420 {
00421 QPen pen = m->
labelPen();
00422 pen.setColor(*color);
00423 m->
setLabelPen(pen);
00424 }
00425
00426 color = d_cache->markerLineColors.find(key);
00427
if ( color )
00428 {
00429 QPen pen = m->
linePen();
00430 pen.setColor(*color);
00431 m->
setLinePen(pen);
00432 }
00433
00434
QwtSymbol symbol = m->
symbol();
00435
00436 color = d_cache->markerSymbolPenColors.find(key);
00437
if ( color )
00438 {
00439 QPen pen = symbol.
pen();
00440 pen.setColor(*color);
00441 symbol.
setPen(pen);
00442 }
00443
00444 color = d_cache->markerSymbolBrushColors.find(key);
00445
if ( color )
00446 {
00447 QBrush brush = symbol.
brush();
00448 brush.setColor(*color);
00449 symbol.
setBrush(brush);
00450 }
00451
00452 m->
setSymbol(symbol);
00453
00454 }
00455
00456
QwtPlotPrintFilter *that = (
QwtPlotPrintFilter *)
this;
00457
delete that->
d_cache;
00458 that->
d_cache = 0;
00459 }
00460
00461
00462
00463
00464
00465