use crate::model::dimension::{Dimension, FiftiethPercent, Twips};
use crate::model::geometry::{EdgeInsets, PartialEdgeInsets};
use crate::model::Dup;
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: Dup<Alignment>,
pub width: Dup<TableMeasure>,
pub layout: Dup<TableLayout>,
pub indent: Dup<TableMeasure>,
pub borders: Dup<TableBorders>,
pub cell_margins: Dup<EdgeInsets<Twips>>,
pub cell_spacing: Dup<TableMeasure>,
pub look: Dup<TableLook>,
pub style_row_band_size: Dup<u32>,
pub style_col_band_size: Dup<u32>,
pub positioning: Dup<TablePositioning>,
pub overlap: Dup<TableOverlap>,
pub bidi_visual: Dup<bool>,
}
#[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<FiftiethPercent>),
Nil,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum TableLayout {
Autofit,
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,
pub property_exceptions: Option<TableRowPropertyExceptions>,
}
#[derive(Clone, Debug, Default)]
pub struct TableRowPropertyExceptions {
pub borders: Option<TableBorders>,
pub cell_spacing: Option<TableMeasure>,
pub bidi_visual: Option<bool>,
}
#[derive(Clone, Debug, Default)]
pub struct TableRowProperties {
pub height: Dup<TableRowHeight>,
pub is_header: Option<bool>,
pub cant_split: Option<bool>,
pub justification: Dup<Alignment>,
pub cnf_style: Dup<CnfStyle>,
pub grid_before: u32,
pub cell_spacing: Dup<TableMeasure>,
pub w_before: Dup<TableMeasure>,
pub grid_after: u32,
pub w_after: Dup<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: Dup<TableMeasure>,
pub borders: Dup<TableCellBorders>,
pub shading: Dup<Shading>,
pub margins: Dup<PartialEdgeInsets<Twips>>,
pub vertical_align: Dup<CellVerticalAlign>,
pub vertical_merge: Dup<VerticalMerge>,
pub grid_span: Dup<u32>,
pub text_direction: Dup<TextDirection>,
pub no_wrap: Option<bool>,
pub cnf_style: Dup<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>,
}