From d8a6664bb134898ff22a55993915a24e395a5738 Mon Sep 17 00:00:00 2001 From: Jaskaran Date: Wed, 4 May 2016 16:43:17 +0530 Subject: [PATCH 1/2] Add facility for border import in orcus + it's test(which is in bad shape now, but will improve) --- src/liborcus/odf_helper.cpp | 48 ++++++++ src/liborcus/odf_helper.hpp | 9 ++ src/liborcus/odf_styles_context.cpp | 133 ++++++++++++++++++++++- src/liborcus/odf_styles_context_test.cpp | 29 ++++- test/ods/styles/improved-cell-styles.xml | 9 ++ 5 files changed, 220 insertions(+), 8 deletions(-) create mode 100644 test/ods/styles/improved-cell-styles.xml diff --git a/src/liborcus/odf_helper.cpp b/src/liborcus/odf_helper.cpp index fc3f61e5b..7be9ae5cd 100644 --- a/src/liborcus/odf_helper.cpp +++ b/src/liborcus/odf_helper.cpp @@ -6,6 +6,9 @@ */ #include "odf_helper.hpp" +#include +#include +#include namespace orcus { @@ -66,6 +69,51 @@ bool odf_helper::convert_fo_color(const pstring& value, orcus::spreadsheet::colo return convert_color_digits(value, blue, 5); } + +bool odf_helper::extract_border_details(const orcus::pstring& value, + length_t &m_border_width, + spreadsheet::border_style_t &m_border_style, + spreadsheet::color_elem_t &m_border_red, + spreadsheet::color_elem_t &m_border_green, + spreadsheet::color_elem_t &m_border_blue + ) +{ orcus::pstring color_code; + orcus::pstring width; + orcus::pstring style; + + std::stringstream ss(value.str()); + std::string buffer; + + std::getline(ss,buffer,' '); + width=buffer.c_str(); + m_border_width=to_length(width); + + std::getline(ss,buffer,' '); + + if(buffer=="unknown" ) m_border_style = spreadsheet::border_style_t::unknown; + else if(buffer=="none" ) m_border_style = spreadsheet::border_style_t::none; + else if(buffer=="dash_dot" ) m_border_style = spreadsheet::border_style_t::dash_dot; + else if(buffer=="dash_dot_dot" ) m_border_style = spreadsheet::border_style_t::dash_dot_dot; + else if(buffer=="dashed" ) m_border_style = spreadsheet::border_style_t::dashed; + else if(buffer=="dotted" ) m_border_style = spreadsheet::border_style_t::dotted; + else if(buffer=="double_border" ) m_border_style = spreadsheet::border_style_t::double_border; + else if(buffer=="hair" ) m_border_style = spreadsheet::border_style_t::hair; + else if(buffer=="medium" ) m_border_style = spreadsheet::border_style_t::medium; + else if(buffer=="medium_dash_dot" ) m_border_style = spreadsheet::border_style_t::medium_dash_dot; + else if(buffer=="medium_dash_dot_dot") m_border_style = spreadsheet::border_style_t::medium_dash_dot_dot; + else if(buffer=="medium_dashed" ) m_border_style = spreadsheet::border_style_t::medium_dashed; + else if(buffer=="slant_dash_dot" ) m_border_style = spreadsheet::border_style_t::slant_dash_dot; + else if(buffer=="thick" ) m_border_style = spreadsheet::border_style_t::thick; + else if(buffer=="thin" ) m_border_style = spreadsheet::border_style_t::thin; + + std::getline(ss,buffer,' '); + color_code=buffer.c_str(); + + if(!convert_fo_color(color_code,m_border_red, m_border_green,m_border_blue)) + return false; + + return true; +} } diff --git a/src/liborcus/odf_helper.hpp b/src/liborcus/odf_helper.hpp index 6880914c5..2f5af40d1 100644 --- a/src/liborcus/odf_helper.hpp +++ b/src/liborcus/odf_helper.hpp @@ -10,6 +10,7 @@ #include #include +#include namespace orcus { @@ -19,6 +20,14 @@ public: static bool convert_fo_color(const orcus::pstring& value, orcus::spreadsheet::color_elem_t& red, orcus::spreadsheet::color_elem_t& green, orcus::spreadsheet::color_elem_t& blue); + /* extracts border style,width and colors out of the pstring provided to it */ + static bool extract_border_details(const orcus::pstring& value,length_t &m_border_width, + spreadsheet::border_style_t &m_border_style, + spreadsheet::color_elem_t &m_border_red, + spreadsheet::color_elem_t &m_border_green, + spreadsheet::color_elem_t &m_border_blue + ); + }; } diff --git a/src/liborcus/odf_styles_context.cpp b/src/liborcus/odf_styles_context.cpp index 6cf726982..d5e2a0005 100644 --- a/src/liborcus/odf_styles_context.cpp +++ b/src/liborcus/odf_styles_context.cpp @@ -31,7 +31,7 @@ class style_attr_parser : public std::unary_function pstring m_parent_name; public: style_attr_parser(const style_value_converter* converter) : - m_converter(converter), m_family(style_family_unknown) {} + m_converter(converter), m_family(style_family_unknown) {} void operator() (const xml_token_attr_t& attr) { @@ -167,7 +167,15 @@ class cell_prop_attr_parser : std::unary_function spreadsheet::color_elem_t m_background_red; spreadsheet::color_elem_t m_background_green; spreadsheet::color_elem_t m_background_blue; + + length_t m_border_width;//At the time of writing this,orcus doesn't have feature of border width import + spreadsheet::border_style_t m_border_style; + spreadsheet::color_elem_t m_border_green ,m_border_blue ,m_border_red; + spreadsheet::border_direction_t m_border_direction; + bool m_background_color; + bool m_border; + bool m_four_side_border; public: @@ -181,6 +189,48 @@ public: m_background_color = odf_helper::convert_fo_color(attr.value, m_background_red, m_background_green, m_background_blue); break; + + case XML_border: + m_border=odf_helper::extract_border_details(attr.value,m_border_width,m_border_style, + m_border_red,m_border_green, + m_border_blue + ); + m_four_side_border=true; + break; + + case XML_border_top: + m_border=odf_helper::extract_border_details(attr.value,m_border_width,m_border_style, + m_border_red,m_border_green, + m_border_blue + ); + m_border_direction =spreadsheet::border_direction_t::top; + break; + + case XML_border_bottom: + m_border=odf_helper::extract_border_details(attr.value,m_border_width,m_border_style, + m_border_red,m_border_green, + m_border_blue + ); + m_border_direction =spreadsheet::border_direction_t::bottom; + break; + + case XML_border_left: + m_border=odf_helper::extract_border_details(attr.value,m_border_width,m_border_style, + m_border_red,m_border_green, + m_border_blue + ); + m_border_direction =spreadsheet::border_direction_t::left; + break; + + case XML_border_right: + m_border=odf_helper::extract_border_details(attr.value,m_border_width,m_border_style, + m_border_red,m_border_green, + m_border_blue + ); + m_border_direction =spreadsheet::border_direction_t::right; + break; + + default: ; } @@ -195,6 +245,39 @@ public: green = m_background_green; blue = m_background_blue; } + + bool has_border() + { + return m_border; + } + + void get_border_style(spreadsheet::border_style_t& style) + { + style=m_border_style; + } + + void get_border_width(length_t& width) + { + width=m_border_width; + } + + void get_border_direction(spreadsheet::border_direction_t& direction) + { + direction=m_border_direction; + } + + bool has_four_side_border() + { + return m_four_side_border; + } + + void get_border_color(spreadsheet::color_elem_t& red, spreadsheet::color_elem_t& green, + spreadsheet::color_elem_t& blue) + { + red=m_border_red; + green=m_border_green; + blue=m_border_blue; + } }; } @@ -380,15 +463,59 @@ void styles_context::start_element(xmlns_id_t ns, xml_token_t name, const std::v mp_styles->set_fill_bg_color(0, red, green, blue); } - size_t fill = mp_styles->commit_fill(); + if(func.has_border()) + { + spreadsheet::border_style_t border_style; + spreadsheet::border_direction_t border_direction; + length_t border_width; + spreadsheet::color_elem_t red; + spreadsheet::color_elem_t green; + spreadsheet::color_elem_t blue; + + if (func.has_four_side_border()) // then apply border styles to each cells explicitly. + { + func.get_border_style(border_style); + func.get_border_color(red,green,blue); + + mp_styles->set_border_style(spreadsheet::border_direction_t::top,border_style); + mp_styles->set_border_color(spreadsheet::border_direction_t::top,0,red,green,blue); + + mp_styles->set_border_style(spreadsheet::border_direction_t::bottom,border_style); + mp_styles->set_border_color(spreadsheet::border_direction_t::bottom,0,red,green,blue); + + mp_styles->set_border_style(spreadsheet::border_direction_t::left,border_style); + mp_styles->set_border_color(spreadsheet::border_direction_t::left,0,red,green,blue); + + mp_styles->set_border_style(spreadsheet::border_direction_t::right,border_style); + mp_styles->set_border_color(spreadsheet::border_direction_t::right,0,red,green,blue); + + } + + else // if border is required to apply to one of sides only. + { + func.get_border_direction(border_direction); + func.get_border_style(border_style); + func.get_border_color(red,green,blue); + + mp_styles->set_border_style(border_direction,border_style); + mp_styles->set_border_color(border_direction,0,red,green,blue); + } + + + } + size_t border_id = mp_styles->commit_border(); + size_t fill_id = mp_styles->commit_fill(); switch (m_current_style->family) { case style_family_table_cell: { odf_style::cell* data = m_current_style->cell_data; - data->fill = fill; + data->fill = fill_id; + data->border=border_id; } + break; + default: ; } diff --git a/src/liborcus/odf_styles_context_test.cpp b/src/liborcus/odf_styles_context_test.cpp index 7aa5bfe7c..2780cb464 100644 --- a/src/liborcus/odf_styles_context_test.cpp +++ b/src/liborcus/odf_styles_context_test.cpp @@ -4,10 +4,10 @@ #include #include "orcus/stream.hpp" - +#include "odf_helper.hpp" #include #include - +#include namespace { const orcus::spreadsheet::cell_style_t* find_cell_style_by_name(const orcus::pstring& name, orcus::spreadsheet::import_styles* styles) @@ -27,14 +27,12 @@ const orcus::spreadsheet::cell_style_t* find_cell_style_by_name(const orcus::pst } int main() -{ - orcus::string_pool string_pool; +{ orcus::string_pool string_pool; const char* path = SRCDIR"/test/ods/styles/cell-styles.xml"; std::string content = orcus::load_file_content(path); orcus::spreadsheet::import_styles styles(string_pool); orcus::import_ods::read_styles(content.c_str(), content.size(), &styles); - const orcus::spreadsheet::cell_style_t* style = find_cell_style_by_name("Note", &styles); assert(style->parent_name == "Text"); size_t xf = style->xf; @@ -49,5 +47,26 @@ int main() assert(cell_fill->bg_color.red == 0xfe); assert(cell_fill->bg_color.green == 0xff); assert(cell_fill->bg_color.blue == 0xcc); + + + orcus::string_pool string_pool2; + const char* path2 = SRCDIR"/test/ods/styles/improved-cell-styles.xml"; + std::string content2 = orcus::load_file_content(path2); + orcus::spreadsheet::import_styles styles2(string_pool2); + orcus::import_ods::read_styles(content2.c_str(), content2.size(), &styles2); + + size_t border_count = styles2.get_border_count(); + assert(border_count==3); + + const orcus::spreadsheet::border_t* border_data = styles2.get_border(2); + orcus::spreadsheet::border_style_t fst =(*border_data).top.style; + + assert(fst ==orcus::spreadsheet::border_style_t::thick); + + const orcus::spreadsheet::border_t* border_data1 = styles2.get_border(1); + orcus::spreadsheet::color_t clrs =(*border_data1).top.border_color; + + assert(int(clrs.blue)==204); + return 0; } diff --git a/test/ods/styles/improved-cell-styles.xml b/test/ods/styles/improved-cell-styles.xml new file mode 100644 index 000000000..c7fc1aa07 --- /dev/null +++ b/test/ods/styles/improved-cell-styles.xml @@ -0,0 +1,9 @@ + + + + + + + + + -- GitLab From eee2ea825909ddfee7506ede0806104b1c0cc9c1 Mon Sep 17 00:00:00 2001 From: Jaskaran Date: Fri, 13 May 2016 13:34:00 +0530 Subject: [PATCH 2/2] Add Code to read border details from xml file --- .../orcus/spreadsheet/import_interface.hpp | 2 + include/orcus/spreadsheet/styles.hpp | 4 +- include/orcus/spreadsheet/types.hpp | 1 + src/liborcus/odf_helper.cpp | 79 +++++++++++-------- src/liborcus/odf_helper.hpp | 2 +- src/liborcus/odf_styles_context.cpp | 67 ++++++++++------ src/spreadsheet/styles.cpp | 7 ++ 7 files changed, 101 insertions(+), 61 deletions(-) diff --git a/include/orcus/spreadsheet/import_interface.hpp b/include/orcus/spreadsheet/import_interface.hpp index 66da60aae..0ff96f8c8 100644 --- a/include/orcus/spreadsheet/import_interface.hpp +++ b/include/orcus/spreadsheet/import_interface.hpp @@ -13,6 +13,7 @@ #include "types.hpp" #include "orcus/types.hpp" #include "orcus/env.hpp" +#include // NB: This header must not depend on ixion, as it needs to be usable for // those clients that provide their own formula engine. Other headers in @@ -110,6 +111,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 size_t commit_border() = 0; // cell protection diff --git a/include/orcus/spreadsheet/styles.hpp b/include/orcus/spreadsheet/styles.hpp index 8ce834cf0..6f7183d42 100644 --- a/include/orcus/spreadsheet/styles.hpp +++ b/include/orcus/spreadsheet/styles.hpp @@ -11,7 +11,7 @@ #include "orcus/spreadsheet/import_interface.hpp" #include "orcus/pstring.hpp" #include "orcus/env.hpp" - +#include #include namespace orcus { @@ -60,6 +60,7 @@ struct ORCUS_SPM_DLLPUBLIC border_attrs_t { border_style_t style; color_t border_color; + length_t border_width; border_attrs_t(); void reset(); @@ -157,6 +158,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 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 46949539f..14f9ebc0a 100644 --- a/include/orcus/spreadsheet/types.hpp +++ b/include/orcus/spreadsheet/types.hpp @@ -40,6 +40,7 @@ enum class border_style_t { unknown = 0, none, + solid, dash_dot, dash_dot_dot, dashed, diff --git a/src/liborcus/odf_helper.cpp b/src/liborcus/odf_helper.cpp index 7be9ae5cd..a5e297206 100644 --- a/src/liborcus/odf_helper.cpp +++ b/src/liborcus/odf_helper.cpp @@ -6,14 +6,40 @@ */ #include "odf_helper.hpp" -#include +#include "string_helper.hpp" #include #include +#include +#include +#include namespace orcus { namespace { +typedef mdds::sorted_string_map odf_border_style_map; + +odf_border_style_map::entry odf_border_style_entries[] = +{ + { MDDS_ASCII("unknown") , spreadsheet::border_style_t::unknown}, + { MDDS_ASCII("none") , spreadsheet::border_style_t::none}, + { MDDS_ASCII("solid") , spreadsheet::border_style_t::solid}, + { MDDS_ASCII("dash_dot") , spreadsheet::border_style_t::dash_dot}, + { 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("slant_dash_dot") , spreadsheet::border_style_t::slant_dash_dot}, + { MDDS_ASCII("thick") , spreadsheet::border_style_t::thick}, + { MDDS_ASCII("thin") , spreadsheet::border_style_t::thin} +}; + + bool is_valid_hex_digit(const char& character, orcus::spreadsheet::color_elem_t& val) { if ('0' <= character && character <= '9') @@ -70,7 +96,7 @@ bool odf_helper::convert_fo_color(const pstring& value, orcus::spreadsheet::colo return convert_color_digits(value, blue, 5); } -bool odf_helper::extract_border_details(const orcus::pstring& value, +void odf_helper::extract_border_details(const orcus::pstring &value, length_t &m_border_width, spreadsheet::border_style_t &m_border_style, spreadsheet::color_elem_t &m_border_red, @@ -81,40 +107,25 @@ bool odf_helper::extract_border_details(const orcus::pstring& value, orcus::pstring width; orcus::pstring style; - std::stringstream ss(value.str()); - std::string buffer; - - std::getline(ss,buffer,' '); - width=buffer.c_str(); - m_border_width=to_length(width); - - std::getline(ss,buffer,' '); - - if(buffer=="unknown" ) m_border_style = spreadsheet::border_style_t::unknown; - else if(buffer=="none" ) m_border_style = spreadsheet::border_style_t::none; - else if(buffer=="dash_dot" ) m_border_style = spreadsheet::border_style_t::dash_dot; - else if(buffer=="dash_dot_dot" ) m_border_style = spreadsheet::border_style_t::dash_dot_dot; - else if(buffer=="dashed" ) m_border_style = spreadsheet::border_style_t::dashed; - else if(buffer=="dotted" ) m_border_style = spreadsheet::border_style_t::dotted; - else if(buffer=="double_border" ) m_border_style = spreadsheet::border_style_t::double_border; - else if(buffer=="hair" ) m_border_style = spreadsheet::border_style_t::hair; - else if(buffer=="medium" ) m_border_style = spreadsheet::border_style_t::medium; - else if(buffer=="medium_dash_dot" ) m_border_style = spreadsheet::border_style_t::medium_dash_dot; - else if(buffer=="medium_dash_dot_dot") m_border_style = spreadsheet::border_style_t::medium_dash_dot_dot; - else if(buffer=="medium_dashed" ) m_border_style = spreadsheet::border_style_t::medium_dashed; - else if(buffer=="slant_dash_dot" ) m_border_style = spreadsheet::border_style_t::slant_dash_dot; - else if(buffer=="thick" ) m_border_style = spreadsheet::border_style_t::thick; - else if(buffer=="thin" ) m_border_style = spreadsheet::border_style_t::thin; - - std::getline(ss,buffer,' '); - color_code=buffer.c_str(); - - if(!convert_fo_color(color_code,m_border_red, m_border_green,m_border_blue)) - return false; + std::vector detail = orcus::string_helper::split_string(value,' '); + + for(auto& sub_detail : detail) + { + if(sub_detail[0] == '#') + convert_fo_color(sub_detail,m_border_red,m_border_green,m_border_blue); + + else if(sub_detail[0] >= '0' && sub_detail[0] <='9') + m_border_width = orcus::to_length(sub_detail); + + else // This has to be a style + { + odf_border_style_map border_style_map(odf_border_style_entries, ORCUS_N_ELEMENTS(odf_border_style_entries), spreadsheet::border_style_t::none); + m_border_style = border_style_map.find(sub_detail.get(), sub_detail.size()); + } - return true; -} + } } +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/src/liborcus/odf_helper.hpp b/src/liborcus/odf_helper.hpp index 2f5af40d1..97c73a311 100644 --- a/src/liborcus/odf_helper.hpp +++ b/src/liborcus/odf_helper.hpp @@ -21,7 +21,7 @@ public: orcus::spreadsheet::color_elem_t& green, orcus::spreadsheet::color_elem_t& blue); /* extracts border style,width and colors out of the pstring provided to it */ - static bool extract_border_details(const orcus::pstring& value,length_t &m_border_width, + static void extract_border_details(const orcus::pstring& value,length_t &m_border_width, spreadsheet::border_style_t &m_border_style, spreadsheet::color_elem_t &m_border_red, spreadsheet::color_elem_t &m_border_green, diff --git a/src/liborcus/odf_styles_context.cpp b/src/liborcus/odf_styles_context.cpp index d5e2a0005..b921af8f9 100644 --- a/src/liborcus/odf_styles_context.cpp +++ b/src/liborcus/odf_styles_context.cpp @@ -164,11 +164,11 @@ public: class cell_prop_attr_parser : std::unary_function { - spreadsheet::color_elem_t m_background_red; - spreadsheet::color_elem_t m_background_green; - spreadsheet::color_elem_t m_background_blue; + spreadsheet::color_elem_t m_background_red; + spreadsheet::color_elem_t m_background_green; + spreadsheet::color_elem_t m_background_blue; - length_t m_border_width;//At the time of writing this,orcus doesn't have feature of border width import + length_t m_border_width; spreadsheet::border_style_t m_border_style; spreadsheet::color_elem_t m_border_green ,m_border_blue ,m_border_red; spreadsheet::border_direction_t m_border_direction; @@ -191,43 +191,52 @@ public: break; case XML_border: - m_border=odf_helper::extract_border_details(attr.value,m_border_width,m_border_style, + odf_helper::extract_border_details(attr.value,m_border_width,m_border_style, m_border_red,m_border_green, m_border_blue ); - m_four_side_border=true; + m_border = true; + m_four_side_border = true; break; case XML_border_top: - m_border=odf_helper::extract_border_details(attr.value,m_border_width,m_border_style, + odf_helper::extract_border_details(attr.value,m_border_width,m_border_style, m_border_red,m_border_green, m_border_blue ); - m_border_direction =spreadsheet::border_direction_t::top; + m_border = true; + m_border_direction = spreadsheet::border_direction_t::top; + m_four_side_border = false; break; case XML_border_bottom: - m_border=odf_helper::extract_border_details(attr.value,m_border_width,m_border_style, + odf_helper::extract_border_details(attr.value,m_border_width,m_border_style, m_border_red,m_border_green, m_border_blue ); - m_border_direction =spreadsheet::border_direction_t::bottom; + m_border = true; + m_border_direction = spreadsheet::border_direction_t::bottom; + m_four_side_border = false; break; case XML_border_left: - m_border=odf_helper::extract_border_details(attr.value,m_border_width,m_border_style, + odf_helper::extract_border_details(attr.value,m_border_width,m_border_style, m_border_red,m_border_green, m_border_blue ); - m_border_direction =spreadsheet::border_direction_t::left; + m_border = true; + m_border_direction = spreadsheet::border_direction_t::left; + m_four_side_border = false; break; case XML_border_right: - m_border=odf_helper::extract_border_details(attr.value,m_border_width,m_border_style, + odf_helper::extract_border_details(attr.value,m_border_width,m_border_style, m_border_red,m_border_green, m_border_blue ); - m_border_direction =spreadsheet::border_direction_t::right; + m_border = true; + m_border_direction = spreadsheet::border_direction_t::right; + m_four_side_border = false; break; @@ -238,6 +247,7 @@ public: } bool has_background_color() { return m_background_color; } + void get_background_color(spreadsheet::color_elem_t& red, spreadsheet::color_elem_t& green, spreadsheet::color_elem_t& blue) { @@ -253,17 +263,17 @@ public: void get_border_style(spreadsheet::border_style_t& style) { - style=m_border_style; + style = m_border_style; } void get_border_width(length_t& width) { - width=m_border_width; + width = m_border_width; } void get_border_direction(spreadsheet::border_direction_t& direction) { - direction=m_border_direction; + direction = m_border_direction; } bool has_four_side_border() @@ -274,9 +284,9 @@ public: void get_border_color(spreadsheet::color_elem_t& red, spreadsheet::color_elem_t& green, spreadsheet::color_elem_t& blue) { - red=m_border_red; - green=m_border_green; - blue=m_border_blue; + red = m_border_red; + green = m_border_green; + blue = m_border_blue; } }; @@ -467,7 +477,7 @@ void styles_context::start_element(xmlns_id_t ns, xml_token_t name, const std::v { spreadsheet::border_style_t border_style; spreadsheet::border_direction_t border_direction; - length_t border_width; + length_t width; spreadsheet::color_elem_t red; spreadsheet::color_elem_t green; spreadsheet::color_elem_t blue; @@ -476,18 +486,23 @@ void styles_context::start_element(xmlns_id_t ns, xml_token_t name, const std::v { func.get_border_style(border_style); func.get_border_color(red,green,blue); + func.get_border_width(width); mp_styles->set_border_style(spreadsheet::border_direction_t::top,border_style); mp_styles->set_border_color(spreadsheet::border_direction_t::top,0,red,green,blue); - + mp_styles->set_border_width(spreadsheet::border_direction_t::top,width); + mp_styles->set_border_style(spreadsheet::border_direction_t::bottom,border_style); mp_styles->set_border_color(spreadsheet::border_direction_t::bottom,0,red,green,blue); - + mp_styles->set_border_width(spreadsheet::border_direction_t::bottom,width); + mp_styles->set_border_style(spreadsheet::border_direction_t::left,border_style); mp_styles->set_border_color(spreadsheet::border_direction_t::left,0,red,green,blue); - + mp_styles->set_border_width(spreadsheet::border_direction_t::left,width); + mp_styles->set_border_style(spreadsheet::border_direction_t::right,border_style); mp_styles->set_border_color(spreadsheet::border_direction_t::right,0,red,green,blue); + mp_styles->set_border_width(spreadsheet::border_direction_t::right,width); } @@ -496,9 +511,11 @@ void styles_context::start_element(xmlns_id_t ns, xml_token_t name, const std::v func.get_border_direction(border_direction); func.get_border_style(border_style); func.get_border_color(red,green,blue); - + func.get_border_width(width); + mp_styles->set_border_style(border_direction,border_style); mp_styles->set_border_color(border_direction,0,red,green,blue); + mp_styles->set_border_width(border_direction,width); } diff --git a/src/spreadsheet/styles.cpp b/src/spreadsheet/styles.cpp index 699dbcc41..949a049c9 100644 --- a/src/spreadsheet/styles.cpp +++ b/src/spreadsheet/styles.cpp @@ -252,6 +252,13 @@ 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) +{ + border_attrs_t* p = get_border_attrs(m_cur_border,dir); + if(p) + p->border_width = width; +} + size_t import_styles::commit_border() { m_borders.push_back(m_cur_border); -- GitLab