/** * Copies the content of one row to this row. * Don't do this if the rows have a different number of cells. * @param copy the row that needs to be copied * @since 5.1.0 */ public void CopyContent(PdfPRow copy) { for (int i = 0; i < cells.Length; ++i) { if (cells[i] != null) { cells[i].Column = copy.GetCells()[i].Column; } } }
/** * Calculates the extra height needed in a row because of rowspans. * @param start the index of the start row (the one to adjust) * @param end the index of the end row on the page * @since 2.1.6 */ virtual protected PdfPRow AdjustCellsInRow(int start, int end) { PdfPRow row = GetRow(start); if (row.Adjusted) return row; row = new PdfPRow(row); PdfPCell cell; PdfPCell[] cells = row.GetCells(); for (int i = 0; i < cells.Length; i++) { cell = cells[i]; if (cell == null || cell.Rowspan == 1) continue; int stop = Math.Min(end, start + cell.Rowspan); float extra = 0; for (int k = start + 1; k < stop; k++) { extra += GetRow(k).MaxHeights; } row.SetExtraHeight(i, extra); } row.Adjusted = true; return row; }
/** * Splits a row to newHeight. * The returned row is the remainder. It will return null if the newHeight * was so small that only an empty row would result. * * @param new_height the new height * @return the remainder row or null if the newHeight was so small that only * an empty row would result */ public PdfPRow SplitRow(PdfPTable table, int rowIndex, float new_height) { // second part of the row PdfPCell[] newCells = new PdfPCell[cells.Length]; float[] fixHs = new float[cells.Length]; float[] minHs = new float[cells.Length]; bool allEmpty = true; // loop over all the cells for (int k = 0; k < cells.Length; ++k) { float newHeight = new_height; PdfPCell cell = cells[k]; if (cell == null) { int index = rowIndex; if (table.RowSpanAbove(index, k)) { while (table.RowSpanAbove(--index, k)) { newHeight += table.GetRow(index).MaxHeights; } PdfPRow row = table.GetRow(index); if (row != null && row.GetCells()[k] != null) { newCells[k] = new PdfPCell(row.GetCells()[k]); newCells[k].Column = null; newCells[k].Rowspan = row.GetCells()[k].Rowspan - rowIndex + index; allEmpty = false; } } continue; } fixHs[k] = cell.FixedHeight; minHs[k] = cell.MinimumHeight; Image img = cell.Image; PdfPCell newCell = new PdfPCell(cell); if (img != null) { if (newHeight > cell.EffectivePaddingBottom + cell.EffectivePaddingTop + 2) { newCell.Phrase = null; allEmpty = false; } } else { float y; ColumnText ct = ColumnText.Duplicate(cell.Column); float left = cell.Left + cell.EffectivePaddingLeft; float bottom = cell.Top + cell.EffectivePaddingBottom - newHeight; float right = cell.Right - cell.EffectivePaddingRight; float top = cell.Top - cell.EffectivePaddingTop; switch (cell.Rotation) { case 90: case 270: y = SetColumn(ct, bottom, left, top, right); break; default: y = SetColumn(ct, left, bottom + 0.00001f, cell.NoWrap ? RIGHT_LIMIT : right, top); break; } int status; status = ct.Go(true); bool thisEmpty = (ct.YLine == y); if (thisEmpty) { newCell.Column = ColumnText.Duplicate(cell.Column); ct.FilledWidth = 0; } else if ((status & ColumnText.NO_MORE_TEXT) == 0) { newCell.Column = ct; ct.FilledWidth = 0; } else { newCell.Phrase = null; } allEmpty = (allEmpty && thisEmpty); } newCells[k] = newCell; cell.FixedHeight = newHeight; } if (allEmpty) { for (int k = 0; k < cells.Length; ++k) { PdfPCell cell = cells[k]; if (cell == null) { continue; } if (fixHs[k] > 0) { cell.FixedHeight = fixHs[k]; } else { cell.MinimumHeight = minHs[k]; } } return(null); } CalculateHeights(); PdfPRow split = new PdfPRow(newCells); split.widths = (float[])widths.Clone(); return(split); }
/** * Imports a PdfPRow and copies all settings * * @param row The PdfPRow to import * @since 2.1.3 */ private void ImportRow(PdfPRow row) { this.cells = new ArrayList(); this.width = this.document.GetDocumentHeader().GetPageSetting().GetPageWidth() - this.document.GetDocumentHeader().GetPageSetting().GetMarginLeft() - this.document.GetDocumentHeader().GetPageSetting().GetMarginRight(); this.width = (int) (this.width * this.parentTable.GetTableWidthPercent() / 100); int cellRight = 0; int cellWidth = 0; PdfPCell[] cells = row.GetCells(); for (int i = 0; i < cells.Length; i++) { cellWidth = (int) (this.width * this.parentTable.GetProportionalWidths()[i] / 100); cellRight = cellRight + cellWidth; PdfPCell cell = cells[i]; RtfCell rtfCell = new RtfCell(this.document, this, cell); rtfCell.SetCellRight(cellRight); rtfCell.SetCellWidth(cellWidth); this.cells.Add(rtfCell); } }