From 77d03d03c46bee91c25001e030772ad70dc316c9 Mon Sep 17 00:00:00 2001 From: Jaskaran Singh Date: Thu, 14 Jul 2016 18:05:04 +0530 Subject: [PATCH 1/4] Re-implement Interface for importing border width --- include/orcus/spreadsheet/import_interface.hpp | 2 +- include/orcus/spreadsheet/styles.hpp | 2 +- src/liborcus/odf_styles_context.cpp | 2 +- src/spreadsheet/styles.cpp | 7 +++++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/include/orcus/spreadsheet/import_interface.hpp b/include/orcus/spreadsheet/import_interface.hpp index ff833fccb..ed67859dc 100644 --- a/include/orcus/spreadsheet/import_interface.hpp +++ b/include/orcus/spreadsheet/import_interface.hpp @@ -114,7 +114,7 @@ public: virtual void set_border_style(orcus::spreadsheet::border_direction_t dir, border_style_t style) = 0; virtual void set_border_color( orcus::spreadsheet::border_direction_t dir, color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue) = 0; - virtual void set_border_width(border_direction_t dir, length_t width) = 0; + virtual void set_border_width(border_direction_t dir, double width, orcus::length_unit_t unit) = 0; virtual size_t commit_border() = 0; // cell protection diff --git a/include/orcus/spreadsheet/styles.hpp b/include/orcus/spreadsheet/styles.hpp index de3e96b55..f6a9de873 100644 --- a/include/orcus/spreadsheet/styles.hpp +++ b/include/orcus/spreadsheet/styles.hpp @@ -171,7 +171,7 @@ public: virtual void set_border_style(border_direction_t dir, border_style_t style); virtual void set_border_color( border_direction_t dir, color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue); - virtual void set_border_width(border_direction_t dir,length_t length); + virtual void set_border_width(border_direction_t dir, double width, orcus::length_unit_t unit); virtual size_t commit_border(); virtual void set_cell_hidden(bool b); diff --git a/src/liborcus/odf_styles_context.cpp b/src/liborcus/odf_styles_context.cpp index 415ccfc47..2260e6d26 100644 --- a/src/liborcus/odf_styles_context.cpp +++ b/src/liborcus/odf_styles_context.cpp @@ -618,7 +618,7 @@ void styles_context::start_element(xmlns_id_t ns, xml_token_t name, const std::v { mp_styles->set_border_color(itr->first, 0, itr->second.red, itr->second.green, itr->second.blue); mp_styles->set_border_style(itr->first, itr->second.border_style); - mp_styles->set_border_width(itr->first, itr->second.border_width); + mp_styles->set_border_width(itr->first, itr->second.border_width.value, itr->second.border_width.unit); } } diff --git a/src/spreadsheet/styles.cpp b/src/spreadsheet/styles.cpp index 6f2397276..90ecef942 100644 --- a/src/spreadsheet/styles.cpp +++ b/src/spreadsheet/styles.cpp @@ -283,11 +283,14 @@ void import_styles::set_border_color( p->border_color = color_t(alpha, red, green, blue); } -void import_styles::set_border_width(border_direction_t dir, length_t width) +void import_styles::set_border_width(border_direction_t dir, double width, orcus::length_unit_t unit) { border_attrs_t* p = get_border_attrs(m_cur_border, dir); if (p) - p->border_width = width; + { + p->border_width.value = width; + p->border_width.unit = unit; + } } size_t import_styles::commit_border() -- GitLab From 784593d4e69ca0829bbaaa21335810cc7f135465 Mon Sep 17 00:00:00 2001 From: Jaskaran Singh Date: Fri, 15 Jul 2016 14:51:53 +0530 Subject: [PATCH 2/4] Remove un-neccessary entries for odf border style --- include/orcus/spreadsheet/types.hpp | 4 +++- src/liborcus/odf_helper.cpp | 11 ++--------- src/liborcus/odf_styles_context_test.cpp | 16 ++++++++-------- test/ods/styles/cell-styles.xml | 8 ++++---- 4 files changed, 17 insertions(+), 22 deletions(-) diff --git a/include/orcus/spreadsheet/types.hpp b/include/orcus/spreadsheet/types.hpp index 394e4b262..1abeb4b7c 100644 --- a/include/orcus/spreadsheet/types.hpp +++ b/include/orcus/spreadsheet/types.hpp @@ -55,7 +55,9 @@ enum class border_style_t medium_dashed, slant_dash_dot, thick, - thin + thin, + double_thin, + fine_dashed }; enum class formula_grammar_t diff --git a/src/liborcus/odf_helper.cpp b/src/liborcus/odf_helper.cpp index f83f8b00f..f402d795b 100644 --- a/src/liborcus/odf_helper.cpp +++ b/src/liborcus/odf_helper.cpp @@ -26,17 +26,10 @@ odf_border_style_map::entry odf_border_style_entries[] = { MDDS_ASCII("dash-dot-dot"), spreadsheet::border_style_t::dash_dot_dot}, { MDDS_ASCII("dashed"), spreadsheet::border_style_t::dashed}, { MDDS_ASCII("dotted"), spreadsheet::border_style_t::dotted}, - { MDDS_ASCII("double-border"), spreadsheet::border_style_t::double_border}, - { MDDS_ASCII("hair"), spreadsheet::border_style_t::hair}, - { MDDS_ASCII("medium"), spreadsheet::border_style_t::medium}, - { MDDS_ASCII("medium-dash-dot"), spreadsheet::border_style_t::medium_dash_dot}, - { MDDS_ASCII("medium-dash-dot-dot"), spreadsheet::border_style_t::medium_dash_dot_dot}, - { MDDS_ASCII("medium-dashed"), spreadsheet::border_style_t::medium_dashed}, + { MDDS_ASCII("double-thin"), spreadsheet::border_style_t::double_thin}, + { MDDS_ASCII("fine-dashed"), spreadsheet::border_style_t::fine_dashed}, { MDDS_ASCII("none"), spreadsheet::border_style_t::none}, - { MDDS_ASCII("slant-dash-dot"), spreadsheet::border_style_t::slant_dash_dot}, { MDDS_ASCII("solid"), spreadsheet::border_style_t::solid}, - { MDDS_ASCII("thick"), spreadsheet::border_style_t::thick}, - { MDDS_ASCII("thin"), spreadsheet::border_style_t::thin}, { MDDS_ASCII("unknown"), spreadsheet::border_style_t::unknown} }; diff --git a/src/liborcus/odf_styles_context_test.cpp b/src/liborcus/odf_styles_context_test.cpp index 95d57971a..99e31b79c 100644 --- a/src/liborcus/odf_styles_context_test.cpp +++ b/src/liborcus/odf_styles_context_test.cpp @@ -59,10 +59,10 @@ void test_odf_border(orcus::spreadsheet::import_styles &styles) assert(cell_format); const orcus::spreadsheet::border_t* cell_border = styles.get_border(border); - assert(cell_border->top.style == orcus::spreadsheet::border_style_t::thick); - assert(cell_border->bottom.style == orcus::spreadsheet::border_style_t::thick); - assert(cell_border->left.style == orcus::spreadsheet::border_style_t::thick); - assert(cell_border->right.style == orcus::spreadsheet::border_style_t::thick); + assert(cell_border->top.style == orcus::spreadsheet::border_style_t::dotted); + assert(cell_border->bottom.style == orcus::spreadsheet::border_style_t::dotted); + assert(cell_border->left.style == orcus::spreadsheet::border_style_t::dotted); + assert(cell_border->right.style == orcus::spreadsheet::border_style_t::dotted); assert(cell_border->top.border_color.red == 0xff); assert(cell_border->bottom.border_color.green == 0xcc); assert(cell_border->left.border_color.blue == 0x12); @@ -77,8 +77,8 @@ void test_odf_border(orcus::spreadsheet::import_styles &styles) assert(cell_format); cell_border = styles.get_border(border); - assert(cell_border->top.style == orcus::spreadsheet::border_style_t::solid); - assert(cell_border->bottom.style == orcus::spreadsheet::border_style_t::thin); + assert(cell_border->top.style == orcus::spreadsheet::border_style_t::fine_dashed); + assert(cell_border->bottom.style == orcus::spreadsheet::border_style_t::double_thin); assert(cell_border->left.style == orcus::spreadsheet::border_style_t::none); assert(cell_border->right.style == orcus::spreadsheet::border_style_t::dash_dot_dot); assert(cell_border->top.border_color.red == 0xff); @@ -95,8 +95,8 @@ void test_odf_border(orcus::spreadsheet::import_styles &styles) assert(cell_format); cell_border = styles.get_border(border); - assert(cell_border->diagonal_bl_tr.style == orcus::spreadsheet::border_style_t::medium); - assert(cell_border->diagonal_tl_br.style == orcus::spreadsheet::border_style_t::medium_dash_dot); + assert(cell_border->diagonal_bl_tr.style == orcus::spreadsheet::border_style_t::dashed); + assert(cell_border->diagonal_tl_br.style == orcus::spreadsheet::border_style_t::dash_dot); assert(cell_border->diagonal_bl_tr.border_color.red == 0xff); assert(cell_border->diagonal_tl_br.border_color.green == 0x00); assert(cell_border->diagonal_tl_br.border_width.value == 0.74); diff --git a/test/ods/styles/cell-styles.xml b/test/ods/styles/cell-styles.xml index 070f7ee67..f78e78997 100644 --- a/test/ods/styles/cell-styles.xml +++ b/test/ods/styles/cell-styles.xml @@ -1,16 +1,16 @@ - + - + - + - + -- GitLab From 8f1cb62fb403d2cc45fcd2e79f882f327cee8f74 Mon Sep 17 00:00:00 2001 From: Jaskaran Singh Date: Sat, 16 Jul 2016 17:39:24 +0530 Subject: [PATCH 3/4] Add code for importing ODF strikeout --- .../orcus/spreadsheet/import_interface.hpp | 4 ++ include/orcus/spreadsheet/styles.hpp | 8 +++ include/orcus/spreadsheet/types.hpp | 26 +++++++ src/liborcus/odf_styles_context.cpp | 69 ++++++++++++++++++- src/spreadsheet/styles.cpp | 26 ++++++- 5 files changed, 131 insertions(+), 2 deletions(-) diff --git a/include/orcus/spreadsheet/import_interface.hpp b/include/orcus/spreadsheet/import_interface.hpp index ed67859dc..49869e4cf 100644 --- a/include/orcus/spreadsheet/import_interface.hpp +++ b/include/orcus/spreadsheet/import_interface.hpp @@ -95,6 +95,10 @@ public: virtual void set_font_underline_type(underline_type_t e) = 0; virtual void set_font_underline_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue) = 0; virtual void set_font_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue) = 0; + virtual void set_strikeout_style(orcus::spreadsheet::strikeout_style_t s) = 0; + virtual void set_strikeout_type(orcus::spreadsheet::strikeout_type_t s) = 0; + virtual void set_strikeout_width(orcus::spreadsheet::strikeout_width_t s) = 0; + virtual void set_strikeout_text(orcus::spreadsheet::strikeout_text_t s) = 0; virtual size_t commit_font() = 0; // fill diff --git a/include/orcus/spreadsheet/styles.hpp b/include/orcus/spreadsheet/styles.hpp index f6a9de873..4a9f03761 100644 --- a/include/orcus/spreadsheet/styles.hpp +++ b/include/orcus/spreadsheet/styles.hpp @@ -45,6 +45,10 @@ struct ORCUS_SPM_DLLPUBLIC font_t underline_type_t underline_type; color_t underline_color; color_t color; + strikeout_style_t strikeout_style; + strikeout_width_t strikeout_width; + strikeout_type_t strikeout_type; + strikeout_text_t strikeout_text; font_t(); void reset(); @@ -158,6 +162,10 @@ public: virtual void set_font_underline_type(underline_type_t e); virtual void set_font_underline_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue); virtual void set_font_color(color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue); + virtual void set_strikeout_style(strikeout_style_t s); + virtual void set_strikeout_type(strikeout_type_t s); + virtual void set_strikeout_width(strikeout_width_t s); + virtual void set_strikeout_text(strikeout_text_t s); virtual size_t commit_font(); virtual void set_fill_count(size_t n); diff --git a/include/orcus/spreadsheet/types.hpp b/include/orcus/spreadsheet/types.hpp index 1abeb4b7c..338ac4dd2 100644 --- a/include/orcus/spreadsheet/types.hpp +++ b/include/orcus/spreadsheet/types.hpp @@ -60,6 +60,32 @@ enum class border_style_t fine_dashed }; +enum class strikeout_style_t +{ + unknown = 0, + solid +}; + +enum class strikeout_type_t +{ + unknown = 0, + single, + double_type +}; + +enum class strikeout_width_t +{ + unknown = 0, + bold +}; + +enum class strikeout_text_t +{ + unknown = 0, + slash, + cross +}; + enum class formula_grammar_t { unknown = 0, diff --git a/src/liborcus/odf_styles_context.cpp b/src/liborcus/odf_styles_context.cpp index 2260e6d26..a1b2da3be 100644 --- a/src/liborcus/odf_styles_context.cpp +++ b/src/liborcus/odf_styles_context.cpp @@ -119,6 +119,13 @@ class text_prop_attr_parser : std::unary_function spreadsheet::underline_t m_underline_style; spreadsheet::underline_type_t m_underline_type; + spreadsheet::strikeout_style_t m_strikeout_style; + spreadsheet::strikeout_type_t m_strikeout_type; + spreadsheet::strikeout_width_t m_strikeout_width; + spreadsheet::strikeout_text_t m_strikeout_text; + + bool m_strikeout; + public: text_prop_attr_parser() : m_bold(false), m_italic(false), m_color(false), m_red(0), m_green(0), m_blue(0), @@ -127,7 +134,12 @@ public: m_underline_mode(spreadsheet::underline_mode_t::continuos), m_underline_width(spreadsheet::underline_width_t::none), m_underline_style(spreadsheet::underline_t::none), - m_underline_type(spreadsheet::underline_type_t::none) {} + m_underline_type(spreadsheet::underline_type_t::none), + m_strikeout_style(spreadsheet::strikeout_style_t::unknown), + m_strikeout_type(spreadsheet::strikeout_type_t::unknown), + m_strikeout_width(spreadsheet::strikeout_width_t::unknown), + m_strikeout_text(spreadsheet::strikeout_text_t::unknown), + m_strikeout(false) {} void operator() (const xml_token_attr_t& attr) { @@ -175,6 +187,42 @@ public: m_underline_type = spreadsheet::underline_type_t::double_type; } break; + case XML_text_line_through_style: + { + m_strikeout = true; + if (attr.value == "solid") + m_strikeout_style = spreadsheet::strikeout_style_t::solid; + else + m_strikeout_style = spreadsheet::strikeout_style_t::unknown; + } + case XML_text_line_through_type: + { + m_strikeout = true; + if (attr.value == "single") + m_strikeout_type = spreadsheet::strikeout_type_t::single; + else if (attr.value == "double") + m_strikeout_type = spreadsheet::strikeout_type_t::double_type; + else + m_strikeout_type = spreadsheet::strikeout_type_t::unknown; + } + case XML_text_line_through_width: + { + m_strikeout = true; + if (attr.value == "bold") + m_strikeout_width = spreadsheet::strikeout_width_t::bold; + else + m_strikeout_width = spreadsheet::strikeout_width_t::unknown; + } + case XML_text_line_through_text: + { + m_strikeout = true; + if (attr.value == "/") + m_strikeout_text = spreadsheet::strikeout_text_t::slash; + else if (attr.value == "X") + m_strikeout_text = spreadsheet::strikeout_text_t::cross; + else + m_strikeout_text = spreadsheet::strikeout_text_t::unknown; + } default: ; } @@ -227,6 +275,11 @@ public: green = m_underline_green; blue = m_underline_blue; } + bool has_strikeout() const { return m_strikeout;} + const spreadsheet::strikeout_style_t get_strikeout_style() const { return m_strikeout_style;} + const spreadsheet::strikeout_width_t get_strikeout_width() const { return m_strikeout_width;} + const spreadsheet::strikeout_type_t get_strikeout_type() const { return m_strikeout_type;} + const spreadsheet::strikeout_text_t get_strikeout_text() const { return m_strikeout_text;} }; class cell_prop_attr_parser : std::unary_function @@ -570,6 +623,20 @@ void styles_context::start_element(xmlns_id_t ns, xml_token_t name, const std::v spreadsheet::underline_mode_t mode = func.get_underline_mode(); mp_styles->set_font_underline_mode(mode); } + if (func.has_strikeout()) + { + spreadsheet::strikeout_style_t style = func.get_strikeout_style(); + mp_styles->set_strikeout_style(style); + + spreadsheet::strikeout_width_t width = func.get_strikeout_width(); + mp_styles->set_strikeout_width(width); + + spreadsheet::strikeout_type_t type = func.get_strikeout_type(); + mp_styles->set_strikeout_type(type); + + spreadsheet::strikeout_text_t text = func.get_strikeout_text(); + mp_styles->set_strikeout_text(text); + } size_t font_id = mp_styles->commit_font(); diff --git a/src/spreadsheet/styles.cpp b/src/spreadsheet/styles.cpp index 90ecef942..f66babbe3 100644 --- a/src/spreadsheet/styles.cpp +++ b/src/spreadsheet/styles.cpp @@ -19,7 +19,11 @@ font_t::font_t() : underline_width(underline_width_t::none), underline_mode(underline_mode_t::continuos), underline_type(underline_type_t::none), - color() + color(), + strikeout_style(strikeout_style_t::unknown), + strikeout_width(strikeout_width_t::unknown), + strikeout_type(strikeout_type_t::unknown), + strikeout_text(strikeout_text_t::unknown) { } @@ -187,6 +191,26 @@ void import_styles::set_font_color(color_elem_t alpha, color_elem_t red, color_e m_cur_font.color = color_t(alpha, red, green, blue); } +void import_styles::set_strikeout_style(strikeout_style_t s) +{ + m_cur_font.strikeout_style = s; +} + +void import_styles::set_strikeout_width(strikeout_width_t s) +{ + m_cur_font.strikeout_width = s; +} + +void import_styles::set_strikeout_type(strikeout_type_t s) +{ + m_cur_font.strikeout_type = s; +} + +void import_styles::set_strikeout_text(strikeout_text_t s) +{ + m_cur_font.strikeout_text = s; +} + size_t import_styles::commit_font() { m_fonts.push_back(m_cur_font); -- GitLab From 1b3e0f57f47bbb630a9a8280d7608a00d72eb8f7 Mon Sep 17 00:00:00 2001 From: Jaskaran Singh Date: Sat, 16 Jul 2016 17:40:40 +0530 Subject: [PATCH 4/4] Add test for ODF strikeout --- src/liborcus/odf_styles_context_test.cpp | 41 ++++++++++++++++++++++++ test/ods/styles/cell-styles.xml | 9 ++++++ 2 files changed, 50 insertions(+) diff --git a/src/liborcus/odf_styles_context_test.cpp b/src/liborcus/odf_styles_context_test.cpp index 99e31b79c..6ded96a1f 100644 --- a/src/liborcus/odf_styles_context_test.cpp +++ b/src/liborcus/odf_styles_context_test.cpp @@ -270,6 +270,46 @@ void test_odf_number_formatting(orcus::spreadsheet::import_styles& styles) assert(cell_number_format->format_string.str() == "[>=0]0.00;[RED]-0.00"); } + +void test_odf_text_strikeout(orcus::spreadsheet::import_styles& styles) +{ + const orcus::spreadsheet::cell_style_t* style = find_cell_style_by_name("Name20", &styles); + size_t xf = style->xf; + const orcus::spreadsheet::cell_format_t* cell_format = styles.get_cell_style_format(xf); + size_t font = cell_format->font; + assert(cell_format); + + const orcus::spreadsheet::font_t* cell_font = styles.get_font(font); + assert(cell_font->strikeout_style == orcus::spreadsheet::strikeout_style_t::solid); + assert(cell_font->strikeout_width == orcus::spreadsheet::strikeout_width_t::unknown); + assert(cell_font->strikeout_type == orcus::spreadsheet::strikeout_type_t::single); + assert(cell_font->strikeout_text == orcus::spreadsheet::strikeout_text_t::unknown); + + style = find_cell_style_by_name("Name21", &styles); + xf = style->xf; + cell_format = styles.get_cell_style_format(xf); + font = cell_format->font; + assert(cell_format); + + cell_font = styles.get_font(font); + assert(cell_font->strikeout_style == orcus::spreadsheet::strikeout_style_t::solid); + assert(cell_font->strikeout_width == orcus::spreadsheet::strikeout_width_t::bold); + assert(cell_font->strikeout_type == orcus::spreadsheet::strikeout_type_t::single); + assert(cell_font->strikeout_text == orcus::spreadsheet::strikeout_text_t::unknown); + + style = find_cell_style_by_name("Name22", &styles); + xf = style->xf; + cell_format = styles.get_cell_style_format(xf); + font = cell_format->font; + assert(cell_format); + + cell_font = styles.get_font(font); + assert(cell_font->strikeout_style == orcus::spreadsheet::strikeout_style_t::solid); + assert(cell_font->strikeout_width == orcus::spreadsheet::strikeout_width_t::unknown); + assert(cell_font->strikeout_type == orcus::spreadsheet::strikeout_type_t::single); + assert(cell_font->strikeout_text == orcus::spreadsheet::strikeout_text_t::slash); +} + int main() { orcus::string_pool string_pool; @@ -282,6 +322,7 @@ int main() test_odf_border(styles); test_odf_cell_protection(styles); test_odf_font(styles); + test_odf_text_strikeout(styles); orcus::string_pool string_pool2; path = SRCDIR"/test/ods/styles/number-format.xml"; diff --git a/test/ods/styles/cell-styles.xml b/test/ods/styles/cell-styles.xml index f78e78997..d9a51360f 100644 --- a/test/ods/styles/cell-styles.xml +++ b/test/ods/styles/cell-styles.xml @@ -27,4 +27,13 @@ + + + + + + + + + -- GitLab