umya_spreadsheet/structs/drawing/
text_paragraph_properties_type.rs

1// a:lvl1pPr
2use super::super::BooleanValue;
3use super::super::EnumValue;
4use super::RunProperties;
5use super::SpaceAfter;
6use super::SpaceBefore;
7use super::TextAlignmentTypeValues;
8use super::TextFontAlignmentValues;
9use crate::reader::driver::*;
10use crate::writer::driver::*;
11use quick_xml::events::{BytesStart, Event};
12use quick_xml::Reader;
13use quick_xml::Writer;
14use std::io::Cursor;
15
16#[derive(Clone, Default, Debug)]
17pub struct TextParagraphPropertiesType {
18    right_to_left: BooleanValue,
19    alignment: EnumValue<TextAlignmentTypeValues>,
20    font_alignment: EnumValue<TextFontAlignmentValues>,
21    space_before: Option<SpaceBefore>,
22    space_after: Option<SpaceAfter>,
23    default_run_properties: Option<Box<RunProperties>>,
24}
25impl TextParagraphPropertiesType {
26    #[inline]
27    pub fn get_right_to_left(&self) -> &bool {
28        self.right_to_left.get_value()
29    }
30
31    #[inline]
32    pub fn set_right_to_left(&mut self, value: bool) -> &mut Self {
33        self.right_to_left.set_value(value);
34        self
35    }
36
37    #[inline]
38    pub fn get_alignment(&self) -> &TextAlignmentTypeValues {
39        self.alignment.get_value()
40    }
41
42    #[inline]
43    pub fn set_alignment(&mut self, value: TextAlignmentTypeValues) -> &mut Self {
44        self.alignment.set_value(value);
45        self
46    }
47
48    #[inline]
49    pub fn get_font_alignment(&self) -> &TextFontAlignmentValues {
50        self.font_alignment.get_value()
51    }
52
53    #[inline]
54    pub fn set_font_alignment(&mut self, value: TextFontAlignmentValues) -> &mut Self {
55        self.font_alignment.set_value(value);
56        self
57    }
58
59    #[inline]
60    pub fn get_space_before(&self) -> Option<&SpaceBefore> {
61        self.space_before.as_ref()
62    }
63
64    #[inline]
65    pub fn get_space_before_mut(&mut self) -> Option<&mut SpaceBefore> {
66        self.space_before.as_mut()
67    }
68
69    #[inline]
70    pub fn set_space_before(&mut self, value: SpaceBefore) -> &mut Self {
71        self.space_before = Some(value);
72        self
73    }
74
75    #[inline]
76    pub fn get_space_after(&self) -> Option<&SpaceAfter> {
77        self.space_after.as_ref()
78    }
79
80    #[inline]
81    pub fn get_space_after_mut(&mut self) -> Option<&mut SpaceAfter> {
82        self.space_after.as_mut()
83    }
84
85    #[inline]
86    pub fn set_space_after(&mut self, value: SpaceAfter) -> &mut Self {
87        self.space_after = Some(value);
88        self
89    }
90
91    #[inline]
92    pub fn get_default_run_properties(&self) -> Option<&RunProperties> {
93        self.default_run_properties.as_deref()
94    }
95
96    #[inline]
97    pub fn get_default_run_properties_mut(&mut self) -> Option<&mut RunProperties> {
98        self.default_run_properties.as_deref_mut()
99    }
100
101    #[inline]
102    pub fn set_default_run_properties(&mut self, value: RunProperties) -> &mut Self {
103        self.default_run_properties = Some(Box::new(value));
104        self
105    }
106
107    pub(crate) fn set_attributes<R: std::io::BufRead>(
108        &mut self,
109        reader: &mut Reader<R>,
110        e: &BytesStart,
111    ) {
112        set_string_from_xml!(self, e, right_to_left, "rtl");
113        set_string_from_xml!(self, e, alignment, "algn");
114        set_string_from_xml!(self, e, font_alignment, "fontAlgn");
115
116        xml_read_loop!(
117            reader,
118            Event::Empty(ref e) => {
119                match e.name().into_inner() {
120                    b"a:defRPr" => {
121                        let mut obj = RunProperties::default();
122                        obj.set_attributes(reader, e, true);
123                        self.set_default_run_properties(obj);
124                    }
125                    _ => (),
126                }
127            },
128            Event::Start(ref e) => {
129                match e.name().into_inner() {
130                b"a:spcBef" => {
131                    let mut obj = SpaceBefore::default();
132                    obj.set_attributes(reader, e);
133                    self.set_space_before(obj);
134                }
135                b"a:spcAft" => {
136                    let mut obj = SpaceAfter::default();
137                    obj.set_attributes(reader, e);
138                    self.set_space_after(obj);
139                }
140                b"a:defRPr" => {
141                    let mut obj = RunProperties::default();
142                    obj.set_attributes(reader, e, false);
143                    self.set_default_run_properties(obj);
144                }
145                _ => (),
146                }
147            },
148            Event::End(ref e) => {
149                match e.name().into_inner() {
150                    b"a:defPPr"  => return,
151                    b"a:lvl1pPr" => return,
152                    b"a:lvl2pPr" => return,
153                    b"a:lvl3pPr" => return,
154                    b"a:lvl4pPr" => return,
155                    b"a:lvl5pPr" => return,
156                    b"a:lvl6pPr" => return,
157                    b"a:lvl7pPr" => return,
158                    b"a:lvl8pPr" => return,
159                    b"a:lvl9pPr" => return,
160                    _ =>()
161                }
162            },
163            Event::Eof => panic!("Error: Could not find {} end element", "a:lvl1pPr-lvl9pPr")
164        );
165    }
166
167    #[inline]
168    pub(crate) fn write_to_default(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
169        self.write_to(writer, "a:defPPr")
170    }
171
172    #[inline]
173    pub(crate) fn write_to_lvl1(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
174        self.write_to(writer, "a:lvl1pPr")
175    }
176
177    #[inline]
178    pub(crate) fn write_to_lvl2(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
179        self.write_to(writer, "a:lvl2pPr")
180    }
181
182    #[inline]
183    pub(crate) fn write_to_lvl3(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
184        self.write_to(writer, "a:lvl3pPr")
185    }
186
187    #[inline]
188    pub(crate) fn write_to_lvl4(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
189        self.write_to(writer, "a:lvl4pPr")
190    }
191
192    #[inline]
193    pub(crate) fn write_to_lvl5(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
194        self.write_to(writer, "a:lvl5pPr")
195    }
196
197    #[inline]
198    pub(crate) fn write_to_lvl6(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
199        self.write_to(writer, "a:lvl6pPr")
200    }
201
202    #[inline]
203    pub(crate) fn write_to_lvl7(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
204        self.write_to(writer, "a:lvl7pPr")
205    }
206
207    #[inline]
208    pub(crate) fn write_to_lvl8(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
209        self.write_to(writer, "a:lvl8pPr")
210    }
211
212    #[inline]
213    pub(crate) fn write_to_lvl9(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
214        self.write_to(writer, "a:lvl9pPr")
215    }
216
217    fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>, tag_name: &str) {
218        // a:lvl1pPr
219        let mut attributes: Vec<(&str, &str)> = Vec::new();
220        if self.right_to_left.has_value() {
221            attributes.push(("rtl", self.right_to_left.get_value_string()));
222        }
223        if self.alignment.has_value() {
224            attributes.push(("algn", self.alignment.get_value_string()));
225        }
226        if self.font_alignment.has_value() {
227            attributes.push(("fontAlgn", self.font_alignment.get_value_string()));
228        }
229        write_start_tag(writer, tag_name, attributes, false);
230
231        // a:spcBef
232        match &self.space_before {
233            Some(v) => {
234                v.write_to(writer);
235            }
236            None => {}
237        }
238
239        // a:spcAft
240        match &self.space_after {
241            Some(v) => {
242                v.write_to(writer);
243            }
244            None => {}
245        }
246
247        // a:defRPr
248        match &self.default_run_properties {
249            Some(v) => {
250                v.write_to_def_rpr(writer);
251            }
252            None => {}
253        }
254
255        write_end_tag(writer, tag_name);
256    }
257}