KD Chart 2 [rev.2.4]

KDChartAbstractAxis.cpp

Go to the documentation of this file.
00001 /****************************************************************************
00002 ** Copyright (C) 2001-2012 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.txt 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 "KDChartAbstractAxis.h"
00024 #include "KDChartAbstractAxis_p.h"
00025 #include "KDChartAbstractDiagram.h"
00026 #include "KDChartAbstractCartesianDiagram.h"
00027 #include "KDChartEnums.h"
00028 #include "KDChartMeasure.h"
00029 
00030 #include <QDebug>
00031 
00032 #include <KDABLibFakes>
00033 
00034 using namespace KDChart;
00035 
00036 #define d d_func()
00037 
00038 AbstractAxis::Private::Private( AbstractDiagram* diagram, AbstractAxis* axis )
00039     : observer( 0 )
00040     , mDiagram( diagram )
00041     , mAxis(    axis )
00042 {
00043     // Note: We do NOT call setDiagram( diagram, axis );
00044     //       but it is called in AbstractAxis::delayedInit() instead!
00045 }
00046 
00047 AbstractAxis::Private::~Private()
00048 {
00049     delete observer;
00050     observer = 0;
00051 }
00052 
00053 bool AbstractAxis::Private::setDiagram(
00054     AbstractDiagram* diagram_,
00055     bool delayedInit )
00056 {
00057     AbstractDiagram* diagram = delayedInit ? mDiagram : diagram_;
00058     if( delayedInit ){
00059         mDiagram = 0;
00060     }
00061 
00062     // do not set a diagram again that was already set
00063     if (  diagram &&
00064         ((diagram == mDiagram) || secondaryDiagrams.contains( diagram )) )
00065         return false;
00066 
00067     bool bNewDiagramStored = false;
00068     if ( ! mDiagram ) {
00069         mDiagram = diagram;
00070         delete observer;
00071         if ( mDiagram ) {
00072 //qDebug() << "axis" << (axis != 0);
00073             observer = new DiagramObserver( mDiagram, mAxis );
00074             const bool con = connect( observer, SIGNAL( diagramDataChanged( AbstractDiagram *) ),
00075                     mAxis, SIGNAL( coordinateSystemChanged() ) );
00076             Q_UNUSED( con )
00077             Q_ASSERT( con );
00078             bNewDiagramStored = true;
00079         }else{
00080             observer = 0;
00081         }
00082     } else {
00083         if ( diagram )
00084             secondaryDiagrams.enqueue( diagram );
00085     }
00086     return bNewDiagramStored;
00087 }
00088 
00089 void AbstractAxis::Private::unsetDiagram( AbstractDiagram* diagram )
00090 {
00091     if ( diagram == mDiagram ) {
00092         mDiagram = 0;
00093         delete observer;
00094         observer = 0;
00095     } else {
00096         secondaryDiagrams.removeAll( diagram );
00097     }
00098     if( !secondaryDiagrams.isEmpty() ) {
00099         AbstractDiagram *nextDiagram = secondaryDiagrams.dequeue();
00100         setDiagram( nextDiagram );
00101     }
00102 }
00103 
00104 bool AbstractAxis::Private::hasDiagram( AbstractDiagram* diagram ) const
00105 {
00106     return diagram == mDiagram || secondaryDiagrams.contains( diagram );
00107 }
00108 
00109 AbstractAxis::AbstractAxis ( AbstractDiagram* diagram )
00110     : AbstractArea( new Private( diagram, this ) )
00111 {
00112     init();
00113     QTimer::singleShot(0, this, SLOT(delayedInit()));
00114 }
00115 
00116 AbstractAxis::~AbstractAxis()
00117 {
00118     d->mDiagram = 0;
00119     d->secondaryDiagrams.clear();
00120 }
00121 
00122 
00123 void AbstractAxis::init()
00124 {
00125     Measure m(
00126         12.5,
00127         KDChartEnums::MeasureCalculationModeAuto,
00128         KDChartEnums::MeasureOrientationAuto );
00129     d->textAttributes.setFontSize( m  );
00130     m.setValue( 5 );
00131     m.setCalculationMode( KDChartEnums::MeasureCalculationModeAbsolute );
00132     d->textAttributes.setMinimalFontSize( m  );
00133     if ( d->diagram() )
00134         createObserver( d->diagram() );
00135 }
00136 
00137 void AbstractAxis::delayedInit()
00138 {
00139     // We call setDiagram() here, because the c'tor of Private
00140     // only has stored the pointers, but it did not call setDiagram().
00141     if( d )
00142         d->setDiagram( 0, true /* delayedInit */ );
00143 }
00144 
00145 bool AbstractAxis::compare( const AbstractAxis* other )const
00146 {
00147     if( other == this ) return true;
00148     if( ! other ){
00149         //qDebug() << "CartesianAxis::compare() cannot compare to Null pointer";
00150         return false;
00151     }
00152     /*
00153     qDebug() << (textAttributes() == other->textAttributes());
00154     qDebug() << (labels()         == other->labels());
00155     qDebug() << (shortLabels()    == other->shortLabels());
00156     */
00157     return  ( static_cast<const AbstractAreaBase*>(this)->compare( other ) ) &&
00158             (textAttributes() == other->textAttributes()) &&
00159             (labels()         == other->labels()) &&
00160             (shortLabels()    == other->shortLabels());
00161 }
00162 
00163 
00164 const QString AbstractAxis::customizedLabel( const QString& label )const
00165 {
00166     return label;
00167 }
00168 
00169 
00170 void AbstractAxis::createObserver( AbstractDiagram* diagram )
00171 {
00172     d->setDiagram( diagram );
00173 }
00174 
00175 void AbstractAxis::deleteObserver( AbstractDiagram* diagram )
00176 {
00177     d->unsetDiagram( diagram );
00178 }
00179 
00180 void AbstractAxis::connectSignals()
00181 {
00182     if( d->observer ){
00183         const bool con = connect( d->observer, SIGNAL( diagramDataChanged( AbstractDiagram *) ),
00184                 this, SIGNAL( coordinateSystemChanged() ) );
00185         Q_UNUSED( con );
00186         Q_ASSERT( con );
00187     }
00188 }
00189 
00190 void AbstractAxis::setTextAttributes( const TextAttributes &a )
00191 {
00192     if( d->textAttributes == a )
00193         return;
00194 
00195     d->textAttributes = a;
00196     update();
00197 }
00198 
00199 TextAttributes AbstractAxis::textAttributes() const
00200 {
00201     return d->textAttributes;
00202 }
00203 
00204 
00205 void AbstractAxis::setRulerAttributes( const RulerAttributes &a )
00206 {
00207         d->rulerAttributes = a;
00208         update();
00209 }
00210 
00211 RulerAttributes AbstractAxis::rulerAttributes() const
00212 {
00213         return d->rulerAttributes;
00214 }
00215 
00216 void AbstractAxis::setLabels( const QStringList& list )
00217 {
00218     if( d->hardLabels == list )
00219         return;
00220 
00221     d->hardLabels = list;
00222     update();
00223 }
00224 
00225 QStringList AbstractAxis::labels() const
00226 {
00227     return d->hardLabels;
00228 }
00229 
00230 void AbstractAxis::setShortLabels( const QStringList& list )
00231 {
00232     if( d->hardShortLabels == list )
00233         return;
00234 
00235     d->hardShortLabels = list;
00236     update();
00237 }
00238 
00239 QStringList AbstractAxis::shortLabels() const
00240 {
00241     return d->hardShortLabels;
00242 }
00243 
00244 const AbstractCoordinatePlane* AbstractAxis::coordinatePlane() const
00245 {
00246     if( d->diagram() )
00247         return d->diagram()->coordinatePlane();
00248     return 0;
00249 }
00250 
00251 const AbstractDiagram * KDChart::AbstractAxis::diagram() const
00252 {
00253     return d->diagram();
00254 }
00255 
00256 bool KDChart::AbstractAxis::observedBy( AbstractDiagram * diagram ) const
00257 {
00258     return d->hasDiagram( diagram );
00259 }
00260 
00261 void KDChart::AbstractAxis::update()
00262 {
00263     if( d->diagram() )
00264         d->diagram()->update();
00265 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Defines

Klarälvdalens Datakonsult AB (KDAB)
Qt-related services and products
http://www.kdab.com/
http://www.kdab.com/products/kd-chart/