Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

qwt_plot_printfilter.cpp

00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** 00002 * Qwt Widget Library 00003 * Copyright (C) 1997 Josef Wilgen 00004 * Copyright (C) 2002 Uwe Rathmann 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the Qwt License, Version 1.0 00008 *****************************************************************************/ 00009 00010 // vim: expandtab 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 // Local Variables: 00462 // mode: C++ 00463 // c-file-style: "stroustrup" 00464 // indent-tabs-mode: nil 00465 // End:

Generated on Tue Nov 16 21:12:21 2004 for Qwt User's Guide by doxygen 1.3.8