diff options
Diffstat (limited to 'lib/kofficecore/KoUnit.h')
-rw-r--r-- | lib/kofficecore/KoUnit.h | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/lib/kofficecore/KoUnit.h b/lib/kofficecore/KoUnit.h new file mode 100644 index 00000000..07638215 --- /dev/null +++ b/lib/kofficecore/KoUnit.h @@ -0,0 +1,175 @@ +/* This file is part of the KDE project + Copyright (C) 1998, 1999 Reginald Stadlbauer <[email protected]>, Torben Weis <[email protected]> + Copyright (C) 2004, Nicolas GOUTTE <[email protected]> + + 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 <qstring.h> +#include <qstringlist.h> +#include <math.h> // for floor +#include <koffice_export.h> + +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. + + /// Save a unit in OASIS format + static void saveOasis(KoXmlWriter* settingsWriter, Unit _unit); + +}; + + +#endif |