diff --git a/include/orcus/spreadsheet/import_interface.hpp b/include/orcus/spreadsheet/import_interface.hpp index ff833fccbb0136f6a1b17cb8ce57daef988e633c..49869e4cf9000d50713b29da2aa5f3362fef0df6 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 @@ -114,7 +118,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 de3e96b555a0bbf97cb29803004db4265c36912c..4a9f037617aa3055248e07934765d4b47a5b0052 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); @@ -171,7 +179,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/include/orcus/spreadsheet/types.hpp b/include/orcus/spreadsheet/types.hpp index 394e4b2625740fe100a99c020794d21184bf1a64..338ac4dd2d1ad89fe603fd092789a36e6aca8588 100644 --- a/include/orcus/spreadsheet/types.hpp +++ b/include/orcus/spreadsheet/types.hpp @@ -55,7 +55,35 @@ enum class border_style_t medium_dashed, slant_dash_dot, thick, - thin + thin, + double_thin, + 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 diff --git a/src/liborcus/odf_helper.cpp b/src/liborcus/odf_helper.cpp index f83f8b00f3ccf2779aaf50241d9d47e1003b66f4..f402d795b81d6a87c63942b0cdcf191dcf5afd56 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.cpp b/src/liborcus/odf_styles_context.cpp index 415ccfc475d063fd513ef3171b28ee44466358b4..a1b2da3be10f481229e1e887ae38d5c48a00509b 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(); @@ -618,7 +685,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/liborcus/odf_styles_context_test.cpp b/src/liborcus/odf_styles_context_test.cpp index 95d57971a84453b54006c5b7fee033fc2f328f84..6ded96a1fb3b03ba0fb6f02bcaf75d8368566e8b 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); @@ -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/src/spreadsheet/styles.cpp b/src/spreadsheet/styles.cpp index 6f2397276530974edde2e27478a39fcc4a80e998..f66babbe3ce937806c0082e029f5ca26e7f7d28e 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); @@ -283,11 +307,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() diff --git a/test/ods/styles/cell-styles.xml b/test/ods/styles/cell-styles.xml index 070f7ee6725d5cf677430af84eaf4cfb5f549a92..d9a51360f3d48e6c8f58ee6f72a8e61b70ce2b77 100644 --- a/test/ods/styles/cell-styles.xml +++ b/test/ods/styles/cell-styles.xml @@ -1,16 +1,16 @@ - + - + - + - + @@ -27,4 +27,13 @@ + + + + + + + + +