Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #ifndef OOX_XLS_UNITCONVERTER_HXX
21 : #define OOX_XLS_UNITCONVERTER_HXX
22 :
23 : #include <map>
24 : #include <vector>
25 : #include "workbookhelper.hxx"
26 :
27 : namespace com { namespace sun { namespace star {
28 : namespace util { struct Date; struct DateTime; }
29 : } } }
30 :
31 : namespace oox {
32 : namespace xls {
33 :
34 : // ============================================================================
35 :
36 : /** Units supported by the UnitConverter class. */
37 : enum Unit
38 : {
39 : UNIT_INCH, /// Inches.
40 : UNIT_POINT, /// Points.
41 : UNIT_TWIP, /// Twips (1/20 point).
42 : UNIT_EMU, /// English Metric Unit (1/360,000 cm).
43 : UNIT_SCREENX, /// Horizontal screen pixels.
44 : UNIT_SCREENY, /// Vertical screen pixels.
45 : UNIT_REFDEVX, /// Horizontal pixels in Calc reference device.
46 : UNIT_REFDEVY, /// Vertical pixels in Calc reference device.
47 : UNIT_DIGIT, /// Digit width of document default font.
48 : UNIT_SPACE, /// Space character width of document default font.
49 :
50 : UNIT_ENUM_SIZE
51 : };
52 :
53 : /** Helper class that provides functions to convert values from and to
54 : different units.
55 :
56 : Provides functions to calculate the width of certain characters of the
57 : default font of the imported/exported document. The default font is always
58 : the first font in the styles font list, and is always referenced by the
59 : default cell style ("Normal" style in Excel) which is used by all empty
60 : unformatted cells in the document. To be able to calculate the charcter
61 : width correctly, the default font must be known, which is the case after
62 : the finalizeImport() or finalizeExport() functions have been called. Caller
63 : must make sure to not call the character width conversion functions before.
64 : */
65 22 : class UnitConverter : public WorkbookHelper
66 : {
67 : public:
68 : explicit UnitConverter( const WorkbookHelper& rHelper );
69 :
70 : /** Final processing after import of all style settings. */
71 : void finalizeImport();
72 : /** Updates internal nulldate for date/serial conversion. */
73 : void finalizeNullDate( const ::com::sun::star::util::Date& rNullDate );
74 :
75 : /** Converts the passed value between the passed units. */
76 : double scaleValue( double fValue, Unit eFromUnit, Unit eToUnit ) const;
77 :
78 : /** Converts the passed value to 1/100 millimeters. */
79 : sal_Int32 scaleToMm100( double fValue, Unit eUnit ) const;
80 : /** Converts the passed value from 1/100 millimeters to the passed unit. */
81 : double scaleFromMm100( sal_Int32 nMm100, Unit eUnit ) const;
82 :
83 : /** Returns the serial value of the passed datetime, based on current nulldate. */
84 : double calcSerialFromDateTime( const ::com::sun::star::util::DateTime& rDateTime ) const;
85 : /** Returns the datetime of the passed serial value, based on current nulldate. */
86 : ::com::sun::star::util::DateTime calcDateTimeFromSerial( double fSerial ) const;
87 :
88 : /** Returns a BIFF error code from the passed error string. */
89 : sal_uInt8 calcBiffErrorCode( const ::rtl::OUString& rErrorCode ) const;
90 :
91 : private:
92 : /** Adds an error code to the internal maps. */
93 : void addErrorCode( sal_uInt8 nErrorCode, const ::rtl::OUString& rErrorCode );
94 : /** Returns the conversion coefficient for the passed unit. */
95 : double getCoefficient( Unit eUnit ) const;
96 :
97 : private:
98 : typedef ::std::vector< double > DoubleVector;
99 : typedef ::std::map< ::rtl::OUString, sal_uInt8 > OoxErrorCodeMap;
100 : typedef ::std::map< sal_uInt8, ::rtl::OUString > BiffErrorCodeMap;
101 :
102 : DoubleVector maCoeffs; /// Coefficients for unit conversion.
103 : OoxErrorCodeMap maOoxErrCodes; /// Maps error code strings to BIFF error constants.
104 : sal_Int32 mnNullDate; /// Nulldate of this workbook (number of days since 0000-01-01).
105 : };
106 :
107 : // ============================================================================
108 :
109 : } // namespace xls
110 : } // namespace oox
111 :
112 : #endif
113 :
114 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|