You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/kugar/lib/mfieldobject.cpp

262 lines
6.2 KiB

/***************************************************************************
mfieldobject.cpp - Kugar report field object
-------------------
begin : Mon Aug 23 1999
copyright : (C) 1999 by Mutiny Bay Software
email : info@mutinybaysoftware.com
***************************************************************************/
#include "mfieldobject.h"
#include "mutil.h"
#include "inputmask.h"
namespace Kugar
{
/** Constructor */
MFieldObject::MFieldObject() : MLabelObject()
{
// Set the defaults
fieldName = "";
dataType = MFieldObject::String;
format = MUtil::MDY_SLASH;
precision = 0;
currency = 36;
negativeValueColor.setRgb( 255, 0, 0 );
comma = 0;
m_inputMask = new InputMask();
}
/** Copy constructor */
MFieldObject::MFieldObject( const MFieldObject& mFieldObject ) : MLabelObject( ( MLabelObject & ) mFieldObject )
{
copy( &mFieldObject );
}
/** Assignment operator */
MFieldObject MFieldObject::operator=( const MFieldObject& mFieldObject )
{
if ( &mFieldObject == this )
return * this;
// Copy the derived class's data
copy( &mFieldObject );
// Copy the base class's data
( ( MLabelObject & ) * this ) = mFieldObject;
return *this;
}
/** Destructor */
MFieldObject::~MFieldObject()
{}
/** Returns the bound data field name */
TQString MFieldObject::getFieldName()
{
return fieldName;
}
/** Sets the bound data field */
void MFieldObject::setFieldName( const TQString field )
{
fieldName = field;
}
/** Sets the field's data string */
void MFieldObject::setText( const TQString txt )
{
int ret;
TQDate d;
int pos;
TQString month, day, year;
TQRegExp regexp( "[0-9][0-9](-|//)[0-9][0-9](-|//)[0-9][0-9][0-9][0-9]" );
// Check for empty string
if ( txt.isEmpty() && dataType == MFieldObject::Date )
{
text = TQString();
return ;
}
// Set the data
switch ( dataType )
{
case MFieldObject::String:
text = txt;
if ( !getInputMask().isEmpty() )
text = m_inputMask->formatText( txt );
break;
case MFieldObject::Integer:
text.setNum( txt.toDouble(), 'f', 0 );
if ( comma )
formatCommas();
formatNegValue();
break;
case MFieldObject::Float:
text.setNum( txt.toDouble(), 'f', precision );
if ( comma )
formatCommas();
formatNegValue();
break;
case MFieldObject::Date:
// Check if we can read the date and if so, reformat it ...
pos = regexp.search( txt.mid( 0 ) );
ret = regexp.matchedLength();
//ret = regexp.match(txt);
if ( ret != 1 )
{
year = txt.right( 4 );
month = txt.left( 2 );
day = txt.mid( 3, 2 );
d.setYMD( year.toInt(), month.toInt(), day.toInt() );
// d = TQDate::fromString(txt, TQt::LocalDate);
text = MUtil::formatDate( d, format );
}
else
text = txt;
break;
case MFieldObject::Currency:
int prec = precision < 2 ? precision : 2;
bool ok;
text.setNum( txt.toDouble( &ok ), 'f', prec );
if( !ok )
text = TQString();
else
{
if ( comma )
formatCommas();
formatNegValue();
text = TQString( currency + text );
}
break;
}
}
TQString MFieldObject::getInputMask() const
{
return m_inputMask->mask();
}
void MFieldObject::setInputMask( const TQString &inputMask )
{
m_inputMask->setMask( inputMask );
}
/** Sets the field's data type */
void MFieldObject::setDataType( int t )
{
dataType = t;
if ( dataType == MFieldObject::Integer ||
dataType == MFieldObject::Float ||
dataType == MFieldObject::Currency )
saveColor = foregroundColor;
}
/** Sets the field's date formatting */
void MFieldObject::setDateFormat( int f )
{
format = f;
}
/** Sets the field's precision */
void MFieldObject::setPrecision( int p )
{
precision = p;
}
/** Sets the field's currency symbol */
void MFieldObject::setCurrency( const TQChar c )
{
if ( c.isNull() )
currency = 36;
else
currency = c;
}
/** Sets the object's negative value color - default is red*/
void MFieldObject::setNegValueColor( int r, int g, int b )
{
negativeValueColor.setRgb( r, g, b );
}
/** Sets if object should delimit numeric values with commas */
void MFieldObject::setCommaSeparator( int c )
{
comma = c;
}
/** Formats a string representation of a negative number using the negative value color */
void MFieldObject::formatNegValue()
{
if ( text.toDouble() < 0 )
foregroundColor = negativeValueColor;
else
foregroundColor = saveColor;
}
/** Formats the string representation of a number with comma separators */
void MFieldObject::formatCommas()
{
// text = text.replace(".", ",");
TQString tmp;
int i, j;
int offset;
// If a neg value
if ( text.toDouble() < 0 )
offset = 1;
else
offset = 0;
// Look for decimal point
int pos = text.findRev( "." );
// If a decimal was not found, start at end of string
if ( pos == -1 )
pos = text.length();
else
tmp = text.mid( pos, text.length() );
// Move through the string and insert the commas
for ( i = pos - 1, j = 0; i >= offset; i-- )
{
tmp = text.mid( i, 1 ) + tmp;
j++;
if ( ( j == 3 ) && ( i - 1 >= offset ) )
{
tmp = tr( "," ) + tmp;
j = 0;
}
}
// If neg value, add back the sign
if ( offset )
tmp = "-" + tmp;
// Set the new string to the field
text = tmp;
}
/** Copies member data from one object to another.
Used by the copy constructor and assignment operator */
void MFieldObject::copy( const MFieldObject* mFieldObject )
{
// Copy the fields's data type and format
fieldName = mFieldObject->fieldName;
dataType = mFieldObject->dataType;
format = mFieldObject->format;
precision = mFieldObject->precision;
currency = mFieldObject->currency;
negativeValueColor = mFieldObject->negativeValueColor;
saveColor = mFieldObject->saveColor;
comma = mFieldObject->comma;
}
}