/* This file is part of the KDE project
Copyright ( C ) 2003 , 2004 Ariya Hidayat < ariya @ kde . org >
This library is free software ; you can redistribute it and / or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation ; either
version 2 of the License .
This library is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
Library General Public License for more details .
You should have received a copy of the GNU Library General Public License
along with this library ; see the file COPYING . LIB . If not , write to
the Free Software Foundation , Inc . , 51 Franklin Street , Fifth Floor ,
* Boston , MA 02110 - 1301 , USA .
*/
# ifndef KSPREAD_VALUE_H
# define KSPREAD_VALUE_H
# include <tqdatetime.h>
# include <tqstring.h>
# include <tqtextstream.h>
# include <koffice_export.h>
namespace KSpread
{
class ValueData ;
/**
* Provides a wrapper for cell value .
*
* Each cell in a worksheet must hold a value , either as enterred by user
* or as a result of formula evaluation . Default cell holds empty value .
*
* Value uses implicit data sharing to reduce memory usage .
*/
class KSPREAD_EXPORT Value
{
public :
typedef enum {
Empty ,
Boolean ,
Integer ,
Float ,
String ,
Array ,
CellRange , // not used yet
Error
} Type ;
typedef enum {
fmt_None ,
fmt_Boolean ,
fmt_Number ,
fmt_Percent ,
fmt_Money ,
fmt_DateTime ,
fmt_Date ,
fmt_Time ,
fmt_String
} Format ;
/**
* Creates an empty value , i . e holds nothing .
*/
Value ( ) ;
/**
* Creates a value of certain type .
*/
Value ( Type _type ) ;
/**
* Destroys the value .
*/
virtual ~ Value ( ) ;
/**
* Creates a copy from another value .
*/
Value ( const Value & _value ) ;
/**
* Assigns from another value .
*
* Because the data is implicitly shared , such assignment is very fast and
* doesn ' t consume additional memory .
*/
Value & operator = ( const Value & _value ) ;
/**
* Assigns from another value . Same as above .
*/
Value & assign ( const Value & _value ) ;
/**
* Creates a boolean value .
*/
Value ( bool b ) ;
/**
* Creates an integer value .
*/
Value ( long i ) ;
/**
* Creates an integer value .
*/
Value ( int i ) ;
/**
* Create a floating - point value .
*/
Value ( double f ) ;
/**
* Create a string value .
*/
Value ( const TQString & s ) ;
Value ( const char * s ) ;
/**
* Create a floating - point value from date / time .
*
* Internally date / time is represented as serial - number , i . e number of
* elapsed day since reference date . Day 61 is defined as March 1 , 1900.
*/
Value ( const TQDateTime & dt ) ;
/**
* Create a floating - point value from time .
* See also note above .
*/
Value ( const TQTime & time ) ;
/**
* Create a floating - point value from date .
* See also note above .
*/
Value ( const TQDate & date ) ;
/**
* Create an array of values .
*/
Value ( unsigned columns , unsigned rows ) ;
/**
* Returns the type of the value .
*/
Type type ( ) const ;
/** Returns the format of the value (i.e. how should it be interpreted) */
Format format ( ) const ;
/**
* Returns true if empty .
*/
bool isEmpty ( ) const { return type ( ) = = Empty ; }
/**
* Returns true if the type of this value is Boolean .
*/
bool isBoolean ( ) const { return type ( ) = = Boolean ; }
/**
* Returns true if the type of this value is integer .
*/
bool isInteger ( ) const { return type ( ) = = Integer ; }
/**
* Returns true if the type of this value is floating - point .
*/
bool isFloat ( ) const { return type ( ) = = Float ; }
/**
* Returns true if the type of this value is either
* integer or floating - point .
*/
bool isNumber ( ) const { return ( type ( ) = = Integer ) | | ( type ( ) = = Float ) ; }
/**
* Returns true if the type of this value is string .
*/
bool isString ( ) const { return type ( ) = = String ; }
/**
* Returns true if the type of this value is array .
*/
bool isArray ( ) const { return type ( ) = = Array ; }
/**
* Returns true if this value holds error information .
*/
bool isError ( ) const { return type ( ) = = Error ; }
/**
* Sets this value to another value .
*/
void setValue ( const Value & v ) ;
/**
* Sets this value to boolean value .
*/
void setValue ( bool b ) ;
/**
* Sets this value to integer value .
*/
void setValue ( long i ) ;
/**
* Sets this value to integer value .
*/
void setValue ( int i ) ;
/**
* Sets this value to floating - point value .
*/
void setValue ( double f ) ;
/**
* Sets this value to string value .
*/
void setValue ( const TQString & s ) ;
/**
* Sets this value to hold error message .
*/
void setError ( const TQString & msg ) ;
/**
* Sets this value to floating - point number representing the date / time .
*/
void setValue ( const TQDateTime & dt ) ;
/**
* Sets this value to floating - point number representing the date .
*/
void setValue ( const TQTime & dt ) ;
/**
* Sets this value to floating - point number representing the time .
*/
void setValue ( const TQDate & dt ) ;
/** Sets format information for this value. */
void setFormat ( Format fmt ) ;
/**
* Returns the boolean value of this value .
*
* Call this function only if isBoolean ( ) returns true .
*/
bool asBoolean ( ) const ;
/**
* Returns the integer value of this value .
*
* Call this function only if isNumber ( ) returns true .
*/
long asInteger ( ) const ;
/**
* Returns the floating - point value of this value .
*
* Call this function only if isNumber ( ) returns true .
*/
double asFloat ( ) const ;
/**
* Returns the string value of this value .
*
* Call this function only if isString ( ) returns true .
*/
TQString asString ( ) const ;
/**
* Returns the date / time representation of this value .
*/
TQDateTime asDateTime ( ) const ;
/**
* Returns the date representation of this value .
*/
TQDate asDate ( ) const ;
/**
* Returns the time representation of this value .
*/
TQTime asTime ( ) const ;
/**
* Return an element in the array value .
*/
Value element ( unsigned column , unsigned row ) const ;
/**
* Sets an element in the array value . Do not use if isArray ( ) is false .
*/
void setElement ( unsigned column , unsigned row , const Value & value ) ;
/**
* If this value is an array , return the number of columns .
* Returns 1 if isArray ( ) returns false .
*/
unsigned columns ( ) const ;
/**
* If this value is an array , return the number of rows .
* Returns 1 if isArray ( ) returns false .
*/
unsigned rows ( ) const ;
/**
* Returns error message associated with this value .
*
* Call this function only if isError ( ) returns true .
*/
TQString errorMessage ( ) const ;
/**
* Detaches itself from shared value data , i . e make a private , deep copy
* of the data . Usually this function is called automatically so you
* don ' t have to care about it .
*/
void detach ( ) ;
/**
* Returns constant reference to empty value .
*/
static const Value & empty ( ) ;
/**
* Returns constant reference to # DIV / 0 ! error .
*
* This is used to indicate that a formula divides by 0 ( zero ) .
*/
static const Value & errorDIV0 ( ) ;
/**
* Returns constant reference to # N / A error .
*
* This is to indicate that a value is not available to a function .
*/
static const Value & errorNA ( ) ;
/**
* Returns constant reference to # NAME ? error .
*
* This is to indicate that certain text inside formula is not
* recognized , possibly a misspelled name or name that
* does not exist .
*/
static const Value & errorNAME ( ) ;
/**
* Returns constant reference to # NUM ! error .
*
* This is to indicate a problem with a number in a formula .
*/
static const Value & errorNUM ( ) ;
/**
* Returns constant reference to # NULL ! error .
*
* This is to indicate that two area do not intersect .
*/
static const Value & errorNULL ( ) ;
/**
* Returns constant reference to # REF ! error .
*
* This is used to indicate an invalid cell reference .
*/
static const Value & errorREF ( ) ;
/**
* Returns constant reference to # VALUE ! error .
*
* This is to indicate that wrong type of argument or operand
* is used , usually within a function call , e . g SIN ( " some text " ) .
*/
static const Value & errorVALUE ( ) ;
/**
* Returns true if it is OK to compare this value with v .
* If this function returns false , then return value of compare is undefined .
*/
bool allowComparison ( const Value & v ) const ;
/**
* Returns - 1 , 0 , 1 , depends whether this value is less than , equal to , or
* greater than v .
*/
int compare ( const Value & v ) const ;
/**
* Returns true if this value is equal to v .
*/
bool equal ( const Value & v ) const ;
/**
* Returns true if this value is less than v .
*/
bool less ( const Value & v ) const ;
/**
* Returns true if this value is greater than v .
*/
bool greater ( const Value & v ) const ;
// comparison operator - returns true only if strictly identical, unlike equal()/compare()
bool operator = = ( const Value & v ) const ;
inline bool operator ! = ( const Value & other ) const { return ! operator = = ( other ) ; }
static int compare ( double v1 , double v2 ) ;
bool isZero ( ) const ;
static bool isZero ( double v ) ;
protected :
ValueData * d ; // can't never be 0
} ;
} // namespace KSpread
TQTextStream & operator < < ( TQTextStream & ts , KSpread : : Value : : Type type ) ;
TQTextStream & operator < < ( TQTextStream & ts , KSpread : : Value value ) ;
# endif // KSPREAD_VALUE_H