using System; using System.Collections; using iTextSharp.text.pdf; namespace iTextSharp.text { /// /// Summary description for SimpleCell. /// public class SimpleCell : Rectangle, IPdfPCellEvent, ITextElementArray { /** the CellAttributes object represents a row. */ public new const bool ROW = true; /** the CellAttributes object represents a cell. */ public new const bool CELL = false; /** the content of the Cell. */ private ArrayList content = new ArrayList(); /** the width of the Cell. */ private float width = 0f; /** the widthpercentage of the Cell. */ private float widthpercentage = 0f; /** an extra spacing variable */ private float spacing_left = float.NaN; /** an extra spacing variable */ private float spacing_right = float.NaN; /** an extra spacing variable */ private float spacing_top = float.NaN; /** an extra spacing variable */ private float spacing_bottom = float.NaN; /** an extra padding variable */ private float padding_left = float.NaN; /** an extra padding variable */ private float padding_right = float.NaN; /** an extra padding variable */ private float padding_top = float.NaN; /** an extra padding variable */ private float padding_bottom = float.NaN; /** the colspan of a Cell */ private int colspan = 1; /** horizontal alignment inside the Cell. */ private int horizontalAlignment = Element.ALIGN_UNDEFINED; /** vertical alignment inside the Cell. */ private int verticalAlignment = Element.ALIGN_UNDEFINED; /** indicates if these are the attributes of a single Cell (false) or a group of Cells (true). */ private bool cellgroup = false; /** Indicates that the largest ascender height should be used to determine the * height of the first line. Note that this only has an effect when rendered * to PDF. Setting this to true can help with vertical alignment problems. */ protected bool useAscender = false; /** Indicates that the largest descender height should be added to the height of * the last line (so characters like y don't dip into the border). Note that * this only has an effect when rendered to PDF. */ protected bool useDescender = false; /** * Adjusts the cell contents to compensate for border widths. Note that * this only has an effect when rendered to PDF. */ protected bool useBorderPadding; /** * A CellAttributes object is always constructed without any dimensions. * Dimensions are defined after creation. * @param row only true if the CellAttributes object represents a row. */ public SimpleCell(bool row) : base (0f, 0f, 0f, 0f) { cellgroup = row; Border = BOX; } /** * Adds content to this object. * @param element * @throws BadElementException */ public void AddElement(IElement element) { if (cellgroup) { if (element is SimpleCell) { if (((SimpleCell)element).Cellgroup) { throw new BadElementException("You can't add one row to another row."); } content.Add(element); return; } else { throw new BadElementException("You can only add cells to rows, no objects of type " + element.GetType().ToString()); } } if (element.Type == Element.PARAGRAPH || element.Type == Element.PHRASE || element.Type == Element.ANCHOR || element.Type == Element.CHUNK || element.Type == Element.LIST || element.Type == Element.MARKED || element.Type == Element.JPEG || element.Type == Element.JPEG2000 || element.Type == Element.IMGRAW || element.Type == Element.IMGTEMPLATE) { content.Add(element); } else { throw new BadElementException("You can't add an element of type " + element.GetType().ToString() + " to a SimpleCell."); } } /** * Creates a Cell with these attributes. * @param rowAttributes * @return a cell based on these attributes. * @throws BadElementException */ public Cell CreateCell(SimpleCell rowAttributes) { Cell cell = new Cell(); cell.CloneNonPositionParameters(rowAttributes); cell.SoftCloneNonPositionParameters(this); cell.Colspan = colspan; cell.HorizontalAlignment = horizontalAlignment; cell.VerticalAlignment = verticalAlignment; cell.UseAscender = useAscender; cell.UseBorderPadding = useBorderPadding; cell.UseDescender = useDescender; foreach (IElement element in content) { cell.AddElement(element); } return cell; } /** * Creates a PdfPCell with these attributes. * @param rowAttributes * @return a PdfPCell based on these attributes. */ public PdfPCell CreatePdfPCell(SimpleCell rowAttributes) { PdfPCell cell = new PdfPCell(); cell.Border = NO_BORDER; SimpleCell tmp = new SimpleCell(CELL); tmp.Spacing_left = spacing_left; tmp.Spacing_right = spacing_right; tmp.Spacing_top = spacing_top; tmp.Spacing_bottom = spacing_bottom; tmp.CloneNonPositionParameters(rowAttributes); tmp.SoftCloneNonPositionParameters(this); cell.CellEvent = tmp; cell.HorizontalAlignment = rowAttributes.horizontalAlignment; cell.VerticalAlignment = rowAttributes.verticalAlignment; cell.UseAscender = rowAttributes.useAscender; cell.UseBorderPadding = rowAttributes.useBorderPadding; cell.UseDescender = rowAttributes.useDescender; cell.Colspan = colspan; if (horizontalAlignment != Element.ALIGN_UNDEFINED) cell.HorizontalAlignment = horizontalAlignment; if (verticalAlignment != Element.ALIGN_UNDEFINED) cell.VerticalAlignment = verticalAlignment; if (useAscender) cell.UseAscender = useAscender; if (useBorderPadding) cell.UseBorderPadding = useBorderPadding; if (useDescender) cell.UseDescender = useDescender; float p; float sp_left = spacing_left; if (float.IsNaN(sp_left)) sp_left = 0f; float sp_right = spacing_right; if (float.IsNaN(sp_right)) sp_right = 0f; float sp_top = spacing_top; if (float.IsNaN(sp_top)) sp_top = 0f; float sp_bottom = spacing_bottom; if (float.IsNaN(sp_bottom)) sp_bottom = 0f; p = padding_left; if (float.IsNaN(p)) p = 0f; cell.PaddingLeft = p + sp_left; p = padding_right; if (float.IsNaN(p)) p = 0f; cell.PaddingRight = p + sp_right; p = padding_top; if (float.IsNaN(p)) p = 0f; cell.PaddingTop = p + sp_top; p = padding_bottom; if (float.IsNaN(p)) p = 0f; cell.PaddingBottom = p + sp_bottom; foreach (IElement element in content) { cell.AddElement(element); } return cell; } /** * @param rectangle * @param spacing * @return a rectangle */ public static SimpleCell GetDimensionlessInstance(Rectangle rectangle, float spacing) { SimpleCell cell = new SimpleCell(CELL); cell.CloneNonPositionParameters(rectangle); cell.Spacing = spacing * 2; return cell; } /** * @see com.lowagie.text.pdf.PdfPCellEvent#cellLayout(com.lowagie.text.pdf.PdfPCell, com.lowagie.text.Rectangle, com.lowagie.text.pdf.PdfContentByte[]) */ public void CellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) { float sp_left = spacing_left; if (float.IsNaN(sp_left)) sp_left = 0f; float sp_right = spacing_right; if (float.IsNaN(sp_right)) sp_right = 0f; float sp_top = spacing_top; if (float.IsNaN(sp_top)) sp_top = 0f; float sp_bottom = spacing_bottom; if (float.IsNaN(sp_bottom)) sp_bottom = 0f; Rectangle rect = new Rectangle(position.GetLeft(sp_left), position.GetBottom(sp_bottom), position.GetRight(sp_right), position.GetTop(sp_top)); rect.CloneNonPositionParameters(this); canvases[PdfPTable.BACKGROUNDCANVAS].Rectangle(rect); rect.BackgroundColor = null; canvases[PdfPTable.LINECANVAS].Rectangle(rect); } /** Sets the padding parameters if they are undefined. * @param padding*/ public float Padding { set { if (float.IsNaN(padding_right)) { Padding_right = value; } if (float.IsNaN(padding_left)) { Padding_left = value; } if (float.IsNaN(padding_bottom)) { Padding_bottom = value; } if (float.IsNaN(padding_top)) { Padding_top = value; } } } /** * @return Returns the colspan. */ public int Colspan { get { return colspan; } set { if (value > 0) this.colspan = value; } } /** * @param padding_bottom The padding_bottom to set. */ public float Padding_bottom { get { return padding_bottom; } set { padding_bottom = value; } } public float Padding_left { get { return padding_left; } set { padding_left = value; } } public float Padding_right { get { return padding_right; } set { padding_right = value; } } public float Padding_top { get { return padding_top; } set { padding_top = value; } } /** * @return Returns the spacing. */ public float Spacing { set { this.spacing_left = value; this.spacing_right = value; this.spacing_top = value; this.spacing_bottom = value; } } public float Spacing_top { get { return spacing_top; } set { spacing_top = value; } } public float Spacing_bottom { get { return spacing_bottom; } set { spacing_bottom = value; } } public float Spacing_left { get { return spacing_left; } set { spacing_left = value; } } public float Spacing_right { get { return spacing_right; } set { spacing_right = value; } } /** * @return Returns the cellgroup. */ public bool Cellgroup { get { return cellgroup; } set { cellgroup = value; } } /** * @return Returns the horizontal alignment. */ public int HorizontalAlignment { get { return horizontalAlignment; } set { horizontalAlignment = value; } } public int VerticalAlignment { get { return verticalAlignment; } set { verticalAlignment = value; } } /** * @return Returns the width. */ public new float Width { get { return width; } set { width = value; } } /** * @return Returns the widthpercentage. */ public float Widthpercentage { get { return widthpercentage; } set { widthpercentage = value; } } /** * @return Returns the useAscender. */ public bool UseAscender { get { return useAscender; } set { useAscender = value; } } public bool UseDescender { get { return useDescender; } set { useDescender = value; } } /** * @return Returns the useBorderPadding. */ public bool UseBorderPadding { get { return useBorderPadding; } set { useBorderPadding = value; } } /** * @return Returns the content. */ internal ArrayList Content { get { return content; } } /** * @see com.lowagie.text.TextElementArray#add(java.lang.Object) */ public bool Add(Object o) { try { AddElement((IElement)o); return true; } catch (InvalidCastException) { return false; } } public override int Type { get { return Element.CELL; } } } }