use crate::style::pagestyle::PageStyleRef;
use crate::style::AnyStyleRef;
use crate::text::TextTag;
use get_size2::GetSize;
use std::borrow::Borrow;
style_ref2!(MasterPageRef);
#[derive(Clone, Debug, Default, GetSize)]
pub struct MasterPage {
name: String,
display_name: String,
pagestyle: Option<PageStyleRef>,
next_style_name: Option<MasterPageRef>,
header: HeaderFooter,
header_first: HeaderFooter,
header_left: HeaderFooter,
footer: HeaderFooter,
footer_first: HeaderFooter,
footer_left: HeaderFooter,
}
impl MasterPage {
pub fn new_empty() -> Self {
Self {
name: Default::default(),
display_name: Default::default(),
pagestyle: Default::default(),
next_style_name: Default::default(),
header: Default::default(),
header_first: Default::default(),
header_left: Default::default(),
footer: Default::default(),
footer_first: Default::default(),
footer_left: Default::default(),
}
}
pub fn new<S: AsRef<str>>(name: S) -> Self {
Self {
name: name.as_ref().to_string(),
display_name: Default::default(),
pagestyle: Default::default(),
next_style_name: Default::default(),
header: Default::default(),
header_first: Default::default(),
header_left: Default::default(),
footer: Default::default(),
footer_first: Default::default(),
footer_left: Default::default(),
}
}
pub fn masterpage_ref(&self) -> MasterPageRef {
MasterPageRef::from(self.name())
}
pub fn set_name(&mut self, name: String) {
self.name = name;
}
pub fn name(&self) -> &String {
&self.name
}
pub fn set_display_name(&mut self, display_name: String) {
self.display_name = display_name;
}
pub fn display_name(&self) -> &String {
&self.display_name
}
pub fn set_pagestyle(&mut self, name: &PageStyleRef) {
self.pagestyle = Some(name.clone());
}
pub fn pagestyle(&self) -> Option<&PageStyleRef> {
self.pagestyle.as_ref()
}
pub fn set_next_masterpage(&mut self, master: &MasterPageRef) {
self.next_style_name = Some(master.clone());
}
pub fn next_masterpage(&self) -> Option<&MasterPageRef> {
self.next_style_name.as_ref()
}
pub fn set_header(&mut self, header: HeaderFooter) {
self.header = header;
}
pub fn header(&self) -> &HeaderFooter {
&self.header
}
pub fn header_mut(&mut self) -> &mut HeaderFooter {
&mut self.header
}
pub fn set_header_first(&mut self, header: HeaderFooter) {
self.header_first = header;
}
pub fn header_first(&self) -> &HeaderFooter {
&self.header_first
}
pub fn header_first_mut(&mut self) -> &mut HeaderFooter {
&mut self.header_first
}
pub fn set_header_left(&mut self, header: HeaderFooter) {
self.header_left = header;
}
pub fn header_left(&self) -> &HeaderFooter {
&self.header_left
}
pub fn header_left_mut(&mut self) -> &mut HeaderFooter {
&mut self.header_left
}
pub fn set_footer(&mut self, footer: HeaderFooter) {
self.footer = footer;
}
pub fn footer(&self) -> &HeaderFooter {
&self.footer
}
pub fn footer_mut(&mut self) -> &mut HeaderFooter {
&mut self.footer
}
pub fn set_footer_first(&mut self, footer: HeaderFooter) {
self.footer_first = footer;
}
pub fn footer_first(&self) -> &HeaderFooter {
&self.footer_first
}
pub fn footer_first_mut(&mut self) -> &mut HeaderFooter {
&mut self.footer_first
}
pub fn set_footer_left(&mut self, footer: HeaderFooter) {
self.footer_left = footer;
}
pub fn footer_left(&self) -> &HeaderFooter {
&self.footer_left
}
pub fn footer_left_mut(&mut self) -> &mut HeaderFooter {
&mut self.footer_left
}
}
#[derive(Clone, Debug, Default, GetSize)]
pub struct HeaderFooter {
display: bool,
region_left: Vec<TextTag>,
region_center: Vec<TextTag>,
region_right: Vec<TextTag>,
content: Vec<TextTag>,
}
impl HeaderFooter {
pub fn new() -> Self {
Self {
display: true,
region_left: Default::default(),
region_center: Default::default(),
region_right: Default::default(),
content: Default::default(),
}
}
pub fn set_display(&mut self, display: bool) {
self.display = display;
}
pub fn display(&self) -> bool {
self.display
}
pub fn is_empty(&self) -> bool {
self.region_left.is_empty()
&& self.region_center.is_empty()
&& self.region_right.is_empty()
&& self.content.is_empty()
}
pub fn set_left(&mut self, txt: Vec<TextTag>) {
self.region_left = txt;
}
pub fn add_left(&mut self, txt: TextTag) {
self.region_left.push(txt);
}
pub fn clear_left(&mut self) {
self.region_left = Vec::new();
}
pub fn left(&self) -> &Vec<TextTag> {
self.region_left.as_ref()
}
pub fn left_mut(&mut self) -> &mut Vec<TextTag> {
self.region_left.as_mut()
}
pub fn set_center(&mut self, txt: Vec<TextTag>) {
self.region_center = txt;
}
pub fn add_center(&mut self, txt: TextTag) {
self.region_center.push(txt);
}
pub fn clear_center(&mut self) {
self.region_center = Vec::new();
}
pub fn center(&self) -> &Vec<TextTag> {
self.region_center.as_ref()
}
pub fn center_mut(&mut self) -> &mut Vec<TextTag> {
self.region_center.as_mut()
}
pub fn set_right(&mut self, txt: Vec<TextTag>) {
self.region_right = txt;
}
pub fn add_right(&mut self, txt: TextTag) {
self.region_right.push(txt);
}
pub fn clear_right(&mut self) {
self.region_right = Vec::new();
}
pub fn right(&self) -> &Vec<TextTag> {
self.region_right.as_ref()
}
pub fn right_mut(&mut self) -> &mut Vec<TextTag> {
self.region_right.as_mut()
}
pub fn set_content(&mut self, txt: Vec<TextTag>) {
self.content = txt;
}
pub fn add_content(&mut self, txt: TextTag) {
self.content.push(txt);
}
pub fn content(&self) -> &Vec<TextTag> {
&self.content
}
pub fn content_mut(&mut self) -> &mut Vec<TextTag> {
&mut self.content
}
}