00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <qgisinterface.h>
00024 #include <qgisgui.h>
00025 #include "qgsquickprint.h"
00026 #include <qgsapplication.h>
00027 #include <qgsmaplayerregistry.h>
00028 #include <qgsvectorlayer.h>
00029 #include <qgssymbol.h>
00030 #include <qgsmapcanvas.h>
00031 #include <qgsrenderer.h>
00032 #include <qgslogger.h>
00033 #include <qgslabelattributes.h>
00034 #include <qgslabel.h>
00035
00036
00037
00038
00039
00040 #include <QAction>
00041 #include <QToolBar>
00042 #include <QColor>
00043 #include <QPainter>
00044 #include <QDate>
00045 #include <QPixmap>
00046 #include <QString>
00047 #include <QSettings>
00048 #include <QSvgRenderer>
00049 #include <QLinearGradient>
00050
00051
00052 #include <cmath>
00053
00054 #ifdef _MSC_VER
00055 #define round(x) ((x) >= 0 ? floor((x)+0.5) : floor((x)-0.5))
00056 #endif
00057
00058 QgsQuickPrint::QgsQuickPrint()
00059 {
00060 mPageSize = QPrinter::A4;
00061 }
00062
00063 QgsQuickPrint::~QgsQuickPrint()
00064 {
00065
00066 }
00067 void QgsQuickPrint::setTitle( QString theText )
00068 {
00069 mTitleText = theText;
00070 }
00071 void QgsQuickPrint::setName( QString theText )
00072 {
00073 mNameText = theText;
00074 }
00075 void QgsQuickPrint::setCopyright( QString theText )
00076 {
00077 mCopyrightText = theText;
00078 }
00079 void QgsQuickPrint::setNorthArrow( QString theFileName )
00080 {
00081 mNorthArrowFile = theFileName;
00082 }
00083 void QgsQuickPrint::setLogo1( QString theFileName )
00084 {
00085 mLogo1File = theFileName;
00086 QgsDebugMsg( QString( "Logo1 set to: %1" ).arg( mLogo1File ) );
00087 }
00088 void QgsQuickPrint::setLogo2( QString theFileName )
00089 {
00090 mLogo2File = theFileName;
00091 QgsDebugMsg( QString( "Logo2 set to: %1" ).arg( mLogo2File ) );
00092 }
00093 void QgsQuickPrint::setOutputPdf( QString theFileName )
00094 {
00095 mOutputFileName = theFileName;
00096 }
00097 void QgsQuickPrint::setMapCanvas( QgsMapCanvas * thepMapCanvas )
00098 {
00099 mpMapRenderer = thepMapCanvas->mapRenderer();
00100 mMapBackgroundColor = thepMapCanvas->canvasColor();
00101 }
00102 void QgsQuickPrint::setMapRenderer( QgsMapRenderer * thepMapRenderer )
00103 {
00104 mpMapRenderer = thepMapRenderer;
00105 }
00106 void QgsQuickPrint::setMapBackgroundColor( QColor theColor )
00107 {
00108 mMapBackgroundColor = theColor;
00109 }
00110 void QgsQuickPrint::setPageSize( QPrinter::PageSize theSize )
00111 {
00112 mPageSize = theSize;
00113 }
00114
00115 void QgsQuickPrint::printMap()
00116 {
00117 if ( mOutputFileName.isEmpty() )
00118 {
00119 return;
00120 }
00121 if ( mpMapRenderer == NULL )
00122 {
00123 return;
00124 }
00125
00126 if ( !mOutputFileName.toUpper().endsWith( ".PDF" ) )
00127 {
00128 mOutputFileName += ".pdf";
00129 }
00130
00131
00132
00133
00134 QPrinter myPrinter( QPrinter::ScreenResolution );
00135
00136
00137
00138
00139
00140 int myPrintResolutionDpi = 300;
00141 myPrinter.setResolution( myPrintResolutionDpi );
00142 myPrinter.setOutputFormat( QPrinter::PdfFormat );
00143 QgsDebugMsg( QString( "Printing to page size %1" ).arg( pageSizeToString( mPageSize ) ) );
00144 myPrinter.setPageSize( mPageSize );
00145 myPrinter.setOutputFileName( mOutputFileName );
00146 myPrinter.setOrientation( QPrinter::Landscape );
00147 myPrinter.setDocName( "quickprint Report" );
00148 QPainter myPrintPainter( &myPrinter );
00149 myPrintPainter.setPen( Qt::gray );
00150 myPrintPainter.setBrush( Qt::white );
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208 int myOriginX = myPrinter.pageRect().left();
00209 int myOriginY = myPrinter.pageRect().top();
00210 int myDrawableWidth = myPrinter.pageRect().width() - myOriginX;
00211 int myDrawableHeight = myPrinter.pageRect().height() - myOriginY;
00212
00213
00214 int myHorizontalSpacing = myDrawableWidth / 100;
00215 int myVerticalSpacing = myDrawableHeight / 100;
00216
00217
00218 int myMapWidthPercent = 65;
00219 int myMapHeightPercent = 71;
00220 int myLegendWidthPercent = 25;
00221 int myLegendHeightPercent = 65;
00222 int myLogoWidthPercent = 23;
00223 int myLogoHeightPercent = 17;
00224
00225
00226
00227
00228 int myOriginalDpi = mpMapRenderer->outputDpi();
00229
00230 if ( 0 == myOriginalDpi ) myOriginalDpi = 96;
00231 QSize myOriginalSize = mpMapRenderer->outputSize();
00232
00233
00234 int myMapTitleFontSize = 24;
00235 int myMapDateFontSize = 16;
00236 int myMapNameFontSize = 32;
00237 int myLegendFontSize = 12;
00238 #ifdef Q_OS_LINUX//this sucks...
00239 myLegendFontSize -= 2;
00240 #endif
00241
00242 #ifdef WIN32 //this sucks too...
00243 myMapTitleFontSize /= 2;
00244 myMapDateFontSize /= 2;
00245 myMapNameFontSize /= 2;
00246 myLegendFontSize /= 2;
00247 #endif
00248 QString myFontFamily = "Arial";
00249
00250
00251 QColor myLegendBackgroundColor = Qt::white;
00252
00253
00254
00255
00256
00257
00258 myPrintPainter.drawRect(
00259 myOriginX, myOriginY, myDrawableWidth, myDrawableHeight );
00260
00261
00262
00263 QFont myTitleFont( myFontFamily, myMapTitleFontSize );
00264 myPrintPainter.setFont( myTitleFont );
00265 QFontMetrics myTitleMetrics( myTitleFont, &myPrinter );
00266 int myPageTitleHeight = myTitleMetrics.height();
00267 int myPageTitleWidth = myTitleMetrics.width( mTitleText );
00268 myOriginX += myHorizontalSpacing;
00269 myOriginY -= ( myPageTitleHeight / 2 );
00270 QRect myPageTitleRect( myOriginX,
00271 myOriginY,
00272 myPageTitleWidth,
00273 myPageTitleHeight );
00274
00275 myPrintPainter.setPen( Qt::white );
00276 myPrintPainter.drawRect( myPageTitleRect );
00277 myPrintPainter.setPen( Qt::black );
00278 myPrintPainter.drawText( myPageTitleRect, Qt::AlignCenter, mTitleText );
00279
00280
00281
00282
00283 QFont myDateFont( myFontFamily, myMapDateFontSize );
00284 QString myDateText( QDate::currentDate().toString( Qt::LocalDate ) );
00285 myPrintPainter.setFont( myDateFont );
00286 QFontMetrics myDateMetrics( myDateFont, &myPrinter );
00287 int myDateHeight = myDateMetrics.height();
00288
00289 myOriginX += myHorizontalSpacing;
00290 myOriginY += myPageTitleHeight + myVerticalSpacing ;
00291 QRect myDateRect( myOriginX,
00292 myOriginY,
00293 myPageTitleWidth,
00294 myDateHeight );
00295
00296 myPrintPainter.setPen( Qt::white );
00297 myPrintPainter.drawRect( myDateRect );
00298 myPrintPainter.setPen( Qt::black );
00299 myPrintPainter.drawText( myDateRect, Qt::AlignCenter, myDateText );
00300
00301
00302
00303
00304 QFont myNameFont( myFontFamily, myMapNameFontSize );
00305 myPrintPainter.setFont( myNameFont );
00306 QFontMetrics myNameMetrics( myNameFont, &myPrinter );
00307 int myNameHeight = myNameMetrics.height();
00308 int myNameWidth = myNameMetrics.width( mNameText );
00309 myOriginX = myPrinter.pageRect().left() + myDrawableWidth / 2;
00310 myOriginX -= myNameWidth / 2;
00311 myOriginY = myPrinter.pageRect().top() + ( myPageTitleHeight / 2 ) + myVerticalSpacing ;
00312 QRect myNameRect( myOriginX,
00313 myOriginY,
00314 myNameWidth,
00315 myNameHeight );
00316
00317 myPrintPainter.setPen( Qt::white );
00318 myPrintPainter.drawRect( myNameRect );
00319 myPrintPainter.setPen( Qt::black );
00320 myPrintPainter.drawText( myNameRect, Qt::AlignCenter, mNameText );
00321
00322
00323
00324
00325 int myMapFrameWidth = myDrawableWidth ;
00326 myOriginX = myPrinter.pageRect().left() + myHorizontalSpacing;
00327 myOriginY += myNameHeight + myVerticalSpacing;
00328 QLine myMapFrameTopLine( myOriginX,
00329 myOriginY,
00330 myMapFrameWidth,
00331 myOriginY );
00332 myPrintPainter.setPen( Qt::black );
00333 myPrintPainter.drawLine( myMapFrameTopLine );
00334
00335
00336
00337
00338
00339
00340 int myMapDimensionX = ( myDrawableWidth / 100 ) * myMapHeightPercent;
00341 int myMapDimensionY = ( myDrawableHeight / 100 ) * myMapWidthPercent;
00342
00343 QImage myMapImage( QSize( myMapDimensionX, myMapDimensionY ), QImage::Format_ARGB32 );
00344 myMapImage.setDotsPerMeterX(( double )( myPrinter.logicalDpiX() ) / 25.4 * 1000.0 );
00345 myMapImage.setDotsPerMeterY(( double )( myPrinter.logicalDpiY() ) / 25.4 * 1000.0 );
00346 myMapImage.fill( 0 );
00347 QPainter myMapPainter;
00348 myMapPainter.begin( &myMapImage );
00349
00350 mpMapRenderer->setOutputSize( QSize( myMapDimensionX, myMapDimensionY ), ( myPrinter.logicalDpiX() + myPrinter.logicalDpiY() ) / 2 );
00351 mpMapRenderer->render( &myMapPainter );
00352
00353 myMapPainter.end();
00354
00355 myOriginX = myPrinter.pageRect().left() + myHorizontalSpacing;
00356 myOriginY += myVerticalSpacing * 2;
00357
00358 myPrintPainter.drawImage( myOriginX, myOriginY, myMapImage );
00359
00360
00361
00362
00363 QFont myLegendFont( myFontFamily, myLegendFontSize );
00364
00365 int myLegendDimensionX = ( myDrawableWidth / 100 ) * myLegendWidthPercent;
00366 int myLegendDimensionY = ( myDrawableHeight / 100 ) * myLegendHeightPercent;
00367
00368
00369
00370
00371
00372 QRect myOriginalViewport = myPrintPainter.viewport();
00373 myOriginX += myMapDimensionX + myHorizontalSpacing;
00374 myPrintPainter.setViewport( myOriginX,
00375 myOriginY,
00376 myOriginalViewport.width(),
00377 myOriginalViewport.height() );
00378
00379
00380 if ( 0 == 1 )
00381 {
00382 myPrintPainter.drawRect( 0, 0, myLegendDimensionX, myLegendDimensionY );
00383 }
00384
00385 QFontMetrics myLegendFontMetrics( myLegendFont, &myPrinter );
00386 int myLegendFontHeight = myLegendFontMetrics.height();
00387 int myLegendXPos = 0;
00388 int myLegendYPos = 0;
00389 int myLegendSpacer = myLegendFontHeight / 2;
00390 int myLegendVerticalSpacer = myLegendFontHeight / 3;
00391 int myIconWidth = myLegendFontHeight;
00392 myPrintPainter.setFont( myLegendFont );
00393 QStringList myLayerSet = mpMapRenderer->layerSet();
00394 QStringListIterator myLayerIterator( myLayerSet );
00395
00396 while ( myLayerIterator.hasNext() &&
00397 myLegendYPos < myLegendDimensionY )
00398 {
00399 QString myLayerId = myLayerIterator.next();
00400 QgsMapLayer * mypLayer =
00401 QgsMapLayerRegistry::instance()->mapLayer( myLayerId );
00402 if ( mypLayer )
00403 {
00404 QgsVectorLayer *mypVectorLayer =
00405 qobject_cast<QgsVectorLayer *>( mypLayer );
00406
00407 if ( mypVectorLayer && mypVectorLayer->renderer() )
00408 {
00409 QString myLayerName = mypVectorLayer->name();
00410 QIcon myIcon;
00411 QPixmap myPixmap( QSize( myIconWidth, myIconWidth ) );
00412
00413 const QgsRenderer* mypRenderer = mypVectorLayer->renderer();
00414 const QList<QgsSymbol*> mySymbolList = mypRenderer->symbols();
00415
00416
00417
00418 double widthScale = ( myPrinter.logicalDpiX() + myPrinter.logicalDpiY() ) / 2.0 / 25.4;
00419
00420 if ( 1 == mySymbolList.size() )
00421 {
00422 QgsSymbol * mypSymbol = mySymbolList.at( 0 );
00423 myPrintPainter.setPen( mypSymbol->pen() );
00424 myPrintPainter.setBrush( mypSymbol->brush() );
00425 myLegendXPos = 0 ;
00426 if ( mypSymbol->type() == QGis::Point )
00427 {
00428 QImage myImage;
00429 myImage = mypSymbol->getPointSymbolAsImage( widthScale );
00430 myPrintPainter.drawImage( myLegendXPos, myLegendYPos, myImage );
00431 }
00432 else if ( mypSymbol->type() == QGis::Line )
00433 {
00434 myPrintPainter.drawLine( myLegendXPos, myLegendYPos,
00435 myLegendXPos + myIconWidth,
00436 myLegendYPos + myIconWidth );
00437 }
00438 else
00439 {
00440 myPrintPainter.drawRect( myLegendXPos, myLegendYPos, myIconWidth, myIconWidth );
00441 }
00442 myLegendXPos += myIconWidth + myLegendSpacer;
00443 myPrintPainter.setPen( Qt::black );
00444 QStringList myWrappedLayerNameList = wordWrap( myLayerName,
00445 myLegendFontMetrics,
00446 myLegendDimensionX - myIconWidth );
00447
00448
00449
00450 QStringListIterator myLineWrapIterator( myWrappedLayerNameList );
00451 while ( myLineWrapIterator.hasNext() )
00452 {
00453 QString myLine = myLineWrapIterator.next();
00454 QRect myLegendItemRect( myLegendXPos,
00455 myLegendYPos,
00456 myLegendDimensionX - myIconWidth,
00457 myLegendFontHeight );
00458 myPrintPainter.drawText( myLegendItemRect, Qt::AlignLeft, myLine );
00459 myLegendYPos += myLegendVerticalSpacer + myLegendFontHeight;
00460 }
00461 }
00462 else
00463 {
00464
00465 QStringList myWrappedLayerNameList = wordWrap( myLayerName,
00466 myLegendFontMetrics,
00467 myLegendDimensionX - myIconWidth );
00468
00469
00470 int myLabelHeight = myLegendFontHeight *
00471 myWrappedLayerNameList.count();
00472 if ( myLegendYPos + myLabelHeight > myLegendDimensionY )
00473 {
00474 continue;
00475 }
00476
00477
00478
00479
00480 QStringListIterator myLineWrapIterator( myWrappedLayerNameList );
00481 while ( myLineWrapIterator.hasNext() )
00482 {
00483 QString myLine = myLineWrapIterator.next();
00484 myLegendXPos = myIconWidth;
00485 QRect myLegendItemRect( myLegendXPos,
00486 myLegendYPos,
00487 myLegendFontMetrics.width( myLine ),
00488 myLegendFontHeight );
00489 myPrintPainter.setPen( Qt::black );
00490 myPrintPainter.drawText( myLegendItemRect, Qt::AlignLeft, myLine );
00491 myLegendYPos += myLegendVerticalSpacer + myLegendFontHeight;
00492 }
00493
00494
00495
00496 QListIterator<QgsSymbol *> myIterator( mySymbolList );
00497 while ( myIterator.hasNext() && myLegendYPos < myLegendDimensionY )
00498 {
00499 QgsSymbol * mypSymbol = myIterator.next();
00500 myPrintPainter.setPen( mypSymbol->pen() );
00501 myPrintPainter.setBrush( mypSymbol->brush() );
00502 myLegendXPos = myLegendSpacer * 3;
00503 if ( mypSymbol->type() == QGis::Point )
00504 {
00505 QImage myImage;
00506 myImage = mypSymbol->getPointSymbolAsImage( widthScale );
00507 myPrintPainter.drawImage( myLegendXPos, myLegendYPos, myImage );
00508 }
00509 else if ( mypSymbol->type() == QGis::Line )
00510 {
00511 myPrintPainter.drawLine( myLegendXPos, myLegendYPos,
00512 myLegendXPos + myIconWidth,
00513 myLegendYPos + myIconWidth );
00514 }
00515 else
00516 {
00517 myPrintPainter.drawRect(
00518 myLegendXPos, myLegendYPos, myIconWidth, myIconWidth );
00519 }
00520
00521
00522
00523 QString myLabel;
00524 QString myLower = mypSymbol->lowerValue();
00525 if ( !myLower.isEmpty() )
00526 {
00527 myLabel = myLower;
00528 }
00529 QString myUpper = mypSymbol->upperValue();
00530 if ( !myUpper.isEmpty() )
00531 {
00532 myLabel += " - ";
00533 myLabel += myUpper;
00534 }
00535 QString myText = mypSymbol->label();
00536 if ( !myText.isEmpty() )
00537 {
00538 myLabel += " ";
00539 myLabel += myText;
00540 }
00541 myLabel = myLabel.trimmed();
00542 myLegendXPos += myIconWidth + myLegendSpacer;
00543 myPrintPainter.setPen( Qt::black );
00544
00545 QStringList myWrappedLayerNameList = wordWrap( myLabel,
00546 myLegendFontMetrics,
00547 myLegendDimensionX - myLegendXPos );
00548
00549
00550
00551 QStringListIterator myLineWrapIterator( myWrappedLayerNameList );
00552 while ( myLineWrapIterator.hasNext() )
00553 {
00554 QString myLine = myLineWrapIterator.next();
00555
00556 QRect myLegendItemRect( myLegendXPos,
00557 myLegendYPos,
00558 myLegendDimensionX - myIconWidth,
00559 myLegendFontHeight );
00560 myPrintPainter.drawText( myLegendItemRect, Qt::AlignLeft, myLine );
00561 myLegendYPos += myLegendVerticalSpacer + myLegendFontHeight;
00562 }
00563 }
00564 }
00565 }
00566 }
00567 }
00568
00569
00570 myPrintPainter.setViewport( myOriginalViewport );
00571
00572
00573
00574
00575
00576 myOriginX = myPrinter.pageRect().left() + myHorizontalSpacing;
00577 myOriginY += myMapDimensionY + ( myVerticalSpacing * 2 );
00578 QLine myMapFrameBottomLine( myOriginX,
00579 myOriginY,
00580 myMapFrameWidth,
00581 myOriginY );
00582 myPrintPainter.setPen( Qt::black );
00583 myPrintPainter.drawLine( myMapFrameBottomLine );
00584
00585
00586
00587
00588
00589 int myLogoXDim = ( myDrawableWidth / 100 ) * myLogoWidthPercent;
00590 int myLogoYDim = ( myDrawableHeight / 100 ) * myLogoHeightPercent;
00591 QPixmap myLogo1;
00592 QgsDebugMsg( QString( "Logo1: %1" ).arg( mLogo1File ) );
00593 myLogo1.fill( Qt::white );
00594 myLogo1.load( mLogo1File );
00595 myLogo1 = myLogo1.scaled( myLogoXDim, myLogoYDim, Qt::KeepAspectRatio );
00596 myOriginX = myPrinter.pageRect().left() + myHorizontalSpacing;
00597 myOriginY += myVerticalSpacing ;
00598 myPrintPainter.drawPixmap( myOriginX,
00599 myOriginY,
00600 myLogo1 );
00601
00602
00603
00604
00605 myOriginX += myHorizontalSpacing + myLogoXDim;
00606 QRect myCopyrightRect( myOriginX, myOriginY, myLogoXDim, myLogoYDim );
00607 myPrintPainter.setPen( Qt::black );
00608 QFont myCopyrightFont( myFontFamily, myMapDateFontSize );
00609 myPrintPainter.setFont( myCopyrightFont );
00610
00611 myPrintPainter.drawText( myCopyrightRect, Qt::AlignCenter | Qt::TextWordWrap, mCopyrightText );
00612
00613
00614
00615
00616 QPixmap myLogo2;
00617 myLogo2.fill( Qt::white );
00618 myLogo2.load( mLogo2File );
00619 myLogo2 = myLogo2.scaled( myLogoXDim, myLogoYDim, Qt::KeepAspectRatio );
00620 myOriginX += myHorizontalSpacing + myLogoXDim;
00621 myPrintPainter.drawPixmap( myOriginX,
00622 myOriginY,
00623 myLogo2 );
00624
00625
00626
00627
00628 myOriginX += myHorizontalSpacing + myLogoXDim;
00629
00630
00631 QPixmap myNorthArrow( myLogoYDim / 2, myLogoYDim / 2 );
00632 myNorthArrow.fill( Qt::white );
00633 QPainter myNorthPainter( &myNorthArrow );
00634 QSvgRenderer mySvgRenderer( mNorthArrowFile );
00635 mySvgRenderer.render( &myNorthPainter );
00636 myPrintPainter.drawPixmap( myOriginX + (( myLogoXDim / 2 ) ),
00637 myOriginY,
00638 myNorthArrow );
00639
00640
00641
00642
00643 myOriginY += myLogoYDim / 2 + myVerticalSpacing;
00644 myPrintPainter.setViewport( myOriginX,
00645 myOriginY,
00646 myOriginalViewport.width(),
00647 myOriginalViewport.height() );
00648 renderPrintScaleBar( &myPrintPainter, mpMapRenderer, myLogoXDim );
00649 myPrintPainter.setViewport( myOriginalViewport );
00650
00651
00652
00653
00654
00655
00656 myPrintPainter.end();
00657 #if 0
00658 mProgressDialog.setValue( 0 );
00659 mProgressDialog.setLabelText( tr( "Please wait while your report is generated", "COMMENTED OUT" ) );
00660 mProgressDialog.show();
00661 mProgressDialog.setWindowModality( Qt::WindowModal );
00662 mProgressDialog.setAutoClose( true );
00663 #endif
00664
00665
00666
00667 mpMapRenderer->setOutputSize( myOriginalSize, myOriginalDpi );
00668 }
00669
00670 void QgsQuickPrint::scaleTextLabels( int theScaleFactor, SymbolScalingType theDirection )
00671 {
00672 if ( 0 >= theScaleFactor )
00673 {
00674 QgsDebugMsg( "invalid scale factor" );
00675 return;
00676 }
00677 QStringList myLayerSet = mpMapRenderer->layerSet();
00678 QStringListIterator myLayerIterator( myLayerSet );
00679 while ( myLayerIterator.hasNext() )
00680 {
00681 QString myLayerId = myLayerIterator.next();
00682 QgsDebugMsg( "Scaling text labels for print for " + myLayerId );
00683 QgsMapLayer * mypLayer =
00684 QgsMapLayerRegistry::instance()->mapLayer( myLayerId );
00685 if ( mypLayer )
00686 {
00687 QgsVectorLayer *mypVectorLayer =
00688 qobject_cast<QgsVectorLayer *>( mypLayer );
00689 if ( mypVectorLayer )
00690 {
00691 QgsLabel * mypLabel = mypVectorLayer->label();
00692 QgsLabelAttributes * mypLabelAttributes = mypLabel->labelAttributes();
00693 if ( theDirection == ScaleUp )
00694 {
00695 mypLabelAttributes->setSize(
00696 mypLabelAttributes->size() * theScaleFactor,
00697 mypLabelAttributes->sizeType() );
00698 }
00699 else
00700 {
00701 mypLabelAttributes->setSize(
00702 mypLabelAttributes->size() / theScaleFactor,
00703 mypLabelAttributes->sizeType() );
00704 }
00705 }
00706 }
00707 }
00708 }
00709
00710 void QgsQuickPrint::scalePointSymbols( int theScaleFactor, SymbolScalingType theDirection )
00711 {
00712 if ( 0 >= theScaleFactor )
00713 {
00714 QgsDebugMsg( "invalid scale factor" );
00715 return;
00716 }
00717 QStringList myLayerSet = mpMapRenderer->layerSet();
00718 QStringListIterator myLayerIterator( myLayerSet );
00719 while ( myLayerIterator.hasNext() )
00720 {
00721 QString myLayerId = myLayerIterator.next();
00722 QgsDebugMsg( "Scaling point symbols for print for " + myLayerId );
00723 QgsMapLayer * mypLayer =
00724 QgsMapLayerRegistry::instance()->mapLayer( myLayerId );
00725 if ( mypLayer )
00726 {
00727 QgsVectorLayer *mypVectorLayer =
00728 qobject_cast<QgsVectorLayer *>( mypLayer );
00729 if ( mypVectorLayer )
00730 {
00731 const QgsRenderer* mypRenderer = mypVectorLayer->renderer();
00732 const QList<QgsSymbol*> mySymbolList = mypRenderer->symbols();
00733
00734
00735
00736 if ( 1 == mySymbolList.size() )
00737 {
00738 QgsSymbol * mypSymbol = mySymbolList.at( 0 );
00739 if ( mypSymbol->type() == QGis::Point )
00740 {
00741 if ( theDirection == ScaleUp )
00742 {
00743 mypSymbol->setPointSize( mypSymbol->pointSize() * theScaleFactor );
00744 }
00745 else
00746 {
00747 mypSymbol->setPointSize( mypSymbol->pointSize() / theScaleFactor );
00748 }
00749 }
00750 }
00751 else
00752 {
00753 QListIterator<QgsSymbol *> myIterator( mySymbolList );
00754 while ( myIterator.hasNext() )
00755 {
00756 QgsSymbol * mypSymbol = myIterator.next();
00757 if ( mypSymbol->type() == QGis::Point )
00758 {
00759 if ( theDirection == ScaleUp )
00760 {
00761 mypSymbol->setPointSize( mypSymbol->pointSize() * theScaleFactor );
00762 }
00763 else
00764 {
00765 mypSymbol->setPointSize( mypSymbol->pointSize() / theScaleFactor );
00766 }
00767 }
00768 }
00769 }
00770 }
00771 }
00772 }
00773 }
00774
00775
00776
00777 void QgsQuickPrint::renderPrintScaleBar( QPainter * thepPainter,
00778 QgsMapRenderer * thepMapRenderer,
00779 int theMaximumWidth )
00780 {
00781
00782 bool mySnappingFlag = true;
00783 QColor mColor = Qt::black;
00784
00785 int myTextOffsetX = 0;
00786 int myTextOffsetY = 5;
00787 int myXMargin = 20;
00788 int myYMargin = 20;
00789 int myPreferredSize = theMaximumWidth - ( myXMargin * 2 );
00790 double myActualSize = 0;
00791 int myBufferSize = 1;
00792 QColor myBackColor = Qt::white;
00793 QColor myForeColor = Qt::black;
00794
00795
00796
00797
00798
00799
00800
00801 double myMapUnitsPerPixelDouble = std::abs( thepMapRenderer->mapUnitsPerPixel() );
00802
00803
00804 int myLayerCount = thepMapRenderer->layerSet().count();
00805 if ( !myLayerCount || !myMapUnitsPerPixelDouble ) return;
00806
00807
00808 double myScaleBarWidth = myPreferredSize;
00809 myActualSize = myScaleBarWidth * myMapUnitsPerPixelDouble;
00810
00811
00812
00813
00814 double myPowerOf10 = floor( log10( myActualSize ) );
00815
00816
00817 if ( mySnappingFlag )
00818 {
00819 double scaler = pow( 10.0, myPowerOf10 );
00820 myActualSize = round( myActualSize / scaler ) * scaler;
00821 myScaleBarWidth = myActualSize / myMapUnitsPerPixelDouble;
00822 }
00823
00824
00825 QGis::UnitType myMapUnits = thepMapRenderer->mapUnits();
00826 QString myScaleBarUnitLabel;
00827 switch ( myMapUnits )
00828 {
00829 case QGis::Meters:
00830 if ( myActualSize > 1000.0 )
00831 {
00832 myScaleBarUnitLabel = tr( " km" );
00833 myActualSize = myActualSize / 1000;
00834 }
00835 else if ( myActualSize < 0.01 )
00836 {
00837 myScaleBarUnitLabel = tr( " mm" );
00838 myActualSize = myActualSize * 1000;
00839 }
00840 else if ( myActualSize < 0.1 )
00841 {
00842 myScaleBarUnitLabel = tr( " cm" );
00843 myActualSize = myActualSize * 100;
00844 }
00845 else
00846 myScaleBarUnitLabel = tr( " m" );
00847 break;
00848 case QGis::Feet:
00849 if ( myActualSize > 5280.0 )
00850 {
00851 myScaleBarUnitLabel = tr( " miles" );
00852 myActualSize = myActualSize / 5280;
00853 }
00854 else if ( myActualSize == 5280.0 )
00855 {
00856 myScaleBarUnitLabel = tr( " mile" );
00857 myActualSize = myActualSize / 5280;
00858 }
00859 else if ( myActualSize < 1 )
00860 {
00861 myScaleBarUnitLabel = tr( " inches" );
00862 myActualSize = myActualSize * 12;
00863 }
00864 else if ( myActualSize == 1.0 )
00865 {
00866 myScaleBarUnitLabel = tr( " foot" );
00867 }
00868 else
00869 {
00870 myScaleBarUnitLabel = tr( " feet" );
00871 }
00872 break;
00873 case QGis::Degrees:
00874 if ( myActualSize == 1.0 )
00875 myScaleBarUnitLabel = tr( " degree" );
00876 else
00877 myScaleBarUnitLabel = tr( " degrees" );
00878 break;
00879 case QGis::UnknownUnit:
00880 myScaleBarUnitLabel = tr( " unknown" );
00881 default:
00882 QgsDebugMsg( "Error: not picked up map units - actual value = "
00883 + QString::number( myMapUnits ) );
00884 };
00885
00886
00887 int myFontSize = 10;
00888 QFont myFont( "helvetica", myFontSize );
00889 thepPainter->setFont( myFont );
00890 QFontMetrics myFontMetrics( myFont );
00891 double myFontWidth = myFontMetrics.width( myScaleBarUnitLabel );
00892 double myFontHeight = myFontMetrics.height();
00893
00894
00895 QString myScaleBarMaxLabel = QString::number( myActualSize );
00896
00897
00898
00899
00900 double myTotalScaleBarWidth = myScaleBarWidth + ( myFontWidth / 2 );
00901
00902
00903
00904 int myOriginX = ( theMaximumWidth - myTotalScaleBarWidth ) / 2;
00905 int myOriginY = myYMargin;
00906
00907
00908 QPen myForegroundPen( mColor, 2 );
00909 QPen myBackgroundPen( Qt::white, 3 );
00910
00911
00912 int myScaleBarWidthInt = ( int ) myScaleBarWidth;
00913
00914
00915 thepPainter->setPen( myForegroundPen );
00916
00917 QGradientStops myStops;
00918 myStops << QGradientStop( 0.0, QColor( "#616161" ) );
00919 myStops << QGradientStop( 0.5, QColor( "#505050" ) );
00920 myStops << QGradientStop( 0.6, QColor( "#434343" ) );
00921 myStops << QGradientStop( 1.0, QColor( "#656565" ) );
00922
00923 QLinearGradient myReverseGlossyBrush(
00924 QPointF( myOriginX, myOriginY + myFontHeight*3 ),
00925 QPointF( myOriginX, myOriginY ) );
00926 thepPainter->setBrush( myReverseGlossyBrush );
00927 thepPainter->drawRect(
00928 myOriginX,
00929 myOriginY,
00930 myOriginX + myScaleBarWidthInt,
00931 myOriginY + myFontHeight
00932 );
00933
00934
00935
00936
00937
00938
00939
00940 thepPainter->setPen( myBackColor );
00941 myFontWidth = myFontMetrics.width( "0" );
00942
00943 for ( int i = 0 - myBufferSize; i <= myBufferSize; i++ )
00944 {
00945 for ( int j = 0 - myBufferSize; j <= myBufferSize; j++ )
00946 {
00947 thepPainter->drawText( int( i + ( myOriginX - ( myFontWidth / 2 ) ) ),
00948 int( j + ( myOriginY - ( myFontHeight / 4 ) ) ) - myTextOffsetY,
00949 "0" );
00950 }
00951 }
00952
00953
00954 thepPainter->setPen( myForeColor );
00955
00956 thepPainter->drawText(
00957 int( myOriginX - ( myFontWidth / 2 ) ),
00958 int( myOriginY - ( myFontHeight / 4 ) ) - myTextOffsetY,
00959 "0"
00960 );
00961
00962
00963
00964
00965 thepPainter->setPen( myBackColor );
00966 myFontWidth = myFontMetrics.width( myScaleBarMaxLabel );
00967 myFontHeight = myFontMetrics.height();
00968
00969 for ( int i = 0 - myBufferSize; i <= myBufferSize; i++ )
00970 {
00971 for ( int j = 0 - myBufferSize; j <= myBufferSize; j++ )
00972 {
00973 thepPainter->drawText( int( i + ( myOriginX + myScaleBarWidthInt - ( myFontWidth / 2 ) ) ),
00974 int( j + ( myOriginY - ( myFontHeight / 4 ) ) ) - myTextOffsetY,
00975 myScaleBarMaxLabel );
00976 }
00977 }
00978
00979 thepPainter->setPen( myForeColor );
00980 thepPainter->drawText(
00981 int( myOriginX + myScaleBarWidthInt - ( myFontWidth / 2 ) ),
00982 int( myOriginY - ( myFontHeight / 4 ) ) - myTextOffsetY,
00983 myScaleBarMaxLabel
00984 );
00985
00986
00987
00988
00989 thepPainter->setPen( myBackColor );
00990 myFontWidth = myFontMetrics.width( myScaleBarUnitLabel );
00991
00992 for ( int i = 0 - myBufferSize; i <= myBufferSize; i++ )
00993 {
00994 for ( int j = 0 - myBufferSize; j <= myBufferSize; j++ )
00995 {
00996 thepPainter->drawText( i + ( myOriginX + myScaleBarWidthInt + myTextOffsetX ),
00997 j + myOriginY + myFontHeight + ( myFontHeight*2.5 ) + myTextOffsetY,
00998 myScaleBarUnitLabel );
00999 }
01000 }
01001
01002 thepPainter->setPen( myForeColor );
01003 thepPainter->drawText(
01004 myOriginX + myScaleBarWidthInt + myTextOffsetX,
01005 myOriginY + myFontHeight + ( myFontHeight*2.5 ) + myTextOffsetY,
01006 myScaleBarUnitLabel
01007 );
01008 }
01009
01010 QStringList QgsQuickPrint::wordWrap( QString theString,
01011 QFontMetrics theMetrics,
01012 int theWidth )
01013 {
01014
01015 QStringList myList;
01016 QString myCumulativeLine = "";
01017 QString myStringToPreviousSpace = "";
01018 int myPreviousSpacePos = 0;
01019 for ( int i = 0; i < theString.count(); ++i )
01020 {
01021 QChar myChar = theString.at( i );
01022 if ( myChar == QChar( ' ' ) )
01023 {
01024 myStringToPreviousSpace = myCumulativeLine;
01025 myPreviousSpacePos = i;
01026 }
01027 myCumulativeLine += myChar;
01028 if ( theMetrics.width( myCumulativeLine ) >= theWidth )
01029 {
01030
01031
01032
01033 myList << myStringToPreviousSpace.trimmed();
01034 i = myPreviousSpacePos;
01035 myStringToPreviousSpace = "";
01036 myCumulativeLine = "";
01037 }
01038 }
01039
01040 if ( !myCumulativeLine.trimmed().isEmpty() )
01041 {
01042 myList << myCumulativeLine.trimmed();
01043 }
01044
01045
01046 return myList;
01047
01048 }
01049 QString QgsQuickPrint::pageSizeToString( QPrinter::PageSize theSize )
01050 {
01051 if ( theSize == QPrinter::A0 ) return "QPrinter::A0";
01052 if ( theSize == QPrinter::A1 ) return "QPrinter::A1";
01053 if ( theSize == QPrinter::A2 ) return "QPrinter::A2";
01054 if ( theSize == QPrinter::A3 ) return "QPrinter::A3";
01055 if ( theSize == QPrinter::A4 ) return "QPrinter::A4";
01056 if ( theSize == QPrinter::A5 ) return "QPrinter::A5";
01057 if ( theSize == QPrinter::A6 ) return "QPrinter::A6";
01058 if ( theSize == QPrinter::A7 ) return "QPrinter::A7";
01059 if ( theSize == QPrinter::A8 ) return "QPrinter::A8";
01060 if ( theSize == QPrinter::A9 ) return "QPrinter::A9";
01061 if ( theSize == QPrinter::B0 ) return "QPrinter::B0";
01062 if ( theSize == QPrinter::B1 ) return "QPrinter::B1";
01063 if ( theSize == QPrinter::B10 ) return "QPrinter::B10";
01064 if ( theSize == QPrinter::B2 ) return "QPrinter::B2";
01065 if ( theSize == QPrinter::B3 ) return "QPrinter::B3";
01066 if ( theSize == QPrinter::B4 ) return "QPrinter::B4";
01067 if ( theSize == QPrinter::B5 ) return "QPrinter::B5";
01068 if ( theSize == QPrinter::B6 ) return "QPrinter::B6";
01069 if ( theSize == QPrinter::B7 ) return "QPrinter::B7";
01070 if ( theSize == QPrinter::B8 ) return "QPrinter::B8";
01071 if ( theSize == QPrinter::B9 ) return "QPrinter::B9";
01072 if ( theSize == QPrinter::C5E ) return "QPrinter::C5E";
01073 if ( theSize == QPrinter::Comm10E ) return "QPrinter::Comm10E";
01074 if ( theSize == QPrinter::DLE ) return "QPrinter::DLE";
01075 if ( theSize == QPrinter::Executive ) return "QPrinter::Executive";
01076 if ( theSize == QPrinter::Folio ) return "QPrinter::Folio";
01077 if ( theSize == QPrinter::Ledger ) return "QPrinter::Ledger";
01078 if ( theSize == QPrinter::Legal ) return "QPrinter::Legal";
01079 if ( theSize == QPrinter::Letter ) return "QPrinter::Letter";
01080
01081 return "QPrinter::A4";
01082
01083 }
01084
01085 QPrinter::PageSize QgsQuickPrint::stringToPageSize( QString theSize )
01086 {
01087 if ( theSize == "QPrinter::A0" ) return QPrinter::A0;
01088 if ( theSize == "QPrinter::A1" ) return QPrinter::A1;
01089 if ( theSize == "QPrinter::A2" ) return QPrinter::A2;
01090 if ( theSize == "QPrinter::A3" ) return QPrinter::A3;
01091 if ( theSize == "QPrinter::A4" ) return QPrinter::A4;
01092 if ( theSize == "QPrinter::A5" ) return QPrinter::A5;
01093 if ( theSize == "QPrinter::A6" ) return QPrinter::A6;
01094 if ( theSize == "QPrinter::A7" ) return QPrinter::A7;
01095 if ( theSize == "QPrinter::A8" ) return QPrinter::A8;
01096 if ( theSize == "QPrinter::A9" ) return QPrinter::A9;
01097 if ( theSize == "QPrinter::B0" ) return QPrinter::B0;
01098 if ( theSize == "QPrinter::B1" ) return QPrinter::B1;
01099 if ( theSize == "QPrinter::B10" ) return QPrinter::B10;
01100 if ( theSize == "QPrinter::B2" ) return QPrinter::B2;
01101 if ( theSize == "QPrinter::B3" ) return QPrinter::B3;
01102 if ( theSize == "QPrinter::B4" ) return QPrinter::B4;
01103 if ( theSize == "QPrinter::B5" ) return QPrinter::B5;
01104 if ( theSize == "QPrinter::B6" ) return QPrinter::B6;
01105 if ( theSize == "QPrinter::B7" ) return QPrinter::B7;
01106 if ( theSize == "QPrinter::B8" ) return QPrinter::B8;
01107 if ( theSize == "QPrinter::B9" ) return QPrinter::B9;
01108 if ( theSize == "QPrinter::C5E" ) return QPrinter::C5E;
01109 if ( theSize == "QPrinter::Comm10E" ) return QPrinter::Comm10E;
01110 if ( theSize == "QPrinter::DLE" ) return QPrinter::DLE;
01111 if ( theSize == "QPrinter::Executive" ) return QPrinter::Executive;
01112 if ( theSize == "QPrinter::Folio" ) return QPrinter::Folio;
01113 if ( theSize == "QPrinter::Ledger" ) return QPrinter::Ledger;
01114 if ( theSize == "QPrinter::Legal" ) return QPrinter::Legal;
01115 if ( theSize == "QPrinter::Letter" ) return QPrinter::Letter;
01116
01117 return QPrinter::A4;
01118
01119 }
01120
01121
01122