umya_spreadsheet/structs/
embedded_object_properties.rs1use super::BooleanValue;
2use super::ObjectAnchor;
3use super::StringValue;
4use super::UInt32Value;
5use crate::reader::driver::*;
6use crate::structs::raw::RawRelationships;
7use crate::structs::MediaObject;
8use crate::writer::driver::*;
9use quick_xml::events::{BytesStart, Event};
10use quick_xml::Reader;
11use quick_xml::Writer;
12use std::io::Cursor;
13
14#[derive(Clone, Default, Debug)]
15pub struct EmbeddedObjectProperties {
16 prog_id: StringValue,
17 shape_id: UInt32Value,
18 image: MediaObject,
19 default_size: BooleanValue,
20 auto_pict: BooleanValue,
21 object_anchor: ObjectAnchor,
22}
23
24impl EmbeddedObjectProperties {
25 #[inline]
26 pub fn get_prog_id(&self) -> &str {
27 self.prog_id.get_value_str()
28 }
29
30 #[inline]
31 pub fn set_prog_id<S: Into<String>>(&mut self, value: S) -> &mut Self {
32 self.prog_id.set_value(value);
33 self
34 }
35
36 #[inline]
37 pub fn get_shape_id(&self) -> &u32 {
38 self.shape_id.get_value()
39 }
40
41 #[inline]
42 pub fn set_shape_id(&mut self, value: u32) -> &mut Self {
43 self.shape_id.set_value(value);
44 self
45 }
46
47 #[inline]
48 pub fn get_image(&self) -> &MediaObject {
49 &self.image
50 }
51
52 #[inline]
53 pub fn get_image_mut(&mut self) -> &mut MediaObject {
54 &mut self.image
55 }
56
57 #[inline]
58 pub fn set_image(&mut self, value: MediaObject) {
59 self.image = value;
60 }
61
62 #[inline]
63 pub fn get_default_size(&self) -> &bool {
64 self.default_size.get_value()
65 }
66
67 #[inline]
68 pub fn set_default_size(&mut self, value: bool) -> &mut Self {
69 self.default_size.set_value(value);
70 self
71 }
72
73 #[inline]
74 pub fn get_auto_pict(&self) -> &bool {
75 self.auto_pict.get_value()
76 }
77
78 #[inline]
79 pub fn set_auto_pict(&mut self, value: bool) -> &mut Self {
80 self.auto_pict.set_value(value);
81 self
82 }
83
84 #[inline]
85 pub fn get_object_anchor(&self) -> &ObjectAnchor {
86 &self.object_anchor
87 }
88
89 #[inline]
90 pub fn get_object_anchor_mut(&mut self) -> &mut ObjectAnchor {
91 &mut self.object_anchor
92 }
93
94 #[inline]
95 pub fn set_object_anchor(&mut self, value: ObjectAnchor) -> &mut Self {
96 self.object_anchor = value;
97 self
98 }
99
100 pub(crate) fn set_attributes<R: std::io::BufRead>(
101 &mut self,
102 reader: &mut Reader<R>,
103 e: &BytesStart,
104 relationships: &RawRelationships,
105 ) {
106 let r_id = get_attribute(e, b"r:id").unwrap();
107 let attached_file = relationships.get_relationship_by_rid(&r_id).get_raw_file();
108
109 self.get_image_mut()
110 .set_image_name(attached_file.get_file_name());
111 self.get_image_mut()
112 .set_image_data(attached_file.get_file_data().clone());
113
114 set_string_from_xml!(self, e, default_size, "defaultSize");
115 set_string_from_xml!(self, e, auto_pict, "autoPict");
116
117 xml_read_loop!(
118 reader,
119 Event::Start(ref e) => {
120 if e.name().into_inner() == b"anchor" {
121 self.object_anchor.set_attributes(reader, e);
122 }
123 },
124 Event::End(ref e) => {
125 if e.name().into_inner() == b"objectPr" {
126 return
127 }
128 },
129 Event::Eof => panic!("Error: Could not find {} end element", "objectPr")
130 );
131 }
132
133 pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>, r_id: &usize) {
134 let mut attributes: Vec<(&str, &str)> = Vec::new();
136 if self.default_size.has_value() {
137 attributes.push(("defaultSize", self.default_size.get_value_string()));
138 }
139 if self.auto_pict.has_value() {
140 attributes.push(("autoPict", self.auto_pict.get_value_string()));
141 }
142 let r_id_str = format!("rId{}", r_id);
143 attributes.push(("r:id", &r_id_str));
144 write_start_tag(writer, "objectPr", attributes, false);
145
146 self.object_anchor.write_to(writer);
148
149 write_end_tag(writer, "objectPr");
150 }
151}