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 :
10 : #ifndef INCLUDED_SC_SOURCE_FILTER_INC_ORCUSINTERFACE_HXX
11 : #define INCLUDED_SC_SOURCE_FILTER_INC_ORCUSINTERFACE_HXX
12 :
13 : #include "address.hxx"
14 : #include "documentimport.hxx"
15 :
16 : #include "sharedformulagroups.hxx"
17 :
18 : #include <rtl/strbuf.hxx>
19 :
20 : #define __ORCUS_STATIC_LIB
21 : #include <orcus/spreadsheet/import_interface.hpp>
22 :
23 : #include <boost/ptr_container/ptr_vector.hpp>
24 : #include <map>
25 : #include <unordered_map>
26 :
27 : class ScDocumentImport;
28 : class ScOrcusSheet;
29 : class ScOrcusFactory;
30 : class ScRangeData;
31 :
32 : namespace com { namespace sun { namespace star { namespace task {
33 :
34 : class XStatusIndicator;
35 :
36 : }}}}
37 :
38 0 : class ScOrcusGlobalSettings : public orcus::spreadsheet::iface::import_global_settings
39 : {
40 : ScDocumentImport& mrDoc;
41 :
42 : public:
43 : ScOrcusGlobalSettings(ScDocumentImport& rDoc);
44 :
45 : virtual void set_origin_date(int year, int month, int day) SAL_OVERRIDE;
46 :
47 : virtual void set_default_formula_grammar(orcus::spreadsheet::formula_grammar_t grammar) SAL_OVERRIDE;
48 : virtual orcus::spreadsheet::formula_grammar_t get_default_formula_grammar() const SAL_OVERRIDE;
49 : };
50 :
51 0 : class ScOrcusSharedStrings : public orcus::spreadsheet::iface::import_shared_strings
52 : {
53 : ScOrcusFactory& mrFactory;
54 :
55 : OStringBuffer maCurSegment;
56 : public:
57 : ScOrcusSharedStrings(ScOrcusFactory& rFactory);
58 :
59 : virtual size_t append(const char* s, size_t n) SAL_OVERRIDE;
60 : virtual size_t add(const char* s, size_t n) SAL_OVERRIDE;
61 :
62 : virtual void set_segment_bold(bool b) SAL_OVERRIDE;
63 : virtual void set_segment_italic(bool b) SAL_OVERRIDE;
64 : virtual void set_segment_font(size_t font_index) SAL_OVERRIDE;
65 : virtual void set_segment_font_name(const char* s, size_t n) SAL_OVERRIDE;
66 : virtual void set_segment_font_size(double point) SAL_OVERRIDE;
67 : virtual void set_segment_font_color(orcus::spreadsheet::color_elem_t alpha,
68 : orcus::spreadsheet::color_elem_t red,
69 : orcus::spreadsheet::color_elem_t green,
70 : orcus::spreadsheet::color_elem_t blue) SAL_OVERRIDE;
71 : virtual void append_segment(const char* s, size_t n) SAL_OVERRIDE;
72 :
73 : virtual size_t commit_segments() SAL_OVERRIDE;
74 : };
75 :
76 : class ScOrcusAutoFilter : public orcus::spreadsheet::iface::import_auto_filter
77 : {
78 : public:
79 : ScOrcusAutoFilter(ScDocument& rDoc);
80 :
81 : virtual ~ScOrcusAutoFilter();
82 :
83 : virtual void set_range(const char* p_ref, size_t n_ref) SAL_OVERRIDE;
84 :
85 : virtual void set_column(orcus::spreadsheet::col_t col) SAL_OVERRIDE;
86 :
87 : virtual void append_column_match_value(const char* p, size_t n) SAL_OVERRIDE;
88 :
89 : virtual void commit_column() SAL_OVERRIDE;
90 :
91 : virtual void commit() SAL_OVERRIDE;
92 :
93 : private:
94 : ScDocument& mrDoc;
95 : };
96 :
97 0 : class ScOrcusSheet : public orcus::spreadsheet::iface::import_sheet
98 : {
99 : ScDocumentImport& mrDoc;
100 : SCTAB mnTab;
101 : ScOrcusFactory& mrFactory;
102 : sc::SharedFormulaGroups maFormulaGroups;
103 : ScOrcusAutoFilter maAutoFilter;
104 :
105 : typedef std::map<size_t, ScRangeData*> SharedFormulaContainer;
106 : SharedFormulaContainer maSharedFormulas;
107 :
108 : int mnCellCount;
109 :
110 : void cellInserted();
111 :
112 : public:
113 : ScOrcusSheet(ScDocumentImport& rDoc, SCTAB nTab, ScOrcusFactory& rFactory);
114 :
115 0 : virtual orcus::spreadsheet::iface::import_auto_filter* get_auto_filter() SAL_OVERRIDE { return &maAutoFilter; }
116 :
117 : // Orcus import interface
118 : virtual void set_auto(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, const char* p, size_t n) SAL_OVERRIDE;
119 : virtual void set_string(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, size_t sindex) SAL_OVERRIDE;
120 : virtual void set_value(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, double value) SAL_OVERRIDE;
121 : virtual void set_bool(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, bool value) SAL_OVERRIDE;
122 : virtual void set_date_time(
123 : orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, int year, int month, int day, int hour, int minute, double second) SAL_OVERRIDE;
124 :
125 : virtual void set_format(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, size_t xf_index) SAL_OVERRIDE;
126 : virtual void set_format(orcus::spreadsheet::row_t row_start, orcus::spreadsheet::col_t col_start,
127 : orcus::spreadsheet::row_t row_end, orcus::spreadsheet::col_t col_end, size_t xf_index) SAL_OVERRIDE;
128 :
129 : virtual void set_formula(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, orcus::spreadsheet::formula_grammar_t grammar, const char* p, size_t n) SAL_OVERRIDE;
130 : virtual void set_formula_result(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, const char* p, size_t n) SAL_OVERRIDE;
131 : virtual void set_formula_result(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, double val) SAL_OVERRIDE;
132 :
133 : virtual void set_shared_formula(
134 : orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, orcus::spreadsheet::formula_grammar_t grammar, size_t sindex,
135 : const char* p_formula, size_t n_formula) SAL_OVERRIDE;
136 :
137 : virtual void set_shared_formula(
138 : orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, orcus::spreadsheet::formula_grammar_t grammar, size_t sindex,
139 : const char* p_formula, size_t n_formula, const char* p_range, size_t n_range) SAL_OVERRIDE;
140 :
141 : virtual void set_shared_formula(orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, size_t sindex) SAL_OVERRIDE;
142 :
143 : virtual void set_array_formula(
144 : orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, orcus::spreadsheet::formula_grammar_t grammar,
145 : const char* p, size_t n, orcus::spreadsheet::row_t array_rows, orcus::spreadsheet::col_t array_cols) SAL_OVERRIDE;
146 :
147 : virtual void set_array_formula(
148 : orcus::spreadsheet::row_t row, orcus::spreadsheet::col_t col, orcus::spreadsheet::formula_grammar_t grammar,
149 : const char* p, size_t n, const char* p_range, size_t n_range) SAL_OVERRIDE;
150 :
151 0 : SCTAB getIndex() const { return mnTab; }
152 : };
153 :
154 0 : class ScOrcusStyles : public orcus::spreadsheet::iface::import_styles
155 : {
156 :
157 : public:
158 : // font
159 :
160 : virtual void set_font_count(size_t n) SAL_OVERRIDE;
161 : virtual void set_font_bold(bool b) SAL_OVERRIDE;
162 : virtual void set_font_italic(bool b) SAL_OVERRIDE;
163 : virtual void set_font_name(const char* s, size_t n) SAL_OVERRIDE;
164 : virtual void set_font_size(double point) SAL_OVERRIDE;
165 : virtual void set_font_underline(orcus::spreadsheet::underline_t e) SAL_OVERRIDE;
166 : virtual void set_font_color( orcus::spreadsheet::color_elem_t alpha,
167 : orcus::spreadsheet::color_elem_t red,
168 : orcus::spreadsheet::color_elem_t green,
169 : orcus::spreadsheet::color_elem_t blue) SAL_OVERRIDE;
170 : virtual size_t commit_font() SAL_OVERRIDE;
171 :
172 : // fill
173 :
174 : virtual void set_fill_count(size_t n) SAL_OVERRIDE;
175 : virtual void set_fill_pattern_type(const char* s, size_t n) SAL_OVERRIDE;
176 : virtual void set_fill_fg_color(orcus::spreadsheet::color_elem_t alpha, orcus::spreadsheet::color_elem_t red, orcus::spreadsheet::color_elem_t green, orcus::spreadsheet::color_elem_t blue) SAL_OVERRIDE;
177 : virtual void set_fill_bg_color(orcus::spreadsheet::color_elem_t alpha, orcus::spreadsheet::color_elem_t red, orcus::spreadsheet::color_elem_t green, orcus::spreadsheet::color_elem_t blue) SAL_OVERRIDE;
178 : virtual size_t commit_fill() SAL_OVERRIDE;
179 :
180 : // border
181 :
182 : virtual void set_border_count(size_t n) SAL_OVERRIDE;
183 : virtual void set_border_style(orcus::spreadsheet::border_direction_t dir, const char* s, size_t n) SAL_OVERRIDE;
184 : virtual void set_border_color(orcus::spreadsheet::border_direction_t dir,
185 : orcus::spreadsheet::color_elem_t alpha,
186 : orcus::spreadsheet::color_elem_t red,
187 : orcus::spreadsheet::color_elem_t green,
188 : orcus::spreadsheet::color_elem_t blue) SAL_OVERRIDE;
189 : virtual size_t commit_border() SAL_OVERRIDE;
190 :
191 : // cell protection
192 : virtual void set_cell_hidden(bool b) SAL_OVERRIDE;
193 : virtual void set_cell_locked(bool b) SAL_OVERRIDE;
194 : virtual size_t commit_cell_protection() SAL_OVERRIDE;
195 :
196 : // number format
197 : virtual void set_number_format_count(size_t n) SAL_OVERRIDE;
198 : virtual void set_number_format_identifier(size_t n) SAL_OVERRIDE;
199 : virtual void set_number_format_code(const char* s, size_t n) SAL_OVERRIDE;
200 : virtual size_t commit_number_format() SAL_OVERRIDE;
201 :
202 : // cell style xf
203 :
204 : virtual void set_cell_style_xf_count(size_t n) SAL_OVERRIDE;
205 : virtual size_t commit_cell_style_xf() SAL_OVERRIDE;
206 :
207 : // cell xf
208 :
209 : virtual void set_cell_xf_count(size_t n) SAL_OVERRIDE;
210 : virtual size_t commit_cell_xf() SAL_OVERRIDE;
211 :
212 : // dxf
213 : virtual void set_dxf_count(size_t count) SAL_OVERRIDE;
214 : virtual size_t commit_dxf() SAL_OVERRIDE;
215 :
216 : // xf (cell format) - used both by cell xf and cell style xf.
217 :
218 : virtual void set_xf_number_format(size_t index) SAL_OVERRIDE;
219 : virtual void set_xf_font(size_t index) SAL_OVERRIDE;
220 : virtual void set_xf_fill(size_t index) SAL_OVERRIDE;
221 : virtual void set_xf_border(size_t index) SAL_OVERRIDE;
222 : virtual void set_xf_protection(size_t index) SAL_OVERRIDE;
223 : virtual void set_xf_style_xf(size_t index) SAL_OVERRIDE;
224 : virtual void set_xf_apply_alignment(bool b) SAL_OVERRIDE;
225 : virtual void set_xf_horizontal_alignment(orcus::spreadsheet::hor_alignment_t align) SAL_OVERRIDE;
226 : virtual void set_xf_vertical_alignment(orcus::spreadsheet::ver_alignment_t align) SAL_OVERRIDE;
227 :
228 : // cell style entry
229 :
230 : virtual void set_cell_style_count(size_t n) SAL_OVERRIDE;
231 : virtual void set_cell_style_name(const char* s, size_t n) SAL_OVERRIDE;
232 : virtual void set_cell_style_xf(size_t index) SAL_OVERRIDE;
233 : virtual void set_cell_style_builtin(size_t index) SAL_OVERRIDE;
234 : virtual size_t commit_cell_style() SAL_OVERRIDE;
235 : };
236 :
237 0 : class ScOrcusFactory : public orcus::spreadsheet::iface::import_factory
238 : {
239 0 : struct StringCellCache
240 : {
241 : ScAddress maPos;
242 : size_t mnIndex;
243 :
244 : StringCellCache(const ScAddress& rPos, size_t nIndex);
245 : };
246 :
247 : typedef std::unordered_map<OUString, size_t, OUStringHash> StringHashType;
248 : typedef std::vector<StringCellCache> StringCellCaches;
249 :
250 : ScDocumentImport maDoc;
251 :
252 : std::vector<OUString> maStrings;
253 : StringHashType maStringHash;
254 :
255 : StringCellCaches maStringCells;
256 : ScOrcusGlobalSettings maGlobalSettings;
257 : ScOrcusSharedStrings maSharedStrings;
258 : boost::ptr_vector<ScOrcusSheet> maSheets;
259 : ScOrcusStyles maStyles;
260 :
261 : int mnProgress;
262 :
263 : com::sun::star::uno::Reference<com::sun::star::task::XStatusIndicator> mxStatusIndicator;
264 :
265 : public:
266 : ScOrcusFactory(ScDocument& rDoc);
267 :
268 : virtual orcus::spreadsheet::iface::import_sheet* append_sheet(const char *sheet_name, size_t sheet_name_length) SAL_OVERRIDE;
269 : virtual orcus::spreadsheet::iface::import_sheet* get_sheet(const char *sheet_name, size_t sheet_name_length) SAL_OVERRIDE;
270 : virtual orcus::spreadsheet::iface::import_sheet* get_sheet(orcus::spreadsheet::sheet_t sheet_index) SAL_OVERRIDE;
271 : virtual orcus::spreadsheet::iface::import_global_settings* get_global_settings() SAL_OVERRIDE;
272 : virtual orcus::spreadsheet::iface::import_shared_strings* get_shared_strings() SAL_OVERRIDE;
273 : virtual orcus::spreadsheet::iface::import_styles* get_styles() SAL_OVERRIDE;
274 : virtual void finalize() SAL_OVERRIDE;
275 :
276 : size_t appendString(const OUString& rStr);
277 : size_t addString(const OUString& rStr);
278 :
279 : void pushStringCell(const ScAddress& rPos, size_t nStrIndex);
280 :
281 : void incrementProgress();
282 :
283 : void setStatusIndicator(const com::sun::star::uno::Reference<com::sun::star::task::XStatusIndicator>& rIndicator);
284 : };
285 :
286 : #endif
287 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|