2018-10-23 23:44:50 +01:00
// http://officeopenxml.com/WPtableGrid.php
import { Paragraph } from "file/paragraph" ;
2019-09-13 00:51:20 +01:00
import { BorderStyle } from "file/styles" ;
2018-10-23 23:44:50 +01:00
import { IXmlableObject , XmlComponent } from "file/xml-components" ;
2019-03-21 01:06:07 +00:00
import { ITableShadingAttributesProperties } from "../shading" ;
2018-10-23 23:44:50 +01:00
import { Table } from "../table" ;
2019-09-22 02:39:38 +01:00
import { TableRow } from "../table-row" ;
2019-04-18 13:55:18 +10:00
import { ITableCellMarginOptions } from "./cell-margin/table-cell-margins" ;
2019-09-13 00:51:20 +01:00
import { VerticalAlign , VMergeType } from "./table-cell-components" ;
2018-10-23 23:44:50 +01:00
import { TableCellProperties } from "./table-cell-properties" ;
2019-06-25 01:21:28 +01:00
export interface ITableCellOptions {
readonly shading? : ITableShadingAttributesProperties ;
2019-09-13 00:51:20 +01:00
readonly margins? : ITableCellMarginOptions ;
readonly verticalAlign? : VerticalAlign ;
readonly verticalMerge? : VMergeType ;
readonly columnSpan? : number ;
2019-09-22 02:39:38 +01:00
readonly rowSpan? : number ;
2019-09-13 00:51:20 +01:00
readonly borders ? : {
readonly top ? : {
readonly style : BorderStyle ;
readonly size : number ;
readonly color : string ;
} ;
readonly bottom ? : {
readonly style : BorderStyle ;
readonly size : number ;
readonly color : string ;
} ;
readonly left ? : {
readonly style : BorderStyle ;
readonly size : number ;
readonly color : string ;
} ;
readonly right ? : {
readonly style : BorderStyle ;
readonly size : number ;
readonly color : string ;
} ;
} ;
readonly children : Array < Paragraph | Table > ;
2019-06-25 01:21:28 +01:00
}
2019-09-22 02:39:38 +01:00
interface ITableCellMetaData {
readonly column : TableCell [ ] ;
readonly row : TableRow ;
}
2018-10-23 23:44:50 +01:00
export class TableCell extends XmlComponent {
private readonly properties : TableCellProperties ;
2019-09-22 02:39:38 +01:00
// tslint:disable-next-line: readonly-keyword
private metaData : ITableCellMetaData ;
2018-10-23 23:44:50 +01:00
2019-09-13 00:51:20 +01:00
constructor ( readonly options : ITableCellOptions ) {
2018-10-23 23:44:50 +01:00
super ( "w:tc" ) ;
2019-03-18 23:50:21 +00:00
2018-10-23 23:44:50 +01:00
this . properties = new TableCellProperties ( ) ;
this . root . push ( this . properties ) ;
2019-09-13 00:51:20 +01:00
for ( const child of options . children ) {
this . root . push ( child ) ;
2018-10-23 23:44:50 +01:00
}
2018-12-31 01:55:15 +00:00
2019-09-13 00:51:20 +01:00
if ( options . verticalAlign ) {
this . properties . setVerticalAlign ( options . verticalAlign ) ;
}
2019-03-04 22:50:04 +00:00
2019-09-13 00:51:20 +01:00
if ( options . verticalMerge ) {
this . properties . addVerticalMerge ( options . verticalMerge ) ;
}
2019-03-18 23:50:21 +00:00
2019-09-13 00:51:20 +01:00
if ( options . margins ) {
this . properties . addMargins ( options . margins ) ;
}
2019-03-18 23:50:21 +00:00
2019-09-13 00:51:20 +01:00
if ( options . shading ) {
this . properties . setShading ( options . shading ) ;
}
2019-03-21 01:06:07 +00:00
2019-09-13 00:51:20 +01:00
if ( options . columnSpan ) {
this . properties . addGridSpan ( options . columnSpan ) ;
}
2019-03-21 01:06:07 +00:00
2019-09-13 00:51:20 +01:00
if ( options . borders ) {
if ( options . borders . top ) {
this . properties . Borders . addTopBorder ( options . borders . top . style , options . borders . top . size , options . borders . top . color ) ;
}
if ( options . borders . bottom ) {
this . properties . Borders . addBottomBorder (
options . borders . bottom . style ,
options . borders . bottom . size ,
options . borders . bottom . color ,
) ;
}
if ( options . borders . left ) {
this . properties . Borders . addLeftBorder ( options . borders . left . style , options . borders . left . size , options . borders . left . color ) ;
}
if ( options . borders . right ) {
this . properties . Borders . addRightBorder (
options . borders . right . style ,
options . borders . right . size ,
options . borders . right . color ,
) ;
}
}
2018-10-23 23:44:50 +01:00
}
2019-03-05 11:38:21 +01:00
2019-09-13 00:51:20 +01:00
public prepForXml ( ) : IXmlableObject | undefined {
2019-09-22 02:39:38 +01:00
// Row Span has to be added in this method and not the constructor because it needs to know information about the column which happens after Table Cell construction
// Row Span of 1 will crash word as it will add RESTART and not a corresponding CONTINUE
if ( this . options . rowSpan && this . options . rowSpan > 1 ) {
this . properties . addVerticalMerge ( VMergeType . RESTART ) ;
const currentIndex = this . metaData . column . indexOf ( this ) ;
for ( let i = currentIndex + 1 ; i <= currentIndex + this . options . rowSpan - 1 ; i ++ ) {
this . metaData . column [ i ] . metaData . row . Children . splice (
i ,
0 ,
new TableCell ( {
children : [ ] ,
} ) ,
) ;
this . metaData . column [ i ] . properties . addVerticalMerge ( VMergeType . CONTINUE ) ;
}
}
2019-09-13 00:51:20 +01:00
// Cells must end with a paragraph
if ( ! ( this . root [ this . root . length - 1 ] instanceof Paragraph ) ) {
this . root . push ( new Paragraph ( { } ) ) ;
}
return super . prepForXml ( ) ;
2019-03-05 11:38:21 +01:00
}
2019-09-22 02:39:38 +01:00
public set MetaData ( metaData : ITableCellMetaData ) {
this . metaData = metaData ;
}
2018-10-23 23:44:50 +01:00
}