|
|
|
/***************************************************************************
|
|
|
|
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, Qt::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;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|