Commit 9c7a03fd authored by ElenaSubbotina's avatar ElenaSubbotina

OdfFormatWriter - add ole objects

parent 9272b27a
...@@ -44,7 +44,7 @@ namespace cpdoccore { ...@@ -44,7 +44,7 @@ namespace cpdoccore {
namespace odf_writer { namespace odf_writer {
_mediaitems::item::item( std::wstring const & _oox_ref, _mediaitems::item::item(std::wstring const & _oox_ref,
Type _type, Type _type,
std::wstring const & _odf_ref std::wstring const & _odf_ref
) )
...@@ -58,23 +58,31 @@ _mediaitems::item::item( std::wstring const & _oox_ref, ...@@ -58,23 +58,31 @@ _mediaitems::item::item( std::wstring const & _oox_ref,
void _mediaitems::add_or_find(const std::wstring & oox_ref, Type type, std::wstring & odf_ref) void _mediaitems::add_or_find(const std::wstring & oox_ref, Type type, std::wstring & odf_ref)
{ {
std::wstring output_sub_path;// std::wstring output_sub_path;
std::wstring output_fileName; std::wstring output_fileName;
int number=0; int number=0;
if (type == typeImage) if (type == typeImage)
{ {
output_sub_path = L"Pictures/"; output_sub_path = L"Pictures/";
number= count_image+1; number = count_image + 1;
} }
else else if (type == typeMedia)
{ {
output_sub_path = L"Media/"; output_sub_path = L"Media/";
number= count_media+1; number = count_media + 1;
} }
else if (type == typeOleObject)
{
output_fileName = utils::media::create_file_name(oox_ref, type, number);//guid??? output_sub_path = L"";
number = count_object + 1;
}
else if (type == typeObjectReplacement)
{
output_sub_path = L"ObjectReplacements/";
number = count_image_object + 1;
}
output_fileName = utils::media::create_file_name(oox_ref, type, number); //guid???
std::wstring input_path = oox_ref; std::wstring input_path = oox_ref;
...@@ -92,16 +100,25 @@ void _mediaitems::add_or_find(const std::wstring & oox_ref, Type type, std::wst ...@@ -92,16 +100,25 @@ void _mediaitems::add_or_find(const std::wstring & oox_ref, Type type, std::wst
break; break;
} }
} }
if (output_path .length() < 1) if (output_path.length() < 1)
{ {
output_path = ( output_sub_path + output_fileName) ; output_path = ( output_sub_path + output_fileName) ;
if ( type == typeImage) if ( type == typeImage)
{ {
count_image++; count_image++;
} }
else else if ( type == typeMedia)
{
count_media++; count_media++;
}
else if ( type == typeOleObject)
{
count_object++;
}
else if ( type == typeObjectReplacement)
{
count_image_object++;
}
items_.push_back( item(input_path, type, xml::utils::replace_text_to_xml(output_path)) ); items_.push_back( item(input_path, type, xml::utils::replace_text_to_xml(output_path)) );
} }
......
...@@ -42,13 +42,14 @@ class rels; ...@@ -42,13 +42,14 @@ class rels;
class _mediaitems class _mediaitems
{ {
public: public:
enum Type { typeUnknown = 0, typeImage, typeMedia}; enum Type { typeUnknown = 0, typeImage, typeMedia, typeOleObject, typeObjectReplacement};
//oleObject ???
_mediaitems() _mediaitems()
{ {
count_image =0; count_image = 0;
count_media =0; count_media = 0;
count_object = 0;
count_image_object = 0;
} }
struct item struct item
...@@ -66,6 +67,8 @@ public: ...@@ -66,6 +67,8 @@ public:
size_t count_image; size_t count_image;
size_t count_media; size_t count_media;
size_t count_object;
size_t count_image_object;
void add_or_find(const std::wstring & oox_ref, Type type, std::wstring & odf_ref); void add_or_find(const std::wstring & oox_ref, Type type, std::wstring & odf_ref);
......
...@@ -29,12 +29,8 @@ ...@@ -29,12 +29,8 @@
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
* *
*/ */
#include "mediaitems_utils.h" #include "mediaitems_utils.h"
#include <boost/lexical_cast.hpp>
namespace cpdoccore { namespace cpdoccore {
namespace odf_writer{ namespace odf_writer{
namespace utils { namespace utils {
...@@ -45,9 +41,11 @@ std::wstring get_rel_type(_mediaitems::Type type) ...@@ -45,9 +41,11 @@ std::wstring get_rel_type(_mediaitems::Type type)
{ {
switch (type) switch (type)
{ {
case _mediaitems::typeImage: case _mediaitems::typeOleObject:
return L""; return L"application/vnd.sun.star.oleobject";
default: case _mediaitems::typeMedia:
case _mediaitems::typeImage:
default:
return L""; return L"";
} }
} }
...@@ -58,6 +56,9 @@ std::wstring get_default_file_name(_mediaitems::Type type) ...@@ -58,6 +56,9 @@ std::wstring get_default_file_name(_mediaitems::Type type)
{ {
case _mediaitems::typeImage: case _mediaitems::typeImage:
return L"image"; return L"image";
case _mediaitems::typeOleObject:
case _mediaitems::typeObjectReplacement:
return L"Object ";
default: default:
return L"media"; return L"media";
} }
...@@ -66,11 +67,15 @@ std::wstring get_default_file_name(_mediaitems::Type type) ...@@ -66,11 +67,15 @@ std::wstring get_default_file_name(_mediaitems::Type type)
std::wstring create_file_name(const std::wstring & uri, _mediaitems::Type type, size_t Num) std::wstring create_file_name(const std::wstring & uri, _mediaitems::Type type, size_t Num)
{ {
std::wstring sExt; std::wstring sExt;
int n = uri.rfind(L".");
if (n>=0) sExt = uri.substr(n);
//todooo проверить
return get_default_file_name(type) + boost::lexical_cast<std::wstring>(Num) + sExt; if (type == _mediaitems::typeOleObject &&
type == _mediaitems::typeObjectReplacement)
{
int n = uri.rfind(L".");
if (n >= 0) sExt = uri.substr(n);
}
return get_default_file_name(type) + std::to_wstring(Num) + sExt;
} }
......
...@@ -77,8 +77,7 @@ namespace odf_writer ...@@ -77,8 +77,7 @@ namespace odf_writer
{ {
return boost::make_shared<simple_element>(FileName, Content, utf8); return boost::make_shared<simple_element>(FileName, Content, utf8);
} }
//-------------------------------------------------------------------------------
////////////
content_simple_ptr content_simple::create() content_simple_ptr content_simple::create()
{ {
return boost::make_shared<content_simple>(); return boost::make_shared<content_simple>();
...@@ -87,7 +86,7 @@ namespace odf_writer ...@@ -87,7 +86,7 @@ namespace odf_writer
{ {
return boost::make_shared<content_content>(); return boost::make_shared<content_content>();
} }
/////////////// //-------------------------------------------------------------------------------
void manifect_file::add_rels(rels & r) void manifect_file::add_rels(rels & r)
{ {
std::vector<relationship> & rels = r.relationships(); std::vector<relationship> & rels = r.relationships();
...@@ -174,23 +173,21 @@ namespace odf_writer ...@@ -174,23 +173,21 @@ namespace odf_writer
simple_element elm(L"meta.xml", resStream.str()); simple_element elm(L"meta.xml", resStream.str());
elm.write(RootPath); elm.write(RootPath);
} }
/////////////////////////// //-------------------------------------------------------------------------------
media::media(_mediaitems & mediaitems, const std::wstring internal_folder, int type) : mediaitems_(mediaitems), type_(type), folder_(internal_folder)
media::media(_mediaitems & mediaitems) : mediaitems_(mediaitems)
{ {
} }
void media::write(const std::wstring & RootPath) void media::write(const std::wstring & RootPath)
{ {
if (mediaitems_.count_media < 1)return; std::wstring path = RootPath + (folder_.empty() ? L"" : FILE_SEPARATOR_STR) + folder_;
std::wstring path = RootPath + FILE_SEPARATOR_STR + L"Media";
NSDirectory::CreateDirectory(path); NSDirectory::CreateDirectory(path);
std::vector< _mediaitems::item > & items = mediaitems_.items(); std::vector< _mediaitems::item > & items = mediaitems_.items();
for (size_t i = 0; i < items.size(); i++) for (size_t i = 0; i < items.size(); i++)
{ {
if (items[i].type == _mediaitems::typeMedia) if (items[i].type == type_)
{ {
std::wstring file_name_out = RootPath + FILE_SEPARATOR_STR + items[i].odf_ref; std::wstring file_name_out = RootPath + FILE_SEPARATOR_STR + items[i].odf_ref;
...@@ -198,49 +195,31 @@ namespace odf_writer ...@@ -198,49 +195,31 @@ namespace odf_writer
} }
} }
} }
//-------------------------------------------------------------------------------
pictures::pictures(_mediaitems & mediaitems) : mediaitems_(mediaitems)
{
}
void pictures::write(const std::wstring & RootPath)//folder by content.xml
{
if (mediaitems_.count_image < 1 )return;
std::wstring path = RootPath + FILE_SEPARATOR_STR + L"Pictures";
NSDirectory::CreateDirectory(path);
std::vector< _mediaitems::item > & items = mediaitems_.items();
for (size_t i = 0; i < items.size(); i++)
{
if (items[i].type == _mediaitems::typeImage && items[i].oox_ref.length()>0)
{
std::wstring file_name_out = RootPath + FILE_SEPARATOR_STR + items[i].odf_ref;
try
{
NSFile::CFileBinary::Copy(items[i].oox_ref, file_name_out);
}catch (...)
{
}
}
}
}
void object_files::set_content(content_content_ptr & _content) void object_files::set_content(content_content_ptr & _content)
{ {
content_.set_content(_content); content_.set_content(_content);
meta_ = element_ptr(new meta_file()); meta_ = element_ptr(new meta_file());
} }
void object_files::set_media(_mediaitems & mediaitems) void object_files::set_mediaitems(_mediaitems & mediaitems)
{
media_ = element_ptr( new media(mediaitems) );
}
void object_files::set_pictures(_mediaitems & mediaitems)
{ {
pictures_ = element_ptr( new pictures(mediaitems) ); if (mediaitems.count_image > 0)
{
pictures_ = element_ptr( new media(mediaitems, L"Picture", 1) );
}
if (mediaitems.count_media > 0)
{
media_ = element_ptr( new media(mediaitems, L"Media", 2) );
}
if (mediaitems.count_object > 0)
{
oleObjects_ = element_ptr( new media(mediaitems, L"", 3) );
}
if (mediaitems.count_object > 0)
{
imageObjects_ = element_ptr( new media(mediaitems, L"ObjectReplacements", 4) );
}
} }
void object_files::set_styles(content_simple_ptr & _content) void object_files::set_styles(content_simple_ptr & _content)
{ {
...@@ -258,8 +237,10 @@ namespace odf_writer ...@@ -258,8 +237,10 @@ namespace odf_writer
if (meta_) meta_->write(RootPath); if (meta_) meta_->write(RootPath);
if (media_) media_->write(RootPath); if (media_) media_->write(RootPath);
if (pictures_) pictures_->write(RootPath); if (pictures_) pictures_->write(RootPath);
if (oleObjects_) oleObjects_->write(RootPath);
if (imageObjects_) imageObjects_->write(RootPath);
} }
void odf_document::add_object(element_ptr _object, bool root) void odf_document::add_object(element_ptr _object, bool root)
......
...@@ -174,21 +174,13 @@ namespace odf_writer ...@@ -174,21 +174,13 @@ namespace odf_writer
class media : public element class media : public element
{ {
public: public:
media(_mediaitems & mediaitems); media(_mediaitems & mediaitems, const std::wstring internal_folder, int type);
virtual void write(const std::wstring & RootPath); virtual void write(const std::wstring & RootPath);
private: private:
_mediaitems & mediaitems_; _mediaitems& mediaitems_;
int type_;
}; std::wstring folder_;
class pictures : public element
{
public:
pictures(_mediaitems & mediaitems);
virtual void write(const std::wstring & RootPath);
private:
_mediaitems & mediaitems_;
}; };
class object_files : public element class object_files : public element
...@@ -201,8 +193,7 @@ namespace odf_writer ...@@ -201,8 +193,7 @@ namespace odf_writer
void set_styles (content_simple_ptr & _styles); void set_styles (content_simple_ptr & _styles);
void set_settings (content_simple_ptr & _settings); void set_settings (content_simple_ptr & _settings);
void set_media (_mediaitems & mediaitems); void set_mediaitems (_mediaitems & mediaitems);
void set_pictures (_mediaitems & mediaitems);
virtual void write(const std::wstring & RootPath); virtual void write(const std::wstring & RootPath);
...@@ -212,16 +203,18 @@ namespace odf_writer ...@@ -212,16 +203,18 @@ namespace odf_writer
styles_file styles_; styles_file styles_;
element_ptr meta_; element_ptr meta_;
element_ptr media_; element_ptr media_;
element_ptr pictures_; element_ptr pictures_;
}; element_ptr oleObjects_;
element_ptr imageObjects_;
};
class odf_document : public element class odf_document : public element
{ {
public: public:
odf_document(std::wstring type); odf_document(std::wstring type);
void add_object(element_ptr _object,bool root=false); void add_object(element_ptr _object,bool root = false);
void set_rels(rels & r); void set_rels(rels & r);
......
...@@ -150,13 +150,12 @@ void odf_conversion_context::end_document() ...@@ -150,13 +150,12 @@ void odf_conversion_context::end_document()
{ {
object_files->set_content (content_root_); object_files->set_content (content_root_);
object_files->set_styles (content_style_); object_files->set_styles (content_style_);
object_files->set_media (object.mediaitems); object_files->set_mediaitems(object.mediaitems);
object_files->set_pictures (object.mediaitems);
object_files->set_settings (content_settings_); object_files->set_settings (content_settings_);
if (!isRoot)object_files->local_path = object.name + L"/"; if (!isRoot)object_files->local_path = object.name + L"/";
object.mediaitems.dump_rels(rels_,object_files->local_path); object.mediaitems.dump_rels(rels_, object_files->local_path);
rels_.add(relationship(std::wstring(L"text/xml"), object_files->local_path + L"styles.xml")); rels_.add(relationship(std::wstring(L"text/xml"), object_files->local_path + L"styles.xml"));
rels_.add(relationship(std::wstring(L"text/xml"), object_files->local_path + L"content.xml")); rels_.add(relationship(std::wstring(L"text/xml"), object_files->local_path + L"content.xml"));
...@@ -311,6 +310,24 @@ std::wstring odf_conversion_context::add_media(const std::wstring & file_name) ...@@ -311,6 +310,24 @@ std::wstring odf_conversion_context::add_media(const std::wstring & file_name)
return odf_ref_name; return odf_ref_name;
} }
std::wstring odf_conversion_context::add_imageobject(const std::wstring & file_name)
{
if (file_name.empty()) return L"";
std::wstring odf_ref_name ;
mediaitems()->add_or_find(file_name,_mediaitems::typeObjectReplacement, odf_ref_name);
return odf_ref_name;
}
std::wstring odf_conversion_context::add_oleobject(const std::wstring & file_name)
{
if (file_name.empty()) return L"";
std::wstring odf_ref_name ;
mediaitems()->add_or_find(file_name,_mediaitems::typeOleObject, odf_ref_name);
return odf_ref_name;
}
void odf_conversion_context::add_tab(_CP_OPT(int) type, _CP_OPT(length) _length, _CP_OPT(int) leader) void odf_conversion_context::add_tab(_CP_OPT(int) type, _CP_OPT(length) _length, _CP_OPT(int) leader)
{ {
if (!temporary_.elm) return; if (!temporary_.elm) return;
......
...@@ -96,8 +96,10 @@ public: ...@@ -96,8 +96,10 @@ public:
virtual void start_text_context() = 0; virtual void start_text_context() = 0;
virtual void end_text_context() = 0; virtual void end_text_context() = 0;
std::wstring add_image(const std::wstring & image_file_name); std::wstring add_image (const std::wstring & image_file_name);
std::wstring add_media(const std::wstring & file_name); std::wstring add_media (const std::wstring & file_name);
std::wstring add_oleobject (const std::wstring & ole_file_name);
std::wstring add_imageobject(const std::wstring & ole_file_name);
virtual odf_style_context * styles_context(); virtual odf_style_context * styles_context();
......
...@@ -222,6 +222,7 @@ struct odf_drawing_state ...@@ -222,6 +222,7 @@ struct odf_drawing_state
_CP_OPT(presentation_class) presentation_class_; _CP_OPT(presentation_class) presentation_class_;
_CP_OPT(std::wstring) presentation_placeholder_; _CP_OPT(std::wstring) presentation_placeholder_;
std::wstring program_;
std::wstring replacement_; std::wstring replacement_;
std::wstring path_; std::wstring path_;
std::wstring view_box_; std::wstring view_box_;
...@@ -2655,6 +2656,10 @@ void odf_drawing_context::start_object_ole(std::wstring ref) ...@@ -2655,6 +2656,10 @@ void odf_drawing_context::start_object_ole(std::wstring ref)
{ {
start_frame(); start_frame();
impl_->current_graphic_properties->common_draw_fill_attlist_.draw_fill_ = draw_fill::none;
impl_->current_graphic_properties->draw_stroke_ = line_style(line_style::None);
impl_->current_graphic_properties->draw_ole_draw_aspect_ = 1;
//------------------------------------------------------------------------------------------------------
office_element_ptr object_elm; office_element_ptr object_elm;
create_element(L"draw", L"object-ole", object_elm, impl_->odf_context_); create_element(L"draw", L"object-ole", object_elm, impl_->odf_context_);
...@@ -2682,6 +2687,11 @@ void odf_drawing_context::set_image_replacement(std::wstring ref) ...@@ -2682,6 +2687,11 @@ void odf_drawing_context::set_image_replacement(std::wstring ref)
impl_->current_drawing_state_.replacement_ = ref; impl_->current_drawing_state_.replacement_ = ref;
} }
void odf_drawing_context::set_program(std::wstring program)
{
impl_->current_drawing_state_.program_ = program;
}
bool odf_drawing_context::is_exist_content() bool odf_drawing_context::is_exist_content()
{ {
return (impl_->drawing_list_.empty() ? false : true); return (impl_->drawing_list_.empty() ? false : true);
......
...@@ -153,6 +153,8 @@ public: ...@@ -153,6 +153,8 @@ public:
void add_image_replacement(); void add_image_replacement();
void set_image_replacement(std::wstring ref); void set_image_replacement(std::wstring ref);
void set_program(std::wstring program);
bool isLineShape(); bool isLineShape();
void corrected_line_fill(); void corrected_line_fill();
......
...@@ -56,7 +56,7 @@ namespace utils ...@@ -56,7 +56,7 @@ namespace utils
void calculate_size_font_symbols(_font_metrix & metrix, CApplicationFonts *appFonts) void calculate_size_font_symbols(_font_metrix & metrix, CApplicationFonts *appFonts)
{ {
double appr_px = _graphics_utils_::calculate_size_symbol_asc(metrix.font_name,metrix.font_size,metrix.italic,metrix.bold, appFonts); double appr_px = _graphics_utils_::calculate_size_symbol_asc(metrix.font_name, metrix.font_size, metrix.italic, metrix.bold, appFonts);
if (appr_px <0.01) if (appr_px <0.01)
{ {
...@@ -357,12 +357,15 @@ void ods_conversion_context::end_cell() ...@@ -357,12 +357,15 @@ void ods_conversion_context::end_cell()
} }
void ods_conversion_context::calculate_font_metrix(std::wstring name, double size, bool italic, bool bold) void ods_conversion_context::calculate_font_metrix(std::wstring name, double size, bool italic, bool bold)
{ {
if (font_metrix_.IsCalc)return; if (font_metrix_.IsCalc) return;
font_metrix_.font_size = size; if (size < 1)
font_metrix_.italic = italic; size = 12;
font_metrix_.bold = bold;
font_metrix_.font_name = name; font_metrix_.font_size = size;
font_metrix_.italic = italic;
font_metrix_.bold = bold;
font_metrix_.font_name = name;
//////////////////////////////////////////// ////////////////////////////////////////////
utils::calculate_size_font_symbols(font_metrix_, applicationFonts_); utils::calculate_size_font_symbols(font_metrix_, applicationFonts_);
......
...@@ -69,7 +69,7 @@ public: ...@@ -69,7 +69,7 @@ public:
void add_column(int start_column, int repeated, int level = 0, bool _default = false); void add_column(int start_column, int repeated, int level = 0, bool _default = false);
void end_columns(); void end_columns();
void calculate_font_metrix(std::wstring name, double size, bool italic, bool bold); void calculate_font_metrix(std::wstring name, double size, bool italic, bool bold);
void start_rows(); void start_rows();
void start_row(int _start_row, int repeated, int level = 0, bool _default = false); void start_row(int _start_row, int repeated, int level = 0, bool _default = false);
......
...@@ -62,7 +62,9 @@ void graphic_format_properties::apply_from(const graphic_format_properties & Oth ...@@ -62,7 +62,9 @@ void graphic_format_properties::apply_from(const graphic_format_properties & Oth
_CP_APPLY_PROP2(draw_auto_grow_width_); _CP_APPLY_PROP2(draw_auto_grow_width_);
_CP_APPLY_PROP2(draw_fit_to_size_); _CP_APPLY_PROP2(draw_fit_to_size_);
_CP_APPLY_PROP2(draw_fit_to_contour_); _CP_APPLY_PROP2(draw_fit_to_contour_);
_CP_APPLY_PROP2(draw_wrap_influence_on_position_);
_CP_APPLY_PROP2(draw_ole_draw_aspect_);
_CP_APPLY_PROP2(svg_stroke_color_); _CP_APPLY_PROP2(svg_stroke_color_);
_CP_APPLY_PROP2(svg_stroke_width_); _CP_APPLY_PROP2(svg_stroke_width_);
_CP_APPLY_PROP2(svg_stroke_opacity_); _CP_APPLY_PROP2(svg_stroke_opacity_);
...@@ -86,7 +88,6 @@ void graphic_format_properties::apply_from(const graphic_format_properties & Oth ...@@ -86,7 +88,6 @@ void graphic_format_properties::apply_from(const graphic_format_properties & Oth
_CP_APPLY_PROP2(style_overflow_behavior_); _CP_APPLY_PROP2(style_overflow_behavior_);
_CP_APPLY_PROP2(style_mirror_); _CP_APPLY_PROP2(style_mirror_);
_CP_APPLY_PROP2(fo_clip_); _CP_APPLY_PROP2(fo_clip_);
_CP_APPLY_PROP2(draw_wrap_influence_on_position_);
common_draw_fill_attlist_.apply_from(Other.common_draw_fill_attlist_); common_draw_fill_attlist_.apply_from(Other.common_draw_fill_attlist_);
common_draw_rel_size_attlist_.apply_from(Other.common_draw_rel_size_attlist_); common_draw_rel_size_attlist_.apply_from(Other.common_draw_rel_size_attlist_);
...@@ -123,6 +124,7 @@ void graphic_format_properties::serialize(std::wostream & _Wostream ,const wchar ...@@ -123,6 +124,7 @@ void graphic_format_properties::serialize(std::wostream & _Wostream ,const wchar
CP_XML_ATTR_OPT(L"draw:auto-grow-width", draw_auto_grow_width_); CP_XML_ATTR_OPT(L"draw:auto-grow-width", draw_auto_grow_width_);
CP_XML_ATTR_OPT(L"draw:fit-to-size", draw_fit_to_size_); CP_XML_ATTR_OPT(L"draw:fit-to-size", draw_fit_to_size_);
CP_XML_ATTR_OPT(L"draw:fit-to-contour", draw_fit_to_contour_); CP_XML_ATTR_OPT(L"draw:fit-to-contour", draw_fit_to_contour_);
CP_XML_ATTR_OPT(L"draw:ole-draw-aspect", draw_ole_draw_aspect_);
CP_XML_ATTR_OPT(L"draw:stroke", draw_stroke_); CP_XML_ATTR_OPT(L"draw:stroke", draw_stroke_);
CP_XML_ATTR_OPT(L"draw:stroke-dash", draw_stroke_dash_); CP_XML_ATTR_OPT(L"draw:stroke-dash", draw_stroke_dash_);
......
...@@ -103,7 +103,8 @@ public: ...@@ -103,7 +103,8 @@ public:
_CP_OPT(odf_types::color) draw_shadow_color_; _CP_OPT(odf_types::color) draw_shadow_color_;
_CP_OPT(odf_types::length) draw_shadow_offset_y_; _CP_OPT(odf_types::length) draw_shadow_offset_y_;
_CP_OPT(odf_types::length) draw_shadow_offset_x_; _CP_OPT(odf_types::length) draw_shadow_offset_x_;
_CP_OPT(unsigned int) draw_ole_draw_aspect_;
odf_types::common_draw_fill_attlist common_draw_fill_attlist_; odf_types::common_draw_fill_attlist common_draw_fill_attlist_;
odf_types::common_draw_rel_size_attlist common_draw_rel_size_attlist_; odf_types::common_draw_rel_size_attlist common_draw_rel_size_attlist_;
...@@ -143,8 +144,8 @@ public: ...@@ -143,8 +144,8 @@ public:
_CP_OPT(std::wstring) style_mirror_; _CP_OPT(std::wstring) style_mirror_;
_CP_OPT(std::wstring) fo_clip_; _CP_OPT(std::wstring) fo_clip_;
//////////////////////////////////////////////////////////////////////// //-------------------------------------------------------------------------------------
office_element_ptr style_background_image_; office_element_ptr style_background_image_;
}; };
......
...@@ -203,25 +203,25 @@ void OoxConverter::convert(PPTX::Logic::Pic *oox_picture) ...@@ -203,25 +203,25 @@ void OoxConverter::convert(PPTX::Logic::Pic *oox_picture)
} }
} }
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
std::wstring odf_ref_image; bool bEmbedded = true;
std::wstring pathImage; std::wstring pathImage;
if (oox_picture->blipFill.blip.IsInit()) if (oox_picture->blipFill.blip.IsInit())
{ {
bool bEmbedded = true;
if (oox_picture->blipFill.blip->embed.IsInit()) if (oox_picture->blipFill.blip->embed.IsInit())
{ {
std::wstring sID = oox_picture->blipFill.blip->embed->get(); std::wstring sID = oox_picture->blipFill.blip->embed->get();
pathImage = find_link_by_id(sID, 1); pathImage = find_link_by_id(sID, 1);
odf_ref_image = odf_context()->add_image(pathImage);
} }
else if (oox_picture->blipFill.blip->link.IsInit()) else if (oox_picture->blipFill.blip->link.IsInit())
{ {
odf_ref_image = oox_picture->blipFill.blip->link->get(); pathImage = oox_picture->blipFill.blip->link->get();
bEmbedded = false; bEmbedded = false;
} }
} }
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
std::wstring odf_ref_image;
if (oox_picture->nvPicPr.nvPr.media.is_init()) if (oox_picture->nvPicPr.nvPr.media.is_init())
{ {
if (oox_picture->nvPicPr.nvPr.media.is<PPTX::Logic::MediaFile>()) if (oox_picture->nvPicPr.nvPr.media.is<PPTX::Logic::MediaFile>())
...@@ -238,7 +238,7 @@ void OoxConverter::convert(PPTX::Logic::Pic *oox_picture) ...@@ -238,7 +238,7 @@ void OoxConverter::convert(PPTX::Logic::Pic *oox_picture)
PPTX::Logic::Ext & ext = oox_picture->nvPicPr.nvPr.extLst[i]; PPTX::Logic::Ext & ext = oox_picture->nvPicPr.nvPr.extLst[i];
if (pathMedia.empty() && ext.link.IsInit()) if (pathMedia.empty() && ext.link.IsInit())
{ {
pathMedia= find_link_by_id(ext.link->get(), 3); pathMedia = find_link_by_id(ext.link->get(), 3);
//например файлики mp3 //например файлики mp3
} }
if (ext.st.IsInit()) start = *ext.st; if (ext.st.IsInit()) start = *ext.st;
...@@ -255,6 +255,7 @@ void OoxConverter::convert(PPTX::Logic::Pic *oox_picture) ...@@ -255,6 +255,7 @@ void OoxConverter::convert(PPTX::Logic::Pic *oox_picture)
OoxConverter::convert(&oox_picture->nvPicPr.cNvPr); OoxConverter::convert(&oox_picture->nvPicPr.cNvPr);
OoxConverter::convert(&oox_picture->spPr, oox_picture->style.GetPointer()); OoxConverter::convert(&oox_picture->spPr, oox_picture->style.GetPointer());
odf_ref_image = bEmbedded ? odf_context()->add_image(pathImage) : pathImage;
odf_context()->drawing_context()->set_image_replacement(odf_ref_image); odf_context()->drawing_context()->set_image_replacement(odf_ref_image);
odf_context()->drawing_context()->end_media(); odf_context()->drawing_context()->end_media();
...@@ -265,15 +266,32 @@ void OoxConverter::convert(PPTX::Logic::Pic *oox_picture) ...@@ -265,15 +266,32 @@ void OoxConverter::convert(PPTX::Logic::Pic *oox_picture)
} }
if (oox_picture->oleObject.IsInit()) if (oox_picture->oleObject.IsInit())
{ {
//nullable_limit<Limit::OLEDrawAspectType>m_oDrawAspect; std::wstring pathOle;
//nullable<OOX::RId> m_oId;
//nullable_string m_sObjectId; if (oox_picture->oleObject->m_oId.IsInit())
//nullable_string m_sProgId; {
//nullable_string m_sShapeId; pathOle = find_link_by_id(oox_picture->oleObject->m_oId->get(), 4);
//nullable_limit<Limit::OLEType> m_oType; }
//nullable_limit<Limit::OLEUpdateMode> m_oUpdateMode; std::wstring odf_ref_ole = odf_context()->add_oleobject(pathOle);
if (!odf_ref_ole.empty())
{
odf_context()->drawing_context()->start_object_ole(odf_ref_ole);
if (oox_picture->oleObject->m_sProgId.IsInit())
{
odf_context()->drawing_context()->set_program(*oox_picture->oleObject->m_sProgId);
}
odf_ref_image = bEmbedded ? odf_context()->add_imageobject(pathImage) : pathImage;
odf_context()->drawing_context()->set_image_replacement(odf_ref_image);
odf_context()->drawing_context()->end_object_ole();
return;
}
} }
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
odf_ref_image = bEmbedded ? odf_context()->add_image(pathImage) : pathImage;
odf_context()->drawing_context()->start_image(odf_ref_image); odf_context()->drawing_context()->start_image(odf_ref_image);
{ {
double Width = 0, Height = 0; double Width = 0, Height = 0;
......
...@@ -328,6 +328,13 @@ std::wstring OoxConverter::find_link_by (smart_ptr<OOX::File> & oFile, int type) ...@@ -328,6 +328,13 @@ std::wstring OoxConverter::find_link_by (smart_ptr<OOX::File> & oFile, int type)
if (pMedia) if (pMedia)
ref = pMedia->filename().GetPath(); ref = pMedia->filename().GetPath();
} }
if (type == 4)
{
OOX::OleObject* pOleObject = dynamic_cast<OOX::OleObject*>(oFile.operator->());
if (pOleObject)
ref = pOleObject->filename().GetPath();
}
return ref; return ref;
} }
......
...@@ -3150,7 +3150,7 @@ void DocxConverter::convert(OOX::Numbering::CLvl* oox_num_lvl) ...@@ -3150,7 +3150,7 @@ void DocxConverter::convert(OOX::Numbering::CLvl* oox_num_lvl)
int id = oox_num_lvl->m_oLvlPicBulletId->m_oVal->GetValue(); int id = oox_num_lvl->m_oLvlPicBulletId->m_oVal->GetValue();
OOX::CNumbering * lists_styles = docx_document->GetNumbering(); OOX::CNumbering * lists_styles = docx_document->GetNumbering();
for (size_t i = 0; (lists_styles) && (i< lists_styles->m_arrNumPicBullet.size()); i++) for (size_t i = 0; (lists_styles) && (i < lists_styles->m_arrNumPicBullet.size()); i++)
{ {
if ((lists_styles->m_arrNumPicBullet[i]) && (lists_styles->m_arrNumPicBullet[i]->m_oNumPicBulletId.GetValue() == id)) if ((lists_styles->m_arrNumPicBullet[i]) && (lists_styles->m_arrNumPicBullet[i]->m_oNumPicBulletId.GetValue() == id))
{ {
......
...@@ -295,17 +295,20 @@ void XlsxConverter::convert(OOX::Spreadsheet::CWorksheet *oox_sheet) ...@@ -295,17 +295,20 @@ void XlsxConverter::convert(OOX::Spreadsheet::CWorksheet *oox_sheet)
{ {
OOX::Spreadsheet::CDrawing* pDrawing = (OOX::Spreadsheet::CDrawing*)oFile.operator->(); OOX::Spreadsheet::CDrawing* pDrawing = (OOX::Spreadsheet::CDrawing*)oFile.operator->();
convert(pDrawing); convert(pDrawing, oox_sheet);
} }
} }
////сортировки
convert(oox_sheet->m_oOleObjects.GetPointer(), oox_sheet);
//сортировки
//convert(oox_sheet->m_oSortState.GetPointer()); //convert(oox_sheet->m_oSortState.GetPointer());
//автофильтры //автофильтры
convert(oox_sheet->m_oAutofilter.GetPointer()); convert(oox_sheet->m_oAutofilter.GetPointer());
//условное форматирование //условное форматирование
if (oox_sheet->m_arrConditionalFormatting.size() >0) if (!oox_sheet->m_arrConditionalFormatting.empty() )
{ {
ods_context->start_conditional_formats(); ods_context->start_conditional_formats();
for (size_t fmt =0; fmt < oox_sheet->m_arrConditionalFormatting.size(); fmt++) for (size_t fmt =0; fmt < oox_sheet->m_arrConditionalFormatting.size(); fmt++)
...@@ -1232,7 +1235,7 @@ void XlsxConverter::convert_styles() ...@@ -1232,7 +1235,7 @@ void XlsxConverter::convert_styles()
void XlsxConverter::convert(OOX::Spreadsheet::CFont * font, odf_writer::style_text_properties * text_properties) void XlsxConverter::convert(OOX::Spreadsheet::CFont *font, odf_writer::style_text_properties *text_properties)
{ {
if (font == NULL)return; if (font == NULL)return;
if (text_properties == NULL)return; if (text_properties == NULL)return;
...@@ -1271,7 +1274,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::CFont * font, odf_writer::style_te ...@@ -1271,7 +1274,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::CFont * font, odf_writer::style_te
} }
} }
} }
if (font->m_oItalic.IsInit() && (font->m_oItalic->m_oVal.ToBool() ==true))font_italic = true; if (font->m_oItalic.IsInit() && (font->m_oItalic->m_oVal.ToBool() ==true)) font_italic = true;
if (font_italic) text_properties->content_.fo_font_style_ = odf_types::font_style(odf_types::font_style::Italic); if (font_italic) text_properties->content_.fo_font_style_ = odf_types::font_style(odf_types::font_style::Italic);
else text_properties->content_.fo_font_style_ = odf_types::font_style(odf_types::font_style::Normal); else text_properties->content_.fo_font_style_ = odf_types::font_style(odf_types::font_style::Normal);
...@@ -1322,7 +1325,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::CFont * font, odf_writer::style_te ...@@ -1322,7 +1325,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::CFont * font, odf_writer::style_te
if ((font->m_oStrike.IsInit()) && (font->m_oStrike->m_oVal.ToBool())) if ((font->m_oStrike.IsInit()) && (font->m_oStrike->m_oVal.ToBool()))
text_properties->content_.style_text_line_through_type_ = odf_types::line_type(odf_types::line_type::Single); text_properties->content_.style_text_line_through_type_ = odf_types::line_type(odf_types::line_type::Single);
ods_context->calculate_font_metrix(font_name,font_size,font_italic,font_bold); ods_context->calculate_font_metrix(font_name, font_size, font_italic, font_bold);
} }
void XlsxConverter::convert(double oox_size, _CP_OPT(odf_types::length) & odf_size) void XlsxConverter::convert(double oox_size, _CP_OPT(odf_types::length) & odf_size)
...@@ -1818,7 +1821,6 @@ void XlsxConverter::convert(OOX::Spreadsheet::CCellAnchor *oox_anchor) ...@@ -1818,7 +1821,6 @@ void XlsxConverter::convert(OOX::Spreadsheet::CCellAnchor *oox_anchor)
{ {
if (!oox_anchor) return; if (!oox_anchor) return;
if (oox_anchor->m_bShapeOle) return;
////////////////// //////////////////
if (oox_anchor->m_oFrom.IsInit() || oox_anchor->m_oTo.IsInit()) if (oox_anchor->m_oFrom.IsInit() || oox_anchor->m_oTo.IsInit())
{ {
...@@ -1859,22 +1861,107 @@ void XlsxConverter::convert(OOX::Spreadsheet::CCellAnchor *oox_anchor) ...@@ -1859,22 +1861,107 @@ void XlsxConverter::convert(OOX::Spreadsheet::CCellAnchor *oox_anchor)
odf_context()->drawing_context()->end_drawing(); odf_context()->drawing_context()->end_drawing();
} }
void XlsxConverter::convert(OOX::Spreadsheet::CDrawing *oox_drawing) void XlsxConverter::convert(OOX::Spreadsheet::CDrawing *oox_drawing, OOX::Spreadsheet::CWorksheet *oox_sheet)
{ {
if (!oox_drawing)return; if (!oox_drawing)return;
OOX::IFileContainer* old_container = xlsx_current_container; OOX::IFileContainer* old_container = xlsx_current_container;
xlsx_current_container = dynamic_cast<OOX::IFileContainer*>(oox_drawing); xlsx_current_container = dynamic_cast<OOX::IFileContainer*>(oox_drawing);
for (size_t dr = 0 ; dr < oox_drawing->m_arrItems.size(); dr++) for (size_t i = 0; i < oox_drawing->m_arrItems.size(); i++)
{ {
OOX::Spreadsheet::CCellAnchor * oox_anchor = oox_drawing->m_arrItems[i];
if (oox_anchor->m_bShapeOle) continue;
if (oox_sheet->m_oOleObjects.IsInit() && oox_anchor->m_nId.IsInit())
{
std::map<int, OOX::Spreadsheet::COleObject*>::const_iterator pFind = oox_sheet->m_oOleObjects->m_mapOleObjects.find(oox_anchor->m_nId.get());
if (pFind != oox_sheet->m_oOleObjects->m_mapOleObjects.end())
{
//??? перенести даные привязки
oox_anchor->m_bShapeOle = true;
continue;
}
}
ods_context->start_drawings(); ods_context->start_drawings();
convert(oox_drawing->m_arrItems[dr]); convert(oox_anchor);
ods_context->end_drawings(); ods_context->end_drawings();
} }
xlsx_current_container = old_container; xlsx_current_container = old_container;
} }
void XlsxConverter::convert(OOX::Spreadsheet::COleObjects *oox_objects, OOX::Spreadsheet::CWorksheet *oox_sheet)
{
if (!oox_objects) return;
for (std::map<int, OOX::Spreadsheet::COleObject*>::const_iterator it = oox_objects->m_mapOleObjects.begin(); it != oox_objects->m_mapOleObjects.end(); ++it)
{
OOX::Spreadsheet::COleObject* object = it->second;
ods_context->start_drawings();
bool bAnchor = false;
std::wstring odf_ref_object, odf_ref_image;
if (object->m_oObjectPr.IsInit())
{
if (object->m_oObjectPr->m_oAnchor.IsInit())
{
bAnchor = true;
oox_table_position from = {}, to = {};
convert(object->m_oObjectPr->m_oAnchor->m_oFrom.GetPointer(), &from);
convert(object->m_oObjectPr->m_oAnchor->m_oTo.GetPointer(), &to);
double x1 = 0, y1 = 0, x2 = 0, y2 = 0;
ods_context->current_table().convert_position(from, x1, y1);
ods_context->current_table().convert_position(to, x2, y2);
ods_context->drawing_context()->set_drawings_rect(x1, y1, x2 - x1, y2 - y1);
}
}
if (object->m_oRid.IsInit())
{
std::wstring pathOle;
std::wstring sID = object->m_oRid->GetValue();
pathOle = find_link_by_id(sID, 4);
odf_ref_object = odf_context()->add_oleobject(pathOle);
}
if ((object->m_oObjectPr.IsInit()) && (object->m_oObjectPr->m_oRid.IsInit()))
{
std::wstring pathImage;
std::wstring sID = object->m_oObjectPr->m_oRid->GetValue();
pathImage = find_link_by_id(sID, 1);
odf_ref_image = odf_context()->add_imageobject(pathImage);
}
//--------------------------------------------------------------------------------------------------
if (!bAnchor || odf_ref_image.empty())
{
//from vml drawing or oox drawing
//m_oShapeId;
}
//--------------------------------------------------------------------------------------------------
ods_context->drawing_context()->start_drawing();
ods_context->drawing_context()->start_object_ole(odf_ref_object);
ods_context->drawing_context()->set_image_replacement(odf_ref_image);
if (object->m_oProgId.IsInit())
{
ods_context->drawing_context()->set_program(*object->m_oProgId);
}
ods_context->drawing_context()->end_object_ole();
ods_context->drawing_context()->end_drawing();
ods_context->end_drawings();
}
}
void XlsxConverter::convert(OOX::Spreadsheet::CFromTo* oox_from_to, oox_table_position * pos) void XlsxConverter::convert(OOX::Spreadsheet::CFromTo* oox_from_to, oox_table_position * pos)
......
...@@ -47,7 +47,6 @@ namespace OOX ...@@ -47,7 +47,6 @@ namespace OOX
class WritingElement; class WritingElement;
class CWorksheet; class CWorksheet;
class CDrawing;
class CTable; class CTable;
class CCol; class CCol;
class CRow; class CRow;
...@@ -69,8 +68,9 @@ namespace OOX ...@@ -69,8 +68,9 @@ namespace OOX
class CDxf; class CDxf;
class CCellStyle; class CCellStyle;
class CNumFmt; class CNumFmt;
class CCellAnchor; class COleObjects;
class CDrawing; class CDrawing;
class CCellAnchor;
class CFromTo; class CFromTo;
class CCommentItem; class CCommentItem;
class CDefinedName; class CDefinedName;
...@@ -182,18 +182,19 @@ namespace Oox2Odf ...@@ -182,18 +182,19 @@ namespace Oox2Odf
void convert(OOX::Spreadsheet::CColor *color, _CP_OPT(odf_types::color) & odf_color); void convert(OOX::Spreadsheet::CColor *color, _CP_OPT(odf_types::color) & odf_color);
void convert(OOX::Spreadsheet::CColor *color, _CP_OPT(odf_types::background_color) & odf_bckgrd_color); void convert(OOX::Spreadsheet::CColor *color, _CP_OPT(odf_types::background_color) & odf_bckgrd_color);
void convert(OOX::Spreadsheet::CBorderProp *borderProp, std::wstring & odf_border_prop); void convert(OOX::Spreadsheet::CBorderProp *borderProp, std::wstring & odf_border_prop);
void convert(OOX::Spreadsheet::CAligment *aligment, odf_writer::style_paragraph_properties * paragraph_properties, void convert(OOX::Spreadsheet::CAligment *aligment, odf_writer::style_paragraph_properties *paragraph_properties,
odf_writer::style_table_cell_properties * cell_properties); odf_writer::style_table_cell_properties *cell_properties);
void convert(OOX::Spreadsheet::CXfs *cell_style, int oox_id, bool automatic=true, bool root = false); void convert(OOX::Spreadsheet::CXfs *cell_style, int oox_id, bool automatic = true, bool root = false);
void convert(OOX::Spreadsheet::CCellStyle *cell_style); void convert(OOX::Spreadsheet::CCellStyle *cell_style);
void convert(OOX::Spreadsheet::CNumFmt *numFmt); void convert(OOX::Spreadsheet::CNumFmt *numFmt);
void convert(OOX::Spreadsheet::CDxf *dxFmt, int oox_id); void convert(OOX::Spreadsheet::CDxf *dxFmt, int oox_id);
void convert(OOX::Spreadsheet::CCellAnchor *oox_anchor); void convert(OOX::Spreadsheet::CCellAnchor *oox_anchor);
void convert(OOX::Spreadsheet::CDrawing *oox_drawing); void convert(OOX::Spreadsheet::CDrawing *oox_drawing, OOX::Spreadsheet::CWorksheet *oox_sheet);
void convert(OOX::Spreadsheet::COleObjects *oox_objects, OOX::Spreadsheet::CWorksheet *oox_sheet);
void convert(OOX::Spreadsheet::CFromTo *oox_from_to, oox_table_position * pos); void convert(OOX::Spreadsheet::CFromTo *oox_from_to, oox_table_position *pos);
void convert(OOX::Spreadsheet::CConditionalFormatting *oox_cond_fmt); void convert(OOX::Spreadsheet::CConditionalFormatting *oox_cond_fmt);
void convert(OOX::Spreadsheet::CConditionalFormattingRule *oox_cond_rule); void convert(OOX::Spreadsheet::CConditionalFormattingRule *oox_cond_rule);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment