docx_reader/documents/elements/
section_property.rs

1use super::*;
2use crate::types::*;
3use crate::Footer;
4use crate::Header;
5
6use serde::Serialize;
7
8#[derive(Debug, Clone, PartialEq, Serialize)]
9#[serde(rename_all = "camelCase")]
10pub struct SectionProperty {
11	pub page_size: PageSize,
12	pub page_margin: PageMargin,
13	pub columns: usize,
14	pub space: usize,
15	pub title_pg: bool,
16	pub text_direction: String,
17	#[serde(skip_serializing_if = "Option::is_none")]
18	pub doc_grid: Option<DocGrid>,
19	#[serde(skip_serializing_if = "Option::is_none")]
20	pub header_reference: Option<HeaderReference>,
21	#[serde(skip_serializing_if = "Option::is_none")]
22	pub header: Option<Header>,
23	#[serde(skip_serializing_if = "Option::is_none")]
24	pub first_header_reference: Option<HeaderReference>,
25	#[serde(skip_serializing_if = "Option::is_none")]
26	pub first_header: Option<Header>,
27	#[serde(skip_serializing_if = "Option::is_none")]
28	pub even_header_reference: Option<HeaderReference>,
29	#[serde(skip_serializing_if = "Option::is_none")]
30	pub even_header: Option<Header>,
31	#[serde(skip_serializing_if = "Option::is_none")]
32	pub footer_reference: Option<FooterReference>,
33	#[serde(skip_serializing_if = "Option::is_none")]
34	pub footer: Option<Footer>,
35	#[serde(skip_serializing_if = "Option::is_none")]
36	pub first_footer_reference: Option<FooterReference>,
37	#[serde(skip_serializing_if = "Option::is_none")]
38	pub first_footer: Option<Footer>,
39	#[serde(skip_serializing_if = "Option::is_none")]
40	pub even_footer_reference: Option<FooterReference>,
41	#[serde(skip_serializing_if = "Option::is_none")]
42	pub even_footer: Option<Footer>,
43	#[serde(skip_serializing_if = "Option::is_none")]
44	pub section_type: Option<SectionType>,
45}
46
47impl SectionProperty {
48	pub fn new() -> SectionProperty {
49		Default::default()
50	}
51
52	pub fn page_size(mut self, size: PageSize) -> Self {
53		self.page_size = size;
54		self
55	}
56
57	pub fn page_margin(mut self, margin: PageMargin) -> Self {
58		self.page_margin = margin;
59		self
60	}
61
62	pub fn page_orient(mut self, o: PageOrientationType) -> Self {
63		self.page_size = self.page_size.orient(o);
64		self
65	}
66
67	pub fn doc_grid(mut self, doc_grid: DocGrid) -> Self {
68		self.doc_grid = Some(doc_grid);
69		self
70	}
71
72	pub fn text_direction(mut self, direction: String) -> Self {
73		self.text_direction = direction;
74		self
75	}
76
77	pub fn title_pg(mut self) -> Self {
78		self.title_pg = true;
79		self
80	}
81
82	pub fn header(mut self, h: Header, rid: &str) -> Self {
83		self.header_reference = Some(HeaderReference::new("default", rid));
84		self.header = Some(h);
85		self
86	}
87
88	pub fn first_header(mut self, h: Header, rid: &str) -> Self {
89		self.first_header_reference = Some(HeaderReference::new("first", rid));
90		self.first_header = Some(h);
91		self.title_pg = true;
92		self
93	}
94
95	pub fn first_header_without_title_pg(mut self, h: Header, rid: &str) -> Self {
96		self.first_header_reference = Some(HeaderReference::new("first", rid));
97		self.first_header = Some(h);
98		self
99	}
100
101	pub fn even_header(mut self, h: Header, rid: &str) -> Self {
102		self.even_header_reference = Some(HeaderReference::new("even", rid));
103		self.even_header = Some(h);
104		self
105	}
106
107	pub fn footer(mut self, h: Footer, rid: &str) -> Self {
108		self.footer_reference = Some(FooterReference::new("default", rid));
109		self.footer = Some(h);
110		self
111	}
112
113	pub fn first_footer(mut self, h: Footer, rid: &str) -> Self {
114		self.first_footer_reference = Some(FooterReference::new("first", rid));
115		self.first_footer = Some(h);
116		self.title_pg = true;
117		self
118	}
119
120	pub fn first_footer_without_title_pg(mut self, h: Footer, rid: &str) -> Self {
121		self.first_footer_reference = Some(FooterReference::new("first", rid));
122		self.first_footer = Some(h);
123		self
124	}
125
126	pub fn even_footer(mut self, h: Footer, rid: &str) -> Self {
127		self.even_footer_reference = Some(FooterReference::new("even", rid));
128		self.even_footer = Some(h);
129		self
130	}
131
132	pub fn get_headers(&self) -> Vec<&Header> {
133		let mut headers = vec![];
134		if let Some(ref header) = self.header {
135			headers.push(header);
136		}
137		if let Some(ref header) = self.first_header {
138			headers.push(header);
139		}
140		if let Some(ref header) = self.even_header {
141			headers.push(header);
142		}
143		headers
144	}
145
146	pub fn get_footers(&self) -> Vec<&Footer> {
147		let mut footers = vec![];
148		if let Some(ref footer) = self.footer {
149			footers.push(footer);
150		}
151		if let Some(ref footer) = self.first_footer {
152			footers.push(footer);
153		}
154		if let Some(ref footer) = self.even_footer {
155			footers.push(footer);
156		}
157		footers
158	}
159}
160
161impl Default for SectionProperty {
162	fn default() -> Self {
163		Self {
164			page_size: PageSize::new(),
165			page_margin: PageMargin::new(),
166			columns: 1,
167			space: 425,
168			title_pg: false,
169			text_direction: "lrTb".to_string(),
170			doc_grid: None,
171			// headers
172			header_reference: None,
173			header: None,
174			first_header_reference: None,
175			first_header: None,
176			even_header_reference: None,
177			even_header: None,
178			// footers
179			footer_reference: None,
180			footer: None,
181			first_footer_reference: None,
182			first_footer: None,
183			even_footer_reference: None,
184			even_footer: None,
185			section_type: None,
186		}
187	}
188}