// methods
/**
* Adds a <CODE>PdfChunk</CODE> to the <CODE>PdfLine</CODE>.
*
* @param chunk the <CODE>PdfChunk</CODE> to add
* @return <CODE>null</CODE> if the chunk could be added completely; if not
* a <CODE>PdfChunk</CODE> containing the part of the chunk that could
* not be added is returned
*/
internal PdfChunk Add(PdfChunk chunk)
{
// nothing happens if the chunk is null.
if (chunk == null || chunk.ToString().Equals(""))
{
return(null);
}
// we split the chunk to be added
PdfChunk overflow = chunk.Split(width);
newlineSplit = (chunk.IsNewlineSplit() || overflow == null);
// if (chunk.IsNewlineSplit() && alignment == Element.ALIGN_JUSTIFIED)
// alignment = Element.ALIGN_LEFT;
if (chunk.IsTab())
{
Object[] tab = (Object[])chunk.GetAttribute(Chunk.TAB);
if (chunk.IsAttribute(Chunk.TABSETTINGS))
{
bool isWhiteSpace = (bool)tab[1];
if (!isWhiteSpace || line.Count > 0)
{
Flush();
tabStopAnchorPosition = float.NaN;
tabStop = PdfChunk.GetTabStop(chunk, originalWidth - width);
if (tabStop.Position > originalWidth)
{
width = 0;
if (isWhiteSpace)
{
return(null);
}
else
{
return(chunk);
}
}
tabStop.Position = tabStop.Position;
chunk.TabStop = tabStop;
if (tabStop.Align == TabStop.Alignment.LEFT)
{
width = originalWidth - tabStop.Position;
tabStop = null;
tabPosition = float.NaN;
}
else
{
tabPosition = originalWidth - width;
}
}
else
{
return(null);
}
}
else
{
//Keep deprecated tab logic for backward compatibility...
float tabStopPosition = (float)tab[1];
bool newline = (bool)tab[2];
if (newline && tabPosition < originalWidth - width)
{
return(chunk);
}
chunk.AdjustLeft(left);
width = originalWidth - tabStopPosition;
}
AddToLine(chunk);
} // if the length of the chunk > 0 we add it to the line
else if (chunk.Length > 0 || chunk.IsImage())
{
if (overflow != null)
{
chunk.TrimLastSpace();
}
width -= chunk.Width();
AddToLine(chunk);
}
// if the length == 0 and there were no other chunks added to the line yet,
// we risk to end up in an endless loop trying endlessly to add the same chunk
else if (line.Count < 1)
{
chunk = overflow;
overflow = chunk.Truncate(width);
width -= chunk.Width();
if (chunk.Length > 0)
{
AddToLine(chunk);
return(overflow);
}
// if the chunck couldn't even be truncated, we add everything, so be it
else
{
if (overflow != null)
{
AddToLine(chunk);
}
return(null);
}
}
else
{
width += line[line.Count - 1].TrimLastSpace();
}
return(overflow);
}