umya_spreadsheet/structs/
conditional_formatting.rs

1use 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        // conditionalFormatting
105        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            // cfRule
114            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}