1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
6  */
7 
8 #ifndef INCLUDED_ORCUS_SPREADSHEET_FACTORY_SHEET_HPP
9 #define INCLUDED_ORCUS_SPREADSHEET_FACTORY_SHEET_HPP
10 
11 #include "orcus/spreadsheet/import_interface.hpp"
12 #include "orcus/spreadsheet/import_interface_view.hpp"
13 #include "orcus/spreadsheet/auto_filter.hpp"
14 
15 #include "orcus/spreadsheet/export_interface.hpp"
16 
17 #include "factory_table.hpp"
18 #include "shared_formula.hpp"
19 
20 #include <memory>
21 #include <ixion/formula_name_resolver.hpp>
22 #include <ixion/formula_result.hpp>
23 #include <boost/optional.hpp>
24 
25 namespace orcus {
26 
27 class string_pool;
28 
29 namespace spreadsheet {
30 
31 class document;
32 class sheet_view;
33 class sheet;
34 class import_sheet_view;
35 
36 class import_sheet_named_exp : public iface::import_named_expression
37 {
38     document& m_doc;
39     sheet_t m_sheet_index;
40     pstring m_name;
41     ixion::abs_address_t m_base;
42     ixion::formula_tokens_t m_tokens;
43 
44     void define(const char* p_name, size_t n_name, const char* p_exp, size_t n_exp, formula_ref_context_t ref_cxt);
45 
46 public:
47     import_sheet_named_exp(document& doc, sheet_t sheet_index);
48     virtual ~import_sheet_named_exp() override;
49 
50     virtual void set_base_position(const src_address_t& pos) override;
51     virtual void set_named_expression(const char* p_name, size_t n_name, const char* p_exp, size_t n_exp) override;
52     virtual void set_named_range(const char* p_name, size_t n_name, const char* p_range, size_t n_range) override;
53     virtual void commit();
54 };
55 
56 /**
57  * Implement the sheet properties import interface, but the actual
58  * properties are stored in sheet.
59  */
60 class import_sheet_properties : public iface::import_sheet_properties
61 {
62     document& m_doc;
63     sheet& m_sheet;
64 public:
65     import_sheet_properties(document& doc, sheet& sh);
66     ~import_sheet_properties();
67 
68     virtual void set_column_width(col_t col, double width, orcus::length_unit_t unit);
69     virtual void set_column_hidden(col_t col, bool hidden);
70     virtual void set_row_height(row_t row, double height, orcus::length_unit_t unit);
71     virtual void set_row_hidden(row_t row, bool hidden);
72     virtual void set_merge_cell_range(const range_t& range);
73 };
74 
75 class import_data_table : public iface::import_data_table
76 {
77     sheet& m_sheet;
78 public:
79     import_data_table(sheet& sh);
80     ~import_data_table();
81 
82     void reset();
83 
84     virtual void set_type(data_table_type_t type) override;
85 
86     virtual void set_range(const range_t& range) override;
87 
88     virtual void set_first_reference(const char* p_ref, size_t n_ref, bool deleted) override;
89 
90     virtual void set_second_reference(const char* p_ref, size_t n_ref, bool deleted) override;
91 
92     virtual void commit() override;
93 };
94 
95 class import_auto_filter : public orcus::spreadsheet::iface::import_auto_filter
96 {
97     sheet& m_sheet;
98     string_pool& m_string_pool;
99     std::unique_ptr<auto_filter_t> mp_data;
100     col_t m_cur_col;
101     auto_filter_column_t m_cur_col_data;
102 
103 public:
104     import_auto_filter(sheet& sh, string_pool& sp);
105 
106     void reset();
107 
108     virtual void set_range(const range_t& range) override;
109 
110     virtual void set_column(col_t col) override;
111 
112     virtual void append_column_match_value(const char* p, size_t n) override;
113 
114     virtual void commit_column() override;
115 
116     virtual void commit() override;
117 };
118 
119 class import_array_formula : public iface::import_array_formula
120 {
121     document& m_doc;
122     sheet& m_sheet;
123 
124     range_t m_range;
125     ixion::formula_tokens_t m_tokens;
126     boost::optional<ixion::formula_result> m_result;
127     formula_error_policy_t m_error_policy;
128 
129 public:
130     import_array_formula(document& doc, sheet& sheet);
131     virtual ~import_array_formula() override;
132 
133     virtual void set_range(const range_t& range) override;
134 
135     virtual void set_formula(formula_grammar_t grammar, const char* p, size_t n) override;
136 
137     virtual void set_result_value(row_t row, col_t col, double value) override;
138 
139     virtual void set_result_string(row_t row, col_t col, size_t sindex) override;
140 
141     virtual void set_result_empty(row_t row, col_t col) override;
142 
143     virtual void set_result_bool(row_t row, col_t col, bool value) override;
144 
145     virtual void commit() override;
146 
147     void set_missing_formula_result(ixion::formula_result result);
148 
149     void set_formula_error_policy(formula_error_policy_t policy);
150 
151     void reset();
152 };
153 
154 class import_formula : public iface::import_formula
155 {
156     document& m_doc;
157     sheet& m_sheet;
158     shared_formula_pool& m_shared_formula_pool;
159 
160     row_t m_row;
161     col_t m_col;
162     size_t m_shared_index;
163     bool m_shared;
164 
165     ixion::formula_tokens_store_ptr_t m_tokens_store;
166     boost::optional<ixion::formula_result> m_result;
167     formula_error_policy_t m_error_policy;
168 
169 public:
170     import_formula(document& doc, sheet& sheet, shared_formula_pool& pool);
171     virtual ~import_formula() override;
172 
173     virtual void set_position(row_t row, col_t col) override;
174     virtual void set_formula(formula_grammar_t grammar, const char* p, size_t n) override;
175     virtual void set_shared_formula_index(size_t index) override;
176     virtual void set_result_value(double value) override;
177     virtual void set_result_string(size_t sindex) override;
178     virtual void set_result_empty() override;
179     virtual void set_result_bool(bool value) override;
180     virtual void commit() override;
181 
182     void set_missing_formula_result(ixion::formula_result result);
183     void set_formula_error_policy(formula_error_policy_t policy);
184 
185     void reset();
186 };
187 
188 class import_sheet : public iface::import_sheet
189 {
190     document& m_doc;
191     sheet& m_sheet;
192     shared_formula_pool m_shared_formula_pool;
193     import_formula m_formula;
194     import_array_formula m_array_formula;
195     import_sheet_named_exp m_named_exp;
196     import_sheet_properties m_sheet_properties;
197     import_data_table m_data_table;
198     import_auto_filter m_auto_filter;
199     import_table m_table;
200     character_set_t m_charset;
201 
202     std::unique_ptr<import_sheet_view> m_sheet_view;
203 
204     bool m_fill_missing_formula_results;
205 
206 public:
207     import_sheet(document& doc, sheet& sh, sheet_view* view);
208     virtual ~import_sheet() override;
209 
210     virtual iface::import_sheet_view* get_sheet_view() override;
211     virtual iface::import_auto_filter* get_auto_filter() override;
212     virtual iface::import_conditional_format* get_conditional_format() override;
213     virtual iface::import_data_table* get_data_table() override;
214     virtual iface::import_named_expression* get_named_expression() override;
215     virtual iface::import_sheet_properties* get_sheet_properties() override;
216     virtual iface::import_table* get_table() override;
217     virtual iface::import_formula* get_formula() override;
218     virtual iface::import_array_formula* get_array_formula() override;
219     virtual void set_auto(row_t row, col_t col, const char* p, size_t n) override;
220     virtual void set_bool(row_t row, col_t col, bool value) override;
221     virtual void set_date_time(row_t row, col_t col, int year, int month, int day, int hour, int minute, double second) override;
222     virtual void set_format(row_t row, col_t col, size_t xf_index) override;
223     virtual void set_format(row_t row_start, col_t col_start, row_t row_end, col_t col_end, size_t xf_index) override;
224     virtual void set_string(row_t row, col_t col, size_t sindex) override;
225     virtual void set_value(row_t row, col_t col, double value) override;
226     virtual void fill_down_cells(row_t src_row, col_t src_col, row_t range_size) override;
227     virtual range_size_t get_sheet_size() const override;
228 
229     void set_character_set(character_set_t charset);
230     void set_fill_missing_formula_results(bool b);
231     void set_formula_error_policy(formula_error_policy_t policy);
232 };
233 
234 class import_sheet_view : public iface::import_sheet_view
235 {
236     sheet_view& m_view;
237     sheet_t m_sheet_index;
238 public:
239     import_sheet_view(sheet_view& view, sheet_t si);
240     virtual ~import_sheet_view();
241     virtual void set_sheet_active() override;
242 
243     virtual void set_split_pane(
244         double hor_split, double ver_split,
245         const address_t& top_left_cell,
246         sheet_pane_t active_pane) override;
247 
248     virtual void set_frozen_pane(
249         col_t visible_columns, row_t visible_rows,
250         const address_t& top_left_cell,
251         sheet_pane_t active_pane) override;
252 
253     virtual void set_selected_range(sheet_pane_t pane, range_t range) override;
254 };
255 
256 class export_sheet : public iface::export_sheet
257 {
258     const document& m_doc;
259     const sheet& m_sheet;
260 public:
261     export_sheet(const document& doc, const sheet& sh);
262     ~export_sheet();
263 
264     virtual void write_string(std::ostream& os, row_t row, col_t col) const override;
265 };
266 
267 }}
268 
269 #endif
270 
271 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
272