umya_spreadsheet/structs/drawing/charts/
chart_text.rs1use 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 write_start_tag(writer, "c:tx", vec![], false);
99
100 if let Some(v) = &self.rich_text {
102 v.write_to(writer);
103 }
104
105 if let Some(v) = &self.string_reference {
107 v.write_to(writer, spreadsheet);
108 }
109
110 if let Some(v) = &self.numeric_value {
112 v.write_to(writer);
113 }
114
115 write_end_tag(writer, "c:tx");
116 }
117}