/* 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) ); }