xref: /trunk/main/sc/source/filter/inc/xihelper.hxx (revision 870c3792)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef SC_XIHELPER_HXX
25 #define SC_XIHELPER_HXX
26 
27 #include <editeng/editdata.hxx>
28 #include "scmatrix.hxx"
29 #include "xladdress.hxx"
30 #include "xiroot.hxx"
31 #include "xistring.hxx"
32 
33 // Excel->Calc cell address/range conversion ==================================
34 
35 /** Provides functions to convert Excel cell addresses to Calc cell addresses. */
36 class XclImpAddressConverter : public XclAddressConverterBase
37 {
38 public:
39     explicit            XclImpAddressConverter( const XclImpRoot& rRoot );
40 
41     // cell address -----------------------------------------------------------
42 
43     /** Checks if the passed Excel cell address is valid.
44         @param rXclPos  The Excel cell address to check.
45         @param bWarn  true = Sets the internal flag that produces a warning box
46             after loading/saving the file, if the cell address is not valid.
47         @return  true = Cell address in rXclPos is valid. */
48     bool                CheckAddress( const XclAddress& rXclPos, bool bWarn );
49 
50     /** Converts the passed Excel cell address to a Calc cell address.
51         @param rScPos  (Out) The converted Calc cell address, if valid.
52         @param rXclPos  The Excel cell address to convert.
53         @param bWarn  true = Sets the internal flag that produces a warning box
54             after loading/saving the file, if the cell address is invalid.
55         @return  true = Cell address returned in rScPos is valid. */
56     bool                ConvertAddress( ScAddress& rScPos,
57                             const XclAddress& rXclPos, SCTAB nScTab, bool bWarn );
58 
59     /** Returns a valid cell address by moving it into allowed dimensions.
60         @param rXclPos  The Excel cell address to convert.
61         @param bWarn  true = Sets the internal flag that produces a warning box
62             after loading/saving the file, if the cell address is invalid.
63         @return  The converted Calc cell address. */
64     ScAddress           CreateValidAddress( const XclAddress& rXclPos,
65                             SCTAB nScTab, bool bWarn );
66 
67     // cell range -------------------------------------------------------------
68 
69     /** Checks if the passed cell range is valid (checks start and end position).
70         @param rXclRange  The Excel cell range to check.
71         @param bWarn  true = Sets the internal flag that produces a warning box
72             after loading/saving the file, if the cell range is not valid.
73         @return  true = Cell range in rXclRange is valid. */
74     bool                CheckRange( const XclRange& rXclRange, bool bWarn );
75 
76     /** Converts the passed Excel cell range to a Calc cell range.
77         @param rScRange  (Out) The converted Calc cell range, if valid.
78         @param rXclRange  The Excel cell range to convert.
79         @param bWarn  true = Sets the internal flag that produces a warning box
80             after loading/saving the file, if the cell range contains invalid cells.
81         @return  true = Cell range returned in rScRange is valid (original or cropped). */
82     bool                ConvertRange( ScRange& rScRange, const XclRange& rXclRange,
83                             SCTAB nScTab1, SCTAB nScTab2, bool bWarn );
84 
85 //UNUSED2009-05 /** Returns a valid cell range by moving it into allowed dimensions.
86 //UNUSED2009-05     @descr  The start and/or end position of the range may be modified.
87 //UNUSED2009-05     @param rXclRange  The Excel cell range to convert.
88 //UNUSED2009-05     @param bWarn  true = Sets the internal flag that produces a warning box
89 //UNUSED2009-05         after loading/saving the file, if the cell range contains invalid cells.
90 //UNUSED2009-05     @return  The converted Calc cell range. */
91 //UNUSED2009-05 ScRange             CreateValidRange( const XclRange& rXclRange,
92 //UNUSED2009-05                         SCTAB nScTab1, SCTAB nScTab2, bool bWarn );
93 
94     // cell range list --------------------------------------------------------
95 
96 //UNUSED2009-05 /** Checks if the passed cell range list is valid.
97 //UNUSED2009-05     @param rXclRanges  The Excel cell range list to check.
98 //UNUSED2009-05     @param bWarn  true = Sets the internal flag that produces a warning box
99 //UNUSED2009-05         after loading/saving the file, if the cell range list contains at
100 //UNUSED2009-05         least one invalid range.
101 //UNUSED2009-05     @return  true = Cell range list in rScRanges is completely valid. */
102 //UNUSED2009-05 bool                CheckRangeList( const XclRangeList& rXclRanges, bool bWarn );
103 
104     /** Converts the passed Excel cell range list to a Calc cell range list.
105         @descr  The start position of the ranges will not be modified. Cell
106             ranges that fit partly into valid dimensions are cropped
107             accordingly. Cell ranges that do not fit at all, are not inserted
108             into the Calc cell range list.
109         @param rScRanges  (Out) The converted Calc cell range list.
110         @param rXclRanges  The Excel cell range list to convert.
111         @param bWarn  true = Sets the internal flag that produces a warning box
112             after loading/saving the file, if at least one of the cell ranges
113             contains invalid cells. */
114     void                ConvertRangeList( ScRangeList& rScRanges,
115                             const XclRangeList& rXclRanges, SCTAB nScTab, bool bWarn );
116 };
117 
118 // String->EditEngine conversion ==============================================
119 
120 class ScBaseCell;
121 class EditTextObject;
122 
123 /** This class provides methods to convert an XclImpString.
124     @The string can be converted to an edit engine text object or directly
125     to a Calc edit cell. */
126 class XclImpStringHelper : ScfNoInstance
127 {
128 public:
129     /** Returns a new edit engine text object.
130         @param nXFIndex  Index to XF for first text portion (for escapement). */
131     static EditTextObject* CreateTextObject(
132                             const XclImpRoot& rRoot,
133                             const XclImpString& rString );
134 
135 //UNUSED2009-05 /** Returns a new edit engine text object for a cell note.
136 //UNUSED2009-05     @param nXFIndex  Index to XF for first text portion (for escapement). */
137 //UNUSED2009-05 static EditTextObject* CreateNoteObject(
138 //UNUSED2009-05                         const XclImpRoot& rRoot,
139 //UNUSED2009-05                         const XclImpString& rString );
140 
141     /** Creates a new text cell or edit cell for a Calc document.
142         @param nXFIndex  Index to XF for first text portion (for escapement). */
143     static ScBaseCell*  CreateCell(
144                             const XclImpRoot& rRoot,
145                             const XclImpString& rString,
146                             sal_uInt16 nXFIndex = 0 );
147 };
148 
149 // Header/footer conversion ===================================================
150 
151 class EditEngine;
152 class EditTextObject;
153 class SfxItemSet;
154 class SvxFieldItem;
155 struct XclFontData;
156 
157 /** Converts an Excel header/footer string into three edit engine text objects.
158     @descr  Header/footer content is divided into three parts: Left, center and
159     right portion. All formatting information is encoded in the Excel string
160     using special character sequences. A control sequence starts with the ampersand
161     character.
162 
163     Supported control sequences:
164     &L                      start of left portion
165     &C                      start of center portion
166     &R                      start of right portion
167     &P                      current page number
168     &N                      page count
169     &D                      current date
170     &T                      current time
171     &A                      table name
172     &F                      file name without path (see also &Z&F)
173     &Z                      file path without file name (converted to full file name, see also &Z&F)
174     &Z&F                    file path and name
175     &U                      underlining on/off
176     &E                      double underlining on/off
177     &S                      strikeout characters on/off
178     &X                      superscript on/off
179     &Y                      subscript on/off
180     &"fontname,fontstyle"   use font with name 'fontname' and style 'fontstyle'
181     &fontheight             set font height in points ('fontheight' is a decimal value)
182 
183     Known but unsupported control sequences:
184     &G                      picture
185  */
186 class XclImpHFConverter : protected XclImpRoot, ScfNoCopy
187 {
188 public:
189     explicit            XclImpHFConverter( const XclImpRoot& rRoot );
190                         ~XclImpHFConverter();
191 
192     /** Parses the passed string and creates three new edit engine text objects. */
193     void                ParseString( const String& rHFString );
194 
195     /** Creates a ScPageHFItem and inserts it into the passed item set. */
196     void                FillToItemSet( SfxItemSet& rItemSet, sal_uInt16 nWhichId ) const;
197     /** Returns the total height of the converted header or footer in twips. */
198     sal_Int32           GetTotalHeight() const;
199 
200 private:    // types
201     typedef ::std::auto_ptr< XclFontData > XclFontDataPtr;
202 
203     /** Enumerates the supported header/footer portions. */
204     enum XclImpHFPortion { EXC_HF_LEFT, EXC_HF_CENTER, EXC_HF_RIGHT, EXC_HF_PORTION_COUNT };
205 
206     /** Contains all information about a header/footer portion. */
207     struct XclImpHFPortionInfo
208     {
209         typedef ScfRef< EditTextObject > EditTextObjectRef;
210         EditTextObjectRef   mxObj;          /// Edit engine text object.
211         ESelection          maSel;          /// Edit engine selection.
212         sal_Int32           mnHeight;       /// Height of previous lines in twips.
213         sal_uInt16          mnMaxLineHt;    /// Maximum font height for the current text line.
214         explicit            XclImpHFPortionInfo();
215     };
216     typedef ::std::vector< XclImpHFPortionInfo > XclImpHFPortionInfoVec;
217 
218 private:
219     /** Returns the current edit engine text object. */
GetCurrInfo()220     inline XclImpHFPortionInfo& GetCurrInfo() { return maInfos[ meCurrObj ]; }
221     /** Returns the current edit engine text object. */
GetCurrObj()222     inline XclImpHFPortionInfo::EditTextObjectRef& GetCurrObj() { return GetCurrInfo().mxObj; }
223     /** Returns the current selection. */
GetCurrSel()224     inline ESelection&  GetCurrSel() { return GetCurrInfo().maSel; }
225 
226     /** Returns the maximum line height of the specified portion. */
227     sal_uInt16          GetMaxLineHeight( XclImpHFPortion ePortion ) const;
228     /** Returns the current maximum line height. */
229     sal_uInt16          GetCurrMaxLineHeight() const;
230 
231     /** Updates the maximum line height of the specified portion, using the current font size. */
232     void                UpdateMaxLineHeight( XclImpHFPortion ePortion );
233     /** Updates the current maximum line height, using the current font size. */
234     void                UpdateCurrMaxLineHeight();
235 
236     /** Sets the font attributes at the current selection.
237         @descr  After that, the start position of the current selection object is
238         adjusted to the end of the selection. */
239     void                SetAttribs();
240     /** Resets font data to application default font. */
241     void                ResetFontData();
242 
243     /** Inserts maCurrText into edit engine and adjusts the current selection object.
244         @descr  The text shall not contain a newline character.
245         The text will be cleared after insertion. */
246     void                InsertText();
247     /** Inserts the passed text field and adjusts the current selection object. */
248     void                InsertField( const SvxFieldItem& rFieldItem );
249     /** Inserts a line break and adjusts the current selection object. */
250     void                InsertLineBreak();
251 
252     /** Creates the edit engine text object of current portion from edit engine. */
253     void                CreateCurrObject();
254     /** Changes current header/footer portion to eNew.
255         @descr  Creates text object of current portion and reinitializes edit engine. */
256     void                SetNewPortion( XclImpHFPortion eNew );
257 
258 private:
259     EditEngine&         mrEE;               /// The header/footer edit engine.
260     XclImpHFPortionInfoVec maInfos;         /// Edit engine text objects for all portions.
261     String              maCurrText;         /// Current text to insert into edit engine.
262     XclFontDataPtr      mxFontData;         /// Font data of current text.
263     XclImpHFPortion     meCurrObj;          /// The current portion.
264 };
265 
266 // URL conversion =============================================================
267 
268 /** This class contains static methods to decode an URL stored in an Excel file.
269     @descr  Excel URLs can contain a sheet name, for instance: path\[test.xls]Sheet1
270     This sheet name will be extracted automatically. */
271 class XclImpUrlHelper : ScfNoInstance
272 {
273 public:
274     /** Decodes an encoded external document URL with optional sheet name.
275         @param rUrl  Returns the decoded file name incl. path.
276         @param rTabName  Returns the decoded sheet name.
277         @param rbSameWb  Returns true, if the URL is a reference to the own workbook.
278         @param rEncodedUrl   An encoded URL from Excel. */
279     static void         DecodeUrl(
280                             String& rUrl,
281                             String& rTabName,
282                             bool& rbSameWb,
283                             const XclImpRoot& rRoot,
284                             const String& rEncodedUrl );
285 
286     /** Decodes an encoded external document URL without sheet name.
287         @param rUrl  Returns the decoded file name incl. path.
288         @param rbSameWb  Returns true, if the URL is a reference to the own workbook.
289         @param rEncodedUrl   An encoded URL from Excel. */
290     static void         DecodeUrl(
291                             String& rUrl,
292                             bool& rbSameWb,
293                             const XclImpRoot& rRoot,
294                             const String& rEncodedUrl );
295 
296     /** Decodes the passed URL to OLE or DDE link components.
297         @descr  For DDE links: Decodes to application name and topic.
298         For OLE object links: Decodes to class name and document URL.
299         @return  true = decoding was successful, returned strings are valid (not empty). */
300     static bool         DecodeLink( String& rApplic, String& rTopic, const String rEncUrl );
301 };
302 
303 // Cached values ==============================================================
304 
305 class ScTokenArray;
306 
307 /** This class stores one cached value of a cached value list (used for instance in
308     CRN, EXTERNNAME, tArray). */
309 class XclImpCachedValue : ScfNoCopy
310 {
311 public:
312     /** Creates a cached value and reads contents from stream and stores it with its array address. */
313     explicit            XclImpCachedValue( XclImpStream& rStrm );
314     virtual             ~XclImpCachedValue();
315 
316     /** Returns the type of the cached value (EXC_CACHEDVAL_*). */
GetType() const317     inline sal_uInt8    GetType() const     { return mnType; }
318     /** Returns the cached string value, if this value is a string, else an empty string. */
GetString() const319     inline const String& GetString() const  { return mxStr.get() ? *mxStr : EMPTY_STRING; }
320     /** Returns the cached number, if this value has number type, else 0.0. */
GetValue() const321     inline double       GetValue() const    { return mfValue; }
322     /** Returns the cached Boolean value, if this value has Boolean type, else false. */
GetBool() const323     inline bool         GetBool() const     { return (mnType == EXC_CACHEDVAL_BOOL) && (mnBoolErr != 0); }
324     /** Returns the cached Calc error code, if this value has Error type, else 0. */
GetXclError() const325     inline sal_uInt8    GetXclError() const { return (mnType == EXC_CACHEDVAL_ERROR) ? mnBoolErr : EXC_ERR_NA; }
326     /** Returns the cached Calc error code, if this value has Error type, else 0. */
327     sal_uInt16              GetScError() const;
328     /** Returns the token array if this is a Boolean value or error value, else 0. */
GetBoolErrFmla() const329     inline const ScTokenArray* GetBoolErrFmla() const { return mxTokArr.get(); }
330 
331 protected:
332     typedef ::std::auto_ptr< String >               StringPtr;
333     typedef ::std::auto_ptr< const ScTokenArray >   ScTokenArrayPtr;
334 
335     StringPtr           mxStr;      /// Cached value is a string.
336     double              mfValue;    /// Cached value is a double.
337     ScTokenArrayPtr     mxTokArr;   /// Cached value is a formula or error code or Boolean.
338     sal_uInt8           mnBoolErr;  /// Boolean value or Excel error code.
339     sal_uInt8           mnType;     /// The type of the cached value (EXC_CACHEDVAL_*).
340 };
341 
342 // ----------------------------------------------------------------------------
343 
344 /** Contains cached values in a 2-dimensional array. */
345 class XclImpCachedMatrix
346 {
347 public:
348     explicit            XclImpCachedMatrix( XclImpStream& rStrm );
349                         ~XclImpCachedMatrix();
350 
351     /** Creates a new ScMatrix object and fills it with the contained values. */
352     ScMatrixRef         CreateScMatrix() const;
353 
354 private:
355     typedef ScfDelList< XclImpCachedValue > XclImpValueList;
356 
357     XclImpValueList     maValueList;    /// List of cached cell values.
358     SCSIZE              mnScCols;       /// Number of cached columns.
359     SCSIZE              mnScRows;       /// Number of cached rows.
360 };
361 
362 // ============================================================================
363 
364 #endif
365 
366