spreadsheet_ods/style/
masterpage.rs1use crate::style::pagestyle::PageStyleRef;
2use crate::style::AnyStyleRef;
3use crate::text::TextTag;
4use get_size2::GetSize;
5use std::borrow::Borrow;
6
7style_ref2!(MasterPageRef);
8
9#[derive(Clone, Debug, Default, GetSize)]
42pub struct MasterPage {
43 name: String,
44 display_name: String,
45 pagestyle: Option<PageStyleRef>,
46 next_style_name: Option<MasterPageRef>,
47
48 header: HeaderFooter,
49 header_first: HeaderFooter,
50 header_left: HeaderFooter,
51
52 footer: HeaderFooter,
53 footer_first: HeaderFooter,
54 footer_left: HeaderFooter,
55}
56
57impl MasterPage {
58 pub fn new_empty() -> Self {
60 Self {
61 name: Default::default(),
62 display_name: Default::default(),
63 pagestyle: Default::default(),
64 next_style_name: Default::default(),
65 header: Default::default(),
66 header_first: Default::default(),
67 header_left: Default::default(),
68 footer: Default::default(),
69 footer_first: Default::default(),
70 footer_left: Default::default(),
71 }
72 }
73
74 pub fn new<S: AsRef<str>>(name: S) -> Self {
76 Self {
77 name: name.as_ref().to_string(),
78 display_name: Default::default(),
79 pagestyle: Default::default(),
80 next_style_name: Default::default(),
81 header: Default::default(),
82 header_first: Default::default(),
83 header_left: Default::default(),
84 footer: Default::default(),
85 footer_first: Default::default(),
86 footer_left: Default::default(),
87 }
88 }
89
90 pub fn masterpage_ref(&self) -> MasterPageRef {
92 MasterPageRef::from(self.name())
93 }
94
95 pub fn set_name(&mut self, name: String) {
97 self.name = name;
98 }
99
100 pub fn name(&self) -> &String {
102 &self.name
103 }
104
105 pub fn set_display_name(&mut self, display_name: String) {
107 self.display_name = display_name;
108 }
109
110 pub fn display_name(&self) -> &String {
112 &self.display_name
113 }
114
115 pub fn set_pagestyle(&mut self, name: &PageStyleRef) {
117 self.pagestyle = Some(name.clone());
118 }
119
120 pub fn pagestyle(&self) -> Option<&PageStyleRef> {
122 self.pagestyle.as_ref()
123 }
124
125 pub fn set_next_masterpage(&mut self, master: &MasterPageRef) {
130 self.next_style_name = Some(master.clone());
131 }
132
133 pub fn next_masterpage(&self) -> Option<&MasterPageRef> {
135 self.next_style_name.as_ref()
136 }
137
138 pub fn set_header(&mut self, header: HeaderFooter) {
140 self.header = header;
141 }
142
143 pub fn header(&self) -> &HeaderFooter {
145 &self.header
146 }
147
148 pub fn header_mut(&mut self) -> &mut HeaderFooter {
150 &mut self.header
151 }
152
153 pub fn set_header_first(&mut self, header: HeaderFooter) {
155 self.header_first = header;
156 }
157
158 pub fn header_first(&self) -> &HeaderFooter {
160 &self.header_first
161 }
162
163 pub fn header_first_mut(&mut self) -> &mut HeaderFooter {
165 &mut self.header_first
166 }
167
168 pub fn set_header_left(&mut self, header: HeaderFooter) {
170 self.header_left = header;
171 }
172
173 pub fn header_left(&self) -> &HeaderFooter {
175 &self.header_left
176 }
177
178 pub fn header_left_mut(&mut self) -> &mut HeaderFooter {
180 &mut self.header_left
181 }
182
183 pub fn set_footer(&mut self, footer: HeaderFooter) {
185 self.footer = footer;
186 }
187
188 pub fn footer(&self) -> &HeaderFooter {
190 &self.footer
191 }
192
193 pub fn footer_mut(&mut self) -> &mut HeaderFooter {
195 &mut self.footer
196 }
197
198 pub fn set_footer_first(&mut self, footer: HeaderFooter) {
200 self.footer_first = footer;
201 }
202
203 pub fn footer_first(&self) -> &HeaderFooter {
205 &self.footer_first
206 }
207
208 pub fn footer_first_mut(&mut self) -> &mut HeaderFooter {
210 &mut self.footer_first
211 }
212
213 pub fn set_footer_left(&mut self, footer: HeaderFooter) {
215 self.footer_left = footer;
216 }
217
218 pub fn footer_left(&self) -> &HeaderFooter {
220 &self.footer_left
221 }
222
223 pub fn footer_left_mut(&mut self) -> &mut HeaderFooter {
225 &mut self.footer_left
226 }
227}
228
229#[derive(Clone, Debug, Default, GetSize)]
234pub struct HeaderFooter {
235 display: bool,
236
237 region_left: Vec<TextTag>,
238 region_center: Vec<TextTag>,
239 region_right: Vec<TextTag>,
240
241 content: Vec<TextTag>,
242}
243
244impl HeaderFooter {
245 pub fn new() -> Self {
247 Self {
248 display: true,
249 region_left: Default::default(),
250 region_center: Default::default(),
251 region_right: Default::default(),
252 content: Default::default(),
253 }
254 }
255
256 pub fn set_display(&mut self, display: bool) {
258 self.display = display;
259 }
260
261 pub fn display(&self) -> bool {
263 self.display
264 }
265
266 pub fn is_empty(&self) -> bool {
268 self.region_left.is_empty()
269 && self.region_center.is_empty()
270 && self.region_right.is_empty()
271 && self.content.is_empty()
272 }
273
274 pub fn set_left(&mut self, txt: Vec<TextTag>) {
279 self.region_left = txt;
280 }
281
282 pub fn add_left(&mut self, txt: TextTag) {
287 self.region_left.push(txt);
288 }
289
290 pub fn clear_left(&mut self) {
292 self.region_left = Vec::new();
293 }
294
295 pub fn left(&self) -> &Vec<TextTag> {
297 self.region_left.as_ref()
298 }
299
300 pub fn left_mut(&mut self) -> &mut Vec<TextTag> {
302 self.region_left.as_mut()
303 }
304
305 pub fn set_center(&mut self, txt: Vec<TextTag>) {
310 self.region_center = txt;
311 }
312
313 pub fn add_center(&mut self, txt: TextTag) {
318 self.region_center.push(txt);
319 }
320
321 pub fn clear_center(&mut self) {
323 self.region_center = Vec::new();
324 }
325
326 pub fn center(&self) -> &Vec<TextTag> {
328 self.region_center.as_ref()
329 }
330
331 pub fn center_mut(&mut self) -> &mut Vec<TextTag> {
333 self.region_center.as_mut()
334 }
335
336 pub fn set_right(&mut self, txt: Vec<TextTag>) {
341 self.region_right = txt;
342 }
343
344 pub fn add_right(&mut self, txt: TextTag) {
349 self.region_right.push(txt);
350 }
351
352 pub fn clear_right(&mut self) {
354 self.region_right = Vec::new();
355 }
356
357 pub fn right(&self) -> &Vec<TextTag> {
359 self.region_right.as_ref()
360 }
361
362 pub fn right_mut(&mut self) -> &mut Vec<TextTag> {
364 self.region_right.as_mut()
365 }
366
367 pub fn set_content(&mut self, txt: Vec<TextTag>) {
369 self.content = txt;
370 }
371
372 pub fn add_content(&mut self, txt: TextTag) {
374 self.content.push(txt);
375 }
376
377 pub fn content(&self) -> &Vec<TextTag> {
379 &self.content
380 }
381
382 pub fn content_mut(&mut self) -> &mut Vec<TextTag> {
384 &mut self.content
385 }
386}