/**
* Writes a number of cells (not necessarily all cells).
*
* @param colStart The first column to be written.
* Remember that the column index starts with 0.
* @param colEnd The last column to be written.
* Remember that the column index starts with 0.
* If -1, all the columns to the end are written.
* @param xPos The x-coordinate where the table starts on the canvas
* @param yPos The y-coordinate where the table starts on the canvas
*/
public void WriteCells(int colStart, int colEnd, float xPos, float yPos, PdfContentByte[] canvases)
{
if (!calculated)
{
CalculateHeights();
}
if (colEnd < 0)
{
colEnd = cells.Length;
}
else
{
colEnd = Math.Min(colEnd, cells.Length);
}
if (colStart < 0)
{
colStart = 0;
}
if (colStart >= colEnd)
{
return;
}
int newStart;
for (newStart = colStart; newStart >= 0; --newStart)
{
if (cells[newStart] != null)
{
break;
}
if (newStart > 0)
{
xPos -= widths[newStart - 1];
}
}
if (newStart < 0)
{
newStart = 0;
}
if (cells[newStart] != null)
{
xPos -= cells[newStart].Left;
}
for (int k = newStart; k < colEnd; ++k)
{
PdfPCell cell = cells[k];
if (cell == null)
{
continue;
}
float currentMaxHeight = maxHeight + extraHeights[k];
WriteBorderAndBackground(xPos, yPos, currentMaxHeight, cell, canvases);
Image img = cell.Image;
float tly = cell.Top + yPos - cell.EffectivePaddingTop;
if (cell.Height <= currentMaxHeight)
{
switch (cell.VerticalAlignment)
{
case Element.ALIGN_BOTTOM:
tly = cell.Top + yPos - currentMaxHeight + cell.Height
- cell.EffectivePaddingTop;
break;
case Element.ALIGN_MIDDLE:
tly = cell.Top + yPos + (cell.Height - currentMaxHeight) / 2
- cell.EffectivePaddingTop;
break;
default:
break;
}
}
if (img != null)
{
if (cell.Rotation != 0)
{
img = Image.GetInstance(img);
img.Rotation = img.GetImageRotation() + (float)(cell.Rotation * Math.PI / 180.0);
}
bool vf = false;
if (cell.Height > currentMaxHeight)
{
img.ScalePercent(100);
float scale = (currentMaxHeight - cell.EffectivePaddingTop - cell
.EffectivePaddingBottom)
/ img.ScaledHeight;
img.ScalePercent(scale * 100);
vf = true;
}
float left = cell.Left + xPos
+ cell.EffectivePaddingLeft;
if (vf)
{
switch (cell.HorizontalAlignment)
{
case Element.ALIGN_CENTER:
left = xPos
+ (cell.Left + cell.EffectivePaddingLeft
+ cell.Right
- cell.EffectivePaddingRight - img
.ScaledWidth) / 2;
break;
case Element.ALIGN_RIGHT:
left = xPos + cell.Right
- cell.EffectivePaddingRight
- img.ScaledWidth;
break;
default:
break;
}
tly = cell.Top + yPos - cell.EffectivePaddingTop;
}
img.SetAbsolutePosition(left, tly - img.ScaledHeight);
canvases[PdfPTable.TEXTCANVAS].AddImage(img);
}
else
{
// rotation sponsored by Connection GmbH
if (cell.Rotation == 90 || cell.Rotation == 270)
{
float netWidth = currentMaxHeight - cell.EffectivePaddingTop - cell.EffectivePaddingBottom;
float netHeight = cell.Width - cell.EffectivePaddingLeft - cell.EffectivePaddingRight;
ColumnText ct = ColumnText.Duplicate(cell.Column);
ct.Canvases = canvases;
ct.SetSimpleColumn(0, 0, netWidth + 0.001f, -netHeight);
ct.Go(true);
float calcHeight = -ct.YLine;
if (netWidth <= 0 || netHeight <= 0)
{
calcHeight = 0;
}
if (calcHeight > 0)
{
if (cell.UseDescender)
{
calcHeight -= ct.Descender;
}
ct = ColumnText.Duplicate(cell.Column);
ct.Canvases = canvases;
ct.SetSimpleColumn(-0.003f, -0.001f, netWidth + 0.003f, calcHeight);
float pivotX;
float pivotY;
if (cell.Rotation == 90)
{
pivotY = cell.Top + yPos - currentMaxHeight + cell.EffectivePaddingBottom;
switch (cell.VerticalAlignment)
{
case Element.ALIGN_BOTTOM:
pivotX = cell.Left + xPos + cell.Width - cell.EffectivePaddingRight;
break;
case Element.ALIGN_MIDDLE:
pivotX = cell.Left + xPos + (cell.Width + cell.EffectivePaddingLeft - cell.EffectivePaddingRight + calcHeight) / 2;
break;
default: //top
pivotX = cell.Left + xPos + cell.EffectivePaddingLeft + calcHeight;
break;
}
SaveAndRotateCanvases(canvases, 0, 1, -1, 0, pivotX, pivotY);
}
else
{
pivotY = cell.Top + yPos - cell.EffectivePaddingTop;
switch (cell.VerticalAlignment)
{
case Element.ALIGN_BOTTOM:
pivotX = cell.Left + xPos + cell.EffectivePaddingLeft;
break;
case Element.ALIGN_MIDDLE:
pivotX = cell.Left + xPos + (cell.Width + cell.EffectivePaddingLeft - cell.EffectivePaddingRight - calcHeight) / 2;
break;
default: //top
pivotX = cell.Left + xPos + cell.Width - cell.EffectivePaddingRight - calcHeight;
break;
}
SaveAndRotateCanvases(canvases, 0, -1, 1, 0, pivotX, pivotY);
}
try {
ct.Go();
} finally {
RestoreCanvases(canvases);
}
}
}
else
{
float fixedHeight = cell.FixedHeight;
float rightLimit = cell.Right + xPos
- cell.EffectivePaddingRight;
float leftLimit = cell.Left + xPos
+ cell.EffectivePaddingLeft;
if (cell.NoWrap)
{
switch (cell.HorizontalAlignment)
{
case Element.ALIGN_CENTER:
rightLimit += 10000;
leftLimit -= 10000;
break;
case Element.ALIGN_RIGHT:
if (cell.Rotation == 180)
{
rightLimit += RIGHT_LIMIT;
}
else
{
leftLimit -= RIGHT_LIMIT;
}
break;
default:
if (cell.Rotation == 180)
{
leftLimit -= RIGHT_LIMIT;
}
else
{
rightLimit += RIGHT_LIMIT;
}
break;
}
}
ColumnText ct = ColumnText.Duplicate(cell.Column);
ct.Canvases = canvases;
float bry = tly
- (currentMaxHeight
- cell.EffectivePaddingTop - cell.EffectivePaddingBottom);
if (fixedHeight > 0)
{
if (cell.Height > currentMaxHeight)
{
tly = cell.Top + yPos - cell.EffectivePaddingTop;
bry = cell.Top + yPos - currentMaxHeight + cell.EffectivePaddingBottom;
}
}
if ((tly > bry || ct.ZeroHeightElement()) && leftLimit < rightLimit)
{
ct.SetSimpleColumn(leftLimit, bry - 0.001f, rightLimit, tly);
if (cell.Rotation == 180)
{
float shx = leftLimit + rightLimit;
float shy = yPos + yPos - currentMaxHeight + cell.EffectivePaddingBottom - cell.EffectivePaddingTop;
SaveAndRotateCanvases(canvases, -1, 0, 0, -1, shx, shy);
}
try {
ct.Go();
} finally {
if (cell.Rotation == 180)
{
RestoreCanvases(canvases);
}
}
}
}
}
IPdfPCellEvent evt = cell.CellEvent;
if (evt != null)
{
Rectangle rect = new Rectangle(cell.Left + xPos, cell.Top
+ yPos - currentMaxHeight, cell.Right + xPos, cell.Top
+ yPos);
evt.CellLayout(cell, rect, canvases);
}
}
}