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 : #include "orcusinterface.hxx"
11 :
12 : #include "document.hxx"
13 : #include "cell.hxx"
14 : #include "rangenam.hxx"
15 : #include "tokenarray.hxx"
16 : #include <formula/token.hxx>
17 :
18 :
19 : using orcus::spreadsheet::row_t;
20 : using orcus::spreadsheet::col_t;
21 : using orcus::spreadsheet::formula_grammar_t;
22 :
23 0 : ScOrcusFactory::ScOrcusFactory(ScDocument& rDoc) : mrDoc(rDoc) {}
24 :
25 0 : orcus::spreadsheet::iface::import_sheet* ScOrcusFactory::append_sheet(const char* sheet_name, size_t sheet_name_length)
26 : {
27 0 : OUString aTabName(sheet_name, sheet_name_length, RTL_TEXTENCODING_UTF8);
28 0 : if (!mrDoc.InsertTab(SC_TAB_APPEND, aTabName))
29 0 : return NULL;
30 :
31 0 : SCTAB nTab = mrDoc.GetTableCount() - 1;
32 0 : maSheets.push_back(new ScOrcusSheet(mrDoc, nTab, maSharedStrings));
33 0 : return &maSheets.back();
34 : }
35 :
36 : class FindSheetByIndex : std::unary_function<ScOrcusSheet, bool>
37 : {
38 : SCTAB mnTab;
39 : public:
40 0 : FindSheetByIndex(SCTAB nTab) : mnTab(nTab) {}
41 0 : bool operator() (const ScOrcusSheet& rSheet) const
42 : {
43 0 : return rSheet.getIndex() == mnTab;
44 : }
45 : };
46 :
47 0 : orcus::spreadsheet::iface::import_sheet* ScOrcusFactory::get_sheet(const char* sheet_name, size_t sheet_name_length)
48 : {
49 0 : OUString aTabName(sheet_name, sheet_name_length, RTL_TEXTENCODING_UTF8);
50 0 : SCTAB nTab = -1;
51 0 : if (!mrDoc.GetTable(aTabName, nTab))
52 : // Sheet by that name not found.
53 0 : return NULL;
54 :
55 : // See if we already have an orcus sheet instance by that index.
56 : boost::ptr_vector<ScOrcusSheet>::iterator it =
57 0 : std::find_if(maSheets.begin(), maSheets.end(), FindSheetByIndex(nTab));
58 :
59 0 : if (it != maSheets.end())
60 : // We already have one. Return it.
61 0 : return &(*it);
62 :
63 : // Create a new orcus sheet instance for this.
64 0 : maSheets.push_back(new ScOrcusSheet(mrDoc, nTab, maSharedStrings));
65 0 : return &maSheets.back();
66 : }
67 :
68 0 : orcus::spreadsheet::iface::import_shared_strings* ScOrcusFactory::get_shared_strings()
69 : {
70 0 : return &maSharedStrings;
71 : }
72 :
73 0 : orcus::spreadsheet::iface::import_styles* ScOrcusFactory::get_styles()
74 : {
75 : // We don't support it yet.
76 0 : return new ScOrcusStyles;
77 : }
78 :
79 0 : ScOrcusSheet::ScOrcusSheet(ScDocument& rDoc, SCTAB nTab, ScOrcusSharedStrings& rSharedStrings) :
80 0 : mrDoc(rDoc), mnTab(nTab), mrSharedStrings(rSharedStrings) {}
81 :
82 0 : void ScOrcusSheet::set_auto(row_t row, col_t col, const char* p, size_t n)
83 : {
84 0 : OUString aVal(p, n, RTL_TEXTENCODING_UTF8);
85 0 : mrDoc.SetString(col, row, mnTab, aVal);
86 0 : }
87 :
88 0 : void ScOrcusSheet::set_format(row_t /*row*/, col_t /*col*/, size_t /*xf_index*/)
89 : {
90 0 : }
91 :
92 : namespace {
93 :
94 0 : formula::FormulaGrammar::Grammar getCalcGrammarFromOrcus( formula_grammar_t grammar )
95 : {
96 0 : formula::FormulaGrammar::Grammar eGrammar = formula::FormulaGrammar::GRAM_ODFF;
97 0 : switch(grammar)
98 : {
99 : case orcus::spreadsheet::ods:
100 0 : eGrammar = formula::FormulaGrammar::GRAM_ODFF;
101 0 : break;
102 : case orcus::spreadsheet::xlsx_2007:
103 : case orcus::spreadsheet::xlsx_2010:
104 0 : eGrammar = formula::FormulaGrammar::GRAM_ENGLISH_XL_A1;
105 0 : break;
106 : case orcus::spreadsheet::gnumeric:
107 0 : eGrammar = formula::FormulaGrammar::GRAM_ENGLISH_XL_A1;
108 0 : break;
109 : }
110 :
111 0 : return eGrammar;
112 : }
113 :
114 : }
115 :
116 0 : void ScOrcusSheet::set_formula(
117 : row_t row, col_t col, formula_grammar_t grammar, const char* p, size_t n)
118 : {
119 0 : OUString aFormula(p, n, RTL_TEXTENCODING_UTF8);
120 0 : formula::FormulaGrammar::Grammar eGrammar = getCalcGrammarFromOrcus( grammar );
121 :
122 0 : ScFormulaCell* pCell = new ScFormulaCell(&mrDoc, ScAddress(col, row, mnTab), aFormula, eGrammar);
123 0 : mrDoc.PutCell(col, row, mnTab, pCell);
124 0 : }
125 :
126 0 : void ScOrcusSheet::set_formula_result(row_t row, col_t col, const char* p, size_t n)
127 : {
128 : ScBaseCell* pCell;
129 0 : mrDoc.GetCell( col, row, mnTab, pCell );
130 0 : if(!pCell || pCell->GetCellType() != CELLTYPE_FORMULA)
131 : {
132 : SAL_WARN("sc", "trying to set formula result for non formula \
133 : cell! Col: " << col << ";Row: " << row << ";Tab: " << mnTab);
134 0 : return;
135 : }
136 0 : OUString aResult( p, n, RTL_TEXTENCODING_UTF8);
137 0 : static_cast<ScFormulaCell*>(pCell)->SetHybridString(aResult);
138 : }
139 :
140 0 : void ScOrcusSheet::set_shared_formula(
141 : row_t row, col_t col, formula_grammar_t grammar, size_t sindex,
142 : const char* p_formula, size_t n_formula)
143 : {
144 0 : OUString aFormula( p_formula, n_formula, RTL_TEXTENCODING_UTF8 );
145 0 : formula::FormulaGrammar::Grammar eGrammar = getCalcGrammarFromOrcus( grammar );
146 0 : ScRangeName* pRangeName = mrDoc.GetRangeName();
147 :
148 0 : OUString aName("shared_");
149 0 : aName += OUString::valueOf(sal_Int32(pRangeName->size()));
150 0 : ScRangeData* pSharedFormula = new ScRangeData( &mrDoc, aName, aFormula, ScAddress(col, row, mnTab), RT_SHARED, eGrammar);
151 0 : if(pRangeName->insert(pSharedFormula))
152 : {
153 0 : maSharedFormulas.insert( std::pair<size_t, ScRangeData*>(sindex, pSharedFormula) );
154 0 : ScTokenArray aArr;
155 0 : aArr.AddToken( formula::FormulaIndexToken( ocName, pSharedFormula->GetIndex() ) );
156 0 : ScFormulaCell* pCell = new ScFormulaCell( &mrDoc, ScAddress( row, col, mnTab ), &aArr );
157 0 : mrDoc.PutCell( col, row, mnTab, pCell );
158 0 : }
159 0 : }
160 :
161 0 : void ScOrcusSheet::set_shared_formula(
162 : row_t row, col_t col, formula_grammar_t grammar, size_t sindex,
163 : const char* p_formula, size_t n_formula, const char* /*p_range*/, size_t /*n_range*/)
164 : {
165 0 : OUString aFormula( p_formula, n_formula, RTL_TEXTENCODING_UTF8 );
166 0 : formula::FormulaGrammar::Grammar eGrammar = getCalcGrammarFromOrcus( grammar );
167 0 : ScRangeName* pRangeName = mrDoc.GetRangeName();
168 :
169 0 : OUString aName("shared_");
170 0 : aName += OUString::valueOf(sal_Int32(pRangeName->size()));
171 0 : ScRangeData* pSharedFormula = new ScRangeData( &mrDoc, aName, aFormula, ScAddress(col, row, mnTab), RT_SHARED, eGrammar);
172 0 : if(pRangeName->insert(pSharedFormula))
173 : {
174 0 : maSharedFormulas.insert( std::pair<size_t, ScRangeData*>(sindex, pSharedFormula) );
175 0 : ScTokenArray aArr;
176 0 : aArr.AddToken( formula::FormulaIndexToken( ocName, pSharedFormula->GetIndex() ) );
177 0 : ScFormulaCell* pCell = new ScFormulaCell( &mrDoc, ScAddress( row, col, mnTab ), &aArr );
178 0 : mrDoc.PutCell( col, row, mnTab, pCell );
179 0 : }
180 0 : }
181 :
182 0 : void ScOrcusSheet::set_shared_formula(row_t row, col_t col, size_t sindex)
183 : {
184 0 : if(maSharedFormulas.find(sindex) == maSharedFormulas.end())
185 0 : return;
186 :
187 0 : ScRangeData* pSharedFormula = maSharedFormulas.find(sindex)->second;
188 0 : ScTokenArray aArr;
189 0 : aArr.AddToken( formula::FormulaIndexToken( ocName, pSharedFormula->GetIndex() ) );
190 0 : ScFormulaCell* pCell = new ScFormulaCell( &mrDoc, ScAddress( row, col, mnTab ), &aArr );
191 0 : mrDoc.PutCell( col, row, mnTab, pCell );
192 : }
193 :
194 0 : void ScOrcusSheet::set_string(row_t row, col_t col, size_t sindex)
195 : {
196 : // Calc does not yet support shared strings so we have to
197 : // workaround by importing shared strings into a temporary
198 : // shared string container and writing into calc model as
199 : // normal string
200 :
201 0 : const OUString& rSharedString = mrSharedStrings.getByIndex(sindex);
202 0 : ScBaseCell* pCell = ScBaseCell::CreateTextCell( rSharedString, &mrDoc );
203 0 : mrDoc.PutCell(col, row, mnTab, pCell);
204 0 : }
205 :
206 0 : void ScOrcusSheet::set_value(row_t row, col_t col, double value)
207 : {
208 0 : mrDoc.SetValue( col, row, mnTab, value );
209 0 : }
210 :
211 0 : size_t ScOrcusSharedStrings::append(const char* s, size_t n)
212 : {
213 0 : OUString aNewString(s, n, RTL_TEXTENCODING_UTF8);
214 0 : maSharedStrings.push_back(aNewString);
215 :
216 0 : return maSharedStrings.size() - 1;
217 : }
218 :
219 0 : size_t ScOrcusSharedStrings::add(const char* s, size_t n)
220 : {
221 0 : OUString aNewString(s, n, RTL_TEXTENCODING_UTF8);
222 0 : maSharedStrings.push_back(aNewString);
223 :
224 0 : return maSharedStrings.size() - 1;
225 : }
226 :
227 0 : const OUString& ScOrcusSharedStrings::getByIndex(size_t nIndex) const
228 : {
229 0 : if(nIndex < maSharedStrings.size())
230 0 : return maSharedStrings[nIndex];
231 :
232 0 : throw std::exception();
233 : }
234 :
235 0 : void ScOrcusSharedStrings::set_segment_bold(bool /*b*/)
236 : {
237 0 : }
238 0 : void ScOrcusSharedStrings::set_segment_italic(bool /*b*/)
239 : {
240 0 : }
241 0 : void ScOrcusSharedStrings::set_segment_font_name(const char* /*s*/, size_t /*n*/)
242 : {
243 0 : }
244 0 : void ScOrcusSharedStrings::set_segment_font_size(double /*point*/)
245 : {
246 0 : }
247 0 : void ScOrcusSharedStrings::append_segment(const char* /*s*/, size_t /*n*/)
248 : {
249 0 : }
250 :
251 0 : size_t ScOrcusSharedStrings::commit_segments()
252 : {
253 0 : return 0;
254 : }
255 :
256 0 : void ScOrcusStyles::set_font_count(size_t /*n*/)
257 : {
258 : // needed at all?
259 0 : }
260 :
261 0 : void ScOrcusStyles::set_font_bold(bool /*b*/)
262 : {
263 0 : }
264 :
265 0 : void ScOrcusStyles::set_font_italic(bool /*b*/)
266 : {
267 0 : }
268 :
269 0 : void ScOrcusStyles::set_font_name(const char* /*s*/, size_t /*n*/)
270 : {
271 0 : }
272 :
273 0 : void ScOrcusStyles::set_font_size(double /*point*/)
274 : {
275 0 : }
276 :
277 0 : void ScOrcusStyles::set_font_underline(orcus::spreadsheet::underline_t /*e*/)
278 : {
279 0 : }
280 :
281 0 : size_t ScOrcusStyles::commit_font()
282 : {
283 0 : return 0;
284 : }
285 :
286 :
287 : // fill
288 :
289 0 : void ScOrcusStyles::set_fill_count(size_t /*n*/)
290 : {
291 : // needed at all?
292 0 : }
293 :
294 0 : void ScOrcusStyles::set_fill_pattern_type(const char* /*s*/, size_t /*n*/)
295 : {
296 0 : }
297 :
298 0 : void ScOrcusStyles::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*/)
299 : {
300 0 : }
301 :
302 0 : void ScOrcusStyles::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*/)
303 : {
304 0 : }
305 :
306 0 : size_t ScOrcusStyles::commit_fill()
307 : {
308 0 : return 0;
309 : }
310 :
311 :
312 : // border
313 :
314 0 : void ScOrcusStyles::set_border_count(size_t /*n*/)
315 : {
316 : // needed at all?
317 0 : }
318 :
319 0 : void ScOrcusStyles::set_border_style(orcus::spreadsheet::border_direction_t /*dir*/, const char* /*s*/, size_t /*n*/)
320 : {
321 : // implement later
322 0 : }
323 :
324 0 : size_t ScOrcusStyles::commit_border()
325 : {
326 0 : return 0;
327 : }
328 :
329 :
330 : // cell protection
331 0 : void ScOrcusStyles::set_cell_hidden(bool /*b*/)
332 : {
333 0 : }
334 :
335 0 : void ScOrcusStyles::set_cell_locked(bool /*b*/)
336 : {
337 0 : }
338 :
339 0 : size_t ScOrcusStyles::commit_cell_protection()
340 : {
341 0 : return 0;
342 : }
343 :
344 :
345 : // cell style xf
346 :
347 0 : void ScOrcusStyles::set_cell_style_xf_count(size_t /*n*/)
348 : {
349 : // needed at all?
350 0 : }
351 :
352 0 : size_t ScOrcusStyles::commit_cell_style_xf()
353 : {
354 0 : return 0;
355 : }
356 :
357 :
358 : // cell xf
359 :
360 0 : void ScOrcusStyles::set_cell_xf_count(size_t /*n*/)
361 : {
362 : // needed at all?
363 0 : }
364 :
365 0 : size_t ScOrcusStyles::commit_cell_xf()
366 : {
367 0 : return 0;
368 : }
369 :
370 :
371 : // xf (cell format) - used both by cell xf and cell style xf.
372 :
373 0 : void ScOrcusStyles::set_xf_number_format(size_t /*index*/)
374 : {
375 : // no number format interfaces implemented yet
376 0 : }
377 :
378 0 : void ScOrcusStyles::set_xf_font(size_t /*index*/)
379 : {
380 0 : }
381 :
382 0 : void ScOrcusStyles::set_xf_fill(size_t /*index*/)
383 : {
384 0 : }
385 :
386 0 : void ScOrcusStyles::set_xf_border(size_t /*index*/)
387 : {
388 0 : }
389 :
390 0 : void ScOrcusStyles::set_xf_protection(size_t /*index*/)
391 : {
392 0 : }
393 :
394 0 : void ScOrcusStyles::set_xf_style_xf(size_t /*index*/)
395 : {
396 0 : }
397 :
398 :
399 : // cell style entry
400 : // not needed for now for gnumeric
401 :
402 0 : void ScOrcusStyles::set_cell_style_count(size_t /*n*/)
403 : {
404 : // needed at all?
405 0 : }
406 :
407 0 : void ScOrcusStyles::set_cell_style_name(const char* /*s*/, size_t /*n*/)
408 : {
409 0 : }
410 :
411 0 : void ScOrcusStyles::set_cell_style_xf(size_t /*index*/)
412 : {
413 0 : }
414 :
415 0 : void ScOrcusStyles::set_cell_style_builtin(size_t /*index*/)
416 : {
417 : // not needed for gnumeric
418 0 : }
419 :
420 0 : size_t ScOrcusStyles::commit_cell_style()
421 : {
422 0 : return 0;
423 : }
424 :
425 :
426 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|