use crate::config::Config;
use crate::defaultstyles::{DefaultFormat, DefaultStyle};
use crate::ds::detach::{Detach, Detached};
use crate::format::ValueFormatTrait;
use crate::io::read::default_settings;
use crate::io::NamespaceMap;
use crate::manifest::Manifest;
use crate::metadata::Metadata;
use crate::sheet_::Sheet;
use crate::style::{
ColStyle, ColStyleRef, FontFaceDecl, GraphicStyle, GraphicStyleRef, MasterPage, MasterPageRef,
PageStyle, PageStyleRef, ParagraphStyle, ParagraphStyleRef, RowStyle, RowStyleRef, RubyStyle,
RubyStyleRef, TableStyle, TableStyleRef, TextStyle, TextStyleRef,
};
use crate::validation::{Validation, ValidationRef};
use crate::value_::ValueType;
use crate::xlink::{XLinkActuate, XLinkType};
use crate::xmltree::{XmlContent, XmlTag};
use crate::{
locale, CellStyle, CellStyleRef, HashMap, ValueFormatBoolean, ValueFormatCurrency,
ValueFormatDateTime, ValueFormatNumber, ValueFormatPercentage, ValueFormatRef, ValueFormatText,
ValueFormatTimeDuration,
};
use icu_locid::{locale, Locale};
use std::fmt;
use std::fmt::Formatter;
#[derive(Clone)]
pub struct WorkBook {
pub(crate) sheets: Vec<Detach<Sheet>>,
pub(crate) version: String,
pub(crate) fonts: HashMap<String, FontFaceDecl>,
pub(crate) autonum: HashMap<String, u32>,
pub(crate) scripts: Vec<Script>,
pub(crate) event_listener: HashMap<String, EventListener>,
pub(crate) tablestyles: HashMap<String, TableStyle>,
pub(crate) rowstyles: HashMap<String, RowStyle>,
pub(crate) colstyles: HashMap<String, ColStyle>,
pub(crate) cellstyles: HashMap<String, CellStyle>,
pub(crate) paragraphstyles: HashMap<String, ParagraphStyle>,
pub(crate) textstyles: HashMap<String, TextStyle>,
pub(crate) rubystyles: HashMap<String, RubyStyle>,
pub(crate) graphicstyles: HashMap<String, GraphicStyle>,
pub(crate) formats_boolean: HashMap<String, ValueFormatBoolean>,
pub(crate) formats_number: HashMap<String, ValueFormatNumber>,
pub(crate) formats_percentage: HashMap<String, ValueFormatPercentage>,
pub(crate) formats_currency: HashMap<String, ValueFormatCurrency>,
pub(crate) formats_text: HashMap<String, ValueFormatText>,
pub(crate) formats_datetime: HashMap<String, ValueFormatDateTime>,
pub(crate) formats_timeduration: HashMap<String, ValueFormatTimeDuration>,
pub(crate) def_styles: HashMap<ValueType, String>,
pub(crate) pagestyles: HashMap<String, PageStyle>,
pub(crate) masterpages: HashMap<String, MasterPage>,
pub(crate) validations: HashMap<String, Validation>,
pub(crate) config: Detach<Config>,
pub(crate) workbook_config: WorkBookConfig,
pub(crate) xmlns: HashMap<String, NamespaceMap>,
pub(crate) manifest: HashMap<String, Manifest>,
pub(crate) metadata: Metadata,
pub(crate) extra: Vec<XmlTag>,
}
impl fmt::Debug for WorkBook {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
writeln!(f, "{:?}", self.version)?;
for s in self.sheets.iter() {
writeln!(f, "{:?}", s)?;
}
for s in self.fonts.values() {
writeln!(f, "{:?}", s)?;
}
for s in self.tablestyles.values() {
writeln!(f, "{:?}", s)?;
}
for s in self.rowstyles.values() {
writeln!(f, "{:?}", s)?;
}
for s in self.colstyles.values() {
writeln!(f, "{:?}", s)?;
}
for s in self.cellstyles.values() {
writeln!(f, "{:?}", s)?;
}
for s in self.paragraphstyles.values() {
writeln!(f, "{:?}", s)?;
}
for s in self.textstyles.values() {
writeln!(f, "{:?}", s)?;
}
for s in self.rubystyles.values() {
writeln!(f, "{:?}", s)?;
}
for s in self.graphicstyles.values() {
writeln!(f, "{:?}", s)?;
}
for s in self.formats_boolean.values() {
writeln!(f, "{:?}", s)?;
}
for s in self.formats_number.values() {
writeln!(f, "{:?}", s)?;
}
for s in self.formats_percentage.values() {
writeln!(f, "{:?}", s)?;
}
for s in self.formats_currency.values() {
writeln!(f, "{:?}", s)?;
}
for s in self.formats_text.values() {
writeln!(f, "{:?}", s)?;
}
for s in self.formats_datetime.values() {
writeln!(f, "{:?}", s)?;
}
for s in self.formats_timeduration.values() {
writeln!(f, "{:?}", s)?;
}
for (t, s) in &self.def_styles {
writeln!(f, "{:?} -> {:?}", t, s)?;
}
for s in self.pagestyles.values() {
writeln!(f, "{:?}", s)?;
}
for s in self.masterpages.values() {
writeln!(f, "{:?}", s)?;
}
for s in self.validations.values() {
writeln!(f, "{:?}", s)?;
}
writeln!(f, "{:?}", &self.workbook_config)?;
for v in self.manifest.values() {
writeln!(f, "extras {:?}", v)?;
}
writeln!(f, "{:?}", &self.metadata)?;
for xtr in &self.extra {
writeln!(f, "extras {:?}", xtr)?;
}
Ok(())
}
}
fn auto_style_name<T>(
autonum: &mut HashMap<String, u32>,
prefix: &str,
styles: &HashMap<String, T>,
) -> String {
let mut cnt = if let Some(n) = autonum.get(prefix) {
n + 1
} else {
0
};
let style_name = loop {
let style_name = format!("{}{}", prefix, cnt);
if !styles.contains_key(&style_name) {
break style_name;
}
cnt += 1;
};
autonum.insert(prefix.to_string(), cnt);
style_name
}
impl Default for WorkBook {
fn default() -> Self {
WorkBook::new(locale!("en"))
}
}
impl WorkBook {
pub fn new_empty() -> Self {
WorkBook {
sheets: Default::default(),
version: "1.3".to_string(),
fonts: Default::default(),
autonum: Default::default(),
scripts: Default::default(),
event_listener: Default::default(),
tablestyles: Default::default(),
rowstyles: Default::default(),
colstyles: Default::default(),
cellstyles: Default::default(),
paragraphstyles: Default::default(),
textstyles: Default::default(),
rubystyles: Default::default(),
graphicstyles: Default::default(),
formats_boolean: Default::default(),
formats_number: Default::default(),
formats_percentage: Default::default(),
formats_currency: Default::default(),
formats_text: Default::default(),
formats_datetime: Default::default(),
formats_timeduration: Default::default(),
def_styles: Default::default(),
pagestyles: Default::default(),
masterpages: Default::default(),
validations: Default::default(),
config: default_settings(),
workbook_config: Default::default(),
extra: vec![],
manifest: Default::default(),
metadata: Default::default(),
xmlns: Default::default(),
}
}
pub fn new(locale: Locale) -> Self {
let mut wb = WorkBook::new_empty();
wb.locale_settings(locale);
wb
}
pub fn locale_settings(&mut self, locale: Locale) {
if let Some(lf) = locale::localized_format(locale) {
self.add_boolean_format(lf.boolean_format());
self.add_number_format(lf.number_format());
self.add_percentage_format(lf.percentage_format());
self.add_currency_format(lf.currency_format());
self.add_datetime_format(lf.date_format());
self.add_datetime_format(lf.datetime_format());
self.add_datetime_format(lf.time_of_day_format());
self.add_timeduration_format(lf.time_interval_format());
}
self.add_cellstyle(CellStyle::new(
DefaultStyle::bool().to_string(),
&DefaultFormat::bool(),
));
self.add_cellstyle(CellStyle::new(
DefaultStyle::number().to_string(),
&DefaultFormat::number(),
));
self.add_cellstyle(CellStyle::new(
DefaultStyle::percent().to_string(),
&DefaultFormat::percent(),
));
self.add_cellstyle(CellStyle::new(
DefaultStyle::currency().to_string(),
&DefaultFormat::currency(),
));
self.add_cellstyle(CellStyle::new(
DefaultStyle::date().to_string(),
&DefaultFormat::date(),
));
self.add_cellstyle(CellStyle::new(
DefaultStyle::datetime().to_string(),
&DefaultFormat::datetime(),
));
self.add_cellstyle(CellStyle::new(
DefaultStyle::time_of_day().to_string(),
&DefaultFormat::time_of_day(),
));
self.add_cellstyle(CellStyle::new(
DefaultStyle::time_interval().to_string(),
&DefaultFormat::time_interval(),
));
self.add_def_style(ValueType::Boolean, &DefaultStyle::bool());
self.add_def_style(ValueType::Number, &DefaultStyle::number());
self.add_def_style(ValueType::Percentage, &DefaultStyle::percent());
self.add_def_style(ValueType::Currency, &DefaultStyle::currency());
self.add_def_style(ValueType::DateTime, &DefaultStyle::date());
self.add_def_style(ValueType::TimeDuration, &DefaultStyle::time_interval());
}
pub fn version(&self) -> &String {
&self.version
}
pub fn set_version(&mut self, version: String) {
self.version = version;
}
pub fn config(&self) -> &WorkBookConfig {
&self.workbook_config
}
pub fn config_mut(&mut self) -> &mut WorkBookConfig {
&mut self.workbook_config
}
pub fn num_sheets(&self) -> usize {
self.sheets.len()
}
pub fn sheet_idx<S: AsRef<str>>(&self, name: S) -> Option<usize> {
for (idx, sheet) in self.sheets.iter().enumerate() {
if sheet.name() == name.as_ref() {
return Some(idx);
}
}
None
}
pub fn detach_sheet(&mut self, n: usize) -> Detached<usize, Sheet> {
self.sheets[n].detach(n)
}
pub fn attach_sheet(&mut self, sheet: Detached<usize, Sheet>) {
self.sheets[Detached::key(&sheet)].attach(sheet)
}
pub fn sheet(&self, n: usize) -> &Sheet {
self.sheets[n].as_ref()
}
pub fn sheet_mut(&mut self, n: usize) -> &mut Sheet {
self.sheets[n].as_mut()
}
pub fn iter_sheets(&self) -> impl Iterator<Item = &Sheet> {
self.sheets.iter().map(|sheet| &**sheet)
}
pub fn insert_sheet(&mut self, i: usize, sheet: Sheet) {
self.sheets.insert(i, sheet.into());
}
pub fn push_sheet(&mut self, sheet: Sheet) {
self.sheets.push(sheet.into());
}
pub fn remove_sheet(&mut self, n: usize) -> Sheet {
self.sheets.remove(n).take()
}
pub fn add_script(&mut self, v: Script) {
self.scripts.push(v);
}
pub fn iter_scripts(&self) -> impl Iterator<Item = &Script> {
self.scripts.iter()
}
pub fn scripts(&self) -> &Vec<Script> {
&self.scripts
}
pub fn scripts_mut(&mut self) -> &mut Vec<Script> {
&mut self.scripts
}
pub fn add_event_listener(&mut self, e: EventListener) {
self.event_listener.insert(e.event_name.clone(), e);
}
pub fn remove_event_listener(&mut self, event_name: &str) -> Option<EventListener> {
self.event_listener.remove(event_name)
}
pub fn iter_event_listeners(&self) -> impl Iterator<Item = &EventListener> {
self.event_listener.values()
}
pub fn event_listener(&self, event_name: &str) -> Option<&EventListener> {
self.event_listener.get(event_name)
}
pub fn event_listener_mut(&mut self, event_name: &str) -> Option<&mut EventListener> {
self.event_listener.get_mut(event_name)
}
pub fn add_def_style(&mut self, value_type: ValueType, style: &CellStyleRef) {
self.def_styles.insert(value_type, style.to_string());
}
pub fn def_style(&self, value_type: ValueType) -> Option<&String> {
self.def_styles.get(&value_type)
}
pub fn add_font(&mut self, font: FontFaceDecl) {
self.fonts.insert(font.name().to_string(), font);
}
pub fn remove_font(&mut self, name: &str) -> Option<FontFaceDecl> {
self.fonts.remove(name)
}
pub fn iter_fonts(&self) -> impl Iterator<Item = &FontFaceDecl> {
self.fonts.values()
}
pub fn font(&self, name: &str) -> Option<&FontFaceDecl> {
self.fonts.get(name)
}
pub fn font_mut(&mut self, name: &str) -> Option<&mut FontFaceDecl> {
self.fonts.get_mut(name)
}
pub fn add_tablestyle(&mut self, mut style: TableStyle) -> TableStyleRef {
if style.name().is_empty() {
style.set_name(auto_style_name(&mut self.autonum, "ta", &self.tablestyles));
}
let sref = style.style_ref();
self.tablestyles.insert(style.name().to_string(), style);
sref
}
pub fn remove_tablestyle(&mut self, name: &str) -> Option<TableStyle> {
self.tablestyles.remove(name)
}
pub fn iter_table_styles(&self) -> impl Iterator<Item = &TableStyle> {
self.tablestyles.values()
}
pub fn tablestyle(&self, name: &str) -> Option<&TableStyle> {
self.tablestyles.get(name)
}
pub fn tablestyle_mut(&mut self, name: &str) -> Option<&mut TableStyle> {
self.tablestyles.get_mut(name)
}
pub fn add_rowstyle(&mut self, mut style: RowStyle) -> RowStyleRef {
if style.name().is_empty() {
style.set_name(auto_style_name(&mut self.autonum, "ro", &self.rowstyles));
}
let sref = style.style_ref();
self.rowstyles.insert(style.name().to_string(), style);
sref
}
pub fn remove_rowstyle(&mut self, name: &str) -> Option<RowStyle> {
self.rowstyles.remove(name)
}
pub fn rowstyle(&self, name: &str) -> Option<&RowStyle> {
self.rowstyles.get(name)
}
pub fn rowstyle_mut(&mut self, name: &str) -> Option<&mut RowStyle> {
self.rowstyles.get_mut(name)
}
pub fn iter_rowstyles(&self) -> impl Iterator<Item = &RowStyle> {
self.rowstyles.values()
}
pub fn add_colstyle(&mut self, mut style: ColStyle) -> ColStyleRef {
if style.name().is_empty() {
style.set_name(auto_style_name(&mut self.autonum, "co", &self.colstyles));
}
let sref = style.style_ref();
self.colstyles.insert(style.name().to_string(), style);
sref
}
pub fn remove_colstyle(&mut self, name: &str) -> Option<ColStyle> {
self.colstyles.remove(name)
}
pub fn colstyle(&self, name: &str) -> Option<&ColStyle> {
self.colstyles.get(name)
}
pub fn colstyle_mut(&mut self, name: &str) -> Option<&mut ColStyle> {
self.colstyles.get_mut(name)
}
pub fn iter_colstyles(&self) -> impl Iterator<Item = &ColStyle> {
self.colstyles.values()
}
pub fn add_cellstyle(&mut self, mut style: CellStyle) -> CellStyleRef {
if style.name().is_empty() {
style.set_name(auto_style_name(&mut self.autonum, "ce", &self.cellstyles));
}
let sref = style.style_ref();
self.cellstyles.insert(style.name().to_string(), style);
sref
}
pub fn remove_cellstyle(&mut self, name: &str) -> Option<CellStyle> {
self.cellstyles.remove(name)
}
pub fn iter_cellstyles(&self) -> impl Iterator<Item = &CellStyle> {
self.cellstyles.values()
}
pub fn cellstyle(&self, name: &str) -> Option<&CellStyle> {
self.cellstyles.get(name)
}
pub fn cellstyle_mut(&mut self, name: &str) -> Option<&mut CellStyle> {
self.cellstyles.get_mut(name)
}
pub fn add_paragraphstyle(&mut self, mut style: ParagraphStyle) -> ParagraphStyleRef {
if style.name().is_empty() {
style.set_name(auto_style_name(
&mut self.autonum,
"para",
&self.paragraphstyles,
));
}
let sref = style.style_ref();
self.paragraphstyles.insert(style.name().to_string(), style);
sref
}
pub fn remove_paragraphstyle(&mut self, name: &str) -> Option<ParagraphStyle> {
self.paragraphstyles.remove(name)
}
pub fn iter_paragraphstyles(&self) -> impl Iterator<Item = &ParagraphStyle> {
self.paragraphstyles.values()
}
pub fn paragraphstyle(&self, name: &str) -> Option<&ParagraphStyle> {
self.paragraphstyles.get(name)
}
pub fn paragraphstyle_mut(&mut self, name: &str) -> Option<&mut ParagraphStyle> {
self.paragraphstyles.get_mut(name)
}
pub fn add_textstyle(&mut self, mut style: TextStyle) -> TextStyleRef {
if style.name().is_empty() {
style.set_name(auto_style_name(&mut self.autonum, "txt", &self.textstyles));
}
let sref = style.style_ref();
self.textstyles.insert(style.name().to_string(), style);
sref
}
pub fn remove_textstyle(&mut self, name: &str) -> Option<TextStyle> {
self.textstyles.remove(name)
}
pub fn iter_textstyles(&self) -> impl Iterator<Item = &TextStyle> {
self.textstyles.values()
}
pub fn textstyle(&self, name: &str) -> Option<&TextStyle> {
self.textstyles.get(name)
}
pub fn textstyle_mut(&mut self, name: &str) -> Option<&mut TextStyle> {
self.textstyles.get_mut(name)
}
pub fn add_rubystyle(&mut self, mut style: RubyStyle) -> RubyStyleRef {
if style.name().is_empty() {
style.set_name(auto_style_name(&mut self.autonum, "ruby", &self.rubystyles));
}
let sref = style.style_ref();
self.rubystyles.insert(style.name().to_string(), style);
sref
}
pub fn remove_rubystyle(&mut self, name: &str) -> Option<RubyStyle> {
self.rubystyles.remove(name)
}
pub fn iter_rubystyles(&self) -> impl Iterator<Item = &RubyStyle> {
self.rubystyles.values()
}
pub fn rubystyle(&self, name: &str) -> Option<&RubyStyle> {
self.rubystyles.get(name)
}
pub fn rubystyle_mut(&mut self, name: &str) -> Option<&mut RubyStyle> {
self.rubystyles.get_mut(name)
}
pub fn add_graphicstyle(&mut self, mut style: GraphicStyle) -> GraphicStyleRef {
if style.name().is_empty() {
style.set_name(auto_style_name(
&mut self.autonum,
"gr",
&self.graphicstyles,
));
}
let sref = style.style_ref();
self.graphicstyles.insert(style.name().to_string(), style);
sref
}
pub fn remove_graphicstyle(&mut self, name: &str) -> Option<GraphicStyle> {
self.graphicstyles.remove(name)
}
pub fn iter_graphicstyles(&self) -> impl Iterator<Item = &GraphicStyle> {
self.graphicstyles.values()
}
pub fn graphicstyle(&self, name: &str) -> Option<&GraphicStyle> {
self.graphicstyles.get(name)
}
pub fn graphicstyle_mut(&mut self, name: &str) -> Option<&mut GraphicStyle> {
self.graphicstyles.get_mut(name)
}
pub fn add_boolean_format(&mut self, mut vstyle: ValueFormatBoolean) -> ValueFormatRef {
if vstyle.name().is_empty() {
vstyle.set_name(
auto_style_name(&mut self.autonum, "val_boolean", &self.formats_boolean).as_str(),
);
}
let sref = vstyle.format_ref();
self.formats_boolean
.insert(vstyle.name().to_string(), vstyle);
sref
}
pub fn remove_boolean_format(&mut self, name: &str) -> Option<ValueFormatBoolean> {
self.formats_boolean.remove(name)
}
pub fn iter_boolean_formats(&self) -> impl Iterator<Item = &ValueFormatBoolean> {
self.formats_boolean.values()
}
pub fn boolean_format(&self, name: &str) -> Option<&ValueFormatBoolean> {
self.formats_boolean.get(name)
}
pub fn boolean_format_mut(&mut self, name: &str) -> Option<&mut ValueFormatBoolean> {
self.formats_boolean.get_mut(name)
}
pub fn add_number_format(&mut self, mut vstyle: ValueFormatNumber) -> ValueFormatRef {
if vstyle.name().is_empty() {
vstyle.set_name(
auto_style_name(&mut self.autonum, "val_number", &self.formats_number).as_str(),
);
}
let sref = vstyle.format_ref();
self.formats_number
.insert(vstyle.name().to_string(), vstyle);
sref
}
pub fn remove_number_format(&mut self, name: &str) -> Option<ValueFormatNumber> {
self.formats_number.remove(name)
}
pub fn iter_number_formats(&self) -> impl Iterator<Item = &ValueFormatNumber> {
self.formats_number.values()
}
pub fn number_format(&self, name: &str) -> Option<&ValueFormatBoolean> {
self.formats_boolean.get(name)
}
pub fn number_format_mut(&mut self, name: &str) -> Option<&mut ValueFormatBoolean> {
self.formats_boolean.get_mut(name)
}
pub fn add_percentage_format(&mut self, mut vstyle: ValueFormatPercentage) -> ValueFormatRef {
if vstyle.name().is_empty() {
vstyle.set_name(
auto_style_name(
&mut self.autonum,
"val_percentage",
&self.formats_percentage,
)
.as_str(),
);
}
let sref = vstyle.format_ref();
self.formats_percentage
.insert(vstyle.name().to_string(), vstyle);
sref
}
pub fn remove_percentage_format(&mut self, name: &str) -> Option<ValueFormatPercentage> {
self.formats_percentage.remove(name)
}
pub fn iter_percentage_formats(&self) -> impl Iterator<Item = &ValueFormatPercentage> {
self.formats_percentage.values()
}
pub fn percentage_format(&self, name: &str) -> Option<&ValueFormatPercentage> {
self.formats_percentage.get(name)
}
pub fn percentage_format_mut(&mut self, name: &str) -> Option<&mut ValueFormatPercentage> {
self.formats_percentage.get_mut(name)
}
pub fn add_currency_format(&mut self, mut vstyle: ValueFormatCurrency) -> ValueFormatRef {
if vstyle.name().is_empty() {
vstyle.set_name(
auto_style_name(&mut self.autonum, "val_currency", &self.formats_currency).as_str(),
);
}
let sref = vstyle.format_ref();
self.formats_currency
.insert(vstyle.name().to_string(), vstyle);
sref
}
pub fn remove_currency_format(&mut self, name: &str) -> Option<ValueFormatCurrency> {
self.formats_currency.remove(name)
}
pub fn iter_currency_formats(&self) -> impl Iterator<Item = &ValueFormatCurrency> {
self.formats_currency.values()
}
pub fn currency_format(&self, name: &str) -> Option<&ValueFormatCurrency> {
self.formats_currency.get(name)
}
pub fn currency_format_mut(&mut self, name: &str) -> Option<&mut ValueFormatCurrency> {
self.formats_currency.get_mut(name)
}
pub fn add_text_format(&mut self, mut vstyle: ValueFormatText) -> ValueFormatRef {
if vstyle.name().is_empty() {
vstyle.set_name(
auto_style_name(&mut self.autonum, "val_text", &self.formats_text).as_str(),
);
}
let sref = vstyle.format_ref();
self.formats_text.insert(vstyle.name().to_string(), vstyle);
sref
}
pub fn remove_text_format(&mut self, name: &str) -> Option<ValueFormatText> {
self.formats_text.remove(name)
}
pub fn iter_text_formats(&self) -> impl Iterator<Item = &ValueFormatText> {
self.formats_text.values()
}
pub fn text_format(&self, name: &str) -> Option<&ValueFormatText> {
self.formats_text.get(name)
}
pub fn text_format_mut(&mut self, name: &str) -> Option<&mut ValueFormatText> {
self.formats_text.get_mut(name)
}
pub fn add_datetime_format(&mut self, mut vstyle: ValueFormatDateTime) -> ValueFormatRef {
if vstyle.name().is_empty() {
vstyle.set_name(
auto_style_name(&mut self.autonum, "val_datetime", &self.formats_datetime).as_str(),
);
}
let sref = vstyle.format_ref();
self.formats_datetime
.insert(vstyle.name().to_string(), vstyle);
sref
}
pub fn remove_datetime_format(&mut self, name: &str) -> Option<ValueFormatDateTime> {
self.formats_datetime.remove(name)
}
pub fn iter_datetime_formats(&self) -> impl Iterator<Item = &ValueFormatDateTime> {
self.formats_datetime.values()
}
pub fn datetime_format(&self, name: &str) -> Option<&ValueFormatDateTime> {
self.formats_datetime.get(name)
}
pub fn datetime_format_mut(&mut self, name: &str) -> Option<&mut ValueFormatDateTime> {
self.formats_datetime.get_mut(name)
}
pub fn add_timeduration_format(
&mut self,
mut vstyle: ValueFormatTimeDuration,
) -> ValueFormatRef {
if vstyle.name().is_empty() {
vstyle.set_name(
auto_style_name(
&mut self.autonum,
"val_timeduration",
&self.formats_timeduration,
)
.as_str(),
);
}
let sref = vstyle.format_ref();
self.formats_timeduration
.insert(vstyle.name().to_string(), vstyle);
sref
}
pub fn remove_timeduration_format(&mut self, name: &str) -> Option<ValueFormatTimeDuration> {
self.formats_timeduration.remove(name)
}
pub fn iter_timeduration_formats(&self) -> impl Iterator<Item = &ValueFormatTimeDuration> {
self.formats_timeduration.values()
}
pub fn timeduration_format(&self, name: &str) -> Option<&ValueFormatTimeDuration> {
self.formats_timeduration.get(name)
}
pub fn timeduration_format_mut(&mut self, name: &str) -> Option<&mut ValueFormatTimeDuration> {
self.formats_timeduration.get_mut(name)
}
pub fn add_pagestyle(&mut self, mut pstyle: PageStyle) -> PageStyleRef {
if pstyle.name().is_empty() {
pstyle.set_name(auto_style_name(&mut self.autonum, "page", &self.pagestyles));
}
let sref = pstyle.style_ref();
self.pagestyles.insert(pstyle.name().to_string(), pstyle);
sref
}
pub fn remove_pagestyle(&mut self, name: &str) -> Option<PageStyle> {
self.pagestyles.remove(name)
}
pub fn iter_pagestyles(&self) -> impl Iterator<Item = &PageStyle> {
self.pagestyles.values()
}
pub fn pagestyle(&self, name: &str) -> Option<&PageStyle> {
self.pagestyles.get(name)
}
pub fn pagestyle_mut(&mut self, name: &str) -> Option<&mut PageStyle> {
self.pagestyles.get_mut(name)
}
pub fn add_masterpage(&mut self, mut mpage: MasterPage) -> MasterPageRef {
if mpage.name().is_empty() {
mpage.set_name(auto_style_name(&mut self.autonum, "mp", &self.masterpages));
}
let sref = mpage.masterpage_ref();
self.masterpages.insert(mpage.name().to_string(), mpage);
sref
}
pub fn remove_masterpage(&mut self, name: &str) -> Option<MasterPage> {
self.masterpages.remove(name)
}
pub fn iter_masterpages(&self) -> impl Iterator<Item = &MasterPage> {
self.masterpages.values()
}
pub fn masterpage(&self, name: &str) -> Option<&MasterPage> {
self.masterpages.get(name)
}
pub fn masterpage_mut(&mut self, name: &str) -> Option<&mut MasterPage> {
self.masterpages.get_mut(name)
}
pub fn add_validation(&mut self, mut valid: Validation) -> ValidationRef {
if valid.name().is_empty() {
valid.set_name(auto_style_name(&mut self.autonum, "val", &self.validations));
}
let vref = valid.validation_ref();
self.validations.insert(valid.name().to_string(), valid);
vref
}
pub fn remove_validation(&mut self, name: &str) -> Option<Validation> {
self.validations.remove(name)
}
pub fn iter_validations(&self) -> impl Iterator<Item = &Validation> {
self.validations.values()
}
pub fn validation(&self, name: &str) -> Option<&Validation> {
self.validations.get(name)
}
pub fn validation_mut(&mut self, name: &str) -> Option<&mut Validation> {
self.validations.get_mut(name)
}
pub fn add_manifest(&mut self, manifest: Manifest) {
self.manifest.insert(manifest.full_path.clone(), manifest);
}
pub fn remove_manifest(&mut self, path: &str) -> Option<Manifest> {
self.manifest.remove(path)
}
pub fn iter_manifest(&self) -> impl Iterator<Item = &Manifest> {
self.manifest.values()
}
pub fn manifest(&self, path: &str) -> Option<&Manifest> {
self.manifest.get(path)
}
pub fn manifest_mut(&mut self, path: &str) -> Option<&mut Manifest> {
self.manifest.get_mut(path)
}
pub fn metadata(&self) -> &Metadata {
&self.metadata
}
pub fn metadata_mut(&mut self) -> &mut Metadata {
&mut self.metadata
}
}
#[derive(Clone, Debug)]
pub struct WorkBookConfig {
pub active_table: String,
pub show_grid: bool,
pub show_page_breaks: bool,
pub has_sheet_tabs: bool,
}
impl Default for WorkBookConfig {
fn default() -> Self {
Self {
active_table: "".to_string(),
show_grid: true,
show_page_breaks: false,
has_sheet_tabs: true,
}
}
}
#[derive(Debug, Default, Clone)]
pub struct Script {
pub(crate) script_lang: String,
pub(crate) script: Vec<XmlContent>,
}
impl Script {
pub fn new() -> Self {
Self {
script_lang: "".to_string(),
script: Default::default(),
}
}
pub fn script_lang(&self) -> &str {
&self.script_lang
}
pub fn set_script_lang(&mut self, script_lang: String) {
self.script_lang = script_lang
}
pub fn script(&self) -> &Vec<XmlContent> {
&self.script
}
pub fn set_script(&mut self, script: Vec<XmlContent>) {
self.script = script
}
}
#[derive(Debug, Clone)]
pub struct EventListener {
pub(crate) event_name: String,
pub(crate) script_lang: String,
pub(crate) macro_name: String,
pub(crate) actuate: XLinkActuate,
pub(crate) href: String,
pub(crate) link_type: XLinkType,
}
impl EventListener {
pub fn new() -> Self {
Self {
event_name: Default::default(),
script_lang: Default::default(),
macro_name: Default::default(),
actuate: XLinkActuate::OnLoad,
href: Default::default(),
link_type: Default::default(),
}
}
pub fn event_name(&self) -> &str {
&self.event_name
}
pub fn set_event_name(&mut self, name: String) {
self.event_name = name;
}
pub fn script_lang(&self) -> &str {
&self.script_lang
}
pub fn set_script_lang(&mut self, lang: String) {
self.script_lang = lang
}
pub fn macro_name(&self) -> &str {
&self.macro_name
}
pub fn set_macro_name(&mut self, name: String) {
self.macro_name = name
}
pub fn actuate(&self) -> XLinkActuate {
self.actuate
}
pub fn set_actuate(&mut self, actuate: XLinkActuate) {
self.actuate = actuate;
}
pub fn href(&self) -> &str {
&self.href
}
pub fn set_href(&mut self, href: String) {
self.href = href;
}
pub fn link_type(&self) -> XLinkType {
self.link_type
}
pub fn set_link_type(&mut self, link_type: XLinkType) {
self.link_type = link_type
}
}
impl Default for EventListener {
fn default() -> Self {
Self {
event_name: Default::default(),
script_lang: Default::default(),
macro_name: Default::default(),
actuate: XLinkActuate::OnRequest,
href: Default::default(),
link_type: Default::default(),
}
}
}