umya_spreadsheet/structs/
embedded_object_properties.rs

1use 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        // objectPr
135        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        // anchor
147        self.object_anchor.write_to(writer);
148
149        write_end_tag(writer, "objectPr");
150    }
151}