use crate::model::dimension::{Dimension, ThousandthPercent, Twips};
use crate::model::geometry::EdgeInsets;
use super::content::Block;
use super::formatting::{
Alignment, Border, CnfStyle, HeightRule, Shading, TableAnchor, TableXAlign, TableYAlign,
};
use super::identifiers::TableRowRevisionIds;
#[derive(Clone, Debug)]
pub struct Table {
pub properties: TableProperties,
pub grid: Vec<GridColumn>,
pub rows: Vec<TableRow>,
}
#[derive(Clone, Debug, Default)]
pub struct TableProperties {
pub style_id: Option<super::identifiers::StyleId>,
pub alignment: Option<Alignment>,
pub width: Option<TableMeasure>,
pub layout: Option<TableLayout>,
pub indent: Option<TableMeasure>,
pub borders: Option<TableBorders>,
pub cell_margins: Option<EdgeInsets<Twips>>,
pub cell_spacing: Option<TableMeasure>,
pub look: Option<TableLook>,
pub style_row_band_size: Option<u32>,
pub style_col_band_size: Option<u32>,
pub positioning: Option<TablePositioning>,
pub overlap: Option<TableOverlap>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct TablePositioning {
pub left_from_text: Option<Dimension<Twips>>,
pub right_from_text: Option<Dimension<Twips>>,
pub top_from_text: Option<Dimension<Twips>>,
pub bottom_from_text: Option<Dimension<Twips>>,
pub vert_anchor: Option<TableAnchor>,
pub horz_anchor: Option<TableAnchor>,
pub x_align: Option<TableXAlign>,
pub y_align: Option<TableYAlign>,
pub x: Option<Dimension<Twips>>,
pub y: Option<Dimension<Twips>>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum TableOverlap {
Overlap,
Never,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum TableMeasure {
Auto,
Twips(Dimension<Twips>),
Pct(Dimension<ThousandthPercent>),
Nil,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum TableLayout {
Auto,
Fixed,
}
#[derive(Clone, Copy, Debug)]
pub struct GridColumn {
pub width: Dimension<Twips>,
}
#[derive(Clone, Debug)]
pub struct TableRow {
pub properties: TableRowProperties,
pub cells: Vec<TableCell>,
pub rsids: TableRowRevisionIds,
}
#[derive(Clone, Debug, Default)]
pub struct TableRowProperties {
pub height: Option<TableRowHeight>,
pub is_header: Option<bool>,
pub cant_split: Option<bool>,
pub justification: Option<Alignment>,
pub cnf_style: Option<CnfStyle>,
pub grid_after: Option<u32>,
pub w_after: Option<TableMeasure>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct TableRowHeight {
pub value: Dimension<Twips>,
pub rule: HeightRule,
}
#[derive(Clone, Debug)]
pub struct TableCell {
pub properties: TableCellProperties,
pub content: Vec<Block>,
}
#[derive(Clone, Debug, Default)]
pub struct TableCellProperties {
pub width: Option<TableMeasure>,
pub borders: Option<TableCellBorders>,
pub shading: Option<Shading>,
pub margins: Option<EdgeInsets<Twips>>,
pub vertical_align: Option<CellVerticalAlign>,
pub vertical_merge: Option<VerticalMerge>,
pub grid_span: Option<u32>,
pub text_direction: Option<TextDirection>,
pub no_wrap: Option<bool>,
pub cnf_style: Option<CnfStyle>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum VerticalMerge {
Restart,
Continue,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum CellVerticalAlign {
Top,
Center,
Bottom,
Both,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum TextDirection {
LeftToRightTopToBottom,
TopToBottomRightToLeft,
BottomToTopLeftToRight,
LeftToRightTopToBottomRotated,
TopToBottomRightToLeftRotated,
TopToBottomLeftToRightRotated,
}
#[derive(Clone, Copy, Debug)]
pub struct TableBorders {
pub top: Option<Border>,
pub bottom: Option<Border>,
pub left: Option<Border>,
pub right: Option<Border>,
pub inside_h: Option<Border>,
pub inside_v: Option<Border>,
}
#[derive(Clone, Copy, Debug)]
pub struct TableCellBorders {
pub top: Option<Border>,
pub bottom: Option<Border>,
pub left: Option<Border>,
pub right: Option<Border>,
pub inside_h: Option<Border>,
pub inside_v: Option<Border>,
pub tl2br: Option<Border>,
pub tr2bl: Option<Border>,
}
#[derive(Clone, Copy, Debug, Default)]
pub struct TableLook {
pub first_row: Option<bool>,
pub last_row: Option<bool>,
pub first_column: Option<bool>,
pub last_column: Option<bool>,
pub no_h_band: Option<bool>,
pub no_v_band: Option<bool>,
}