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 ORCUS_SPREADSHEET_TYPES_HPP
9 #define ORCUS_SPREADSHEET_TYPES_HPP
10 
11 #include "orcus/env.hpp"
12 #include <cstdlib>
13 #include <cstdint>
14 #include <iosfwd>
15 #include <initializer_list>
16 
17 // NB: This header should only use primitive data types and enums.
18 
19 namespace orcus { namespace spreadsheet {
20 
21 typedef int32_t row_t;
22 typedef int32_t col_t;
23 typedef int32_t sheet_t;
24 typedef uint8_t color_elem_t;
25 typedef uint16_t col_width_t;
26 typedef uint16_t row_height_t;
27 
28 typedef uint32_t pivot_cache_id_t;
29 
30 ORCUS_DLLPUBLIC col_width_t get_default_column_width();
31 ORCUS_DLLPUBLIC row_height_t get_default_row_height();
32 
33 enum class error_value_t
34 {
35     unknown = 0,
36     null,         // #NULL!
37     div0,         // #DIV/0!
38     value,        // #VALUE!
39     ref,          // #REF!
40     name,         // #NAME?
41     num,          // #NUM!
42     na            // #N/A!
43 };
44 
45 enum class border_direction_t
46 {
47     unknown = 0,
48     top,
49     bottom,
50     left,
51     right,
52     diagonal,
53     diagonal_bl_tr,
54     diagonal_tl_br
55 };
56 
57 enum class border_style_t
58 {
59     unknown = 0,
60     none,
61     solid,
62     dash_dot,
63     dash_dot_dot,
64     dashed,
65     dotted,
66     double_border,
67     hair,
68     medium,
69     medium_dash_dot,
70     medium_dash_dot_dot,
71     medium_dashed,
72     slant_dash_dot,
73     thick,
74     thin,
75     double_thin,
76     fine_dashed
77 };
78 
79 enum class fill_pattern_t
80 {
81     none = 0,
82     solid,
83     dark_down,
84     dark_gray,
85     dark_grid,
86     dark_horizontal,
87     dark_trellis,
88     dark_up,
89     dark_vertical,
90     gray_0625,
91     gray_125,
92     light_down,
93     light_gray,
94     light_grid,
95     light_horizontal,
96     light_trellis,
97     light_up,
98     light_vertical,
99     medium_gray
100 };
101 
102 enum class strikethrough_style_t
103 {
104     none = 0,
105     solid,
106     dash,
107     dot_dash,
108     dot_dot_dash,
109     dotted,
110     long_dash,
111     wave
112 };
113 
114 enum class strikethrough_type_t
115 {
116     unknown = 0,
117     none,
118     single,
119     double_type
120 };
121 
122 enum class strikethrough_width_t
123 {
124     unknown = 0,
125     width_auto,
126     thin,
127     medium,
128     thick,
129     bold
130 };
131 
132 enum class strikethrough_text_t
133 {
134     unknown = 0,
135     slash,
136     cross
137 };
138 
139 /**
140  * Type that specifies the grammar of a formula expression.  Each grammar
141  * may exhibit a different set of syntax rules.
142  */
143 enum class formula_grammar_t
144 {
145     /** Grammar type is either unknown or unspecified. */
146     unknown = 0,
147     /** Grammar used by the Excel 2003 XML (aka XML Spreadsheet) format. */
148     xls_xml,
149     /** Grammar used by the Office Open XML spreadsheet format. */
150     xlsx,
151     /** Grammar used by the OpenDocument Spreadsheet format. */
152     ods,
153     /** Grammar used by the Gnumeric XML format. */
154     gnumeric
155 };
156 
157 enum class formula_t
158 {
159     unknown = 0,
160     array,
161     data_table,
162     normal,
163     shared
164 };
165 
166 /**
167  * Formula reference context specifies the location where a formula
168  * expression is used.  This is used mainly for those document formats that
169  * make use of multiple formula reference syntaxes, such as ODS.
170  */
171 enum class formula_ref_context_t
172 {
173     /**
174      * Default context, that is, the context that is NOT any of the other
175      * contexts specified below.
176      */
177     global = 0,
178 
179     /** base cell position of either a named range or expression. */
180     named_expression_base,
181 
182     /**
183      * named range is a special case of named expression where the expression
184      * consists of only one range token.
185      */
186     named_range,
187 };
188 
189 /**
190  * Policy on how to handle a formula cell containing an expression that has
191  * not been successfully parsed.
192  */
193 enum class formula_error_policy_t
194 {
195     unknown,
196     /** loading of the document will be halted. */
197     fail,
198     /** the error cell will be skipped. */
199     skip
200 };
201 
202 enum class underline_t
203 {
204     none = 0,
205     single_line,
206     single_accounting, // unique to xlsx
207     double_line,
208     double_accounting, // unique to xlsx
209     dotted,
210     dash,
211     long_dash,
212     dot_dash,
213     dot_dot_dot_dash,
214     wave
215 };
216 
217 enum class underline_width_t
218 {
219     none = 0,
220     normal,
221     bold,
222     thin,
223     medium,
224     thick,
225     positive_integer,
226     percent,
227     positive_length
228 };
229 
230 enum class underline_mode_t
231 {
232     continuos = 0,
233     skip_white_space
234 };
235 
236 enum class underline_type_t
237 {
238     none = 0,
239     single,
240     double_type            //necessary to not call it "double", since it is a reserved word
241 };
242 
243 struct underline_attrs_t
244 {
245     underline_t underline_style;
246     underline_width_t underline_width;
247     underline_mode_t underline_mode;
248     underline_type_t underline_type;
249 };
250 
251 enum class hor_alignment_t
252 {
253     unknown = 0,
254     left,
255     center,
256     right,
257     justified,
258     distributed,
259     filled
260 };
261 
262 enum class ver_alignment_t
263 {
264     unknown = 0,
265     top,
266     middle,
267     bottom,
268     justified,
269     distributed
270 };
271 
272 /**
273  * Type of data table.  A data table can be either of a single-variable
274  * column, a single-variable row, or a double-variable type that uses both
275  * column and row input cells.
276  */
277 enum class data_table_type_t
278 {
279     column,
280     row,
281     both
282 };
283 
284 /**
285  * Function type used in the totals row of a table.
286  */
287 enum class totals_row_function_t
288 {
289     none = 0,
290     sum,
291     minimum,
292     maximum,
293     average,
294     count,
295     count_numbers,
296     standard_deviation,
297     variance,
298     custom
299 };
300 
301 enum class conditional_format_t
302 {
303     unknown = 0,
304     condition,
305     date,
306     formula,
307     colorscale,
308     databar,
309     iconset
310 };
311 
312 enum class condition_operator_t
313 {
314     unknown = 0,
315     equal,
316     less,
317     greater,
318     greater_equal,
319     less_equal,
320     not_equal,
321     between,
322     not_between,
323     duplicate,
324     unique,
325     top_n,
326     bottom_n,
327     above_average,
328     below_average,
329     above_equal_average,
330     below_equal_average,
331     contains_error,
332     contains_no_error,
333     begins_with,
334     ends_with,
335     contains,
336     contains_blanks,
337     not_contains,
338     expression
339 };
340 
341 enum class condition_type_t
342 {
343     unknown = 0,
344     value,
345     automatic,
346     max,
347     min,
348     formula,
349     percent,
350     percentile
351 };
352 
353 enum class condition_date_t
354 {
355     unknown = 0,
356     today,
357     yesterday,
358     tomorrow,
359     last_7_days,
360     this_week,
361     next_week,
362     last_week,
363     this_month,
364     next_month,
365     last_month,
366     this_year,
367     next_year,
368     last_year,
369 };
370 
371 enum class databar_axis_t
372 {
373     none = 0,
374     middle,
375     automatic
376 };
377 
378 enum class pivot_cache_group_by_t
379 {
380     unknown = 0,
381     days,     // grouping on "days" for date values.
382     hours,    // grouping on "hours" for date values.
383     minutes,  // grouping on "minutes" for date values.
384     months,   // grouping on "months" for date values.
385     quarters, // grouping on "quarters" for date values.
386     range,    // grouping by numeric ranges for numeric values.
387     seconds,  // grouping on "seconds" for date values.
388     years     // grouping on "years" for date values.
389 };
390 
391 struct address_t
392 {
393     row_t row;
394     col_t column;
395 };
396 
397 struct range_size_t
398 {
399     row_t rows;
400     col_t columns;
401 };
402 
403 struct range_t
404 {
405     address_t first;
406     address_t last;
407 };
408 
409 /**
410  * Stores 3-dimensional cell address.  The 'src' stands for
411  * sheet-row-column.
412  */
413 struct src_address_t
414 {
415     sheet_t sheet;
416     row_t row;
417     col_t column;
418 };
419 
420 /**
421  * Stores 3-dimensional range address.  The 'src' stands for
422  * sheet-row-column.
423  */
424 struct src_range_t
425 {
426     src_address_t first;
427     src_address_t last;
428 };
429 
430 ORCUS_DLLPUBLIC address_t to_rc_address(const src_address_t& r);
431 ORCUS_DLLPUBLIC range_t to_rc_range(const src_range_t& r);
432 
433 ORCUS_DLLPUBLIC bool operator== (const address_t& left, const address_t& right);
434 ORCUS_DLLPUBLIC bool operator!= (const address_t& left, const address_t& right);
435 
436 ORCUS_DLLPUBLIC bool operator== (const src_address_t& left, const src_address_t& right);
437 ORCUS_DLLPUBLIC bool operator!= (const src_address_t& left, const src_address_t& right);
438 
439 ORCUS_DLLPUBLIC bool operator== (const range_t& left, const range_t& right);
440 ORCUS_DLLPUBLIC bool operator!= (const range_t& left, const range_t& right);
441 
442 ORCUS_DLLPUBLIC bool operator== (const src_range_t& left, const src_range_t& right);
443 ORCUS_DLLPUBLIC bool operator!= (const src_range_t& left, const src_range_t& right);
444 
445 ORCUS_DLLPUBLIC bool operator< (const range_t& left, const range_t& right);
446 ORCUS_DLLPUBLIC bool operator> (const range_t& left, const range_t& right);
447 
448 ORCUS_DLLPUBLIC range_t& operator+= (range_t& left, const address_t& right);
449 ORCUS_DLLPUBLIC range_t& operator-= (range_t& left, const address_t& right);
450 
451 ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const address_t& v);
452 ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const src_address_t& v);
453 ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const range_t& v);
454 
455 struct ORCUS_DLLPUBLIC color_rgb_t
456 {
457     color_elem_t red;
458     color_elem_t green;
459     color_elem_t blue;
460 
461     color_rgb_t();
462     color_rgb_t(std::initializer_list<color_elem_t> vs);
463     color_rgb_t(const color_rgb_t& other);
464     color_rgb_t(color_rgb_t&& other);
465 
466     color_rgb_t& operator= (const color_rgb_t& other);
467 };
468 
469 /**
470  * Convert a string representation of a totals row function name to its
471  * equivalent enum value.
472  *
473  * @param p pointer to the string buffer.
474  * @param n size of the string buffer.
475  *
476  * @return enum value representing the totals row function.
477  */
478 ORCUS_DLLPUBLIC totals_row_function_t to_totals_row_function_enum(const char* p, size_t n);
479 
480 /**
481  * Convert a string representation of a pivot cache group-by type to its
482  * equivalent enum value.
483  *
484  * @param p pointer to the string buffer.
485  * @param n size of the string buffer.
486  *
487  * @return enum value representing the pivot cache group-by type.
488  */
489 ORCUS_DLLPUBLIC pivot_cache_group_by_t to_pivot_cache_group_by_enum(const char* p, size_t n);
490 
491 /**
492  * Convert a string representation of a error value to its equivalent enum
493  * value.
494  *
495  * @param p pointer to the string buffer.
496  * @param n size of the string buffer.
497  *
498  * @return enum value representing the error value.
499  */
500 ORCUS_DLLPUBLIC error_value_t to_error_value_enum(const char* p, size_t n);
501 
502 /**
503  * Convert a string representation of a RGB value to an equivalent struct
504  * value.  The string representation is expected to be a 6 digit hexadecimal
505  * value string that may or may not be prefixed with a '#'.
506  *
507  * @param p pointer to the string buffer that stores the string
508  *          representation of the RGB value.
509  * @param n length of the buffer.
510  *
511  * @return struct value representing an RGB value.
512  */
513 ORCUS_DLLPUBLIC color_rgb_t to_color_rgb(const char* p, size_t n);
514 
515 /**
516  * Convert a color name to an RGB value.  It supports SVG 1.0 color keyword
517  * names minus those gray colors with 'grey' spelling variants.  Note that
518  * the name must be all in lowercase.
519  *
520  * @param p pointer to the string buffer that stores the color name.
521  * @param n length of the buffer.
522  *
523  * @return struct value representing an RGB value.
524  */
525 ORCUS_DLLPUBLIC color_rgb_t to_color_rgb_from_name(const char* p, size_t n);
526 
527 /**
528  * Convert a formula error policy name to its enum value equivalent.
529  *
530  * @param p pointer to the string buffer that stores the policy name.
531  * @param n length of the buffer.
532  *
533  * @return enum value equivalent for the original error policy name.
534  */
535 ORCUS_DLLPUBLIC formula_error_policy_t to_formula_error_policy(const char* p, size_t n);
536 
537 ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, error_value_t ev);
538 ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, formula_grammar_t grammar);
539 ORCUS_DLLPUBLIC std::ostream& operator<< (std::ostream& os, const color_rgb_t& color);
540 
541 }}
542 
543 #endif
544 
545 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
546