use super::driver::*;
use super::XlsxError;
use crate::helper::const_str::*;
use crate::structs::Worksheet;
use crate::structs::WriterManager;
use quick_xml::Writer;
use std::io;
pub(crate) fn write<W: io::Seek + io::Write>(
worksheet: &Worksheet,
writer_mng: &mut WriterManager<W>,
) -> Result<(String, Vec<(String, String)>), XlsxError> {
let mut rel_list: Vec<(String, String)> = Vec::new();
if !worksheet.has_legacy_drawing() {
return Ok((String::new(), rel_list));
}
let mut writer = Writer::new(io::Cursor::new(Vec::new()));
write_start_tag(
&mut writer,
"xml",
vec![
("xmlns:v", VML_NS),
("xmlns:o", OFFICE_NS),
("xmlns:x", EXCEL_NS),
],
false,
);
write_start_tag(&mut writer, "o:shapelayout", vec![("v:ext", "edit")], false);
write_start_tag(
&mut writer,
"o:idmap",
vec![("v:ext", "edit"), ("data", "1")],
true,
);
write_end_tag(&mut writer, "o:shapelayout");
let mut id = 1000 + 25;
if worksheet.has_ole_objects() {
write_start_tag(
&mut writer,
"v:shapetype",
vec![
("id", "_x0000_t75"),
("coordsize", "21600,21600"),
("o:spt", "75"),
("o:preferrelative", "t"),
("path", "m@4@5l@4@11@9@11@9@5xe"),
("filled", "f"),
("stroked", "f"),
],
false,
);
write_start_tag(&mut writer, "v:stroke", vec![("joinstyle", "miter")], true);
write_start_tag(&mut writer, "v:formulas", vec![], false);
write_start_tag(
&mut writer,
"v:f",
vec![("eqn", "if lineDrawn pixelLineWidth 0")],
true,
);
write_start_tag(&mut writer, "v:f", vec![("eqn", "sum @0 1 0")], true);
write_start_tag(&mut writer, "v:f", vec![("eqn", "sum 0 0 @1")], true);
write_start_tag(&mut writer, "v:f", vec![("eqn", "prod @2 1 2")], true);
write_start_tag(
&mut writer,
"v:f",
vec![("eqn", "prod @3 21600 pixelWidth")],
true,
);
write_start_tag(
&mut writer,
"v:f",
vec![("eqn", "prod @3 21600 pixelHeight")],
true,
);
write_start_tag(&mut writer, "v:f", vec![("eqn", "sum @0 0 1")], true);
write_start_tag(&mut writer, "v:f", vec![("eqn", "prod @6 1 2")], true);
write_start_tag(
&mut writer,
"v:f",
vec![("eqn", "prod @7 21600 pixelWidth")],
true,
);
write_start_tag(&mut writer, "v:f", vec![("eqn", "sum @8 21600 0")], true);
write_start_tag(
&mut writer,
"v:f",
vec![("eqn", "prod @7 21600 pixelHeight")],
true,
);
write_start_tag(&mut writer, "v:f", vec![("eqn", "sum @10 21600 0")], true);
write_end_tag(&mut writer, "v:formulas");
write_start_tag(
&mut writer,
"v:path",
vec![
("o:extrusionok", "f"),
("gradientshapeok", "t"),
("o:connecttype", "rect"),
],
true,
);
write_start_tag(
&mut writer,
"o:lock",
vec![("v:ext", "edit"), ("aspectratio", "t")],
true,
);
write_end_tag(&mut writer, "v:shapetype");
let mut r_id = 1;
for ole_object in worksheet.get_ole_objects().get_ole_object() {
ole_object
.get_shape()
.write_to(&mut writer, &id, &mut rel_list);
r_id += 1;
id += 1;
}
}
if worksheet.has_comments() {
write_start_tag(
&mut writer,
"v:shapetype",
vec![
("id", "_x0000_t202"),
("coordsize", "21600,21600"),
("o:spt", "202"),
("path", "m,l,21600r21600,l21600,xe"),
],
false,
);
write_start_tag(&mut writer, "v:stroke", vec![("joinstyle", "miter")], true);
write_start_tag(
&mut writer,
"v:path",
vec![("gradientshapeok", "t"), ("o:connecttype", "rect")],
true,
);
write_end_tag(&mut writer, "v:shapetype");
for comment in worksheet.get_comments() {
comment
.get_shape()
.write_to(&mut writer, &id, &mut rel_list);
id += 1;
}
}
write_end_tag(&mut writer, "xml");
let file_no = writer_mng.add_file_at_vml_drawing(writer)?;
Ok((file_no.to_string(), rel_list))
}