コード例 #1
0
ファイル: draw_shapes_xlsx.cpp プロジェクト: ONLYOFFICE/core
void draw_control::xlsx_convert(oox::xlsx_conversion_context & Context)
{
	if (!control_id_) return;

	oox::forms_context::_state & state = Context.get_forms_context().get_state_element(*control_id_);
	if (state.id.empty()) return;

	if (state.ctrlPropId.empty())
	{
		std::wstring target;
		state.ctrlPropId = Context.get_mediaitems().add_control_props(target);
		
		std::wstringstream strm;		
		
		form_element* control = dynamic_cast<form_element*>(state.element);
		if (control)
		{
			control->serialize_control_props(strm);
		}

		Context.add_control_props(state.ctrlPropId, target, strm.str());
	}

	Context.get_drawing_context().start_frame();
	Context.get_drawing_context().set_control(state.ctrlPropId);
	
	common_xlsx_convert(Context);

	Context.get_drawing_context().end_frame();
	Context.get_drawing_context().clear();

}
コード例 #2
0
ファイル: draw_common.cpp プロジェクト: ShockwaveNN/core
void xlsx_convert_transforms(std::wstring transformStr, oox::xlsx_conversion_context & Context)
{
	std::vector<std::wstring> transforms;
	
	boost::algorithm::split(transforms,transformStr, boost::algorithm::is_any_of(L")"), boost::algorithm::token_compress_on);
	
	for (size_t i = 0; i < transforms.size(); i++)
	{			
		std::vector<std::wstring> transform;
		boost::algorithm::split(transform, transforms[i], boost::algorithm::is_any_of(L"("), boost::algorithm::token_compress_on);

		if (transform.size()>1)//тока с аргументами
		{
			int res=0;
			if ((res = transform[0].find(L"translate"))>=0)//перемещение
			{
				std::vector<length> Points ;
				parse_string_to_points(transform[1], Points);

				if (Points.size()>0)
				{
					double x_pt = Points[0].get_value_unit(length::pt);
					double y_pt = 0;
					if (Points.size()>1)y_pt = Points[1].get_value_unit(length::pt);//ее может не быть

					Context.get_drawing_context().set_translate(x_pt,y_pt);
				}
			}
			else if ((res = transform[0].find(L"scale"))>=0)//масштабирование
			{
				std::vector<length> Points ;
				parse_string_to_points(transform[1], Points);
				if (Points.size()>0)
				{
					double x_pt = Points[0].get_value_unit(length::pt);
					double y_pt = x_pt; 
					if (Points.size()>1)y_pt = Points[1].get_value_unit(length::pt);//ее может не быть

					Context.get_drawing_context().set_scale(x_pt,y_pt);
				}
			}
			else if ((res = transform[0].find(L"rotate"))>=0)//вращение
			{
				Context.get_drawing_context().set_rotate(boost::lexical_cast<double>(transform[1]));
			}
			else if ((res = transform[0].find(L"skewX"))>=0)//сдвиг
			{
				double angle =  boost::lexical_cast<double>(transform[1]);
				Context.get_drawing_context().set_property(_property(L"svg:skewX",angle));
			}
			else if ((res = transform[0].find(L"skewY"))>=0)//сдвиг
			{
				double angle =  boost::lexical_cast<double>(transform[1]);
				Context.get_drawing_context().set_property(_property(L"svg:skewY",angle));
			}
		}
	}
}
コード例 #3
0
ファイル: draw_shapes_xlsx.cpp プロジェクト: ONLYOFFICE/core
void draw_custom_shape::xlsx_convert(oox::xlsx_conversion_context & Context)
{
	Context.get_drawing_context().start_shape(7);

	common_xlsx_convert(Context);

	Context.get_drawing_context().end_shape();
	Context.get_drawing_context().clear();
}
コード例 #4
0
ファイル: draw_common.cpp プロジェクト: ShockwaveNN/core
void draw_a::xlsx_convert(oox::xlsx_conversion_context & Context)
{
	Context.get_drawing_context().start_action(L"");
		Context.get_drawing_context().set_link(common_xlink_attlist_.href_.get_value_or(L""));
 	Context.get_drawing_context().end_action();
   
	for (size_t i = 0; i < content_.size(); i++)
    {
        content_[i]->xlsx_convert(Context);
    }
}
コード例 #5
0
void draw_chart::xlsx_convert(oox::xlsx_conversion_context & Context)
{
    const std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
    Context.get_drawing_context().start_chart(href);

 	for (int i = 0 ; i < content_.size(); i++)
    {
		content_[i]->xlsx_convert(Context);
    }
    Context.get_drawing_context().end_chart();
}
コード例 #6
0
ファイル: draw_shapes_xlsx.cpp プロジェクト: ONLYOFFICE/core
void dr3d_scene::xlsx_convert(oox::xlsx_conversion_context & Context)
{
	//const std::wstring style = common_shape_draw_attlist_.draw_text_style_name_.get_value_or(L"");

	Context.get_drawing_context().start_shape(1);//rect с наваротами-атрибутами .. а-ля TextBox
	
	common_xlsx_convert(Context);

	Context.get_drawing_context().end_shape();
	Context.get_drawing_context().clear();
}
コード例 #7
0
ファイル: draw_shapes_xlsx.cpp プロジェクト: ONLYOFFICE/core
void draw_polyline::xlsx_convert(oox::xlsx_conversion_context & Context)
{
	reset_polyline_path();
///////////////////////////////////////////////////////////////////////
	Context.get_drawing_context().start_shape(8);

	common_xlsx_convert(Context);

	Context.get_drawing_context().end_shape();
	Context.get_drawing_context().clear();
}
コード例 #8
0
ファイル: draw_shapes_xlsx.cpp プロジェクト: ONLYOFFICE/core
void draw_line::xlsx_convert(oox::xlsx_conversion_context & Context)
{
	Context.get_drawing_context().start_shape(5);
	
	reset_svg_attributes();
	
	common_xlsx_convert(Context);

	Context.get_drawing_context().end_shape();
	Context.get_drawing_context().clear();
}
コード例 #9
0
void draw_object_ole::xlsx_convert(oox::xlsx_conversion_context & Context)
{
	//временно - замещающая картинка(если она конечно присутствует)
	//Context.get_drawing_context().start_object_ole();

	Context.get_drawing_context().set_use_image_replacement();

	//Context.get_drawing_context().end_object_ole();
}
コード例 #10
0
void draw_text_box::xlsx_convert(oox::xlsx_conversion_context & Context)
{
	Context.get_drawing_context().start_shape(2);//rect с наваротами
	Context.get_text_context().start_drawing_content();

	for (int i = 0 ; i < content_.size(); i++)
    {
		content_[i]->xlsx_convert(Context);
    }

	std::wstring text_content_ = Context.get_text_context().end_drawing_content();

	if (text_content_.length()>0)
	{
		Context.get_drawing_context().set_property(_property(L"text-content",text_content_));
	}
    Context.get_drawing_context().end_shape();  
}
コード例 #11
0
void draw_image::xlsx_convert(oox::xlsx_conversion_context & Context)
{
    const std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
    Context.get_drawing_context().start_image(href);
////////////////////////////////////в принципе достаточно общая часть ...
	Context.get_text_context().start_drawing_content();//...  если в объекте есть текст он привяжется к объекту - иначе к ячейке

	for (int i = 0 ; i < content_.size(); i++)
    {
		content_[i]->xlsx_convert(Context);
    }
	std::wstring text_content_ = Context.get_text_context().end_drawing_content();

	if (text_content_.length()>0)
	{
		Context.get_drawing_context().set_property(_property(L"text-content",text_content_));
	}
////////////////////////////////////////////////////////////////////////////3 раза уже повторилась Content -> Context
    Context.get_drawing_context().end_image();
}
コード例 #12
0
ファイル: draw_shapes_xlsx.cpp プロジェクト: ONLYOFFICE/core
void draw_connector::xlsx_convert(oox::xlsx_conversion_context & Context)
{
	if (draw_connector_attlist_.draw_type_)
	{
		if (*draw_connector_attlist_.draw_type_ == L"curve")
		{
			sub_type_ = 11;
		}
	}
	reset_svg_attributes();	

	reset_svg_path();
///////////////////////////////////////////////////////////////////////
	Context.get_drawing_context().start_shape(6);

	common_xlsx_convert(Context);

	Context.get_drawing_context().end_shape();
	Context.get_drawing_context().clear();
}
コード例 #13
0
void draw_object::xlsx_convert(oox::xlsx_conversion_context & Context)
{
    try {
        const std::wstring href		= common_xlink_attlist_.href_.get_value_or(L"");

        odf_reader::odf_document * odf_reader = Context.root();
        
		std::wstring folderPath = odf_reader->get_folder();
        std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href;

		// normalize path ???? todooo
		boost::algorithm::replace_all(objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR);

        cpdoccore::odf_reader::odf_document objectSubDoc(objectPath,NULL);    
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//в отдельных embd объектах чаще всего диаграммы... но МОГУТ быть и обычные объекты подтипа frame!!! пример RemanejamentoOrcamentario.ods
///////////////////////////////////////////////////////////////////////////
//функциональная часть
		const office_element *contentSubDoc = objectSubDoc.get_impl()->get_content();
		chart_build objectBuild;
		
		if (contentSubDoc)
		{
			process_build_chart process_build_object_(objectBuild, objectSubDoc.odf_context());
			contentSubDoc->accept(process_build_object_); 
		}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//отображательная часть

		if (objectBuild.object_type_ == 1)//диаграмма
		{		
			const std::wstring href_draw = common_xlink_attlist_.href_.get_value_or(L"");
			objectBuild.xlsx_convert(Context);
			
			Context.get_drawing_context().start_chart(href_draw); // в рисовательной части только место объекта, рамочки ... и релсы 
			Context.get_drawing_context().end_chart();		
		}
		else if (objectBuild.object_type_ == 2)//текст (odt text)
		{
			Context.get_drawing_context().start_shape(2); 
			Context.get_text_context().start_drawing_content();

			//сменить контекст с главного на другой ... проблема со стилями!!
			Context.get_text_context().set_local_styles_container(&objectSubDoc.odf_context().styleContainer());

			objectBuild.xlsx_convert(Context);
			
			std::wstring text_content_ = Context.get_text_context().end_drawing_content();
			Context.get_text_context().set_local_styles_container(NULL);//вытираем вручную ...

			if (text_content_.length()>0)
			{
				Context.get_drawing_context().set_property(_property(L"text-content",text_content_));
			}
			Context.get_drawing_context().end_shape();		
		}
		else
		{
			//временно - замещающая картинка(если она конечно присутствует)
			Context.get_drawing_context().set_use_image_replacement();
		}
	
	}
    catch(...)
    {
        _CP_LOG << "[error] : convert draw::object error" << std::endl;
    }
}
コード例 #14
0
ファイル: draw_shapes_xlsx.cpp プロジェクト: ONLYOFFICE/core
void dr3d_sphere::xlsx_convert(oox::xlsx_conversion_context & Context)
{
	Context.get_drawing_context().start_shape(sub_type_); //reset type

}
コード例 #15
0
ファイル: draw_shapes_xlsx.cpp プロジェクト: ONLYOFFICE/core
void draw_enhanced_geometry::xlsx_convert(oox::xlsx_conversion_context & Context) 
{
	find_draw_type_oox();

	if (attlist_.draw_mirror_horizontal_)
	{
		Context.get_drawing_context().set_property(_property(L"flipH", *attlist_.draw_mirror_horizontal_));
	}
	if (attlist_.draw_mirror_vertical_)
	{
		Context.get_drawing_context().set_property(_property(L"flipV", *attlist_.draw_mirror_vertical_));
	}
	if (draw_type_oox_index_)
	{
		Context.get_drawing_context().set_property(_property(L"oox-geom-index", draw_type_oox_index_.get()));	
		Context.get_drawing_context().set_property(_property(L"oox-geom", bOoxType_));	

		if (word_art_ == true)
			Context.get_drawing_context().set_property(_property(L"wordArt", true));	

	}
	if (sub_type_)
	{
		Context.get_drawing_context().start_shape(sub_type_.get());
	}

	std::wstring odf_path;
	if (attlist_.drawooo_enhanced_path_)
		odf_path = attlist_.drawooo_enhanced_path_.get();
	else if (attlist_.draw_enhanced_path_)
		odf_path = attlist_.draw_enhanced_path_.get();
	
	if (!odf_path.empty())
	{
		std::vector<::svg_path::_polyline> o_Polyline;
	
		bool res = false;
		bool bClosed = false;
		
		try
		{
			res = ::svg_path::parseSvgD(o_Polyline, odf_path, true, bClosed);
		}
		catch(...)
		{
			res = false; 
		}
		//if (!bClosed) lined_shape_ = true;
		
		if (o_Polyline.size() > 1 && res )
		{
			//сформируем xml-oox сдесь ... а то придется плодить массивы в drawing .. хоть и не красиво..
			std::wstringstream output_;   
            ::svg_path::oox_serialize(output_, o_Polyline);
			Context.get_drawing_context().set_property(odf_reader::_property(L"custom_path", output_.str()));

			if (attlist_.drawooo_sub_view_size_)
			{
				std::vector< std::wstring > splitted;			    
				boost::algorithm::split(splitted, *attlist_.drawooo_sub_view_size_, boost::algorithm::is_any_of(L" "), boost::algorithm::token_compress_on);
				
				if (splitted.size() == 2)
				{
					int w = boost::lexical_cast<int>(splitted[0]);
					int h = boost::lexical_cast<int>(splitted[1]);
					
					Context.get_drawing_context().set_property(odf_reader::_property(L"custom_path_w", w));
					Context.get_drawing_context().set_property(odf_reader::_property(L"custom_path_h", h));
				}
				else if (splitted.size() == 4)
				{///???? rect ???
					int l = boost::lexical_cast<int>(splitted[0]);
					int t = boost::lexical_cast<int>(splitted[1]);
					int r = boost::lexical_cast<int>(splitted[2]);
					int b = boost::lexical_cast<int>(splitted[3]);

				}
			}
		}
		else if (!draw_type_oox_index_)
		{
			draw_type_oox_index_ = 0;
		}
	}
	if (attlist_.draw_modifiers_)
	{
		if (bOoxType_)
			Context.get_drawing_context().set_property(_property(L"oox-draw-modifiers", attlist_.draw_modifiers_.get()));	
		else
		{
		}
	}
}