1use alloc::{rc::Rc, string::String};
2use core::cell::RefCell;
3
4use crate::{Border, BordersArgs, CellBorders, EventData, SetBordersArgs, Table};
5
6impl Table {
7 pub fn borders(
8 &mut self,
9 kwargs: Option<BordersArgs>,
10 ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
11 let kwargs: BordersArgs = kwargs.unwrap_or_default();
12 let span = self.cr_key_to_span(kwargs.key)?;
13 let mut event_data: EventData = self.cr_new_event(kwargs.save_selection);
14 let borders = if kwargs.top.is_some()
15 || kwargs.bottom.is_some()
16 || kwargs.left.is_some()
17 || kwargs.right.is_some()
18 {
19 Some(CellBorders {
20 top: Border::try_from_opt(kwargs.top)?,
21 right: Border::try_from_opt(kwargs.right)?,
22 bottom: Border::try_from_opt(kwargs.bottom)?,
23 left: Border::try_from_opt(kwargs.left)?,
24 })
25 } else {
26 None
27 };
28 let (start_row, end_row) = span.rows_start_end(&self.grid);
29 let (start_col, end_col) = span.cols_start_end(&self.grid);
30
31 if let Err(e) = (|| -> Result<(), String> {
32 if kwargs.expand {
33 self.cr_ensure_widget_nrows(span.max_row(&self.grid), &mut event_data, true)?;
34 self.cr_ensure_widget_ncols(span.max_col(&self.grid), &mut event_data, true)?;
35 }
36 let empty_val = &self.opts.empty_val;
37
38 for row in start_row..=end_row {
39 for col in start_col..=end_col {
40 Self::acr_event_data_set_tborders(
41 &mut self.grid.index.cells,
42 row,
43 col,
44 borders.clone(),
45 empty_val,
46 &mut event_data,
47 )?;
48 }
49 }
50 Ok(())
51 })() {
52 self.cr_roll_back(Rc::new(RefCell::new(event_data)));
53 return Err(e);
54 }
55
56 self.cr_finalize_event_if_any_non_selection_change(
57 event_data,
58 kwargs.undo,
59 kwargs.emit,
60 true,
61 )
62 }
63
64 pub fn borders_i(
65 &mut self,
66 kwargs: Option<BordersArgs>,
67 ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
68 let kwargs: BordersArgs = kwargs.unwrap_or_default();
69 let span = self.cr_key_to_span(kwargs.key)?;
70 let mut event_data: EventData = self.cr_new_event(kwargs.save_selection);
71 let borders = if kwargs.top.is_some()
72 || kwargs.bottom.is_some()
73 || kwargs.left.is_some()
74 || kwargs.right.is_some()
75 {
76 Some(CellBorders {
77 top: Border::try_from_opt(kwargs.top)?,
78 right: Border::try_from_opt(kwargs.right)?,
79 bottom: Border::try_from_opt(kwargs.bottom)?,
80 left: Border::try_from_opt(kwargs.left)?,
81 })
82 } else {
83 None
84 };
85 let (start_row, end_row) = span.rows_start_end(&self.grid);
86
87 if let Err(e) = (|| -> Result<(), String> {
88 if kwargs.expand {
89 self.cr_ensure_widget_nrows(span.max_row(&self.grid), &mut event_data, true)?;
90 }
91
92 for row in start_row..=end_row {
93 Self::acr_event_data_set_iborders(
94 &mut self.grid.index.cells,
95 row,
96 borders.clone(),
97 &mut event_data,
98 )?;
99 }
100 Ok(())
101 })() {
102 self.cr_roll_back(Rc::new(RefCell::new(event_data)));
103 return Err(e);
104 }
105
106 self.cr_finalize_event_if_any_non_selection_change(
107 event_data,
108 kwargs.undo,
109 kwargs.emit,
110 true,
111 )
112 }
113
114 pub fn borders_h(
115 &mut self,
116 kwargs: Option<BordersArgs>,
117 ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
118 let kwargs: BordersArgs = kwargs.unwrap_or_default();
119 let span = self.cr_key_to_span(kwargs.key)?;
120 let mut event_data: EventData = self.cr_new_event(kwargs.save_selection);
121 let borders = if kwargs.top.is_some()
122 || kwargs.bottom.is_some()
123 || kwargs.left.is_some()
124 || kwargs.right.is_some()
125 {
126 Some(CellBorders {
127 top: Border::try_from_opt(kwargs.top)?,
128 right: Border::try_from_opt(kwargs.right)?,
129 bottom: Border::try_from_opt(kwargs.bottom)?,
130 left: Border::try_from_opt(kwargs.left)?,
131 })
132 } else {
133 None
134 };
135 let (start_col, end_col) = span.cols_start_end(&self.grid);
136
137 if let Err(e) = (|| -> Result<(), String> {
138 if kwargs.expand {
139 self.cr_ensure_widget_ncols(span.max_col(&self.grid), &mut event_data, true)?;
140 }
141
142 for col in start_col..=end_col {
143 Self::acr_event_data_set_hborders(
144 &mut self.grid.header.cells,
145 col,
146 borders.clone(),
147 &mut event_data,
148 )?;
149 }
150 Ok(())
151 })() {
152 self.cr_roll_back(Rc::new(RefCell::new(event_data)));
153 return Err(e);
154 }
155
156 self.cr_finalize_event_if_any_non_selection_change(
157 event_data,
158 kwargs.undo,
159 kwargs.emit,
160 true,
161 )
162 }
163
164 pub fn set_borders(
165 &mut self,
166 kwargs: Option<SetBordersArgs>,
167 ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
168 let kwargs = kwargs.unwrap_or_default();
169 let span = self.cr_key_to_span(kwargs.key)?;
170 let mut event_data = self.cr_new_event(kwargs.save_selection);
171
172 let top = kwargs.top.map(Border::try_from_opt).transpose()?;
173 let right = kwargs.right.map(Border::try_from_opt).transpose()?;
174 let bottom = kwargs.bottom.map(Border::try_from_opt).transpose()?;
175 let left = kwargs.left.map(Border::try_from_opt).transpose()?;
176
177 let (start_row, end_row) = span.rows_start_end(&self.grid);
178 let (start_col, end_col) = span.cols_start_end(&self.grid);
179 let empty_val = &self.opts.empty_val;
180
181 if let Err(e) = (|| -> Result<(), String> {
182 for row in start_row..=end_row {
183 for col in start_col..=end_col {
184 if let Some(b) = &top {
185 Self::acr_event_data_set_tborders_top(
186 &mut self.grid.index.cells,
187 row,
188 col,
189 b.clone(),
190 empty_val,
191 &mut event_data,
192 )?;
193 }
194 if let Some(b) = &right {
195 Self::acr_event_data_set_tborders_right(
196 &mut self.grid.index.cells,
197 row,
198 col,
199 b.clone(),
200 empty_val,
201 &mut event_data,
202 )?;
203 }
204 if let Some(b) = &bottom {
205 Self::acr_event_data_set_tborders_bottom(
206 &mut self.grid.index.cells,
207 row,
208 col,
209 b.clone(),
210 empty_val,
211 &mut event_data,
212 )?;
213 }
214 if let Some(b) = &left {
215 Self::acr_event_data_set_tborders_left(
216 &mut self.grid.index.cells,
217 row,
218 col,
219 b.clone(),
220 empty_val,
221 &mut event_data,
222 )?;
223 }
224 }
225 }
226 Ok(())
227 })() {
228 self.cr_roll_back(Rc::new(RefCell::new(event_data)));
229 return Err(e);
230 }
231
232 self.cr_finalize_event_if_any_non_selection_change(
233 event_data,
234 kwargs.undo,
235 kwargs.emit,
236 true,
237 )
238 }
239
240 pub fn set_borders_i(
241 &mut self,
242 kwargs: Option<SetBordersArgs>,
243 ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
244 let kwargs = kwargs.unwrap_or_default();
245 let span = self.cr_key_to_span(kwargs.key)?;
246 let mut event_data = self.cr_new_event(kwargs.save_selection);
247
248 let top = kwargs.top.map(Border::try_from_opt).transpose()?;
249 let right = kwargs.right.map(Border::try_from_opt).transpose()?;
250 let bottom = kwargs.bottom.map(Border::try_from_opt).transpose()?;
251 let left = kwargs.left.map(Border::try_from_opt).transpose()?;
252
253 let (start_row, end_row) = span.rows_start_end(&self.grid);
254
255 if let Err(e) = (|| -> Result<(), String> {
256 for row in start_row..=end_row {
257 if let Some(b) = &top {
258 Self::acr_event_data_set_iborders_top(
259 &mut self.grid.index.cells,
260 row,
261 b.clone(),
262 &mut event_data,
263 )?;
264 }
265 if let Some(b) = &right {
266 Self::acr_event_data_set_iborders_right(
267 &mut self.grid.index.cells,
268 row,
269 b.clone(),
270 &mut event_data,
271 )?;
272 }
273 if let Some(b) = &bottom {
274 Self::acr_event_data_set_iborders_bottom(
275 &mut self.grid.index.cells,
276 row,
277 b.clone(),
278 &mut event_data,
279 )?;
280 }
281 if let Some(b) = &left {
282 Self::acr_event_data_set_iborders_left(
283 &mut self.grid.index.cells,
284 row,
285 b.clone(),
286 &mut event_data,
287 )?;
288 }
289 }
290 Ok(())
291 })() {
292 self.cr_roll_back(Rc::new(RefCell::new(event_data)));
293 return Err(e);
294 }
295 self.cr_finalize_event_if_any_non_selection_change(
296 event_data,
297 kwargs.undo,
298 kwargs.emit,
299 true,
300 )
301 }
302
303 pub fn set_borders_h(
304 &mut self,
305 kwargs: Option<SetBordersArgs>,
306 ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
307 let kwargs = kwargs.unwrap_or_default();
308 let span = self.cr_key_to_span(kwargs.key)?;
309 let mut event_data = self.cr_new_event(kwargs.save_selection);
310
311 let top = kwargs.top.map(Border::try_from_opt).transpose()?;
312 let right = kwargs.right.map(Border::try_from_opt).transpose()?;
313 let bottom = kwargs.bottom.map(Border::try_from_opt).transpose()?;
314 let left = kwargs.left.map(Border::try_from_opt).transpose()?;
315
316 let (start_col, end_col) = span.cols_start_end(&self.grid);
317
318 if let Err(e) = (|| -> Result<(), String> {
319 for col in start_col..=end_col {
320 if let Some(b) = &top {
321 Self::acr_event_data_set_hborders_top(
322 &mut self.grid.header.cells,
323 col,
324 b.clone(),
325 &mut event_data,
326 )?;
327 }
328 if let Some(b) = &right {
329 Self::acr_event_data_set_hborders_right(
330 &mut self.grid.header.cells,
331 col,
332 b.clone(),
333 &mut event_data,
334 )?;
335 }
336 if let Some(b) = &bottom {
337 Self::acr_event_data_set_hborders_bottom(
338 &mut self.grid.header.cells,
339 col,
340 b.clone(),
341 &mut event_data,
342 )?;
343 }
344 if let Some(b) = &left {
345 Self::acr_event_data_set_hborders_left(
346 &mut self.grid.header.cells,
347 col,
348 b.clone(),
349 &mut event_data,
350 )?;
351 }
352 }
353 Ok(())
354 })() {
355 self.cr_roll_back(Rc::new(RefCell::new(event_data)));
356 return Err(e);
357 }
358 self.cr_finalize_event_if_any_non_selection_change(
359 event_data,
360 kwargs.undo,
361 kwargs.emit,
362 true,
363 )
364 }
365}