docx_reader/documents/elements/
section_property.rs1use 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 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 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}