umya_spreadsheet/structs/
conditional_formatting.rs1use super::ConditionalFormattingRule;
2use super::DifferentialFormats;
3use super::SequenceOfReferences;
4use crate::reader::driver::*;
5use crate::traits::AdjustmentCoordinate;
6use crate::writer::driver::*;
7use quick_xml::events::BytesStart;
8use quick_xml::events::Event;
9use quick_xml::Reader;
10use quick_xml::Writer;
11use std::io::Cursor;
12use thin_vec::ThinVec;
13
14#[derive(Default, Debug, Clone)]
15pub struct ConditionalFormatting {
16 sequence_of_references: SequenceOfReferences,
17 conditional_collection: ThinVec<ConditionalFormattingRule>,
18}
19
20impl ConditionalFormatting {
21 #[inline]
22 pub fn get_sequence_of_references(&self) -> &SequenceOfReferences {
23 &self.sequence_of_references
24 }
25
26 #[inline]
27 pub fn get_sequence_of_references_mut(&mut self) -> &mut SequenceOfReferences {
28 &mut self.sequence_of_references
29 }
30
31 #[inline]
32 pub fn set_sequence_of_references(&mut self, value: SequenceOfReferences) -> &mut Self {
33 self.sequence_of_references = value;
34 self
35 }
36
37 #[inline]
38 pub fn get_conditional_collection(&self) -> &[ConditionalFormattingRule] {
39 &self.conditional_collection
40 }
41
42 #[inline]
43 pub fn get_conditional_collection_mut(&mut self) -> &mut ThinVec<ConditionalFormattingRule> {
44 &mut self.conditional_collection
45 }
46
47 #[inline]
48 pub fn set_conditional_collection(
49 &mut self,
50 value: impl Into<ThinVec<ConditionalFormattingRule>>,
51 ) -> &mut Self {
52 self.conditional_collection = value.into();
53 self
54 }
55
56 #[inline]
57 pub fn add_conditional_collection(&mut self, value: ConditionalFormattingRule) -> &mut Self {
58 self.conditional_collection.push(value);
59 self
60 }
61
62 pub(crate) fn set_attributes<R: std::io::BufRead>(
63 &mut self,
64 reader: &mut Reader<R>,
65 e: &BytesStart,
66 differential_formats: &DifferentialFormats,
67 ) {
68 if let Some(v) = get_attribute(e, b"sqref") {
69 self.sequence_of_references.set_sqref(v);
70 }
71
72 xml_read_loop!(
73 reader,
74 Event::Empty(ref e) => {
75 if e.name().into_inner() == b"cfRule" {
76 let mut obj = ConditionalFormattingRule::default();
77 obj.set_attributes(reader, e, differential_formats, true);
78 self.conditional_collection.push(obj);
79 }
80 },
81 Event::Start(ref e) => {
82 if e.name().into_inner() == b"cfRule" {
83 let mut obj = ConditionalFormattingRule::default();
84 obj.set_attributes(reader, e, differential_formats, false);
85 self.conditional_collection.push(obj);
86 }
87 },
88 Event::End(ref e) => {
89 if e.name().into_inner() == b"conditionalFormatting" {
90 return
91 }
92 },
93 Event::Eof => panic!("Error: Could not find {} end element", "conditionalFormatting")
94 );
95 }
96
97 pub(crate) fn write_to(
98 &self,
99 writer: &mut Writer<Cursor<Vec<u8>>>,
100 differential_formats: &mut DifferentialFormats,
101 ) {
102 let is_inner = !self.conditional_collection.is_empty();
103
104 let mut attributes: Vec<(&str, &str)> = Vec::new();
106
107 let sequence_of_references = &self.sequence_of_references.get_sqref();
108 attributes.push(("sqref", sequence_of_references));
109
110 write_start_tag(writer, "conditionalFormatting", attributes, !is_inner);
111
112 if is_inner {
113 for v in &self.conditional_collection {
115 v.write_to(writer, differential_formats);
116 }
117
118 write_end_tag(writer, "conditionalFormatting");
119 }
120 }
121}
122impl AdjustmentCoordinate for ConditionalFormatting {
123 #[inline]
124 fn adjustment_insert_coordinate(
125 &mut self,
126 root_col_num: &u32,
127 offset_col_num: &u32,
128 root_row_num: &u32,
129 offset_row_num: &u32,
130 ) {
131 self.sequence_of_references.adjustment_insert_coordinate(
132 root_col_num,
133 offset_col_num,
134 root_row_num,
135 offset_row_num,
136 );
137 }
138
139 #[inline]
140 fn adjustment_remove_coordinate(
141 &mut self,
142 root_col_num: &u32,
143 offset_col_num: &u32,
144 root_row_num: &u32,
145 offset_row_num: &u32,
146 ) {
147 self.sequence_of_references.adjustment_remove_coordinate(
148 root_col_num,
149 offset_col_num,
150 root_row_num,
151 offset_row_num,
152 );
153 }
154
155 #[inline]
156 fn is_remove_coordinate(
157 &self,
158 root_col_num: &u32,
159 offset_col_num: &u32,
160 root_row_num: &u32,
161 offset_row_num: &u32,
162 ) -> bool {
163 self.sequence_of_references.is_remove_coordinate(
164 root_col_num,
165 offset_col_num,
166 root_row_num,
167 offset_row_num,
168 )
169 }
170}