KDChartAbstractAreaBase.cpp

Go to the documentation of this file.
00001 /****************************************************************************
00002 ** Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB.  All rights reserved.
00003 **
00004 ** This file is part of the KD Chart library.
00005 **
00006 ** Licensees holding valid commercial KD Chart licenses may use this file in
00007 ** accordance with the KD Chart Commercial License Agreement provided with
00008 ** the Software.
00009 **
00010 **
00011 ** This file may be distributed and/or modified under the terms of the
00012 ** GNU General Public License version 2 and version 3 as published by the
00013 ** Free Software Foundation and appearing in the file LICENSE.GPL included.
00014 **
00015 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00016 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00017 **
00018 ** Contact info@kdab.com if any conditions of this licensing are not
00019 ** clear to you.
00020 **
00021 **********************************************************************/
00022 
00023 #include "KDChartAbstractAreaBase.h"
00024 #include "KDChartAbstractAreaBase_p.h"
00025 #include <KDChartBackgroundAttributes.h>
00026 #include <KDChartFrameAttributes.h>
00027 #include <KDChartTextAttributes.h>
00028 #include "KDChartPainterSaver_p.h"
00029 #include "KDChartPrintingParameters.h"
00030 #include <QPainter>
00031 
00032 #include <KDABLibFakes>
00033 
00034 
00035 using namespace KDChart;
00036 
00037 AbstractAreaBase::Private::Private() :
00038     visible( true )
00039     // PENDING(khz) dockingPointToPadding?, alignToDockingPoint?
00040 {
00041     init();
00042 }
00043 
00044 
00045 AbstractAreaBase::Private::~Private() {}
00046 
00047 
00048 void AbstractAreaBase::Private::init()
00049 {
00050 }
00051 
00052 
00053 
00054 
00055 AbstractAreaBase::AbstractAreaBase() :
00056     _d( new Private() )
00057 {
00058 }
00059 
00060 AbstractAreaBase::~AbstractAreaBase()
00061 {
00062     delete _d; _d = 0;
00063 }
00064 
00065 
00066 void AbstractAreaBase::init()
00067 {
00068 }
00069 
00070 
00071 #define d d_func()
00072 
00073 bool AbstractAreaBase::compare( const AbstractAreaBase* other )const
00074 {
00075     if( other == this ) return true;
00076     if( ! other ){
00077         //qDebug() << "CartesianAxis::compare() cannot compare to Null pointer";
00078         return false;
00079     }
00080     /*
00081     qDebug() << "AbstractAreaBase:" << (frameAttributes() == other->frameAttributes())
00082         << (backgroundAttributes() == other->backgroundAttributes()) << "\n";
00083     */
00084     return  (frameAttributes()      == other->frameAttributes()) &&
00085             (backgroundAttributes() == other->backgroundAttributes());
00086 }
00087 
00088 void AbstractAreaBase::alignToReferencePoint( const RelativePosition& position )
00089 {
00090     Q_UNUSED( position );
00091     // PENDING(kalle) FIXME
00092     qWarning( "Sorry, not implemented: void AbstractAreaBase::alignToReferencePoint( const RelativePosition& position )" );
00093 }
00094 
00095 void AbstractAreaBase::setFrameAttributes( const FrameAttributes &a )
00096 {
00097     if( d->frameAttributes == a )
00098         return;
00099 
00100     d->frameAttributes = a;
00101     positionHasChanged();
00102 }
00103 
00104 FrameAttributes AbstractAreaBase::frameAttributes() const
00105 {
00106     return d->frameAttributes;
00107 }
00108 
00109 void AbstractAreaBase::setBackgroundAttributes( const BackgroundAttributes &a )
00110 {
00111     if( d->backgroundAttributes == a )
00112         return;
00113 
00114     d->backgroundAttributes = a;
00115     positionHasChanged();
00116 }
00117 
00118 BackgroundAttributes AbstractAreaBase::backgroundAttributes() const
00119 {
00120     return d->backgroundAttributes;
00121 }
00122 
00123 
00124 /* static */
00125 void AbstractAreaBase::paintBackgroundAttributes( QPainter& painter, const QRect& rect,
00126     const KDChart::BackgroundAttributes& attributes )
00127 {
00128     if( !attributes.isVisible() ) return;
00129 
00130     /* first draw the brush (may contain a pixmap)*/
00131     if( Qt::NoBrush != attributes.brush().style() ) {
00132         KDChart::PainterSaver painterSaver( &painter );
00133         painter.setPen( Qt::NoPen );
00134         const QPointF newTopLeft( painter.deviceMatrix().map( rect.topLeft() ) );
00135         painter.setBrushOrigin( newTopLeft );
00136         painter.setBrush( attributes.brush() );
00137         painter.drawRect( rect.adjusted( 0, 0, -1, -1 ) );
00138     }
00139     /* next draw the backPixmap over the brush */
00140     if( !attributes.pixmap().isNull() &&
00141         attributes.pixmapMode() != BackgroundAttributes::BackgroundPixmapModeNone ) {
00142         QPointF ol = rect.topLeft();
00143         if( BackgroundAttributes::BackgroundPixmapModeCentered == attributes.pixmapMode() )
00144         {
00145             ol.setX( rect.center().x() - attributes.pixmap().width() / 2 );
00146             ol.setY( rect.center().y() - attributes.pixmap().height()/ 2 );
00147             painter.drawPixmap( ol, attributes.pixmap() );
00148         } else {
00149             QMatrix m;
00150             double zW = (double)rect.width()  / (double)attributes.pixmap().width();
00151             double zH = (double)rect.height() / (double)attributes.pixmap().height();
00152             switch( attributes.pixmapMode() ) {
00153             case BackgroundAttributes::BackgroundPixmapModeScaled:
00154             {
00155                 double z;
00156                 z = qMin( zW, zH );
00157                 m.scale( z, z );
00158             }
00159             break;
00160             case BackgroundAttributes::BackgroundPixmapModeStretched:
00161                 m.scale( zW, zH );
00162                 break;
00163             default:
00164                 ; // Cannot happen, previously checked
00165             }
00166             QPixmap pm = attributes.pixmap().transformed( m );
00167             ol.setX( rect.center().x() - pm.width() / 2 );
00168             ol.setY( rect.center().y() - pm.height()/ 2 );
00169             painter.drawPixmap( ol, pm );
00170         }
00171     }
00172 }
00173 
00174 /* static */
00175 void AbstractAreaBase::paintFrameAttributes( QPainter& painter, const QRect& rect,
00176     const KDChart::FrameAttributes& attributes )
00177 {
00178 
00179     if( !attributes.isVisible() ) return;
00180 
00181     // Note: We set the brush to NoBrush explicitly here.
00182     //       Otherwise we might get a filled rectangle, so any
00183     //       previously drawn background would be overwritten by that area.
00184 
00185     const QPen   oldPen(   painter.pen() );
00186     const QBrush oldBrush( painter.brush() );
00187     painter.setPen(  PrintingParameters::scalePen( attributes.pen() ) );
00188     painter.setBrush( Qt::NoBrush );
00189     painter.drawRect( rect.adjusted( 0, 0, -1, -1 ) );
00190     painter.setBrush( oldBrush );
00191     painter.setPen( oldPen );
00192 }
00193 
00194 void AbstractAreaBase::paintBackground( QPainter& painter, const QRect& rect )
00195 {
00196     Q_ASSERT_X ( d != 0, "AbstractAreaBase::paintBackground()",
00197                 "Private class was not initialized!" );
00198     paintBackgroundAttributes( painter, rect, d->backgroundAttributes );
00199 }
00200 
00201 
00202 void AbstractAreaBase::paintFrame( QPainter& painter, const QRect& rect )
00203 {
00204     Q_ASSERT_X ( d != 0, "AbstractAreaBase::paintFrame()",
00205                 "Private class was not initialized!" );
00206     paintFrameAttributes( painter, rect, d->frameAttributes );
00207 }
00208 
00209 
00210 void AbstractAreaBase::getFrameLeadings(int& left, int& top, int& right, int& bottom ) const
00211 {
00212     if( d && d->frameAttributes.isVisible() ){
00213         const int padding = qMax( d->frameAttributes.padding(), 0 );
00214         left   = padding;
00215         top    = padding;
00216         right  = padding;
00217         bottom = padding;
00218     }else{
00219         left   = 0;
00220         top    = 0;
00221         right  = 0;
00222         bottom = 0;
00223     }
00224 }
00225 
00226 QRect AbstractAreaBase::innerRect() const
00227 {
00228     int left;
00229     int top;
00230     int right;
00231     int bottom;
00232     getFrameLeadings( left, top, right, bottom );
00233     return
00234         QRect( QPoint(0,0), areaGeometry().size() )
00235             .adjusted( left, top, -right, -bottom );
00236 }
00237 
00238 void AbstractAreaBase::positionHasChanged()
00239 {
00240     // this bloc left empty intentionally
00241 }
00242