umya_spreadsheet/structs/drawing/spreadsheet/
shape_style.rs1use super::super::StyleMatrixReferenceType;
3use crate::reader::driver::*;
4use crate::writer::driver::*;
5use quick_xml::events::{BytesStart, Event};
6use quick_xml::Reader;
7use quick_xml::Writer;
8use std::io::Cursor;
9
10#[derive(Clone, Default, Debug)]
11pub struct ShapeStyle {
12 line_reference: Option<Box<StyleMatrixReferenceType>>,
13 fill_reference: Option<Box<StyleMatrixReferenceType>>,
14 effect_reference: Option<Box<StyleMatrixReferenceType>>,
15 font_reference: Option<Box<StyleMatrixReferenceType>>,
16}
17
18impl ShapeStyle {
19 #[inline]
20 pub fn get_line_reference(&self) -> Option<&StyleMatrixReferenceType> {
21 self.line_reference.as_deref()
22 }
23
24 #[inline]
25 pub fn set_line_reference(&mut self, value: StyleMatrixReferenceType) {
26 self.line_reference = Some(Box::new(value));
27 }
28
29 #[inline]
30 pub fn get_fill_reference(&self) -> Option<&StyleMatrixReferenceType> {
31 self.fill_reference.as_deref()
32 }
33
34 #[inline]
35 pub fn set_fill_reference(&mut self, value: StyleMatrixReferenceType) {
36 self.fill_reference = Some(Box::new(value));
37 }
38
39 #[inline]
40 pub fn get_effect_reference(&self) -> Option<&StyleMatrixReferenceType> {
41 self.effect_reference.as_deref()
42 }
43
44 #[inline]
45 pub fn set_effect_reference(&mut self, value: StyleMatrixReferenceType) {
46 self.effect_reference = Some(Box::new(value));
47 }
48
49 #[inline]
50 pub fn get_font_reference(&self) -> Option<&StyleMatrixReferenceType> {
51 self.font_reference.as_deref()
52 }
53
54 #[inline]
55 pub fn set_font_reference(&mut self, value: StyleMatrixReferenceType) {
56 self.font_reference = Some(Box::new(value));
57 }
58
59 pub(crate) fn set_attributes<R: std::io::BufRead>(
60 &mut self,
61 reader: &mut Reader<R>,
62 _e: &BytesStart,
63 ) {
64 xml_read_loop!(
65 reader,
66 Event::Start(ref e) => {
67 match e.name().into_inner() {
68 b"a:lnRef" => {
69 let mut style_matrix_reference_type = StyleMatrixReferenceType::default();
70 style_matrix_reference_type.set_attributes(reader, e, false);
71 self.set_line_reference(style_matrix_reference_type);
72 }
73 b"a:fillRef" => {
74 let mut style_matrix_reference_type = StyleMatrixReferenceType::default();
75 style_matrix_reference_type.set_attributes(reader, e, false);
76 self.set_fill_reference(style_matrix_reference_type);
77 }
78 b"a:effectRef" => {
79 let mut style_matrix_reference_type = StyleMatrixReferenceType::default();
80 style_matrix_reference_type.set_attributes(reader, e, false);
81 self.set_effect_reference(style_matrix_reference_type);
82 }
83 b"a:fontRef" => {
84 let mut style_matrix_reference_type = StyleMatrixReferenceType::default();
85 style_matrix_reference_type.set_attributes(reader, e, false);
86 self.set_font_reference(style_matrix_reference_type);
87 }
88 _ => (),
89 }
90 },
91 Event::Empty(ref e) => {
92 match e.name().into_inner() {
93 b"a:lnRef" => {
94 let mut style_matrix_reference_type = StyleMatrixReferenceType::default();
95 style_matrix_reference_type.set_attributes(reader, e, true);
96 self.set_line_reference(style_matrix_reference_type);
97 }
98 b"a:fillRef" => {
99 let mut style_matrix_reference_type = StyleMatrixReferenceType::default();
100 style_matrix_reference_type.set_attributes(reader, e, true);
101 self.set_fill_reference(style_matrix_reference_type);
102 }
103 b"a:effectRef" => {
104 let mut style_matrix_reference_type = StyleMatrixReferenceType::default();
105 style_matrix_reference_type.set_attributes(reader, e, true);
106 self.set_effect_reference(style_matrix_reference_type);
107 }
108 b"a:fontRef" => {
109 let mut style_matrix_reference_type = StyleMatrixReferenceType::default();
110 style_matrix_reference_type.set_attributes(reader, e, true);
111 self.set_font_reference(style_matrix_reference_type);
112 }
113 _ => (),
114 }
115 },
116 Event::End(ref e) => {
117 if e.name().into_inner() == b"xdr:style" {
118 return;
119 }
120 },
121 Event::Eof => panic!("Error: Could not find {} end element", "xdr:style")
122 );
123 }
124
125 pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
126 write_start_tag(writer, "xdr:style", vec![], false);
128
129 if let Some(style) = &self.line_reference {
131 style.write_to(writer, "a:lnRef");
132 }
133
134 if let Some(style) = &self.fill_reference {
136 style.write_to(writer, "a:fillRef");
137 }
138
139 if let Some(style) = &self.effect_reference {
141 style.write_to(writer, "a:effectRef");
142 }
143
144 if let Some(style) = &self.font_reference {
146 style.write_to(writer, "a:fontRef");
147 }
148
149 write_end_tag(writer, "xdr:style");
150 }
151}