This commit is contained in:
Kathy Ruffing 2011-03-09 12:08:23 +00:00
parent 5ec5508d95
commit a0b15ce884

View File

@ -0,0 +1,301 @@
using System;
using System.Collections.Generic;
using System.Text;
using C1.Win.C1FlexGrid;
using System.IO;
using Itenso.Rtf;
using Itenso.Rtf.Parser;
using Itenso.Rtf.Interpreter;
using Itenso.Rtf.Support;
using Volian.Print.Library;
using Volian.Controls.Library;
namespace Volian.Print.Library
{
public class vlnTable
{
#region Properties
private float[] _RowTop;
public float[] RowTop
{
get { return _RowTop; }
set { _RowTop = value; }
}
private float[] _ColLeft;
public float[] ColLeft
{
get { return _ColLeft; }
set { _ColLeft = value; }
}
private VlnFlexGrid _MyFlexGrid;
public VlnFlexGrid MyFlexGrid
{
get { return _MyFlexGrid; }
set { _MyFlexGrid = value; }
}
private iTextSharp.text.pdf.PdfContentByte _MyContentByte;
public iTextSharp.text.pdf.PdfContentByte MyContentByte
{
get { return _MyContentByte; }
set { _MyContentByte = value; }
}
private vlnCells _MyCells;
public vlnCells MyCells
{
get { return _MyCells; }
set { _MyCells = value; }
}
public float Height
{ get { return RowTop[MyFlexGrid.Rows.Count]; } }
public float Width
{ get { return ColLeft[MyFlexGrid.Cols.Count]; } }
#endregion
#region Constructors
public vlnTable(VlnFlexGrid myFlexGrid, iTextSharp.text.pdf.PdfContentByte myContentByte)
{
MyFlexGrid = myFlexGrid;
MyContentByte = myContentByte;
InitializeSizes();
MyCells = new vlnCells(this, MyFlexGrid, MyContentByte);
}
#endregion
#region Private Methods
private void InitializeSizes()
{
RowTop = new float[MyFlexGrid.Rows.Count + 1];
RowTop[0] = 0;
for (int r = 0; r < MyFlexGrid.Rows.Count; r++)
RowTop[r + 1] = RowTop[r] + 72 * (MyFlexGrid.Rows[r].Height == -1
? MyFlexGrid.Rows.DefaultSize : MyFlexGrid.Rows[r].Height) / (float)MyFlexGrid.DPI;
ColLeft = new float[MyFlexGrid.Cols.Count + 1];
ColLeft[0] = 0;
for (int c = 0; c < MyFlexGrid.Cols.Count; c++)
ColLeft[c + 1] = ColLeft[c] + 72 * (MyFlexGrid.Cols[c].Width == -1
? MyFlexGrid.Cols.DefaultSize : MyFlexGrid.Cols[c].Width) / (float)MyFlexGrid.DPI;
}
#endregion
#region Public Methods
public void AdjustRowTop(int row, float hNew)
{
float hAdjust = hNew - (RowTop[row + 1] - RowTop[row]);
for (int r = row; r < MyFlexGrid.Rows.Count; r++)
RowTop[r + 1] += hAdjust;
}
public void ToPdf(iTextSharp.text.pdf.ColumnText myColumnText, float left, float top)
{
MyCells.ToPdf(myColumnText, left, top);
}
#endregion
}
public class vlnCells : List<vlnCell>
{
#region Properties
private VlnFlexGrid _MyFlexGrid;
public VlnFlexGrid MyFlexGrid
{
get { return _MyFlexGrid; }
set { _MyFlexGrid = value; }
}
private vlnTable _MyTable;
public vlnTable MyTable
{
get { return _MyTable; }
set { _MyTable = value; }
}
private iTextSharp.text.pdf.PdfContentByte _MyContentByte;
public iTextSharp.text.pdf.PdfContentByte MyContentByte
{
get { return _MyContentByte; }
set { _MyContentByte = value; }
}
#endregion
#region Constructors
public vlnCells(vlnTable myTable, VlnFlexGrid myFlexGrid, iTextSharp.text.pdf.PdfContentByte myContentByte)
{
MyTable = myTable;
MyFlexGrid = myFlexGrid;
MyContentByte = myContentByte;
SetupCells();
}
#endregion
#region Private Methods
private void SetupCells()
{
// Create a ColumnText to determine the cell heights
iTextSharp.text.pdf.ColumnText myColumnText1 = new iTextSharp.text.pdf.ColumnText(MyContentByte);
// Walk through
for (int r = 0; r < MyFlexGrid.Rows.Count; r++)
{
for (int c = 0; c < MyFlexGrid.Cols.Count; c++)
{
CellRange cr = MyFlexGrid.GetMergedRange(r, c);
if (cr.r1 == r && cr.c1 == c)
{
float w = MyTable.ColLeft[cr.c2 + 1] - MyTable.ColLeft[cr.c1];
float h = MyTable.RowTop[cr.r2 + 1] - MyTable.RowTop[cr.r1];
string str = MyFlexGrid.GetCellRTFString(r, c)??string.Empty;
using (StepRTB myRTB = new StepRTB())
{
myRTB.Width = (int)w;
myRTB.Font = MyFlexGrid.Font;
if (str.StartsWith(@"{\rtf"))
myRTB.Rtf = str.Replace(@"\~", @"\u160?");
else
myRTB.Text = str;
//myRTB.ForeColor = System.Drawing.Color.Red;
str = myRTB.Rtf;
}
iTextSharp.text.Paragraph myPara = RtfToParagraph(str);
myColumnText1.SetSimpleColumn(0, 0, w - 4, MyContentByte.PdfDocument.PageSize.Top); // Padding = 4
myPara.MultipliedLeading = 1.2F;
myColumnText1.AddElement(myPara);
//myColumnText1.Canvas.SetColorFill(iTextSharp.text.BaseColor.RED);
float posBefore = myColumnText1.YLine;
int status = myColumnText1.Go(true);
float posAfter = myColumnText1.YLine;
float hContent = 4 + posBefore - posAfter;
if (hContent > h)
MyTable.AdjustRowTop(cr.r2, hContent);
Add(new vlnCell(cr.r1, cr.c1, cr.r2, cr.c2, MyTable, myPara, hContent));
}
}
}
}
public static iTextSharp.text.Paragraph RtfToParagraph(string rtf)
{
IRtfDocument rtfDoc = RtfInterpreterTool.BuildDoc(rtf);
Rtf2iTextSharp rtf2IText = new Rtf2iTextSharp(rtfDoc);
iTextSharp.text.Paragraph para = rtf2IText.Convert();
para.SetLeading(_SixLinesPerInch, 0);
return para;
}
private static float _SixLinesPerInch = 12; // twips
#endregion
#region Public Methods
public void ToPdf(iTextSharp.text.pdf.ColumnText myColumnText, float left, float top)
{
foreach (vlnCell myCell in this)
myCell.ToPdf(myColumnText, left, top);
}
#endregion
}
public class vlnCell
{
#region Properties
private vlnTable _MyTable;
public vlnTable MyTable
{
get { return _MyTable; }
set { _MyTable = value; }
}
private int _r1;
public int r1
{
get { return _r1; }
set { _r1 = value; }
}
private int _c1;
public int c1
{
get { return _c1; }
set { _c1 = value; }
}
private int _r2;
public int r2
{
get { return _r2; }
set { _r2 = value; }
}
private int _c2;
public int c2
{
get { return _c2; }
set { _c2 = value; }
}
private iTextSharp.text.Paragraph _MyPara;
public iTextSharp.text.Paragraph MyPara
{
get { return _MyPara; }
set { _MyPara = value; }
}
private float _HContent;
public float HContent
{
get { return _HContent; }
set { _HContent = value; }
}
#endregion
#region Constructors
public vlnCell(int r1, int c1, int r2, int c2, vlnTable myTable, iTextSharp.text.Paragraph myPara, float hContent)
{
this.r1 = r1;
this.c1 = c1;
this.r2 = r2;
this.c2 = c2;
MyTable = myTable;
MyPara = myPara;
HContent = hContent;
}
#endregion
#region Public Methods
public override string ToString()
{
return string.Format("{0}:{1}", r1, c1);
}
public void ToPdf(iTextSharp.text.pdf.ColumnText myColumnText, float left, float top)
{
myColumnText.Canvas.SaveState();
float x = MyTable.ColLeft[c1];
float w = MyTable.ColLeft[c2 + 1] - x;
float y = MyTable.RowTop[r1];
float h = MyTable.RowTop[r2 + 1] - y;
CellRange cr = MyTable.MyFlexGrid.GetCellRange(r1, c1, r2, c2);
if (cr.Style == null || cr.Style.Border.Style != BorderStyleEnum.None)
{
myColumnText.Canvas.Rectangle(left + x, top - y, w, -h);
myColumnText.Canvas.SetColorStroke(iTextSharp.text.Color.BLACK);
myColumnText.Canvas.SetLineWidth(.5F);
if (cr.Style != null && cr.Style.Border.Style == BorderStyleEnum.Dotted)
{
myColumnText.Canvas.SetLineCap(iTextSharp.text.pdf.PdfContentByte.LINE_CAP_ROUND);
myColumnText.Canvas.SetLineDash(0, 2, 0);
//myColumnText.Canvas.SetLineDash(10, 5, 0);
//float[] myDashPattern ={ 1, 2, 3, 4, 5, 6, 7, 8 };
//myColumnText.Canvas.SetLineDash(myDashPattern, 0);
}
else if (cr.Style != null && cr.Style.Border.Style == BorderStyleEnum.Fillet)
myColumnText.Canvas.SetLineDash(4, 4, 0);
myColumnText.Canvas.Stroke();
}
float hAdjust = 0;
if (cr.Style != null)
{
switch (cr.Style.TextAlign)
{
case TextAlignEnum.CenterBottom:
case TextAlignEnum.GeneralBottom:
case TextAlignEnum.LeftBottom:
case TextAlignEnum.RightBottom:
hAdjust = h - HContent;
break;
case TextAlignEnum.CenterCenter:
case TextAlignEnum.GeneralCenter:
case TextAlignEnum.LeftCenter:
case TextAlignEnum.RightCenter:
hAdjust = (h - HContent) / 2;
break;
default:
break;
}
}
iTextSharp.text.pdf.ColumnText myColumnText1 = new iTextSharp.text.pdf.ColumnText(myColumnText.Canvas);
myColumnText1.SetSimpleColumn(2 + left + x, top - y - h, left + x + w - 2, -1 + top - y - hAdjust); // 2 == Default Padding
myColumnText1.AddElement(MyPara);
myColumnText1.Go();
myColumnText.Canvas.RestoreState();
}
#endregion
}
}