umya_spreadsheet/structs/drawing/
text_paragraph_properties_type.rs1use 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 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 match &self.space_before {
233 Some(v) => {
234 v.write_to(writer);
235 }
236 None => {}
237 }
238
239 match &self.space_after {
241 Some(v) => {
242 v.write_to(writer);
243 }
244 None => {}
245 }
246
247 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}