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