umya_spreadsheet/structs/
table.rs

1use std::default;
2
3use quick_xml::{
4    events::{BytesStart, Event},
5    Reader,
6};
7
8use super::{
9    coordinate::*, BooleanValue, EnumValue, StringValue, TotalsRowFunctionValues, UInt32Value,
10};
11use crate::helper::coordinate::*;
12use thin_vec::ThinVec;
13//use reader::driver::*;
14
15#[derive(Clone, Default, Debug)]
16pub struct Table {
17    name: Box<str>,
18    area: (Coordinate, Coordinate),
19    display_name: Box<str>,
20    columns: ThinVec<TableColumn>,
21    style_info: Option<Box<TableStyleInfo>>,
22    totals_row_shown: BooleanValue,
23    totals_row_count: UInt32Value,
24}
25impl Table {
26    #[inline]
27    pub fn new<T>(name: &str, area: (T, T)) -> Self
28    where
29        T: Into<CellCoordinates>,
30    {
31        let coord_beg = Self::cell_coord_to_coord(area.0);
32        let coord_end = Self::cell_coord_to_coord(area.1);
33        let name: Box<str> = name.into();
34        Self {
35            area: (coord_beg, coord_end),
36            name: name.clone(),
37            display_name: name,
38            columns: ThinVec::<TableColumn>::default(),
39            style_info: None,
40            totals_row_shown: BooleanValue::default(),
41            totals_row_count: UInt32Value::default(),
42        }
43    }
44
45    #[inline]
46    pub fn is_ok(&self) -> bool {
47        !(self.name.is_empty()
48            || self.display_name.is_empty()
49            || self.area.0.get_col_num() == &0
50            || self.area.0.get_row_num() == &0
51            || self.area.1.get_col_num() == &0
52            || self.area.1.get_row_num() == &0
53            || self.area.0.get_col_num() > self.area.1.get_col_num()
54            || self.area.0.get_row_num() > self.area.1.get_row_num())
55    }
56
57    #[inline]
58    pub fn get_name(&self) -> &str {
59        &self.name
60    }
61
62    #[inline]
63    pub fn set_name(&mut self, name: &str) {
64        self.name = name.into();
65        if self.display_name.is_empty() {
66            self.display_name = name.into();
67        }
68    }
69
70    #[inline]
71    pub fn get_display_name(&self) -> &str {
72        &self.display_name
73    }
74
75    #[inline]
76    pub fn set_display_name(&mut self, display_name: &str) {
77        self.display_name = display_name.into();
78    }
79
80    #[inline]
81    pub fn get_area(&self) -> &(Coordinate, Coordinate) {
82        &self.area
83    }
84
85    #[inline]
86    pub fn set_area<T>(&mut self, area: (T, T))
87    where
88        T: Into<CellCoordinates>,
89    {
90        let coord_beg = Self::cell_coord_to_coord(area.0);
91        let coord_end = Self::cell_coord_to_coord(area.1);
92        self.area = (coord_beg, coord_end);
93    }
94
95    #[inline]
96    pub fn add_column(&mut self, col: TableColumn) {
97        self.columns.push(col);
98    }
99
100    #[inline]
101    pub fn get_columns(&self) -> &[TableColumn] {
102        &self.columns
103    }
104
105    #[inline]
106    pub(crate) fn has_style_info(&self) -> bool {
107        self.style_info.is_some()
108    }
109
110    #[inline]
111    pub fn get_style_info(&self) -> Option<&TableStyleInfo> {
112        self.style_info.as_deref()
113    }
114
115    #[inline]
116    pub fn set_style_info(&mut self, style_info: Option<TableStyleInfo>) {
117        self.style_info = style_info.map(Box::new);
118    }
119
120    #[inline]
121    pub(crate) fn has_totals_row_shown(&self) -> bool {
122        self.totals_row_shown.has_value()
123    }
124
125    #[inline]
126    pub fn get_totals_row_shown(&self) -> &bool {
127        self.totals_row_shown.get_value()
128    }
129
130    #[inline]
131    pub(crate) fn get_totals_row_shown_str(&self) -> &str {
132        self.totals_row_shown.get_value_string()
133    }
134
135    #[inline]
136    pub fn set_totals_row_shown(&mut self, value: bool) {
137        self.totals_row_shown.set_value(value);
138    }
139
140    #[inline]
141    pub(crate) fn set_totals_row_shown_str(&mut self, value: &str) {
142        self.totals_row_shown.set_value_string(value);
143    }
144
145    #[inline]
146    pub(crate) fn has_totals_row_count(&self) -> bool {
147        self.totals_row_count.has_value()
148    }
149
150    #[inline]
151    pub fn get_totals_row_count(&self) -> &u32 {
152        self.totals_row_count.get_value()
153    }
154
155    #[inline]
156    pub(crate) fn get_totals_row_count_str(&self) -> String {
157        self.totals_row_count.get_value_string()
158    }
159
160    #[inline]
161    pub fn set_totals_row_count(&mut self, value: u32) {
162        self.totals_row_count.set_value(value);
163    }
164
165    #[inline]
166    pub(crate) fn set_totals_row_count_str(&mut self, value: &str) {
167        self.totals_row_count.set_value_string(value);
168    }
169
170    #[inline]
171    fn cell_coord_to_coord<T>(cc: T) -> Coordinate
172    where
173        T: Into<CellCoordinates>,
174    {
175        let cell_coord: CellCoordinates = cc.into();
176        let mut coord: Coordinate = Default::default();
177        coord.set_col_num(cell_coord.col);
178        coord.set_row_num(cell_coord.row);
179        coord
180    }
181}
182
183#[derive(Clone, Default, Debug)]
184pub struct TableColumn {
185    name: String,
186    totals_row_label: StringValue,
187    totals_row_function: EnumValue<TotalsRowFunctionValues>,
188    calculated_column_formula: Option<String>,
189}
190impl TableColumn {
191    #[inline]
192    pub fn new(name: &str) -> Self {
193        Self {
194            name: name.to_string(),
195            totals_row_label: StringValue::default(),
196            totals_row_function: EnumValue::default(),
197            calculated_column_formula: None,
198        }
199    }
200
201    #[inline]
202    pub fn get_name(&self) -> &str {
203        self.name.as_str()
204    }
205
206    #[inline]
207    pub fn set_name(&mut self, name: String) {
208        self.name = name;
209    }
210
211    #[inline]
212    pub(crate) fn has_totals_row_label(&self) -> bool {
213        self.totals_row_label.has_value()
214    }
215
216    #[inline]
217    pub fn get_totals_row_label(&self) -> Option<&str> {
218        self.totals_row_label.get_value()
219    }
220
221    #[inline]
222    pub(crate) fn get_totals_row_label_str(&self) -> &str {
223        self.totals_row_label.get_value_str()
224    }
225
226    #[inline]
227    pub fn set_totals_row_label(&mut self, value: &str) {
228        self.totals_row_label.set_value(value);
229    }
230
231    #[inline]
232    pub(crate) fn set_totals_row_label_str(&mut self, value: &str) {
233        self.totals_row_label.set_value_string(value);
234    }
235
236    #[inline]
237    pub(crate) fn has_totals_row_function(&self) -> bool {
238        self.totals_row_function.has_value()
239    }
240
241    #[inline]
242    pub fn get_totals_row_function(&self) -> &TotalsRowFunctionValues {
243        self.totals_row_function.get_value()
244    }
245
246    #[inline]
247    pub(crate) fn get_totals_row_function_str(&self) -> &str {
248        self.totals_row_function.get_value_string()
249    }
250
251    #[inline]
252    pub fn set_totals_row_function(&mut self, value: TotalsRowFunctionValues) {
253        self.totals_row_function.set_value(value);
254    }
255
256    #[inline]
257    pub(crate) fn set_totals_row_function_str(&mut self, value: &str) {
258        self.totals_row_function.set_value_string(value);
259    }
260
261    #[inline]
262    pub fn get_calculated_column_formula(&self) -> Option<&String> {
263        self.calculated_column_formula.as_ref()
264    }
265
266    #[inline]
267    pub(crate) fn set_calculated_column_formula(&mut self, value: String) {
268        self.calculated_column_formula = Some(value);
269    }
270}
271
272#[derive(Clone, Default, Debug)]
273pub struct TableStyleInfo {
274    name: String,
275    show_first_col: bool,
276    show_last_col: bool,
277    show_row_stripes: bool,
278    show_col_stripes: bool,
279}
280impl TableStyleInfo {
281    #[inline]
282    pub fn new(
283        name: &str,
284        show_first_col: bool,
285        show_last_col: bool,
286        show_row_stripes: bool,
287        show_col_stripes: bool,
288    ) -> Self {
289        Self {
290            name: name.to_string(),
291            show_first_col,
292            show_last_col,
293            show_row_stripes,
294            show_col_stripes,
295        }
296    }
297
298    #[inline]
299    pub fn get_name(&self) -> &str {
300        self.name.as_str()
301    }
302
303    #[inline]
304    pub fn is_show_first_col(&self) -> bool {
305        self.show_first_col
306    }
307
308    #[inline]
309    pub fn is_show_last_col(&self) -> bool {
310        self.show_last_col
311    }
312
313    #[inline]
314    pub fn is_show_row_stripes(&self) -> bool {
315        self.show_row_stripes
316    }
317
318    #[inline]
319    pub fn is_show_col_stripes(&self) -> bool {
320        self.show_col_stripes
321    }
322}