Rich 7549f62ba9 Added gap in centerline for grid for processing VCSummer data
Changed how page length was determined when deciding how to paginate a procedure for processing VCSummer data
Utilized FixedMessage property for processing VCSummer data
Utilized DocStyle.LandscapePageList property for processing VCSummer data
Added gap in centerline for boxes for processing VCSummer data
Changed ToPdf method to pass yTopMargin and yBottomMargin by reference
		Chnaged calls to ToPdf method to pass yTopMargin and yBottomMargin by reference
Changed how vlnParagraph was processed with regards to Notes and Caution boxes to support nuances in VCSummer data
Added code to support macro substitutions in continue messages and end of procedure messages for processing VCSummer data
Added drawing centerline and handling gaps in centerline for processing VCSummer data
Added RomanNumbering of pages for processing VCSummer data
Added classes Gap and Gaps for processing VCSummer data
Utilized MacroTabAdjust property for processing VCSummer data
Changed how vlnText width was calculated for processing VCSummer data
2013-06-11 18:47:47 +00:00

1023 lines
38 KiB
C#

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;
using iTextSharp.text.pdf;
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; }
}
public VlnBorders MyBorders
{
get { return _MyFlexGrid.MyBorders; }
}
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]; } }
private static float _XOffset = -1; // This moves the borders with respect to the text
public static float XOffset
{
get { return vlnTable._XOffset; }
set { vlnTable._XOffset = value; }
}
private static float _YOffset = 0; // This moves the borders with respect to the text
public static float YOffset
{
get { return vlnTable._YOffset; }
set { vlnTable._YOffset = value; }
}
private static float _LineThicknessForThin = .9F;
public static float LineThicknessForThin
{
get { return vlnTable._LineThicknessForThin; }
set { vlnTable._LineThicknessForThin = value; }
}
private static float _LineThicknessForThick = 1.8F;
public static float LineThicknessForThick
{
get { return vlnTable._LineThicknessForThick; }
set { vlnTable._LineThicknessForThick = value; }
}
private static float _LineThicknessForDouble = .6F;
public static float LineThicknessForDouble
{
get { return vlnTable._LineThicknessForDouble; }
set { vlnTable._LineThicknessForDouble = value; }
}
public static float DoubleLineOffset
{
get { return (LineThicknessForThick - LineThicknessForDouble) / 2; }//LineThicknessForThick - 2 * LineThicknessForDouble; }
}
#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 row1, int row2, float hNew)
{
float hAdjust = hNew - (RowTop[row2 + 1] - RowTop[row1]);
for (int r = row2; r < MyFlexGrid.Rows.Count; r++)
RowTop[r + 1] += hAdjust;
}
public void ToPdf(iTextSharp.text.pdf.ColumnText myColumnText, float left, float top)
{
//ZoomGrid(myColumnText, left, top);
VlnSvgPageHelper myPageHelper = myColumnText.Canvas.PdfWriter.PageEvent as VlnSvgPageHelper;
myPageHelper.AddGap(top, top - Height, left, left + Width);
MyCells.ToPdf(myColumnText, left, top);
}
private void ZoomGrid(iTextSharp.text.pdf.ColumnText myColumnText, float left, float top)
{
PdfDestination dest = new PdfDestination(PdfDestination.FITR, left - 4, top - Height - 4, left + Width, top + 4);
myColumnText.Canvas.SetAction(PdfAction.GotoLocalPage(myColumnText.Canvas.PdfWriter.CurrentPageNumber, dest, myColumnText.Canvas.PdfWriter), left, top - Height, left + Width, 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;
DisplayText dt = new DisplayText(MyFlexGrid.GetMyItemInfo(), str, false);
str = dt.StartText;
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.SelectAll();
myRTB.SelectionColor = PrintOverride.OverrideTextColor(System.Drawing.Color.Black);
str = myRTB.Rtf;
}
iTextSharp.text.Paragraph myPara = RtfToParagraph(str);
myColumnText1.SetSimpleColumn(0, 0, w - 2, MyContentByte.PdfDocument.PageSize.Top); // Padding = 4
// RHM 20120925 - Line spacing should be 6 lines per inch. In order to get a valid value
// for TotalLeading you have to set MultipliedLeading first:
myPara.MultipliedLeading = 1.0f;
// once there is valid value for TotalLeading (from previous line), you can use it to
// calculate a MultipliedLeading to give 6 LPI (12 points)
myPara.MultipliedLeading = 12.0f / myPara.TotalLeading;
myPara.SpacingAfter = 8; // RHM 20120925 - Add a line to properly space text from lines.
myColumnText1.AddElement(myPara);
//myColumnText1.Canvas.SetColorFill(PrintOverride.OverrideTextColor(System.Drawing.Color.Black));
float posBefore = myColumnText1.YLine;
int status = myColumnText1.Go(true);
float posAfter = myColumnText1.YLine;
float hContent = 4 + posBefore - posAfter;
if (hContent > h)
MyTable.AdjustRowTop(cr.r1, 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; }
}
public VlnBorders MyBorders
{
get { return _MyTable.MyBorders; }
}
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 Line Pattern Diagram
/*
The diagram below identifies the various border names for the cell in the center
|-AboveLeftSide |-AboveRightSide
| |
| |
| |
LeftOfTopSide | TopSide | RightOfTopSide
------------------|-------------------|------------------
| |
| |
|-LeftSide |-RightSide
| |
| |
LeftOfBottomSide | BottomSide | RightOfBottomSide
--------------------------------------|------------------
| |
| |
| |
| |
|-BelowLeftSide |-BelowRightSide
*/
#endregion
#region Horizontal Line Patterns
private GridLinePattern _TopSide = GridLinePattern.Unknown;
public GridLinePattern TopSide
{
get
{
if (_TopSide == GridLinePattern.Unknown)
_TopSide = MyBorders.HorizontalLines[r1, c1];
return _TopSide;
}
}
private GridLinePattern _BottomSide = GridLinePattern.Unknown;
public GridLinePattern BottomSide
{
get
{
if (_BottomSide == GridLinePattern.Unknown)
_BottomSide = MyBorders.HorizontalLines[r2 + 1, c2];
return _BottomSide;
}
}
private GridLinePattern _RightOfTopSide = GridLinePattern.Unknown;
public GridLinePattern RightOfTopSide
{
get
{
if (_RightOfTopSide == GridLinePattern.Unknown)
{
if (c2 == MyTable.MyFlexGrid.Cols.Count - 1)
_RightOfTopSide = GridLinePattern.None;
else
{
CellRange cr = MyTable.MyFlexGrid.GetMergedRange(r1, c2 + 1);
if (cr.r1 == r1)
_RightOfTopSide = MyBorders.HorizontalLines[r1, c2 + 1];
else
_RightOfTopSide = GridLinePattern.None;
}
}
return _RightOfTopSide;
}
}
private GridLinePattern _LeftOfTopSide = GridLinePattern.Unknown;
public GridLinePattern LeftOfTopSide
{
get
{
if (_LeftOfTopSide == GridLinePattern.Unknown)
{
if (c1 == 0)
_LeftOfTopSide = GridLinePattern.None;
else
{
// This property is only used if c1==0 or r1==0:
// A merged range for row = 0 will always return an r1=0.
CellRange cr = MyTable.MyFlexGrid.GetMergedRange(r1, c1 - 1);
if (cr.r1 == r1)
_LeftOfTopSide = MyBorders.HorizontalLines[r1, c1 - 1];
else // Since this section of code is only entered when r1==0, this else condition should never happen
_LeftOfTopSide = GridLinePattern.None;
}
}
return _LeftOfTopSide;
}
}
private GridLinePattern _RightOfBottomSide = GridLinePattern.Unknown;
public GridLinePattern RightOfBottomSide
{
get
{
if (_RightOfBottomSide == GridLinePattern.Unknown) // Need to consider Merged Cells
{
if (c2 == MyTable.MyFlexGrid.Cols.Count - 1)
_RightOfBottomSide = GridLinePattern.None;
else
{
CellRange cr = MyTable.MyFlexGrid.GetMergedRange(r2, c2 + 1);
if (cr.r2 == r2)
_RightOfBottomSide = MyBorders.HorizontalLines[r2 + 1, c2 + 1];
else
_RightOfBottomSide = GridLinePattern.None;
}
}
return _RightOfBottomSide;
}
}
private GridLinePattern _LeftOfBottomSide = GridLinePattern.Unknown;
public GridLinePattern LeftOfBottomSide
{
get
{
if (_LeftOfBottomSide == GridLinePattern.Unknown) // Need to consider Merged Cells
{
if (c1 == 0)
_LeftOfBottomSide = GridLinePattern.None;
else
{
CellRange cr = MyTable.MyFlexGrid.GetMergedRange(r2, c1 - 1);
if (cr.r2 == r2)
_LeftOfBottomSide = MyBorders.HorizontalLines[r2 + 1, c1 - 1];
else
_LeftOfBottomSide = GridLinePattern.None;
}
}
return _LeftOfBottomSide;
}
}
#endregion
#region Vertical Line Patterns
private GridLinePattern _LeftSide = GridLinePattern.Unknown;
public GridLinePattern LeftSide
{
get
{
if (_LeftSide == GridLinePattern.Unknown)
_LeftSide = MyBorders.VerticalLines[r1, c1];
return _LeftSide;
}
}
private GridLinePattern _RightSide = GridLinePattern.Unknown;
public GridLinePattern RightSide
{
get
{
if (_RightSide == GridLinePattern.Unknown)
_RightSide = MyBorders.VerticalLines[r2, c2 + 1];
return _RightSide;
}
}
private GridLinePattern _BelowRightSide = GridLinePattern.Unknown;
public GridLinePattern BelowRightSide
{
get
{
if (_BelowRightSide == GridLinePattern.Unknown)
{
if (r2 == MyTable.MyFlexGrid.Rows.Count - 1)
_BelowRightSide = GridLinePattern.None;
else
{
CellRange cr = MyTable.MyFlexGrid.GetMergedRange(r2 + 1, c2);
if (cr.c2 == c2)
_BelowRightSide = MyBorders.VerticalLines[r2 + 1, c2 + 1];
else
_BelowRightSide = GridLinePattern.None;
}
}
return _BelowRightSide;
}
}
private GridLinePattern _AboveRightSide = GridLinePattern.Unknown;
public GridLinePattern AboveRightSide
{
get
{
if (_AboveRightSide == GridLinePattern.Unknown)
{
if (r1 == 0)
_AboveRightSide = GridLinePattern.None;
else
{
CellRange cr = MyTable.MyFlexGrid.GetMergedRange(r1 - 1, c2);
if (cr.c2 == c2)
_AboveRightSide = MyBorders.VerticalLines[r1 - 1, c2 + 1];
else
_AboveRightSide = GridLinePattern.None;
}
}
return _AboveRightSide;
}
}
private GridLinePattern _BelowLeftSide = GridLinePattern.Unknown;
public GridLinePattern BelowLeftSide
{
get
{
if (_BelowLeftSide == GridLinePattern.Unknown)
{
if (r2 == MyTable.MyFlexGrid.Rows.Count - 1)
_BelowLeftSide = GridLinePattern.None;
else
{
CellRange cr = MyTable.MyFlexGrid.GetMergedRange(r2 + 1, c1);
if (cr.c1 == c1)
_BelowLeftSide = MyBorders.VerticalLines[r2 + 1, c1];
else
_BelowLeftSide = GridLinePattern.None;
}
}
return _BelowLeftSide;
}
}
private GridLinePattern _AboveLeftSide = GridLinePattern.Unknown;
public GridLinePattern AboveLeftSide
{
get
{
if (_AboveLeftSide == GridLinePattern.Unknown)
{
if (r1 == 0)
_AboveLeftSide = GridLinePattern.None;
else
{
// This property is only used if c1==0 or r1==0:
// A merged range for col = 0 will always return an c1=0.
CellRange cr = MyTable.MyFlexGrid.GetMergedRange(r1 - 1, c1);
if (cr.c1 == c1)
_AboveLeftSide = MyBorders.VerticalLines[r1 - 1, c1];
else // Since this section of code is only entered when c1==0, this else condition should never happen
_AboveLeftSide = GridLinePattern.None;
}
}
return _AboveLeftSide;
}
}
#endregion
#region Static Properties
private static float XOffset { get { return vlnTable.XOffset; } }
private static float YOffset { get { return vlnTable.YOffset; } }
private static float LineThicknessForThin { get { return vlnTable.LineThicknessForThin; } }
private static float LineThicknessForThick { get { return vlnTable.LineThicknessForThick; } }
private static float LineThicknessForDouble { get { return vlnTable.LineThicknessForDouble; } }
private static float DoubleLineOffset { get { return vlnTable.DoubleLineOffset; } }
// adjustments for line intersections:
private static float ThickOverDouble { get { return ((2 * DoubleLineOffset) + LineThicknessForDouble - LineThicknessForThick) / 2; } }
private static float ThickUnderDouble { get { return DoubleLineOffset + (LineThicknessForThick - LineThicknessForDouble) / 2; } }
private static float ThickOverThin { get { return (LineThicknessForThin - LineThicknessForThick) / 2; } }
private static float ThinOverThick { get { return (LineThicknessForThick - LineThicknessForThin) / 2; } }
private static float ThinUnderDouble { get { return DoubleLineOffset + (LineThicknessForThin - LineThicknessForDouble) / 2; } }
private static float ThinOverDouble { get { return (DoubleLineOffset + LineThicknessForThin - LineThicknessForDouble) / 2; } }
private static float DoubleUnderThin { get { return (LineThicknessForThin - LineThicknessForDouble) / 2; } }
private static float DoubleUnderThick { get { return (LineThicknessForThick - LineThicknessForDouble) / 2; } }
#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();
VlnSvgPageHelper _MyPageHelper = myColumnText.Canvas.PdfWriter.PageEvent as VlnSvgPageHelper;
float mult = _MyPageHelper.YMultiplier;
float x = MyTable.ColLeft[c1];
float w = MyTable.ColLeft[c2 + 1] - x;
float y = mult * MyTable.RowTop[r1];
float h = mult * MyTable.RowTop[r2 + 1] - y;
BordersToPdf(myColumnText, left, top, x, w, y, h );
float hAdjust = VeritcalTextAlignment(h);
iTextSharp.text.pdf.ColumnText myColumnText1 = new iTextSharp.text.pdf.ColumnText(myColumnText.Canvas);
float adjustTextLocation = mult * 4; // RHM 20120925 Move text down about 1 half line from the border
myColumnText1.SetSimpleColumn(1 + left + x, top - y - h , left + x + w, 1 + top - y - hAdjust - adjustTextLocation); // 2 == Default Padding
MyPara.MultipliedLeading *= _MyPageHelper.YMultiplier;
myColumnText1.AddElement(MyPara);
myColumnText1.Go();
myColumnText.Canvas.RestoreState();
}
private static float _SixLinesPerInch = 12; // twips
#endregion
#region Private Text Methods
private float VeritcalTextAlignment(float h)
{
float hAdjust = 0;
CellRange cr = MyTable.MyFlexGrid.GetCellRange(r1, c1, r2, c2);
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;
}
}
return hAdjust;
}
#endregion
#region Private Border Methods
// coordinate system is upside down of screen. 0,0 on screen is top/left. 0,0 on pdf is bottom/left.
// i.e. x is same, y is flipped.
private void BordersToPdf(iTextSharp.text.pdf.ColumnText myColumnText, float left, float top, float x, float w, float y, float h)
{
PdfContentByte cb = myColumnText.Canvas;
cb.SaveState();// Save state before drawing borders
//SetOpacity(cb, .7F); // This line makes the borders transparent for testing
float xLeft = left + x + XOffset;
float yTop = top - y + YOffset;
float xRight = left + x + w + XOffset;
float yBottom = top - y - h + YOffset;
// ZoomToCell(myColumnText, xLeft, yTop, xRight, yBottom);
// Draw Top Side for the first row
if (r1 == 0)
DrawHorizontalLine(cb, "Top", xLeft, xRight, yTop, TopSide, LeftSide, AboveLeftSide, LeftOfTopSide, AboveRightSide, RightSide, RightOfTopSide);
// Draw Left Side for the first column
if (c1 == 0)
DrawLineVertical(cb, "Left", xLeft, yBottom, yTop, LeftSide, BottomSide, LeftOfBottomSide, BelowLeftSide, LeftOfTopSide, TopSide, AboveLeftSide);
// Draw Bottom Side
DrawHorizontalLine(cb, "Bottom", xLeft, xRight, yBottom, BottomSide, BelowLeftSide, LeftSide, LeftOfBottomSide, RightSide, BelowRightSide, RightOfBottomSide);
// Draw Right Side
DrawLineVertical(cb, "Right", xRight, yBottom, yTop, RightSide, RightOfBottomSide, BottomSide, BelowRightSide, TopSide, RightOfTopSide, AboveRightSide);
cb.RestoreState();
}
private void DrawHorizontalLine(PdfContentByte cb, string side, float xStart, float xEnd, float y, GridLinePattern LinePattern,
GridLinePattern startToLeft, GridLinePattern startToRight, GridLinePattern startAhead,
GridLinePattern endToLeft, GridLinePattern endToRight, GridLinePattern endAhead)
{
if (LinePattern != GridLinePattern.None)
{
float direction = (xStart < xEnd) ? 1 : -1;
InitializeLineStyle(cb);
SetLineColor(cb, r1, c1, side);
if (LinePattern == GridLinePattern.Double)
{
// Top Line
float dStart = -direction * DoubleIntersectionRight(startToLeft, startToRight, startAhead);
float dEnd = direction * DoubleIntersectionLeft(endToLeft, endToRight, endAhead);
DrawLine(cb, LineThicknessForDouble, xStart + dStart, y + DoubleLineOffset, xEnd + dEnd, y + DoubleLineOffset);
// Bottom Line
dStart = -direction * DoubleIntersectionLeft(startToLeft, startToRight, startAhead);
dEnd = direction * DoubleIntersectionRight(endToLeft, endToRight, endAhead);
DrawLine(cb, LineThicknessForDouble, xStart + dStart, y - DoubleLineOffset, xEnd + dEnd, y - DoubleLineOffset);
}
else if (LinePattern != GridLinePattern.Thick)
{
SetLinePattern(cb, LinePattern);
float dStart = -direction * ThinIntersection(startToLeft, startToRight, startAhead);
float dEnd = direction * ThinIntersection(endToLeft, endToRight, endAhead);
DrawLine(cb, LineThicknessForThin, xStart + dStart, y, xEnd + dEnd, y);
}
else
{
float dStart = -direction * ThickIntersection(startToLeft, startToRight, startAhead);
float dEnd = direction * ThickIntersection(endToLeft, endToRight, endAhead);
DrawLine(cb, LineThicknessForThick, xStart + dStart, y, xEnd + dEnd, y);
}
cb.Stroke();
}
}
private void DrawLineVertical(PdfContentByte cb, string side, float x, float yStart, float yEnd, GridLinePattern LinePattern,
GridLinePattern startToLeft, GridLinePattern startToRight, GridLinePattern startAhead,
GridLinePattern endToLeft, GridLinePattern endToRight, GridLinePattern endAhead)
{
if (LinePattern != GridLinePattern.None)
{
float direction = (yStart < yEnd) ? 1 : -1;
InitializeLineStyle(cb);
SetLineColor(cb, r1, c1, side);
if (LinePattern == GridLinePattern.Double)
{
//Left Line
float dStart = -direction * DoubleIntersectionRight(startToLeft, startToRight, startAhead);
float dEnd = direction * DoubleIntersectionLeft(endToLeft, endToRight, endAhead);
DrawLine(cb, LineThicknessForDouble, x - DoubleLineOffset, yStart + dStart, x - DoubleLineOffset, yEnd + dEnd);
//Right Line
dStart = -direction * DoubleIntersectionLeft(startToLeft, startToRight, startAhead);
dEnd = direction * DoubleIntersectionRight(endToLeft, endToRight, endAhead);
DrawLine(cb, LineThicknessForDouble, x + DoubleLineOffset, yStart + dStart, x + DoubleLineOffset, yEnd + dEnd);
}
else if (LinePattern != GridLinePattern.Thick)
{
SetLinePattern(cb, LinePattern);
float dStart = -direction * ThinIntersection(startToLeft, startToRight, startAhead);
float dEnd = direction * ThinIntersection(endToLeft, endToRight, endAhead);
DrawLine(cb, LineThicknessForThin, x, yStart + dStart, x, yEnd + dEnd);
}
else
{
float dStart = -direction * ThickIntersection(startToLeft, startToRight, startAhead);
float dEnd = direction * ThickIntersection(endToLeft, endToRight, endAhead);
DrawLine(cb, LineThicknessForThick, x, yStart + dStart, x, yEnd + dEnd);
}
cb.Stroke();
}
}
#endregion
#region Intersection Diagram
/* driving into an intersection on line being drawn, facing the intersection. Each intersection requires
* drawing of each of the four cases:
Case 1: Line being drawn right:
lineToLeft
^
|
Line Being Drawn ----->|---> LineAhead
|
v
lineToRight
Case 2: Line being drawn left:
lineToRight
^
|
LineAhead <-----|<--- Line Being Drawn
|
v
lineToLeft
Case 3: Line being drawn up:
lineAhead
^
|
lineToLeft <-----|----> lineToRight
^
|
|
Line Being Drawn
Case 4: Line being drawn down:
Line Begin Drawn
|
|
v
lineToRight <-----|----> lineToLeft
|
|
v
lineAhead
*
*/
#endregion
#region Border Intersection Methods
private static float DoubleIntersectionLeft(GridLinePattern lineToLeft, GridLinePattern lineToRight, GridLinePattern lineAhead)
{
if (lineToLeft == GridLinePattern.Double)
return -DoubleLineOffset;
if (lineToRight == GridLinePattern.Double || lineAhead == GridLinePattern.Double)
return DoubleLineOffset;
if (lineToLeft == GridLinePattern.Thick || lineToRight == GridLinePattern.Thick)
return DoubleUnderThick;
if (VlnBorders.LineWidth(lineToLeft) == 1 || VlnBorders.LineWidth(lineToRight) == 1)
return DoubleUnderThin;
return 0;
}
private static float DoubleIntersectionRight(GridLinePattern lineToLeft, GridLinePattern lineToRight, GridLinePattern lineAhead)
{
if (lineToRight == GridLinePattern.Double)
return -DoubleLineOffset;
if (lineToLeft == GridLinePattern.Double || lineAhead == GridLinePattern.Double)
return DoubleLineOffset;
if (lineToLeft == GridLinePattern.Thick || lineToRight == GridLinePattern.Thick)
return DoubleUnderThick;
if (VlnBorders.LineWidth(lineToLeft) == 1 || VlnBorders.LineWidth(lineToRight) == 1)
return DoubleUnderThin;
return 0;
}
private static float ThinIntersection(GridLinePattern lineToLeft, GridLinePattern lineToRight, GridLinePattern lineAhead)
{
if (lineToLeft == GridLinePattern.Double && lineToRight == GridLinePattern.Double)
return -ThinUnderDouble;
if (lineToLeft == GridLinePattern.Double || lineToRight == GridLinePattern.Double)
{
if (lineAhead == GridLinePattern.Double) return -ThinUnderDouble;
return ThinOverDouble;
}
if (lineToLeft == GridLinePattern.Thick || lineToRight == GridLinePattern.Thick)
return ThinOverThick;
return 0;
}
private static float ThickIntersection(GridLinePattern lineToLeft, GridLinePattern lineToRight, GridLinePattern lineAhead)
{
if (lineToLeft == GridLinePattern.Double && lineToRight == GridLinePattern.Double)
{
if (lineAhead == GridLinePattern.Thick) return ThickOverDouble;
return -ThickUnderDouble;
}
if ( lineToLeft == GridLinePattern.Double || lineToRight == GridLinePattern.Double)
{
if (lineAhead == GridLinePattern.Double)
{
if (lineToLeft == GridLinePattern.Thick || lineToRight == GridLinePattern.Thick)
return ThickOverDouble;
return -ThickUnderDouble;
}
return ThickOverDouble;
}
if (VlnBorders.LineWidth(lineToLeft) == 1 && VlnBorders.LineWidth(lineToRight) == 1)
return ThickOverThin;
return 0;
}
#endregion
#region Basic Border Methods
private static void DrawLine(PdfContentByte cb, float lineThickness, float xStart, float yStart, float xEnd, float yEnd)
{
cb.SetLineWidth(lineThickness);
cb.MoveTo(xStart, yStart);
cb.LineTo(xEnd, yEnd);
}
private static void SetLinePattern(PdfContentByte cb, GridLinePattern linePattern)
{
if (linePattern == GridLinePattern.Dotted)
{
cb.SetLineDash(0, 2, 0);
cb.SetLineCap(PdfContentByte.LINE_CAP_ROUND);
}
else if (linePattern == GridLinePattern.Dashed)
cb.SetLineDash(4, 4, 0);
}
private static void SetLineColor(PdfContentByte cb, int row, int col, string side)
{
iTextSharp.text.Color lineColor = new iTextSharp.text.Color(PrintOverride.OverrideTextColor(System.Drawing.Color.Black));
//switch (side)
//{
// case "Top":
// if (col == 0) lineColor = new iTextSharp.text.Color(PrintOverride.OverrideTextColor(System.Drawing.Color.Blue));
// else lineColor = new iTextSharp.text.Color(PrintOverride.OverrideTextColor(System.Drawing.Color.Cyan));
// break;
// case "Left":
// if (row == 0) lineColor = new iTextSharp.text.Color(PrintOverride.OverrideTextColor(System.Drawing.Color.Red));
// else lineColor = new iTextSharp.text.Color(PrintOverride.OverrideTextColor(System.Drawing.Color.Magenta));
// break;
// case "Bottom":
// if (col == 0) lineColor = new iTextSharp.text.Color(PrintOverride.OverrideTextColor(System.Drawing.Color.Green));
// else lineColor = new iTextSharp.text.Color(PrintOverride.OverrideTextColor(System.Drawing.Color.Cyan));
// break;
// case "Right":
// if (row == 0) lineColor = new iTextSharp.text.Color(PrintOverride.OverrideTextColor(System.Drawing.Color.Orange));
// else lineColor = new iTextSharp.text.Color(PrintOverride.OverrideTextColor(System.Drawing.Color.Magenta));
// break;
//}
cb.SetColorStroke(lineColor);
}
private static void InitializeLineStyle(PdfContentByte cb)
{
cb.SetLineCap(PdfContentByte.LINE_CAP_PROJECTING_SQUARE); // Extend the line by half of it's thickness
cb.SetLineDash(0);// Solid Line
}
#endregion
#region Debug Methods
private static void SetOpacity(PdfContentByte cb, float opacity)
{
PdfGState gs = new PdfGState();
gs.StrokeOpacity = opacity;
cb.SetGState(gs);
}
private static void ZoomToCell(iTextSharp.text.pdf.ColumnText myColumnText, float xLeft, float yTop, float xRight, float yBottom)
{
PdfDestination dest = new PdfDestination(PdfDestination.FITR, xLeft - 4, yBottom , xRight, yTop + 4);
myColumnText.Canvas.SetAction(PdfAction.GotoLocalPage(myColumnText.Canvas.PdfWriter.CurrentPageNumber, dest, myColumnText.Canvas.PdfWriter), xLeft, yBottom, xRight, yTop);
}
#endregion
#region Old Border Methods
//private void DrawLeftLine(PdfContentByte cb, float xLeft, float yTop, float yBottom)
//{
// if (c1 == 0 && LineLeft != GridLinePattern.None)
// {
// InitializeLineStyle(cb);
// SetLineColor(cb, r1, c1, "Left");
// if (LineLeft == GridLinePattern.Double)
// {
// //Left Line
// float dyTop = DoubleIntersectionLeft(LineTopLeft, LineTop, LineLeftAbove);
// float dyBottom = -DoubleIntersectionRight(LineBottom, LineBottomLeft, LineLeftBelow);
// DrawLine(cb, LineThicknessForDouble, xLeft - DoubleLineOffset, yTop + dyTop, xLeft - DoubleLineOffset, yBottom + dyBottom);
// //Right Line
// dyTop = DoubleIntersectionRight(LineTopLeft, LineTop, LineLeftAbove);
// dyBottom = -DoubleIntersectionLeft(LineBottom, LineBottomLeft, LineLeftBelow);
// DrawLine(cb, LineThicknessForDouble, xLeft + DoubleLineOffset, yTop + dyTop, xLeft + DoubleLineOffset, yBottom + dyBottom);
// }
// else if (LineLeft != GridLinePattern.Thick)
// {
// SetLinePattern(cb, LineLeft);
// float dyTop = ThinIntersection(LineTopLeft, LineTop, LineLeftAbove);
// float dyBottom = -ThinIntersection(LineBottom, LineBottomLeft, LineLeftBelow);
// DrawLine(cb, LineThicknessForThin, xLeft, yTop + dyTop, xLeft, yBottom + dyBottom);
// }
// else
// {
// float dyTop = ThickIntersection(LineTopLeft, LineTop, LineLeftAbove);
// float dyBottom = -ThickIntersection(LineBottom, LineBottomLeft, LineLeftBelow);
// DrawLine(cb, LineThicknessForThick, xLeft, yTop + dyTop, xLeft, yBottom + dyBottom);
// }
// cb.Stroke();
// }
//}
//private void DrawRightLine(PdfContentByte cb, float xRight, float yTop, float yBottom)
//{
// if (LineRight != GridLinePattern.None)
// {
// InitializeLineStyle(cb);
// SetLineColor(cb, r1, c1, "Right");
// if (LineRight == GridLinePattern.Double)
// {
// //Left Line
// float dyTop = DoubleIntersectionLeft(LineTop, LineTopRight, LineRightAbove);
// float dyBottom = -DoubleIntersectionRight(LineBottomRight, LineBottom, LineRightBelow);
// DrawLine(cb, LineThicknessForDouble, xRight - DoubleLineOffset, yTop + dyTop, xRight - DoubleLineOffset, yBottom + dyBottom);
// //Right Line
// dyTop = DoubleIntersectionRight(LineTop, LineTopRight, LineRightAbove);
// dyBottom = -DoubleIntersectionLeft(LineBottomRight, LineBottom, LineRightBelow);
// DrawLine(cb, LineThicknessForDouble, xRight + DoubleLineOffset, yTop + dyTop, xRight + DoubleLineOffset, yBottom + dyBottom);
// }
// else if (LineRight != GridLinePattern.Thick)
// {
// float dyTop = ThinIntersection(LineTop, LineTopRight, LineRightAbove);
// float dyBottom = -ThinIntersection(LineBottomRight, LineBottom, LineRightBelow);
// SetLinePattern(cb, LineRight);
// DrawLine(cb, LineThicknessForThin, xRight, yTop + dyTop, xRight, yBottom + dyBottom);
// }
// else
// {
// float dyTop = ThickIntersection(LineTop, LineTopRight, LineRightAbove);
// float dyBottom = -ThickIntersection(LineBottomRight, LineBottom, LineRightBelow);
// DrawLine(cb, LineThicknessForThick, xRight, yTop + dyTop, xRight, yBottom + dyBottom);
// }
// cb.Stroke();
// }
//}
//private void DrawTopLine(PdfContentByte cb, float xLeft, float xRight, float yTop)
//{
// if (r1 == 0 && TopSide != GridLinePattern.None)
// {
// InitializeLineStyle(cb);
// SetLineColor(cb, r1, c1, "Top");
// if (TopSide == GridLinePattern.Double)
// {
// // Top Line
// float dxLeft = -DoubleIntersectionRight(LeftSide, AboveLeftSide, LeftOfTopSide);
// float dxRight = DoubleIntersectionLeft(AboveRightSide, RightSide, RightOfTopSide);
// DrawLine(cb, LineThicknessForDouble, xLeft + dxLeft, yTop + DoubleLineOffset, xRight + dxRight, yTop + DoubleLineOffset);
// // Bottom Line
// dxLeft = -DoubleIntersectionLeft(LeftSide, AboveLeftSide, LeftOfTopSide);
// dxRight = DoubleIntersectionRight(AboveRightSide, RightSide, RightOfTopSide);
// DrawLine(cb, LineThicknessForDouble, xLeft + dxLeft, yTop - DoubleLineOffset, xRight + dxRight, yTop - DoubleLineOffset);
// }
// else if (TopSide != GridLinePattern.Thick)
// {
// SetLinePattern(cb, TopSide);
// float dxLeft = -ThinIntersection(LeftSide, AboveLeftSide, LeftOfTopSide);
// float dxRight = ThinIntersection(AboveRightSide, RightSide, RightOfTopSide);
// DrawLine(cb, LineThicknessForThin, xLeft + dxLeft, yTop, xRight + dxRight, yTop);
// }
// else
// {
// float dxLeft = -ThickIntersection(LeftSide, AboveLeftSide, LeftOfTopSide);
// float dxRight = ThickIntersection(AboveRightSide, RightSide, RightOfTopSide);
// if (c1 == 0)
// Console.WriteLine("'{0}','{1}','{2}',{3},{4}", LeftSide, AboveLeftSide, LeftOfTopSide, dxLeft, ThickOverThin);
// DrawLine(cb, LineThicknessForThick, xLeft + dxLeft, yTop, xRight + dxRight, yTop);
// }
// cb.Stroke();
// }
//}
//private void DrawBottomLine(PdfContentByte cb, float xLeft, float xRight, float yBottom)
//{
// if (BottomSide != GridLinePattern.None)
// {
// InitializeLineStyle(cb);
// SetLineColor(cb, r1, c1, "Bottom");
// if (BottomSide == GridLinePattern.Double)
// {
// // Top Line
// float dxLeft = -DoubleIntersectionRight(BelowLeftSide, LeftSide, LeftOfBottomSide);
// float dxRight = DoubleIntersectionLeft(RightSide, BelowRightSide, RightOfBottomSide);
// DrawLine(cb, LineThicknessForDouble, xLeft + dxLeft, yBottom + DoubleLineOffset, xRight + dxRight, yBottom + DoubleLineOffset);// Top Line
// // Bottom Line
// dxLeft = -DoubleIntersectionLeft(BelowLeftSide, LeftSide, LeftOfBottomSide);
// dxRight = DoubleIntersectionRight(RightSide, BelowRightSide, RightOfBottomSide);
// DrawLine(cb, LineThicknessForDouble, xLeft + dxLeft, yBottom - DoubleLineOffset, xRight + dxRight, yBottom - DoubleLineOffset);//Bottom Line
// }
// else if (BottomSide != GridLinePattern.Thick) // Bottom line is thin. Determine if intersecting with double:
// {
// SetLinePattern(cb, BottomSide);
// float dxLeft = -ThinIntersection(BelowLeftSide, LeftSide, LeftOfBottomSide);
// float dxRight = ThinIntersection(RightSide, BelowRightSide, RightOfBottomSide);
// DrawLine(cb, LineThicknessForThin, xLeft + dxLeft, yBottom, xRight + dxRight, yBottom);
// }
// else
// {
// float dxLeft = -ThickIntersection(BelowLeftSide, LeftSide, LeftOfBottomSide);
// float dxRight = ThickIntersection(RightSide, BelowRightSide, RightOfBottomSide);
// DrawLine(cb, LineThicknessForThick, xLeft + dxLeft, yBottom, xRight + dxRight, yBottom);
// }
// cb.Stroke();
// }
//}
#endregion
}
}