spreadsheet_ods/style/
masterpage.rs

1use 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/// Defines the structure and content for a page.
10/// Refers to a PageStyle for layout information.
11/// It must be attached to a Sheet to be used.
12///
13/// ```
14/// use spreadsheet_ods::{pt, Length, WorkBook, Sheet};
15/// use spreadsheet_ods::style::{PageStyle, MasterPage, TableStyle};
16/// use spreadsheet_ods::style::units::Border;
17/// use spreadsheet_ods::xmltree::XmlVec;
18/// use spreadsheet_ods::color::Rgb;
19/// use icu_locale_core::locale;
20///
21/// let mut wb = WorkBook::new(locale!("en-US"));
22///
23/// let mut ps = PageStyle::new("ps1");
24/// ps.set_border(pt!(0.5), Border::Groove, Rgb::new(128,128,128));
25/// ps.headerstyle_mut().set_background_color(Rgb::new(92,92,92));
26/// let ps_ref = wb.add_pagestyle(ps);
27///
28/// let mut mp1 = MasterPage::new("mp1");
29/// mp1.set_pagestyle(&ps_ref);
30/// mp1.header_mut().center_mut().add_text("center");
31/// mp1.footer_mut().right_mut().add_text("right");
32/// let mp1_ref = wb.add_masterpage(mp1);
33///
34/// let mut ts = TableStyle::new("ts1");
35/// ts.set_master_page(&mp1_ref);
36/// let ts_ref = wb.add_tablestyle(ts);
37///
38/// let mut sheet = Sheet::new("sheet 1");
39/// sheet.set_style(&ts_ref);
40/// ```
41#[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    /// Empty.
59    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    /// New MasterPage
75    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    /// Style reference.
91    pub fn masterpage_ref(&self) -> MasterPageRef {
92        MasterPageRef::from(self.name())
93    }
94
95    /// Name.
96    pub fn set_name(&mut self, name: String) {
97        self.name = name;
98    }
99
100    /// Name.
101    pub fn name(&self) -> &String {
102        &self.name
103    }
104
105    /// Name.
106    pub fn set_display_name(&mut self, display_name: String) {
107        self.display_name = display_name;
108    }
109
110    /// Name.
111    pub fn display_name(&self) -> &String {
112        &self.display_name
113    }
114
115    /// Reference to a page-style.
116    pub fn set_pagestyle(&mut self, name: &PageStyleRef) {
117        self.pagestyle = Some(name.clone());
118    }
119
120    /// Reference to a page-style.
121    pub fn pagestyle(&self) -> Option<&PageStyleRef> {
122        self.pagestyle.as_ref()
123    }
124
125    /// The style:next-style-name attribute specifies the name of the master page that is used for
126    /// the next page if the current page is entirely filled. If the next style name is not specified, the
127    /// current master page is used for the next page. The value of this attribute shall be the name of a
128    /// <style:master-page> element.
129    pub fn set_next_masterpage(&mut self, master: &MasterPageRef) {
130        self.next_style_name = Some(master.clone());
131    }
132
133    /// Next.
134    pub fn next_masterpage(&self) -> Option<&MasterPageRef> {
135        self.next_style_name.as_ref()
136    }
137
138    /// Left side header.
139    pub fn set_header(&mut self, header: HeaderFooter) {
140        self.header = header;
141    }
142
143    /// Left side header.
144    pub fn header(&self) -> &HeaderFooter {
145        &self.header
146    }
147
148    /// Header.
149    pub fn header_mut(&mut self) -> &mut HeaderFooter {
150        &mut self.header
151    }
152
153    /// First page header.
154    pub fn set_header_first(&mut self, header: HeaderFooter) {
155        self.header_first = header;
156    }
157
158    /// First page header.
159    pub fn header_first(&self) -> &HeaderFooter {
160        &self.header_first
161    }
162
163    /// First page header.
164    pub fn header_first_mut(&mut self) -> &mut HeaderFooter {
165        &mut self.header_first
166    }
167
168    /// Left side header.
169    pub fn set_header_left(&mut self, header: HeaderFooter) {
170        self.header_left = header;
171    }
172
173    /// Left side header.
174    pub fn header_left(&self) -> &HeaderFooter {
175        &self.header_left
176    }
177
178    /// Left side header.
179    pub fn header_left_mut(&mut self) -> &mut HeaderFooter {
180        &mut self.header_left
181    }
182
183    /// Footer.
184    pub fn set_footer(&mut self, footer: HeaderFooter) {
185        self.footer = footer;
186    }
187
188    /// Footer.
189    pub fn footer(&self) -> &HeaderFooter {
190        &self.footer
191    }
192
193    /// Footer.
194    pub fn footer_mut(&mut self) -> &mut HeaderFooter {
195        &mut self.footer
196    }
197
198    /// First page footer.
199    pub fn set_footer_first(&mut self, footer: HeaderFooter) {
200        self.footer_first = footer;
201    }
202
203    /// First page footer.
204    pub fn footer_first(&self) -> &HeaderFooter {
205        &self.footer_first
206    }
207
208    /// First page footer.
209    pub fn footer_first_mut(&mut self) -> &mut HeaderFooter {
210        &mut self.footer_first
211    }
212
213    /// Left side footer.
214    pub fn set_footer_left(&mut self, footer: HeaderFooter) {
215        self.footer_left = footer;
216    }
217
218    /// Left side footer.
219    pub fn footer_left(&self) -> &HeaderFooter {
220        &self.footer_left
221    }
222
223    /// Left side footer.
224    pub fn footer_left_mut(&mut self) -> &mut HeaderFooter {
225        &mut self.footer_left
226    }
227}
228
229/// Header/Footer data.
230/// Can be seen as three regions left/center/right or as one region.
231/// In the first case region* contains the data, in the second it's content.
232/// Each is a TextTag of parsed XML-tags.
233#[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    /// Create
246    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    /// Is the header displayed. Used to deactivate left side headers.
257    pub fn set_display(&mut self, display: bool) {
258        self.display = display;
259    }
260
261    /// Display
262    pub fn display(&self) -> bool {
263        self.display
264    }
265
266    /// true if all regions of the header/footer are empty.
267    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    /// Set the content of the left region of the header.
275    ///
276    /// Attention:
277    /// This tag must be a text:p otherwise its ignored.
278    pub fn set_left(&mut self, txt: Vec<TextTag>) {
279        self.region_left = txt;
280    }
281
282    /// Adds to the content of the left region of the header.
283    ///
284    /// Attention:
285    /// This tag must be a text:p otherwise its ignored.
286    pub fn add_left(&mut self, txt: TextTag) {
287        self.region_left.push(txt);
288    }
289
290    /// Clear left region.
291    pub fn clear_left(&mut self) {
292        self.region_left = Vec::new();
293    }
294
295    /// Left region.
296    pub fn left(&self) -> &Vec<TextTag> {
297        self.region_left.as_ref()
298    }
299
300    /// Left region.
301    pub fn left_mut(&mut self) -> &mut Vec<TextTag> {
302        self.region_left.as_mut()
303    }
304
305    /// Set the content of the center region of the header.
306    ///
307    /// Attention:
308    /// This tag must be a text:p otherwise its ignored.
309    pub fn set_center(&mut self, txt: Vec<TextTag>) {
310        self.region_center = txt;
311    }
312
313    /// Adds to the content of the center region of the header.
314    ///
315    /// Attention:
316    /// This tag must be a text:p otherwise its ignored.
317    pub fn add_center(&mut self, txt: TextTag) {
318        self.region_center.push(txt);
319    }
320
321    /// Center region.
322    pub fn clear_center(&mut self) {
323        self.region_center = Vec::new();
324    }
325
326    /// Center region.
327    pub fn center(&self) -> &Vec<TextTag> {
328        self.region_center.as_ref()
329    }
330
331    /// Center region.
332    pub fn center_mut(&mut self) -> &mut Vec<TextTag> {
333        self.region_center.as_mut()
334    }
335
336    /// Set the content of the right region of the header.
337    ///
338    /// Attention:
339    /// This tag must be a text:p otherwise its ignored.
340    pub fn set_right(&mut self, txt: Vec<TextTag>) {
341        self.region_right = txt;
342    }
343
344    /// Adds to the content of the right region of the header.
345    ///
346    /// Attention:
347    /// This tag must be a text:p otherwise its ignored.
348    pub fn add_right(&mut self, txt: TextTag) {
349        self.region_right.push(txt);
350    }
351
352    /// Right region.
353    pub fn clear_right(&mut self) {
354        self.region_right = Vec::new();
355    }
356
357    /// Right region.
358    pub fn right(&self) -> &Vec<TextTag> {
359        self.region_right.as_ref()
360    }
361
362    /// Right region.
363    pub fn right_mut(&mut self) -> &mut Vec<TextTag> {
364        self.region_right.as_mut()
365    }
366
367    /// Header content, if there are no regions.
368    pub fn set_content(&mut self, txt: Vec<TextTag>) {
369        self.content = txt;
370    }
371
372    /// Adds header content, if there are no regions.
373    pub fn add_content(&mut self, txt: TextTag) {
374        self.content.push(txt);
375    }
376
377    /// Header content, if there are no regions.
378    pub fn content(&self) -> &Vec<TextTag> {
379        &self.content
380    }
381
382    /// Header content, if there are no regions.
383    pub fn content_mut(&mut self) -> &mut Vec<TextTag> {
384        &mut self.content
385    }
386}