umya_spreadsheet/structs/vml/spreadsheet/
client_data.rs

1use super::Anchor;
2use super::AutoFill;
3use super::AutoSizePicture;
4use super::ClipboardFormat;
5use super::CommentColumnTarget;
6use super::CommentRowTarget;
7use super::MoveWithCells;
8use super::ObjectValues;
9use super::ResizeWithCells;
10use super::Visible;
11use crate::reader::driver::*;
12use crate::structs::EnumValue;
13use crate::traits::AdjustmentCoordinate;
14use crate::traits::AdjustmentValue;
15use crate::writer::driver::*;
16use quick_xml::events::{BytesStart, Event};
17use quick_xml::Reader;
18use quick_xml::Writer;
19use std::io::Cursor;
20
21#[derive(Clone, Default, Debug)]
22pub struct ClientData {
23    object_type: EnumValue<ObjectValues>,
24    move_with_cells: Option<MoveWithCells>,
25    resize_with_cells: Option<ResizeWithCells>,
26    anchor: Anchor,
27    auto_fill: Option<AutoFill>,
28    comment_row_target: Option<CommentRowTarget>,
29    comment_column_target: Option<CommentColumnTarget>,
30    visible: Option<Visible>,
31    clipboard_format: Option<ClipboardFormat>,
32    auto_size_picture: Option<AutoSizePicture>,
33}
34
35impl ClientData {
36    #[inline]
37    pub fn get_object_type(&self) -> &ObjectValues {
38        self.object_type.get_value()
39    }
40
41    #[inline]
42    pub fn set_object_type(&mut self, value: ObjectValues) -> &mut Self {
43        self.object_type.set_value(value);
44        self
45    }
46
47    #[inline]
48    pub fn get_move_with_cells(&self) -> Option<&MoveWithCells> {
49        self.move_with_cells.as_ref()
50    }
51
52    #[inline]
53    pub fn get_move_with_cells_mut(&mut self) -> Option<&mut MoveWithCells> {
54        self.move_with_cells.as_mut()
55    }
56
57    #[inline]
58    pub fn set_move_with_cells(&mut self, value: MoveWithCells) -> &mut Self {
59        self.move_with_cells = Some(value);
60        self
61    }
62
63    #[inline]
64    pub fn get_resize_with_cells(&self) -> Option<&ResizeWithCells> {
65        self.resize_with_cells.as_ref()
66    }
67
68    #[inline]
69    pub fn get_resize_with_cells_mut(&mut self) -> Option<&mut ResizeWithCells> {
70        self.resize_with_cells.as_mut()
71    }
72
73    #[inline]
74    pub fn set_resize_with_cells(&mut self, value: ResizeWithCells) -> &mut Self {
75        self.resize_with_cells = Some(value);
76        self
77    }
78
79    #[inline]
80    pub fn get_anchor(&self) -> &Anchor {
81        &self.anchor
82    }
83
84    #[inline]
85    pub fn get_anchor_mut(&mut self) -> &mut Anchor {
86        &mut self.anchor
87    }
88
89    #[inline]
90    pub fn set_anchor(&mut self, value: Anchor) -> &mut Self {
91        self.anchor = value;
92        self
93    }
94
95    #[inline]
96    pub fn get_auto_fill(&self) -> Option<&AutoFill> {
97        self.auto_fill.as_ref()
98    }
99
100    #[inline]
101    pub fn get_auto_fill_mut(&mut self) -> Option<&mut AutoFill> {
102        self.auto_fill.as_mut()
103    }
104
105    #[inline]
106    pub fn set_auto_fill(&mut self, value: AutoFill) -> &mut Self {
107        self.auto_fill = Some(value);
108        self
109    }
110
111    #[inline]
112    pub fn get_comment_row_target(&self) -> Option<&CommentRowTarget> {
113        self.comment_row_target.as_ref()
114    }
115
116    #[inline]
117    pub fn get_comment_row_target_mut(&mut self) -> Option<&mut CommentRowTarget> {
118        self.comment_row_target.as_mut()
119    }
120
121    #[inline]
122    pub fn set_comment_row_target(&mut self, value: CommentRowTarget) -> &mut Self {
123        self.comment_row_target = Some(value);
124        self
125    }
126
127    #[inline]
128    pub fn get_comment_column_target(&self) -> Option<&CommentColumnTarget> {
129        self.comment_column_target.as_ref()
130    }
131
132    #[inline]
133    pub fn get_comment_column_target_mut(&mut self) -> Option<&mut CommentColumnTarget> {
134        self.comment_column_target.as_mut()
135    }
136
137    #[inline]
138    pub fn set_comment_column_target(&mut self, value: CommentColumnTarget) -> &mut Self {
139        self.comment_column_target = Some(value);
140        self
141    }
142
143    #[inline]
144    pub fn get_visible(&self) -> Option<&Visible> {
145        self.visible.as_ref()
146    }
147
148    #[inline]
149    pub fn get_visible_mut(&mut self) -> Option<&mut Visible> {
150        self.visible.as_mut()
151    }
152
153    #[inline]
154    pub fn set_visible(&mut self, value: Visible) -> &mut Self {
155        self.visible = Some(value);
156        self
157    }
158
159    #[inline]
160    pub fn get_clipboard_format(&self) -> Option<&ClipboardFormat> {
161        self.clipboard_format.as_ref()
162    }
163
164    #[inline]
165    pub fn get_clipboard_format_mut(&mut self) -> Option<&mut ClipboardFormat> {
166        self.clipboard_format.as_mut()
167    }
168
169    #[inline]
170    pub fn set_clipboard_format(&mut self, value: ClipboardFormat) -> &mut Self {
171        self.clipboard_format = Some(value);
172        self
173    }
174
175    #[inline]
176    pub fn get_auto_size_picture(&self) -> Option<&AutoSizePicture> {
177        self.auto_size_picture.as_ref()
178    }
179
180    #[inline]
181    pub fn get_auto_size_picture_mut(&mut self) -> Option<&mut AutoSizePicture> {
182        self.auto_size_picture.as_mut()
183    }
184
185    #[inline]
186    pub fn set_auto_size_picture(&mut self, value: AutoSizePicture) -> &mut Self {
187        self.auto_size_picture = Some(value);
188        self
189    }
190
191    #[inline]
192    pub(crate) fn set_attributes<R: std::io::BufRead>(
193        &mut self,
194        reader: &mut Reader<R>,
195        e: &BytesStart,
196    ) {
197        set_string_from_xml!(self, e, object_type, "ObjectType");
198
199        xml_read_loop!(
200            reader,
201            Event::Empty(ref e) => {
202                match e.name().into_inner() {
203                    b"x:MoveWithCells" => {
204                        let mut obj = MoveWithCells::default();
205                        obj.set_attributes(reader, e, true);
206                        self.set_move_with_cells(obj);
207                    }
208                    b"x:SizeWithCells" => {
209                        let mut obj = ResizeWithCells::default();
210                        obj.set_attributes(reader, e, true);
211                        self.set_resize_with_cells(obj);
212                    }
213                    b"x:AutoFill" => {
214                        let mut obj = AutoFill::default();
215                        obj.set_attributes(reader, e, true);
216                        self.set_auto_fill(obj);
217                    }
218                    b"x:Visible" => {
219                        let mut obj = Visible::default();
220                        obj.set_attributes(reader, e, true);
221                        self.set_visible(obj);
222                    }
223                    b"x:AutoPict" => {
224                        let mut obj = AutoSizePicture::default();
225                        obj.set_attributes(reader, e, true);
226                        self.set_auto_size_picture(obj);
227                    }
228                    _ => (),
229                }
230            },
231            Event::Start(ref e) => {
232                match e.name().into_inner() {
233                    b"x:Anchor" => {
234                        let mut obj = Anchor::default();
235                        obj.set_attributes(reader, e);
236                        self.set_anchor(obj);
237                    }
238                    b"x:MoveWithCells" => {
239                        let mut obj = MoveWithCells::default();
240                        obj.set_attributes(reader, e, false);
241                        self.set_move_with_cells(obj);
242                    }
243                    b"x:SizeWithCells" => {
244                        let mut obj = ResizeWithCells::default();
245                        obj.set_attributes(reader, e, false);
246                        self.set_resize_with_cells(obj);
247                    }
248                    b"x:AutoFill" => {
249                        let mut obj = AutoFill::default();
250                        obj.set_attributes(reader, e, false);
251                        self.set_auto_fill(obj);
252                    }
253                    b"x:Row" => {
254                        let mut obj = CommentRowTarget::default();
255                        obj.set_attributes(reader, e);
256                        self.set_comment_row_target(obj);
257                    }
258                    b"x:Column" => {
259                        let mut obj = CommentColumnTarget::default();
260                        obj.set_attributes(reader, e);
261                        self.set_comment_column_target(obj);
262                    }
263                    b"x:CF" => {
264                        let mut obj = ClipboardFormat::default();
265                        obj.set_attributes(reader, e);
266                        self.set_clipboard_format(obj);
267                    }
268                    b"x:Visible" => {
269                        let mut obj = Visible::default();
270                        obj.set_attributes(reader, e, false);
271                        self.set_visible(obj);
272                    }
273                    b"x:AutoPict" => {
274                        let mut obj = AutoSizePicture::default();
275                        obj.set_attributes(reader, e, false);
276                        self.set_auto_size_picture(obj);
277                    }
278                    _ => (),
279                }
280            },
281            Event::End(ref e) => {
282                if e.name().into_inner() == b"x:ClientData" {
283                    return
284                }
285            },
286            Event::Eof => panic!("Error: Could not find {} end element", "x:ClientData")
287        );
288    }
289
290    #[inline]
291    pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
292        // x:ClientData
293        write_start_tag(
294            writer,
295            "x:ClientData",
296            vec![("ObjectType", self.object_type.get_value_string())],
297            false,
298        );
299
300        // x:MoveWithCells
301        if let Some(v) = &self.move_with_cells {
302            v.write_to(writer);
303        }
304
305        // x:SizeWithCells
306        if let Some(v) = &self.resize_with_cells {
307            v.write_to(writer);
308        }
309
310        // x:Anchor
311        self.anchor.write_to(writer);
312
313        // x:AutoFill
314        if let Some(v) = &self.auto_fill {
315            v.write_to(writer);
316        }
317
318        // x:Row
319        if let Some(v) = &self.comment_row_target {
320            v.write_to(writer);
321        }
322
323        // x:Column
324        if let Some(v) = &self.comment_column_target {
325            v.write_to(writer);
326        }
327
328        // x:Visible
329        if let Some(v) = &self.visible {
330            v.write_to(writer);
331        }
332
333        // x:CF
334        if let Some(v) = &self.clipboard_format {
335            v.write_to(writer);
336        }
337
338        // x:AutoPict
339        if let Some(v) = &self.auto_size_picture {
340            v.write_to(writer);
341        }
342
343        write_end_tag(writer, "x:ClientData");
344    }
345}
346impl AdjustmentCoordinate for ClientData {
347    #[inline]
348    fn adjustment_insert_coordinate(
349        &mut self,
350        root_col_num: &u32,
351        offset_col_num: &u32,
352        root_row_num: &u32,
353        offset_row_num: &u32,
354    ) {
355        self.anchor.adjustment_insert_coordinate(
356            root_col_num,
357            offset_col_num,
358            root_row_num,
359            offset_row_num,
360        );
361        match &mut self.comment_column_target {
362            Some(v) => {
363                v.adjustment_insert_value(root_col_num, offset_col_num);
364            }
365            None => {}
366        }
367        match &mut self.comment_row_target {
368            Some(v) => {
369                v.adjustment_insert_value(root_row_num, offset_row_num);
370            }
371            None => {}
372        }
373    }
374
375    #[inline]
376    fn adjustment_remove_coordinate(
377        &mut self,
378        root_col_num: &u32,
379        offset_col_num: &u32,
380        root_row_num: &u32,
381        offset_row_num: &u32,
382    ) {
383        self.anchor.adjustment_remove_coordinate(
384            root_col_num,
385            offset_col_num,
386            root_row_num,
387            offset_row_num,
388        );
389        match &mut self.comment_column_target {
390            Some(v) => {
391                v.adjustment_remove_value(root_col_num, offset_col_num);
392            }
393            None => {}
394        }
395        match &mut self.comment_row_target {
396            Some(v) => {
397                v.adjustment_remove_value(root_row_num, offset_row_num);
398            }
399            None => {}
400        }
401    }
402}