diff options
Diffstat (limited to 'libkdchart/KDChartTableBase.h')
-rw-r--r-- | libkdchart/KDChartTableBase.h | 478 |
1 files changed, 478 insertions, 0 deletions
diff --git a/libkdchart/KDChartTableBase.h b/libkdchart/KDChartTableBase.h new file mode 100644 index 0000000..5031449 --- /dev/null +++ b/libkdchart/KDChartTableBase.h @@ -0,0 +1,478 @@ +/* -*- Mode: C++ -*- + KDChart - a multi-platform charting engine +*/ + +/**************************************************************************** + ** Copyright (C) 2001-2003 Klarälvdalens 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 __KDCHARTTABLEINTERFACE_H__ +#define __KDCHARTTABLEINTERFACE_H__ + + +class QTable; + +#include <qvariant.h> +#include <qobject.h> +#include <qdatetime.h> + +#include <kdchart_export.h> + +#if defined( SUN7 ) || defined (_SGIAPI) + #include <float.h> + #include <limits.h> +#else + #include <cfloat> + #include <climits> +#endif + + +/** + Use special value KDCHART_POS_INFINITE to indicate positive infinite values. + + If your own table class (derived from KDChartTableDataBase) does + not store your positive infinite values as KDCHART_POS_INFINITE + please make sure to reimplement \sa isPosInfinite() accordingly. + + \sa isPosInfinite, isNegInfinite +*/ +#define KDCHART_POS_INFINITE DBL_MAX + +/** + Use special value KDCHART_NEG_INFINITE to indicate negative infinite values. + + If your own table class (derived from KDChartTableDataBase) does + not store your negative infinite values as KDCHART_NEG_INFINITE + please make sure to reimplement \sa isNegInfinite() accordingly. + + \sa isNegInfinite, isPosInfinite +*/ +#define KDCHART_NEG_INFINITE -DBL_MAX + + +/** + \file KDChartTableBase.h + + \brief Provides a table class holding all data values + that are to be used in a chart. + + By subclassing KDChartTableDataBase you may provide your own + methods to access data stored somewhere else instead of + using the setCell function to move them into KD Chart's cells. + + \note See the files in doc/tutorial/step07/ for a sample implementation you might want to use as starting-point for your own data handling class. +*/ + +///KD Chart's build-in table data for an easy way of storing data values. +class KDCHART_EXPORT KDChartTableDataBase :public QObject +{ + Q_OBJECT +public: + /** + Default constructor. + + Creates an empty table and sets the sorted flag to false. + */ + KDChartTableDataBase() : + QObject( 0 ), + _sorted(false), + _useUsedRows(false), + _useUsedCols(false) {} + /** + Default copy constructor. + + Just initializes the QObject part of this class and copies the sorted flag. + */ + KDChartTableDataBase( const KDChartTableDataBase& other ) :QObject(0) + { + _sorted = other._sorted; + _useUsedRows = other._useUsedRows; + _useUsedCols = other._useUsedCols; + _usedRows = other._usedRows; + _usedCols = other._usedCols; + } + /** + Default destructor. + + Does nothing, only defined to have it virtual. + */ + virtual ~KDChartTableDataBase() {} + +public slots: + /** + Returns the number of rows in the table. + + \note This pure-virtual function has to be implemented by + each class derived from KDChartTableDataBase. + + \returns the number of rows in the table. + + \sa setRows, usedRows, cols + */ + virtual uint rows() const = 0; + /** + Returns the number of cols in the table. + + \note This pure-virtual function has to be implemented by + each class derived from KDChartTableDataBase. + + \returns the number of cols in the table. + + \sa setCols, usedCols, rows + */ + virtual uint cols() const = 0; + + /** + Stores data in a cell. + + \note This pure-virtual function has to be implemented by + each class derived from KDChartTableDataBase. + + \param _row the row number of the cell to store the data object into. + \param _col the column number of the cell to store the data object into. + \param _value1 the first value to be stored, normally the Y value, possible types: int, double, QString + QString might be used in case you want to use this cell's content for axis label + \param _value2 the second value to be stored, normally the X value (if any), possible types: int, double, QDateTime + + \sa cellCoords, cellContent, setProp + */ + virtual void setCell( uint _row, uint _col, + const QVariant& _value1, + const QVariant& _value2=QVariant() ) = 0; + /** + Specifies the property set ID for a cell. + + \note This pure-virtual function has to be implemented by + each class derived from KDChartTableDataBase. + + \param _row the row number of the cell. + \param _col the column number of the cell. + \param _propSet the property set ID to be stored for this data cell, defaults to zero for normal data. + + \sa cellProp, cellContent, setCell + */ + virtual void setProp( uint _row, uint _col, + int _propSet=0 ) = 0; + + /** + Returns one of the coordinate data value(s) stored in a cell. + + \note This pure-virtual function has to be implemented by + each class derived from KDChartTableDataBase. + + \param _row the row number of the cell to be retrieved. + \param _col the column number of the cell to be retrieved. + \param _value the coordinate variable to be filled by this method. + \param coordinate the number of the coordinate to be retrieved, normally + 1 is the Y value and 2 is the X value. + + \returns TRUE if the row and col are addressing a cell in the table. + + \sa cellCoords, cellProp, cellContent, cellVal, setCell, setProp + */ + virtual bool cellCoord( uint _row, uint _col, + QVariant& _value, + int coordinate=1 ) const = 0; + + /** + Returns one of the coordinate data value(s) stored in a cell. + + This convenience method calls the bool cellCoord() function and returns + the result if it returned successfully - otherwise it returns an invalid QVariant. + + \note If you \em know that a cell is containing valid double data + you may quickly access them like this: +\verbatim const double yVal = data.cellVal( r, c ).toDouble(); +const double xVal = data.cellVal( r, c, 2 ).toDouble(); \endverbatim + + \param _row the row number of the cell to be retrieved. + \param _col the column number of the cell to be retrieved. + \param coordinate the number of the coordinate to be retrieved, normally + 1 is the Y value and 2 is the X value. + + \returns cell contens if the row and col are addressing a cell in the + table, otherwise an invalid QVariant is returned. + + \sa cellCoords, cellProp, cellContent, setCell, setProp + */ + virtual QVariant cellVal( uint _row, uint _col, int coordinate=1 ) const { + QVariant value; + if( cellCoord( _row, _col, value, coordinate ) ) + return value; + else + return QVariant(); + } + + /** + Returns the property set ID stored in a cell. + + \note This pure-virtual function has to be implemented by + each class derived from KDChartTableDataBase. + + \param _prop the property set ID of the cell to be retrieved. + + \returns TRUE if the row and col are addressing a cell in the table. + + \sa cellCoord, cellCoords, cellContent, setCell, setProp + */ + virtual bool cellProp( uint _row, uint _col, + int& _prop ) const = 0; + + /** + Increases the number of rows (and/or columns, resp.) stored in this table. + + \note This pure-virtual function has to be implemented by + each class derived from KDChartTableDataBase. + + \note The old content of the table must be preserved (e.g. by copying + the data into the cells of the new table). + + \param _row the new number of rows. + \param _col the new number of columns. + + \sa cell + */ + virtual void expand( uint _rows, uint _cols ) = 0; + + + + // E N D O F pure-virtual function declarations + + + + /** + \note To improve runtime speed this virtual function + may be reimplemented by classes derived from KDChartTableDataBase. + + \sa cellCoords, cellProp, setCell, setProp + */ + virtual bool cellContent( uint _row, uint _col, + QVariant& _value1, + QVariant& _value2, + int& _prop ) const + { + return cellCoords(_row,_col, _value1,_value2) && + cellProp(_row,_col, _prop); + } + /** + \note To improve runtime speed this virtual function + may be reimplemented by classes derived from KDChartTableDataBase. + + \sa cellCoord, cellProp, cellContent, setCell, setProp + */ + virtual bool cellCoords( uint _row, uint _col, + QVariant& _value1, + QVariant& _value2 ) const + { + return cellCoord(_row,_col, _value1, 1) && + cellCoord(_row,_col, _value2, 2); + } + + + /** + Sets the number of rows in the table that actually contain data. + + \note You might want to re-implement this function in derived classes, + the default implementation just stores the new number of used rows. + + \param _rows the number of rows in the table that actually contain data. + + \sa usedRows, rows, cols + */ + virtual void setUsedRows( uint _rows ); + /** + Returns the number of rows in the table that actually contain data. + + \returns the number of rows in the table that actually contain data. + + \sa setUsedRows, rows, cols + */ + virtual uint usedRows() const; + + /** + Sets the number of cols in the table that actually contain data. + + \note You might want to re-implement this function in derived classes, + the default implementation just stores the new number of used cols. + + \param _cols the number of cols in the table that actually contain data. + + \sa usedCols, rows, cols + */ + virtual void setUsedCols( uint _cols ); + /** + Returns the number of cols in the table that actually contain data. + + \returns the number of cols in the table that actually contain data. + + \sa setUsedCols, rows, cols + */ + virtual uint usedCols() const; + + + /** + Returns the number of cols the table has been scrolled by. + + Default implementation of this always returns zero, so make sure + to return the appropriate value if your class derived from KDChartTableDataBase + is supporting internal data scrolling technics. + + See the KD Chart Programmers Manual for details described in the + Data Scrolling chapter. + + \returns the number of cols the table has been scrolled by. + + \sa cols, rows + */ + virtual uint colsScrolledBy() const + { + return 0; + } + + + /** + Specified whether the table is sorted. + + \sa sorted + */ + virtual void setSorted(bool sorted); + /** + Returns whether the table is sorted. + + \sa setSorted + */ + virtual bool sorted() const; + + /** + Returns true if the given value represents a positive infinite value. + + \note This virtual function may be implemented by + classes derived from KDChartTableDataBase. + This should be done if your data are not stored as + special value KDCHART_POS_INFINITE + to indicate positive infinite values + + \returns TRUE if the value given is a positive infinite value. + */ + virtual bool isPosInfinite( double value ) const + { + return value == KDCHART_POS_INFINITE; + } + + /** + Returns true if the given value represents a negative infinite value. + + \note This virtual function may be implemented by + classes derived from KDChartTableDataBase. + This should be done if your data are not stored as + special value KDCHART_NEG_INFINITE + to indicate negative infinite values + + \returns TRUE if the value given is a negative infinite value. + */ + virtual bool isNegInfinite( double value ) const + { + return value == KDCHART_NEG_INFINITE; + } + + /** + Returns true if the given value represents a normal double value. + + Normal double values are defined as values that are neither positive infinite + nor negative infinite. This method is provided to let derived classed use + their own way to determine when a double value is to be threated as normal. + + \note To improve runtime speed this virtual function + may be reimplemented by classes derived from KDChartTableDataBase. + + \returns TRUE if the value given is neither positive infinite nor negativr infinite. + */ + virtual bool isNormalDouble( double value ) const + { + return !isPosInfinite( value ) && !isNegInfinite( value ); + } + + /** + Returns true if the given QVariant value represents a normal double value. + + This method tests if \c value has type QVariant::Double: if no, it returns false; + if yes, it sets \c dVal accordingly and calls the virtual method + isNormalDouble( double value ). + + \param value The QVariant value to be tested and converted. + \param dVal Points to the double variable to be filled with the converted value. + + \returns TRUE if the value given is neither positive infinite nor negative + infinite, \c value is set to the converted value if the type of \c value + is QVariant::Double, otherwise it is not modified. + */ + bool isNormalDouble( QVariant value, double& dVal ) const + { + if( QVariant::Double != value.type() ) + return false; + dVal = value.toDouble(); + return isNormalDouble( dVal ); + } + + virtual void importFromQTable( QTable* table ); + + virtual double maxValue( int coordinate=1 ) const; + virtual double minValue( int coordinate=1, bool bOnlyGTZero=false ) const; + + virtual QDateTime maxDtValue( int coordinate=1 ) const; + virtual QDateTime minDtValue( int coordinate=1 ) const; + + virtual double maxColSum( int coordinate=1 ) const; + virtual double minColSum( int coordinate=1 ) const; + virtual double maxColSum( uint row, uint row2, int coordinate=1 ) const; + virtual double minColSum( uint row, uint row2, int coordinate=1 ) const; + virtual double colSum( uint col, int coordinate=1 ) const; + virtual double colAbsSum( uint col, int coordinate=1 ) const; + virtual double maxRowSum( int coordinate=1 ) const; + virtual double minRowSum( int coordinate=1 ) const; + virtual double rowSum( uint row, int coordinate=1 ) const; + virtual double rowAbsSum( uint row, int coordinate=1 ) const; + virtual double maxInColumn( uint col, int coordinate=1 ) const; + virtual double minInColumn( uint col, int coordinate=1 ) const; + virtual double maxInRow( uint row, int coordinate=1 ) const; + virtual double minInRow( uint row, int coordinate=1 ) const; + virtual double maxInRows( uint row, uint row2, int coordinate=1 ) const; + virtual double minInRows( uint row, uint row2, int coordinate=1, bool bOnlyGTZero=false ) const; + virtual QDateTime maxDtInRows( uint row, uint row2, int coordinate=1 ) const; + virtual QDateTime minDtInRows( uint row, uint row2, int coordinate=1 ) const; + virtual uint lastPositiveCellInColumn( uint col, int coordinate=1 ) const; + virtual bool cellsHaveSeveralCoordinates(QVariant::Type* type2Ref) const; + virtual bool cellsHaveSeveralCoordinates(uint row1=0, uint row2=UINT_MAX, + QVariant::Type* type2Ref=NULL) const; + virtual QVariant::Type cellsValueType( uint row1, uint row2=UINT_MAX, + int coordinate=1 ) const; + virtual QVariant::Type cellsValueType( int coordinate=1 ) const; +private: + bool _sorted; +protected: + bool _useUsedRows, _useUsedCols; +private: + uint _usedRows, _usedCols; +}; + +#endif |