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