umya_spreadsheet/structs/drawing/charts/
chart_text.rs

1// c:tx
2use super::NumericValue;
3use super::RichText;
4use super::StringReference;
5use crate::structs::Spreadsheet;
6use crate::writer::driver::*;
7use crate::xml_read_loop;
8use quick_xml::events::{BytesStart, Event};
9use quick_xml::Reader;
10use quick_xml::Writer;
11use std::io::Cursor;
12
13#[derive(Clone, Default, Debug)]
14pub struct ChartText {
15    rich_text: Option<RichText>,
16    string_reference: Option<StringReference>,
17    numeric_value: Option<NumericValue>,
18}
19
20impl ChartText {
21    pub fn get_rich_text(&self) -> Option<&RichText> {
22        self.rich_text.as_ref()
23    }
24
25    pub fn get_rich_text_mut(&mut self) -> Option<&mut RichText> {
26        self.rich_text.as_mut()
27    }
28
29    pub fn set_rich_text(&mut self, value: RichText) -> &mut ChartText {
30        self.rich_text = Some(value);
31        self
32    }
33
34    pub fn get_string_reference(&self) -> Option<&StringReference> {
35        self.string_reference.as_ref()
36    }
37
38    pub fn get_string_reference_mut(&mut self) -> Option<&mut StringReference> {
39        self.string_reference.as_mut()
40    }
41
42    pub fn set_string_reference(&mut self, value: StringReference) -> &mut Self {
43        self.string_reference = Some(value);
44        self
45    }
46
47    pub fn get_numeric_value(&self) -> Option<&NumericValue> {
48        self.numeric_value.as_ref()
49    }
50
51    pub fn get_numeric_value_mut(&mut self) -> Option<&mut NumericValue> {
52        self.numeric_value.as_mut()
53    }
54
55    pub fn set_numeric_value(&mut self, value: NumericValue) -> &mut Self {
56        self.numeric_value = Some(value);
57        self
58    }
59
60    pub(crate) fn set_attributes<R: std::io::BufRead>(
61        &mut self,
62        reader: &mut Reader<R>,
63        _e: &BytesStart,
64    ) {
65        xml_read_loop!(
66            reader,
67            Event::Start(ref e) => {
68                match e.name().into_inner() {
69                    b"c:rich" => {
70                        let mut obj = RichText::default();
71                        obj.set_attributes(reader, e);
72                        self.set_rich_text(obj);
73                    }
74                    b"c:strRef" => {
75                        let mut obj = StringReference::default();
76                        obj.set_attributes(reader, e);
77                        self.set_string_reference(obj);
78                    }
79                    b"c:v" => {
80                        let mut obj = NumericValue::default();
81                        obj.set_attributes(reader, e);
82                        self.set_numeric_value(obj);
83                    }
84                    _ => (),
85                }
86            },
87            Event::End(ref e) => {
88                if e.name().into_inner() == b"c:tx" {
89                    return;
90                }
91            },
92            Event::Eof => panic!("Error: Could not find {} end element", "c:tx"),
93        );
94    }
95
96    pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>, spreadsheet: &Spreadsheet) {
97        // c:tx
98        write_start_tag(writer, "c:tx", vec![], false);
99
100        // c:rich
101        if let Some(v) = &self.rich_text {
102            v.write_to(writer);
103        }
104
105        // c:strRef
106        if let Some(v) = &self.string_reference {
107            v.write_to(writer, spreadsheet);
108        }
109
110        // c:v
111        if let Some(v) = &self.numeric_value {
112            v.write_to(writer);
113        }
114
115        write_end_tag(writer, "c:tx");
116    }
117}