umya_spreadsheet/structs/
table.rs1use 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#[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}