protected override void OnPrintPage(PrintPageEventArgs ev)
{
int count = 0;
float leftMargin = ev.MarginBounds.Left;
float rightMargin = ev.MarginBounds.Right;
float topMargin = ev.MarginBounds.Top;
//ev.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
if (rc == null)
{
Document.ParseAll();
Document.ParseAll(true);
rc = new RowList();
foreach (Row r in Document)
{
bool hasbreak = false;
float x = leftMargin;
var newRow = new Row();
rc.Add(newRow);
foreach (Word w in r)
{
Font f = fontNormal;
if (w.Style != null)
{
FontStyle fs = 0;
if (w.Style.Bold)
fs |= FontStyle.Bold;
if (w.Style.Italic)
fs |= FontStyle.Italic;
if (w.Style.Underline)
fs |= FontStyle.Underline;
f = new Font("Courier new", 8, fs);
}
SizeF sf = ev.Graphics.MeasureString(w.Text, f);
if (x + sf.Width > rightMargin)
{
var chr = (char) 0xbf;
var br = new Word {Text = (chr + ""), InfoTip = "break char"};
newRow.Add(br);
hasbreak = true;
newRow = new Row();
rc.Add(newRow);
x = leftMargin;
}
x += sf.Width;
newRow.Add(w);
}
if (hasbreak)
{
rc.Add(new Row());
}
}
}
//------------------------------------------------------
base.OnPrintPage(ev);
float lpp = ev.MarginBounds.Height/fontNormal.GetHeight(ev.Graphics);
while (count < lpp && (RowIndex < rc.Count))
{
float x = leftMargin;
float yPos = topMargin + (count*fontNormal.GetHeight(ev.Graphics));
Row r = rc[RowIndex];
foreach (Word w in r)
{
if (w.InfoTip != null && w.InfoTip == "break char")
{
ev.Graphics.DrawString(w.Text, fontBreak, Brushes.Black, x, yPos,
new StringFormat());
}
else
{
SizeF sf = ev.Graphics.MeasureString(w.Text, fontNormal);
if (w.Text != null && (".,:;".IndexOf(w.Text) >= 0))
{
sf.Width = 6;
x -= 4;
}
if (w.Text == "\t")
{
sf.Width = ev.Graphics.MeasureString("...", fontNormal).Width;
}
Color c = Color.Black;
Font f = fontNormal;
if (w.Style != null)
{
c = w.Style.ForeColor;
FontStyle fs = 0;
if (w.Style.Bold)
fs |= FontStyle.Bold;
if (w.Style.Italic)
fs |= FontStyle.Italic;
if (w.Style.Underline)
fs |= FontStyle.Underline;
f = new Font("Courier new", 8, fs);
if (!w.Style.Transparent)
{
Color bg = w.Style.BackColor;
ev.Graphics.FillRectangle(new SolidBrush(bg), x, yPos, sf.Width,
fontNormal.GetHeight(ev.Graphics));
}
}
c = Color.FromArgb(c.R, c.G, c.B);
ev.Graphics.DrawString(w.Text, f, new SolidBrush(c), x, yPos, new
StringFormat());
x += sf.Width;
}
}
count++;
RowIndex++;
}
//If we have more lines then print another page
ev.HasMorePages = RowIndex < rc.Count;
}
}