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/lib/kofficecore/KoUnit.cpp

216 lines
5.9 KiB

/* This file is part of the KDE project
Copyright (C) 2001 David Faure <faure@kde.org>
Copyright (C) 2004, Nicolas GOUTTE <goutte@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, or (at your option) any later version.
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.
*/
//#include <KoGlobal.h>
#include "KoUnit.h"
#include <KoXmlWriter.h>
#include <tdelocale.h>
#include <tdeglobal.h>
#include <kdebug.h>
#include <tqregexp.h>
#include <tqdom.h>
TQStringList KoUnit::listOfUnitName()
{
TQStringList lst;
for ( uint i = 0 ; i <= KoUnit::U_LASTUNIT ; ++i )
{
KoUnit::Unit unit = static_cast<KoUnit::Unit>( i );
lst.append( KoUnit::unitDescription( unit ) );
}
return lst;
}
TQString KoUnit::unitDescription( Unit _unit )
{
switch ( _unit )
{
case KoUnit::U_MM:
return i18n("Millimeters (mm)");
case KoUnit::U_CM:
return i18n("Centimeters (cm)");
case KoUnit::U_DM:
return i18n("Decimeters (dm)");
case KoUnit::U_INCH:
return i18n("Inches (in)");
case KoUnit::U_PI:
return i18n("Pica (pi)");
case KoUnit::U_DD:
return i18n("Didot (dd)");
case KoUnit::U_CC:
return i18n("Cicero (cc)");
case KoUnit::U_PT:
return i18n("Points (pt)" );
default:
return i18n("Error!");
}
}
double KoUnit::toUserValue( double ptValue, Unit unit )
{
switch ( unit ) {
case U_MM:
return toMM( ptValue );
case U_CM:
return toCM( ptValue );
case U_DM:
return toDM( ptValue );
case U_INCH:
return toInch( ptValue );
case U_PI:
return toPI( ptValue );
case U_DD:
return toDD( ptValue );
case U_CC:
return toCC( ptValue );
case U_PT:
default:
return toPoint( ptValue );
}
}
double KoUnit::ptToUnit( const double ptValue, const Unit unit )
{
switch ( unit )
{
case U_MM:
return POINT_TO_MM( ptValue );
case U_CM:
return POINT_TO_CM( ptValue );
case U_DM:
return POINT_TO_DM( ptValue );
case U_INCH:
return POINT_TO_INCH( ptValue );
case U_PI:
return POINT_TO_PI( ptValue );
case U_DD:
return POINT_TO_DD( ptValue );
case U_CC:
return POINT_TO_CC( ptValue );
case U_PT:
default:
return ptValue;
}
}
TQString KoUnit::toUserStringValue( double ptValue, Unit unit )
{
return TDEGlobal::locale()->formatNumber( toUserValue( ptValue, unit ) );
}
double KoUnit::fromUserValue( double value, Unit unit )
{
switch ( unit ) {
case U_MM:
return MM_TO_POINT( value );
case U_CM:
return CM_TO_POINT( value );
case U_DM:
return DM_TO_POINT( value );
case U_INCH:
return INCH_TO_POINT( value );
case U_PI:
return PI_TO_POINT( value );
case U_DD:
return DD_TO_POINT( value );
case U_CC:
return CC_TO_POINT( value );
case U_PT:
default:
return value;
}
}
double KoUnit::fromUserValue( const TQString& value, Unit unit, bool* ok )
{
return fromUserValue( TDEGlobal::locale()->readNumber( value, ok ), unit );
}
double KoUnit::parseValue( TQString value, double defaultVal )
{
value.simplifyWhiteSpace();
value.remove( ' ' );
if( value.isEmpty() )
return defaultVal;
int index = value.find( TQRegExp( "[a-z]+$" ) );
if ( index == -1 )
return value.toDouble();
TQString unit = value.mid( index );
value.truncate ( index );
double val = value.toDouble();
if ( unit == "pt" )
return val;
bool ok;
Unit u = KoUnit::unit( unit, &ok );
if( ok )
return fromUserValue( val, u );
if( unit == "m" )
return fromUserValue( val * 10.0, U_DM );
else if( unit == "km" )
return fromUserValue( val * 10000.0, U_DM );
kdWarning() << "KoUnit::parseValue: Unit " << unit << " is not supported, please report." << endl;
// TODO : add support for mi/ft ?
return defaultVal;
}
KoUnit::Unit KoUnit::unit( const TQString &_unitName, bool* ok )
{
if ( ok )
*ok = true;
if ( _unitName == TQString::fromLatin1( "mm" ) ) return U_MM;
if ( _unitName == TQString::fromLatin1( "cm" ) ) return U_CM;
if ( _unitName == TQString::fromLatin1( "dm" ) ) return U_DM;
if ( _unitName == TQString::fromLatin1( "in" )
|| _unitName == TQString::fromLatin1("inch") /*compat*/ ) return U_INCH;
if ( _unitName == TQString::fromLatin1( "pi" ) ) return U_PI;
if ( _unitName == TQString::fromLatin1( "dd" ) ) return U_DD;
if ( _unitName == TQString::fromLatin1( "cc" ) ) return U_CC;
if ( _unitName == TQString::fromLatin1( "pt" ) ) return U_PT;
if ( ok )
*ok = false;
return U_PT;
}
TQString KoUnit::unitName( Unit _unit )
{
if ( _unit == U_MM ) return TQString::fromLatin1( "mm" );
if ( _unit == U_CM ) return TQString::fromLatin1( "cm" );
if ( _unit == U_DM ) return TQString::fromLatin1( "dm" );
if ( _unit == U_INCH ) return TQString::fromLatin1( "in" );
if ( _unit == U_PI ) return TQString::fromLatin1( "pi" );
if ( _unit == U_DD ) return TQString::fromLatin1( "dd" );
if ( _unit == U_CC ) return TQString::fromLatin1( "cc" );
return TQString::fromLatin1( "pt" );
}
void KoUnit::saveOasis(KoXmlWriter* settingsWriter, Unit _unit)
{
settingsWriter->addConfigItem( "unit", unitName(_unit) );
}