/* This file is part of the KDE project Copyright (C) 1998, 1999 Reginald Stadlbauer , Torben Weis Copyright (C) 2004, Nicolas GOUTTE 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. */ #ifndef kounit_h #define kounit_h #include #include #include // for floor #include class KoXmlWriter; class QDomElement; // 1 inch ^= 72 pt // 1 inch ^= 25.399956 mm (-pedantic ;p) // 1 pt = 1/12 pi // 1 pt ^= 0.0077880997 cc // 1 cc = 12 dd // Note: I don't use division but multiplication with the inverse value // because it's faster ;p (Werner) #define POINT_TO_MM(px) ((px)*0.352777167) #define MM_TO_POINT(mm) ((mm)*2.83465058) #define POINT_TO_CM(px) ((px)*0.0352777167) #define CM_TO_POINT(cm) ((cm)*28.3465058) #define POINT_TO_DM(px) ((px)*0.00352777167) #define DM_TO_POINT(dm) ((dm)*283.465058) #define POINT_TO_INCH(px) ((px)*0.01388888888889) #define INCH_TO_POINT(inch) ((inch)*72.0) #define MM_TO_INCH(mm) ((mm)*0.039370147) #define INCH_TO_MM(inch) ((inch)*25.399956) #define POINT_TO_PI(px)((px)*0.083333333) #define POINT_TO_DD(px)((px)*0.006490083) #define POINT_TO_CC(px)((px)*0.077880997) #define PI_TO_POINT(pi)((pi)*12) #define DD_TO_POINT(dd)((dd)*154.08124) #define CC_TO_POINT(cc)((cc)*12.840103) /** * %KOffice stores everything in pt (using "double") internally. * When displaying a value to the user, the value is converted to the user's unit * of choice, and rounded to a reasonable precision to avoid 0.999999 */ class KOFFICECORE_EXPORT KoUnit { public: /** Length units supported by KOffice. */ enum Unit { U_MM = 0, U_PT = 1, U_INCH = 2, U_CM = 3, U_DM = 4, U_PI = 5, // pica U_DD = 6, // didot U_CC = 7, // cicero U_LASTUNIT = U_CC // update when adding a new unit // when adding a new unit, make sure to implement support for it in koRuler too }; /// Prepare ptValue to be displayed in pt static double toPoint( double ptValue ) { // No conversion, only rounding (to 0.001 precision) return floor( ptValue * 1000.0 ) / 1000.0; } /// Prepare ptValue to be displayed in mm static double toMM( double ptValue ) { // "mm" values are rounded to 0.0001 millimeters return floor( POINT_TO_MM( ptValue ) * 10000.0 ) / 10000.0; } /// Prepare ptValue to be displayed in cm static double toCM( double ptValue ) { return floor( POINT_TO_CM( ptValue ) * 10000.0 ) / 10000.0; } /// Prepare ptValue to be displayed in dm static double toDM( double ptValue ) { return floor( POINT_TO_DM( ptValue ) * 10000.0 ) / 10000.0; } /// Prepare ptValue to be displayed in inch static double toInch( double ptValue ) { // "in" values are rounded to 0.00001 inches return floor( POINT_TO_INCH( ptValue ) * 100000.0 ) / 100000.0; } /// Prepare ptValue to be displayed in pica static double toPI( double ptValue ) { // "pi" values are rounded to 0.00001 inches return floor( POINT_TO_PI( ptValue ) * 100000.0 ) / 100000.0; } /// Prepare ptValue to be displayed in didot static double toDD( double ptValue ) { // "dd" values are rounded to 0.00001 inches return floor( POINT_TO_DD( ptValue ) * 100000.0 ) / 100000.0; } /// Prepare ptValue to be displayed in cicero static double toCC( double ptValue ) { // "cc" values are rounded to 0.00001 inches return floor( POINT_TO_CC( ptValue ) * 100000.0 ) / 100000.0; } /** * This method is the one to use to display a value in a dialog * \return the value @p ptValue converted to @p unit and rounded, ready to be displayed * Old name: ptToUnit */ static double toUserValue( double ptValue, Unit unit ); /** * Convert the value @p ptValue to a given unit @p unit * Unlike KoUnit::ptToUnit the return value remains unrounded, so that it can be used in complex calculation * \return the converted value * Old name: ptToUnitUnrounded */ static double ptToUnit( const double ptValue, const Unit unit ); /// This method is the one to use to display a value in a dialog /// @return the value @p ptValue converted to @p unit and rounded, ready to be displayed /// Old name: userValue static QString toUserStringValue( double ptValue, Unit unit ); /// This method is the one to use to read a value from a dialog /// @return the value in @p unit, converted to points for internal use /// Old name: ptFromUnit static double fromUserValue( double value, Unit unit ); /// This method is the one to use to read a value from a dialog /// @param value value entered by the user /// @param unit unit type selected by the user /// @param ok if set, the pointed bool is set to true if the value could be /// converted to a double, and to false otherwise. /// @return the value in @p unit, converted to points for internal use static double fromUserValue( const QString& value, Unit unit, bool* ok = 0 ); /// Convert a unit name into a Unit enum /// @param _unitName name to convert /// @param ok if set, it will be true if the unit was known, false if unknown static Unit unit( const QString &_unitName, bool* ok = 0 ); /// Get the name of a unit static QString unitName( Unit _unit ); /// Get the full (translated) description of a unit static QString unitDescription( Unit _unit ); static QStringList listOfUnitName(); /// parse common %KOffice and OO values, like "10cm", "5mm" to pt static double parseValue( QString value, double defaultVal = 0.0 ); // Note: the above method doesn't take a const ref, since it modifies the arg. #ifndef SIMPLE_KOLIBS /// Save a unit in OASIS format static void saveOasis(KoXmlWriter* settingsWriter, Unit _unit); #endif }; #endif