diff options
Diffstat (limited to 'kchart/kdchart/KDChartDataIntern.h')
-rw-r--r-- | kchart/kdchart/KDChartDataIntern.h | 432 |
1 files changed, 432 insertions, 0 deletions
diff --git a/kchart/kdchart/KDChartDataIntern.h b/kchart/kdchart/KDChartDataIntern.h new file mode 100644 index 00000000..cb41b5cb --- /dev/null +++ b/kchart/kdchart/KDChartDataIntern.h @@ -0,0 +1,432 @@ +/* -*- Mode: C++ -*- + KDChart - a multi-platform charting engine +*/ + +/**************************************************************************** + ** Copyright (C) 2001-2003 Klar�vdalens Datakonsult AB. All rights reserved. + ** + ** This file is part of the KDChart library. + ** + ** This file may be distributed and/or modified under the terms of the + ** GNU General Public License version 2 as published by the Free Software + ** Foundation and appearing in the file LICENSE.GPL included in the + ** packaging of this file. + ** + ** Licensees holding valid commercial KDChart licenses may use this file in + ** accordance with the KDChart Commercial License Agreement provided with + ** the Software. + ** + ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + ** + ** See http://www.klaralvdalens-datakonsult.se/?page=products for + ** information about KDChart Commercial License Agreements. + ** + ** Contact info@klaralvdalens-datakonsult.se if any conditions of this + ** licensing are not clear to you. + ** + **********************************************************************/ +#ifndef __KDCHARTDATAINTERN_H__ +#define __KDCHARTDATAINTERN_H__ + +#include <qvariant.h> +#include <qstring.h> +#include <qdatetime.h> +#include "KDChartGlobal.h" + +/** + \file KDChartData.h + + \brief Provides a class to encapsulate one data value in a chart. +*/ + + + +// Please leave all methods in this class inline! +// It's necessary since it's part of the interface provided by KDChart +class KDCHART_EXPORT KDChartData +{ +public: + // 0. default c'tor: initializing all values as undefined + + KDChartData() : + _valueType( QVariant::Invalid ), + _valueType2( QVariant::Invalid ), + _propSetID( 0 ) + {} + + // 1. simple c'tors: used for 1-coordinate data + + KDChartData( double value ) : + _valueType( QVariant::Double ), dValue( value ), + _valueType2( QVariant::Invalid ), + _propSetID( 0 ) + {} + /* string values are only supported for legend texts or axis labels */ + KDChartData( const QString& value ) : + _valueType( QVariant::String ), sValue( value ), + _valueType2( QVariant::Invalid ), + _propSetID( 0 ) + {} + /* date/time values for /ordinate/ axes are not implemented yet + KDChartData( QDateTime value ) : + _valueType( QVariant::DateTime ), dtValue( value ), + _valueType2( QVariant::Invalid ), + _propSetID( 0 ) + {}*/ + + // 2. complex c'tors: used for 2-coordinate data + + // 2.a) with additional Date/Time: normally used when Date on x-axis + // e.g. for time related index numbers like water level measurements + KDChartData( double yValue, QDateTime xValue ) : + _valueType( QVariant::Double ), dValue( yValue ), + _valueType2( QVariant::DateTime ), dtValue2( xValue ), + _propSetID( 0 ) + {} + + + KDChartData( const QVariant& _value1, + const QVariant& _value2 ) + { + switch( _value1.type() ){ + case QVariant::Int: + case QVariant::UInt: + case QVariant::Double: + _valueType = QVariant::Double; + dValue = _value1.toDouble(); + break; + case QVariant::DateTime: + _valueType = QVariant::DateTime; + dtValue = _value1.toDateTime(); + break; + case QVariant::String: + _valueType = QVariant::String; + sValue = _value1.toString(); + break; + default: + _valueType = QVariant::Invalid; + } + switch( _value2.type() ){ + case QVariant::Int: + case QVariant::UInt: + case QVariant::Double: + _valueType2 = QVariant::Double; + dValue2 = _value2.toDouble(); + break; + case QVariant::DateTime: + _valueType2 = QVariant::DateTime; + dtValue2 = _value2.toDateTime(); + break; + default: + _valueType2 = QVariant::Invalid; + } + _propSetID = 0; + } + + /* date/time values for /ordinate/ axes are not implemented yet + KDChartData( QDateTime yValue, QDateTime xValue ) : + _valueType( DateTime ), dtValue( yValue ), + _valueType2( DateTime ), dtValue2( xValue ), + _propSetID( 0 ) + {}*/ + // 2.b) with additional Double: may be used for mathematical data... + KDChartData( double yValue, double xValue ) : + _valueType( QVariant::Double ), dValue( yValue ), + _valueType2( QVariant::Double ), dValue2( xValue ), + _propSetID( 0 ) + {} + /* date/time values for /ordinate/ axes are not implemented yet + KDChartData( QDateTime yValue, double xValue ) : + _valueType( DateTime ), dtValue( yValue ), + _valueType2( Double ), dValue2( xValue ), + _propSetID( 0 ) + {}*/ + +/* + /-** + Copy constructor. + + \sa setData + * / + KDChartData( const KDChartData& other ) : + { + setData( other ); + } + + /-** + Assignment operator. + + \sa setData + * / + KDChartData& operator=( const KDChartData& R ) + { + setData( R ); + return *this; + } +*/ + /** + Compare operator. + + \sa isEqual + */ + bool operator==( const KDChartData& it ) const + { + return isEqual(*this, it); + } + + /** + Compare operator. + + \sa isEqual + */ + bool operator!=( const KDChartData& it ) const + { + return !isEqual(*this, it); + } + + /** + Compare method. + + \note The property set ID is <b>not</b> taken into account while comparing. + Two KDChartData are considered equal if their data values are equal - the + property set ID is ignored. + */ + bool isEqual( const KDChartData& a, const KDChartData& b ) const + { + bool bRet = (a.hasValue( 1 ) == b.hasValue( 1 )) && + (a.hasValue( 2 ) == b.hasValue( 2 )); + if ( bRet && a.hasValue( 1 ) ) { + bRet = a.valueType( 1 ) == b.valueType( 1 ); + if ( bRet ) { + switch ( a.valueType( 1 ) ) { + case QVariant::String: + bRet = a.stringValue( 1 ) == b.stringValue( 1 ); + break; + case QVariant::Double: + bRet = a.doubleValue( 1 ) == b.doubleValue( 1 ); + break; + case QVariant::DateTime: + bRet = a.dateTimeValue( 1 ) == b.dateTimeValue( 1 ); + break; + default: + bRet = false; + } + } + if ( bRet && a.hasValue( 2 ) ) { + bRet = a.valueType( 2 ) == b.valueType( 2 ); + if ( bRet ) { + switch ( a.valueType( 2 ) ) { + // note: the 2nd value can not be a string + // - must be a date or a number! + case QVariant::Double: + bRet = a.doubleValue( 2 ) == b.doubleValue( 2 ); + break; + case QVariant::DateTime: + bRet = a.dateTimeValue( 2 ) == b.dateTimeValue( 2 ); + break; + default: + bRet = false; + } + } + } + // Note: We do *not* compare the _propSetID here since it contains + // no values but is used to handle some layout information... + } + return bRet; + } + + /** + Method setAll. + + \note The property set ID is <b>also</b> changed by the setAll method. + + \sa setData + */ + void setAll( const KDChartData& R ) + { + setData( R ); + setPropertySet( R.propertySet() ); + } + + + /** + Method setData. + + \note The property set ID is <b>not</b> changed by the setData method. + If you want to set it please call \c KDChartData::setPropertySet() explicitely. + + \sa setAll + */ + void setData( const KDChartData& R ) + { + if( &R != this ){ + _valueType = R._valueType; + _valueType2 = R._valueType2; + switch ( valueType( 1 ) ) { + case QVariant::String: + sValue = R.sValue; + break; + case QVariant::Double: + dValue = R.dValue; + break; + case QVariant::DateTime: + dtValue = R.dtValue; + break; + default: + /* NOOP */; + } + switch ( valueType( 2 ) ) { + // note: the 2nd value can not be a string + // - must be a date or a number! + case QVariant::Double: + dValue2 = R.dValue2; + break; + case QVariant::DateTime: + dtValue2 = R.dtValue2; + break; + default: + /* NOOP */; + } + // Note: We do *not* copy the _propSetID here since it contains + // no values but is used to handle some layout information... + } + } + + QVariant::Type valueType( int valNo=1 ) const + { + return (1 == valNo) + ? _valueType + : _valueType2; + } + bool hasValue( int valNo=1 ) const + { + return (1 == valNo) + ? (_valueType != QVariant::Invalid) + : ((_valueType2 == QVariant::Double) || (_valueType2 == QVariant::DateTime)); + } + /* string values are only supported for legend texts or axis labels */ + bool isString( int valNo=1 ) const + { + return (1 == valNo) + ? (_valueType == QVariant::String) + : false; + } + bool isDouble( int valNo=1 ) const + { + return (1 == valNo) + ? (_valueType == QVariant::Double) + : (_valueType2 == QVariant::Double); + } + bool isDateTime( int valNo=1 ) const + { + return (1 == valNo) + ? (_valueType == QVariant::DateTime) + : (_valueType2 == QVariant::DateTime); + } + + + void clearValue() + { + _valueType = QVariant::Invalid; + _valueType2 = QVariant::Invalid; + _propSetID = 0; + } + + QVariant value( int valNo=1 ) const + { + if( 1 == valNo ) + switch ( valueType( 1 ) ) { + case QVariant::String: + return sValue; + case QVariant::Double: + return dValue; + case QVariant::DateTime: + return dtValue; + default: + return QVariant(); + } + else if( 2 == valNo ) + switch ( valueType( 2 ) ) { + case QVariant::Double: + return dValue2; + case QVariant::DateTime: + return dtValue2; + default: + return QVariant(); + } + else + return QVariant(); + } + + /* string values are only supported for legend texts or axis labels */ + QString stringValue( int valNo=1 ) const + { + // note: the 2nd value can not be a string + // - must be a date or a number! + if ((1 == valNo) && isString( valNo )) + return sValue; + else + return QString::null; + } + double doubleValue( int valNo=1 ) const + { + return isDouble( valNo ) + ? ((1 == valNo) ? dValue : dValue2) + : DBL_MIN; + } + QDateTime dateTimeValue( int valNo=1 ) const + { + return isDateTime( valNo ) + ? ((1 == valNo) ? dtValue : dtValue2) + : QDateTime(); + } + + /** + Assign a property set to a data cell. + + \param propSetID The ID of the property set to be assigned to this data cell. + This ID can either be one of the built-in IDs documented + at KDChartPropertySet::BuiltinDataPropertySetIDs or + a special ID that was given back by a + KDChartParams::registerProperties function call. + + \sa propertySet + \sa KDCHART_PROPSET_NORMAL_DATA, KDCHART_PROPSET_TRANSPARENT_DATA + */ + void setPropertySet( int propSetID = 0 ) + { + _propSetID = propSetID; + } + /** + Return the ID of the property set that is assigned to this data cell. + + Use KDChartParams::properties( int ID ) for accessing the respective property set information. + + \sa setPropertySet + \sa KDCHART_PROPSET_NORMAL_DATA, KDCHART_PROPSET_TRANSPARENT_DATA + */ + int propertySet() const + { + return _propSetID; + } + + +private: + // OBLIGATORY 1st value: usually used for ordinate axis + QVariant::Type _valueType; + QDateTime dtValue; + double dValue; // Sorry, d(t)Value and sValue cannot be a union, + QString sValue; // since QString has a non-default constructor. + + // OPTIONAL 2nd value: if valid, normally used for abscissa axis + // note: this 2nd value can not be a string - must be a date or a number! + QVariant::Type _valueType2; + QDateTime dtValue2; + double dValue2; + + // ID number of the property set assigned to this cell + int _propSetID; +}; + +#endif |