umya_spreadsheet/structs/drawing/charts/
chart_space.rs

1use crate::xml_read_loop;
2
3// c:chartSpace
4use super::Chart;
5use super::Date1904;
6use super::EditingLanguage;
7use super::PrintSettings;
8use super::RoundedCorners;
9use super::ShapeProperties;
10use crate::helper::const_str::*;
11use crate::structs::office2010::drawing::charts::Style;
12use crate::structs::Spreadsheet;
13use crate::traits::AdjustmentCoordinateWithSheet;
14use crate::writer::driver::*;
15use quick_xml::events::{BytesStart, Event};
16use quick_xml::Reader;
17use quick_xml::Writer;
18use std::io::Cursor;
19
20#[derive(Clone, Default, Debug)]
21pub struct ChartSpace {
22    date1904: Option<Date1904>,
23    editing_language: EditingLanguage,
24    rounded_corners: RoundedCorners,
25    style: Option<Style>,
26    chart: Chart,
27    shape_properties: Option<ShapeProperties>,
28    print_settings: Option<PrintSettings>,
29}
30
31impl ChartSpace {
32    pub fn get_date1904(&self) -> Option<&Date1904> {
33        self.date1904.as_ref()
34    }
35
36    pub fn get_date1904_mut(&mut self) -> Option<&mut Date1904> {
37        self.date1904.as_mut()
38    }
39
40    pub fn set_date1904(&mut self, value: Date1904) -> &mut Self {
41        self.date1904 = Some(value);
42        self
43    }
44
45    pub fn get_editing_language(&self) -> &EditingLanguage {
46        &self.editing_language
47    }
48
49    pub fn get_editing_language_mut(&mut self) -> &mut EditingLanguage {
50        &mut self.editing_language
51    }
52
53    pub fn set_editing_language(&mut self, value: EditingLanguage) -> &mut Self {
54        self.editing_language = value;
55        self
56    }
57
58    pub fn get_rounded_corners(&self) -> &RoundedCorners {
59        &self.rounded_corners
60    }
61
62    pub fn get_rounded_corners_mut(&mut self) -> &mut RoundedCorners {
63        &mut self.rounded_corners
64    }
65
66    pub fn set_rounded_corners(&mut self, value: RoundedCorners) -> &mut Self {
67        self.rounded_corners = value;
68        self
69    }
70
71    pub fn get_style(&self) -> Option<&Style> {
72        self.style.as_ref()
73    }
74
75    pub fn get_style_mut(&mut self) -> Option<&mut Style> {
76        self.style.as_mut()
77    }
78
79    pub fn set_style(&mut self, value: Style) -> &mut Self {
80        self.style = Some(value);
81        self
82    }
83
84    pub fn get_chart(&self) -> &Chart {
85        &self.chart
86    }
87
88    pub fn get_chart_mut(&mut self) -> &mut Chart {
89        &mut self.chart
90    }
91
92    pub fn set_chart(&mut self, value: Chart) -> &mut Self {
93        self.chart = value;
94        self
95    }
96
97    pub fn get_shape_properties(&self) -> Option<&ShapeProperties> {
98        self.shape_properties.as_ref()
99    }
100
101    pub fn get_shape_properties_mut(&mut self) -> Option<&mut ShapeProperties> {
102        self.shape_properties.as_mut()
103    }
104
105    pub fn set_shape_properties(&mut self, value: ShapeProperties) -> &mut Self {
106        self.shape_properties = Some(value);
107        self
108    }
109
110    pub fn get_print_settings(&self) -> Option<&PrintSettings> {
111        self.print_settings.as_ref()
112    }
113
114    pub fn get_print_settings_mut(&mut self) -> Option<&mut PrintSettings> {
115        self.print_settings.as_mut()
116    }
117
118    pub fn set_print_settings(&mut self, value: PrintSettings) -> &mut Self {
119        self.print_settings = Some(value);
120        self
121    }
122
123    pub(crate) fn set_attributes<R: std::io::BufRead>(
124        &mut self,
125        reader: &mut Reader<R>,
126        _e: &BytesStart,
127    ) {
128        xml_read_loop!(
129            reader,
130            Event::Start(ref e) => match e.name().into_inner() {
131                b"mc:AlternateContent" => {
132                    let mut obj = Style::default();
133                    obj.set_attributes(reader, e, true);
134                    self.set_style(obj);
135                }
136                b"c:chart" => {
137                    self.chart.set_attributes(reader, e);
138                }
139                b"c:printSettings" => {
140                    let mut obj = PrintSettings::default();
141                    obj.set_attributes(reader, e);
142                    self.set_print_settings(obj);
143                }
144                b"c:spPr" => {
145                    let mut obj = ShapeProperties::default();
146                    obj.set_attributes(reader, e);
147                    self.set_shape_properties(obj);
148                }
149                _ => (),
150            },
151            Event::Empty(ref e) => match e.name().into_inner() {
152                b"c:date1904" => {
153                    let mut obj = Date1904::default();
154                    obj.set_attributes(reader, e);
155                    self.set_date1904(obj);
156                }
157                b"c:lang" => {
158                    self.editing_language.set_attributes(reader, e);
159                }
160                b"c:roundedCorners" => {
161                    self.rounded_corners.set_attributes(reader, e);
162                }
163                b"c:style" => {
164                    let mut obj = Style::default();
165                    obj.set_attributes(reader, e, false);
166                    self.set_style(obj);
167                }
168                _ => (),
169            },
170            Event::End(ref e) => {
171                if e.name().into_inner() == b"c:chartSpace" {
172                    return;
173                }
174            },
175            Event::Eof => panic!("Error: Could not find {} end element", "c:chartSpace"),
176        );
177    }
178
179    pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>, spreadsheet: &Spreadsheet) {
180        // c:chartSpace
181        write_start_tag(
182            writer,
183            "c:chartSpace",
184            vec![
185                ("xmlns:c", DRAWINGML_CHART_NS),
186                ("xmlns:a", DRAWINGML_MAIN_NS),
187                ("xmlns:r", REL_OFC_NS),
188                ("xmlns:c16r2", DRAWING_CHART_2015_NS),
189            ],
190            false,
191        );
192
193        // c:date1904
194        if let Some(v) = &self.date1904 {
195            v.write_to(writer);
196        }
197
198        // c:lang
199        self.editing_language.write_to(writer);
200
201        // c:roundedCorners
202        self.rounded_corners.write_to(writer);
203
204        // c:style
205        if let Some(v) = &self.style {
206            v.write_to(writer);
207        }
208
209        // c:chart
210        self.chart.write_to(writer, spreadsheet);
211
212        // c:spPr
213        if let Some(v) = &self.shape_properties {
214            v.write_to(writer);
215        }
216
217        // c:printSettings
218        if let Some(v) = &self.print_settings {
219            v.write_to(writer);
220        }
221
222        write_end_tag(writer, "c:chartSpace");
223    }
224}
225impl AdjustmentCoordinateWithSheet for ChartSpace {
226    fn adjustment_insert_coordinate_with_sheet(
227        &mut self,
228        sheet_name: &str,
229        root_col_num: &u32,
230        offset_col_num: &u32,
231        root_row_num: &u32,
232        offset_row_num: &u32,
233    ) {
234        self.chart.adjustment_insert_coordinate_with_sheet(
235            sheet_name,
236            root_col_num,
237            offset_col_num,
238            root_row_num,
239            offset_row_num,
240        );
241    }
242
243    fn adjustment_remove_coordinate_with_sheet(
244        &mut self,
245        sheet_name: &str,
246        root_col_num: &u32,
247        offset_col_num: &u32,
248        root_row_num: &u32,
249        offset_row_num: &u32,
250    ) {
251        self.chart.adjustment_remove_coordinate_with_sheet(
252            sheet_name,
253            root_col_num,
254            offset_col_num,
255            root_row_num,
256            offset_row_num,
257        );
258    }
259}