1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef OOX_XLS_WORKSHEETHELPER_HXX
#define OOX_XLS_WORKSHEETHELPER_HXX
#include "oox/helper/containerhelper.hxx"
#include "oox/helper/progressbar.hxx"
#include "oox/ole/olehelper.hxx"
#include "addressconverter.hxx"
#include "formulabase.hxx"
namespace com { namespace sun { namespace star {
namespace awt { struct Point; }
namespace awt { struct Rectangle; }
namespace awt { struct Size; }
namespace drawing { class XDrawPage; }
namespace sheet { class XSheetCellRanges; }
namespace sheet { class XSpreadsheet; }
namespace table { class XCell; }
namespace table { class XCell2; }
namespace table { class XCellRange; }
namespace table { class XTableColumns; }
namespace table { class XTableRows; }
} } }
namespace oox {
namespace xls {
class AutoFilterBuffer;
struct BinAddress;
struct BinRange;
class CommentsBuffer;
class CondFormatBuffer;
class Font;
class PageSettings;
class QueryTableBuffer;
class RichString;
class SheetDataBuffer;
class SheetViewSettings;
class VmlDrawing;
class WorksheetSettings;
typedef ::std::map< OUString, void* > ExtLst;
// ============================================================================
// ============================================================================
typedef ::std::map< BinAddress, sal_Int32 > SharedFormulaMap;
/** An enumeration for all types of sheets in a workbook. */
enum WorksheetType
{
SHEETTYPE_WORKSHEET, /// Worksheet.
SHEETTYPE_CHARTSHEET, /// Chart sheet.
SHEETTYPE_MACROSHEET, /// Macro sheet.
SHEETTYPE_DIALOGSHEET, /// Dialog sheet (BIFF5+).
SHEETTYPE_MODULESHEET, /// VB module sheet (BIFF5 only).
SHEETTYPE_EMPTYSHEET /// Other (unsupported) sheet type.
};
// ============================================================================
/** Stores settings and formatting data about a range of sheet columns. */
struct ColumnModel
{
ValueRange maRange; /// 1-based (!) range of the described columns.
double mfWidth; /// Column width in number of characters.
sal_Int32 mnXfId; /// Column default formatting.
sal_Int32 mnLevel; /// Column outline level.
bool mbShowPhonetic:1; /// True = cells in column show phonetic settings.
bool mbHidden:1; /// True = column is hidden.
bool mbCollapsed:1; /// True = column outline is collapsed.
explicit ColumnModel();
/** Returns true, if this entry can be merged with the passed column range (column settings are equal). */
bool isMergeable( const ColumnModel& rModel ) const;
};
// ----------------------------------------------------------------------------
/** Stores settings and formatting data about a sheet row. */
struct RowModel
{
sal_Int32 mnRow; /// 1-based (!) index of the described row.
ValueRangeSet maColSpans; /// 0-based (!) column ranges of used cells.
double mfHeight; /// Row height in points.
sal_Int32 mnXfId; /// Row default formatting (see mbIsFormatted).
sal_Int32 mnLevel; /// Row outline level.
bool mbCustomHeight:1; /// True = row has custom height.
bool mbCustomFormat:1; /// True = cells in row have explicit formatting.
bool mbShowPhonetic:1; /// True = cells in row show phonetic settings.
bool mbHidden:1; /// True = row is hidden.
bool mbCollapsed:1; /// True = row outline is collapsed.
bool mbThickTop:1; /// True = row has extra space above text.
bool mbThickBottom:1; /// True = row has extra space below text.
explicit RowModel();
/** Inserts the passed column span into the row model. */
void insertColSpan( const ValueRange& rColSpan );
/** Returns true, if this entry can be merged with the passed row range (row settings are equal). */
bool isMergeable( const RowModel& rModel ) const;
};
// ----------------------------------------------------------------------------
/** Stores formatting data about a page break. */
struct PageBreakModel
{
sal_Int32 mnColRow; /// 0-based (!) index of column/row.
sal_Int32 mnMin; /// Start of limited break.
sal_Int32 mnMax; /// End of limited break.
bool mbManual; /// True = manual page break.
explicit PageBreakModel();
};
// ----------------------------------------------------------------------------
/** Stores data about a hyperlink range. */
struct HyperlinkModel : public ::oox::ole::StdHlinkInfo
{
::com::sun::star::table::CellRangeAddress
maRange; /// The cell area containing the hyperlink.
OUString maTooltip; /// Additional tooltip text.
explicit HyperlinkModel();
};
// ----------------------------------------------------------------------------
/** Stores data about ranges with data validation settings. */
struct ValidationModel
{
ApiCellRangeList maRanges;
ApiTokenSequence maTokens1;
ApiTokenSequence maTokens2;
OUString msRef;
OUString maInputTitle;
OUString maInputMessage;
OUString maErrorTitle;
OUString maErrorMessage;
sal_Int32 mnType;
sal_Int32 mnOperator;
sal_Int32 mnErrorStyle;
bool mbShowInputMsg:1;
bool mbShowErrorMsg:1;
bool mbNoDropDown:1;
bool mbAllowBlank:1;
explicit ValidationModel();
/** Sets the passed BIFF validation type. */
void setBiffType( sal_uInt8 nType );
/** Sets the passed BIFF operator. */
void setBiffOperator( sal_uInt8 nOperator );
/** Sets the passed BIFF error style. */
void setBiffErrorStyle( sal_uInt8 nErrorStyle );
};
// ============================================================================
// ============================================================================
class WorksheetGlobals;
typedef ::boost::shared_ptr< WorksheetGlobals > WorksheetGlobalsRef;
class IWorksheetProgress {
public:
virtual ~IWorksheetProgress() {}
virtual ISegmentProgressBarRef getRowProgress() = 0;
virtual void setCustomRowProgress(
const ISegmentProgressBarRef &rxRowProgress ) = 0;
};
class WorksheetHelper : public WorkbookHelper
{
public:
/*implicit*/ WorksheetHelper( WorksheetGlobals& rSheetGlob );
static WorksheetGlobalsRef constructGlobals(
const WorkbookHelper& rHelper,
const ISegmentProgressBarRef& rxProgressBar,
WorksheetType eSheetType,
sal_Int16 nSheet );
// horrible accessor for hidden WorksheetGlobals ...
static IWorksheetProgress *getWorksheetInterface( const WorksheetGlobalsRef &xRef );
// ------------------------------------------------------------------------
/** Returns the type of this sheet. */
WorksheetType getSheetType() const;
/** Returns the index of the current sheet. */
sal_Int16 getSheetIndex() const;
/** Returns the XSpreadsheet interface of the current sheet. */
const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheet >&
getSheet() const;
/** Returns the XCell interface for the passed cell address. */
::com::sun::star::uno::Reference< ::com::sun::star::table::XCell >
getCell( const ::com::sun::star::table::CellAddress& rAddress ) const;
/** Returns the XCellRange interface for the passed cell range address. */
::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange >
getCellRange( const ::com::sun::star::table::CellRangeAddress& rRange ) const;
/** Returns the XDrawPage interface of the draw page of the current sheet. */
::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage >
getDrawPage() const;
/** Returns the absolute cell position in 1/100 mm. */
::com::sun::star::awt::Point getCellPosition( sal_Int32 nCol, sal_Int32 nRow ) const;
/** Returns the cell size in 1/100 mm. */
::com::sun::star::awt::Size getCellSize( sal_Int32 nCol, sal_Int32 nRow ) const;
/** Returns the size of the entire drawing page in 1/100 mm. */
::com::sun::star::awt::Size getDrawPageSize() const;
/** Returns the buffer for cell contents and cell formatting. */
SheetDataBuffer& getSheetData() const;
/** Returns the conditional formatting in this sheet. */
CondFormatBuffer& getCondFormats() const;
/** Returns the buffer for all cell comments in this sheet. */
CommentsBuffer& getComments() const;
/** Returns the auto filters for the sheet. */
AutoFilterBuffer& getAutoFilters() const;
/** Returns the buffer for all web query tables in this sheet. */
QueryTableBuffer& getQueryTables() const;
/** Returns the worksheet settings object. */
WorksheetSettings& getWorksheetSettings() const;
/** Returns the page/print settings for this sheet. */
PageSettings& getPageSettings() const;
/** Returns the view settings for this sheet. */
SheetViewSettings& getSheetViewSettings() const;
/** Returns the VML drawing page for this sheet (OOXML/BIFF12 only). */
VmlDrawing& getVmlDrawing() const;
ExtLst& getExtLst() const;
/** Sets a column or row page break described in the passed struct. */
void setPageBreak( const PageBreakModel& rModel, bool bRowBreak );
/** Inserts the hyperlink URL into the spreadsheet. */
void setHyperlink( const HyperlinkModel& rModel );
/** Inserts the data validation settings into the spreadsheet. */
void setValidation( const ValidationModel& rModel );
/** Sets the path to the DrawingML fragment of this sheet. */
void setDrawingPath( const OUString& rDrawingPath );
/** Sets the path to the legacy VML drawing fragment of this sheet. */
void setVmlDrawingPath( const OUString& rVmlDrawingPath );
/** Extends the used area of this sheet by the passed cell position. */
void extendUsedArea( const ::com::sun::star::table::CellAddress& rAddress );
/** Extends the used area of this sheet by the passed cell range. */
void extendUsedArea( const ::com::sun::star::table::CellRangeAddress& rRange );
/** Extends the shape bounding box by the position and size of the passed rectangle (in 1/100 mm). */
void extendShapeBoundingBox( const ::com::sun::star::awt::Rectangle& rShapeRect );
/** Sets base width for all columns (without padding pixels). This value
is only used, if width has not been set with setDefaultColumnWidth(). */
void setBaseColumnWidth( sal_Int32 nWidth );
/** Sets default width for all columns. This function overrides the base
width set with the setBaseColumnWidth() function. */
void setDefaultColumnWidth( double fWidth );
/** Sets column settings for a specific range of columns.
@descr Column default formatting is converted directly, other settings
are cached and converted in the finalizeWorksheetImport() call. */
void setColumnModel( const ColumnModel& rModel );
/** Sets default height and hidden state for all unused rows in the sheet. */
void setDefaultRowSettings(
double fHeight, bool bCustomHeight,
bool bHidden, bool bThickTop, bool bThickBottom );
/** Sets row settings for a specific range of rows.
@descr Row default formatting is converted directly, other settings
are cached and converted in the finalizeWorksheetImport() call. */
void setRowModel( const RowModel& rModel );
/** Specifies that the passed row needs to set its height manually. */
void setManualRowHeight( sal_Int32 nRow );
/** Inserts a value cell directly into the Calc sheet. */
void putValue( const com::sun::star::table::CellAddress& rAddress, double fValue );
/** Inserts a string cell directly into the Calc sheet. */
void putString( const com::sun::star::table::CellAddress& rAddress, const OUString& rText );
/** Inserts a rich-string cell directly into the Calc sheet. */
void putRichString(
const com::sun::star::table::CellAddress& rAddress,
const RichString& rString, const Font* pFirstPortionFont );
/** Inserts a formula cell directly into the Calc sheet. */
void putFormulaTokens(
const com::sun::star::table::CellAddress& rAddress, const ApiTokenSequence& rTokens );
/** Initial conversion before importing the worksheet. */
void initializeWorksheetImport();
/** Final conversion after importing the worksheet. */
void finalizeWorksheetImport();
/** Final import of drawing objects. Has to be called after all content has been imported */
void finalizeDrawingImport();
void setCellFormula( const ::com::sun::star::table::CellAddress& rTokenAddress, const OUString& );
void setCellFormula(
const com::sun::star::table::CellAddress& rAddr, sal_Int32 nSharedId,
const OUString& rCellValue, sal_Int32 nValueType );
void setCellArrayFormula( const ::com::sun::star::table::CellRangeAddress& rRangeAddress, const ::com::sun::star::table::CellAddress& rTokenAddress, const OUString& );
void createSharedFormulaMapEntry(
const com::sun::star::table::CellAddress& rAddress,
const com::sun::star::table::CellRangeAddress& rRange,
sal_Int32 nSharedId, const OUString& rTokens );
void setCellFormulaValue( const ::com::sun::star::table::CellAddress& rAddress,
double fValue );
private:
WorksheetGlobals& mrSheetGlob;
};
// ============================================================================
// ============================================================================
} // namespace xls
} // namespace oox
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|