1398 lines
51 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using VEPROMS.CSLA.Library;
using iTextSharp.text.pdf;
using iTextSharp.text;
using System.IO;
using System.Text.RegularExpressions;
namespace Volian.Print.Library
{
public class PDFReport
{
public enum ReportType
{
SearchResults = 0,
LibraryDocUsage = 1,
ReferencedObjectsUsage = 2,
TransitionUsage = 3,
ReferencedObjectSummary = 4,
ReferencedObjectComplete = 5
}
private PdfWriter _MyPdfWriter;
private ICollection<ItemInfo> _ResultList;
public ICollection<ItemInfo> ResultList
{
get { return _ResultList; }
set { _ResultList = value; }
}
private string _FileName;
public string FileName
{
get { return _FileName; }
set { _FileName = value; }
}
private string _ReportTitle;
public string ReportTitle
{
get { return _ReportTitle; }
set { _ReportTitle = value; }
}
private string _TypesSelected;
public string TypesSelected
{
get { return _TypesSelected; }
set { _TypesSelected = value; }
}
private bool _ShowAnnotations = true;
public bool ShowAnnotations
{
get { return _ShowAnnotations; }
set { _ShowAnnotations = value; }
}
private string _SearchString;
public string SearchString
{
get { return _SearchString; }
set { _SearchString = VEPROMS.CSLA.Library.ItemInfo.ConvertToDisplayText(value); }
}
private DocumentInfoList _LibDocList;
public DocumentInfoList LibDocList
{
get { return _LibDocList; }
set { _LibDocList = value; }
}
private int _ReportType = 0;
private string _ByLine;
private bool _SortUsageByProcedure = false;
private string _RODataFile = "";
private List<string> _ROList;
private ROFSTLookup _ROFSTLookup;
private bool _IncludeMissingROs = false;
private bool _ConvertCaretToDelta = true;
private bool _IncludeEmptyROFields = false;
// Search Results Report
public PDFReport(string reportTitle, string typesSelected, ICollection<ItemInfo> resultList, string fileName)
{
_ResultList = resultList;
_FileName = fileName;
_ReportTitle = VEPROMS.CSLA.Library.ItemInfo.ConvertToDisplayText(reportTitle);
_TypesSelected = VEPROMS.CSLA.Library.ItemInfo.ConvertToDisplayText(typesSelected);
_ReportType = (int)ReportType.SearchResults;
_ByLine = "PROMS Search Results";
}
// Library Document Report
public PDFReport(string reportTitle, DocumentInfoList libDocList, string fileName)
{
_LibDocList = libDocList;
_FileName = fileName;
_ReportTitle = VEPROMS.CSLA.Library.ItemInfo.ConvertToDisplayText(reportTitle);
_ReportType = (int)ReportType.LibraryDocUsage;
_ByLine = "Generated By PROMS";
}
// RO Usage
public PDFReport(string reportTitle, ICollection<ItemInfo> resultList, string fileName, bool sortUsageByProcedure, bool includeMissingROs)
{
_ResultList = resultList;
_FileName = fileName;
_ReportTitle = VEPROMS.CSLA.Library.ItemInfo.ConvertToDisplayText(reportTitle);
_ReportType = (int)ReportType.ReferencedObjectsUsage;
_ByLine = "Generated By PROMS";
_SortUsageByProcedure = sortUsageByProcedure;
_IncludeMissingROs = includeMissingROs;
}
// RO Complete RO Report
public PDFReport(string reportTitle, string roDataFile, string outfile, ROFSTLookup fstlookup, bool completeReport, bool convertCaretToDelta, bool includeEmptyROFields)
{
_FileName = outfile;
_ReportTitle = reportTitle;
_ReportType = (int)ReportType.ReferencedObjectComplete;
_ByLine = "Complete Referenced Objects Report";
_RODataFile = roDataFile;
_ConvertCaretToDelta = convertCaretToDelta;
_ROFSTLookup = fstlookup;
_IncludeEmptyROFields = includeEmptyROFields;
}
// RO Summary Report
public PDFReport(string reportTitle, string outfile, ROFSTLookup fstlookup, List<string> roList)
{
_FileName = outfile;
_ReportTitle = reportTitle;
_ReportType = (int)ReportType.ReferencedObjectSummary;
_ByLine = "RO Summary Report";
_ROFSTLookup = fstlookup;
_ROList = roList;
}
private string AddGroup(PdfPTable datatable, string dvPath, string lastDvPath, Font f2, bool StripLast, Color bgColor, bool skipFirst)
{
int level = 0;
string retval = "";
StringBuilder sb = new StringBuilder();
string ttt = dvPath.Replace("\x11", " ");
string[] OldPath = lastDvPath.Split("\x7".ToCharArray());
string[] NewPath = dvPath.Split("\x7".ToCharArray());
string sep = "";
bool foundMisMatch = false;
int n = NewPath.Length;
int jstart = (skipFirst) ? 1 : 0;
if (StripLast)
{
retval = NewPath[--n];
if (retval.Contains("\x11"))
retval = retval.Substring(0, retval.IndexOf("\x11")); // this is the step number
}
for (int j = jstart; j < n; j++)
{
if (NewPath[j] != "" && (foundMisMatch || OldPath.Length < j + 1 || NewPath[j] != OldPath[j]))
{
sb.Append(sep + "".PadLeft(2 * level) + NewPath[j].Replace("\x11", " ")).Replace(@"\u8209?", "-");
sep = "\r\n";
foundMisMatch = true;
}
level++;
}
if (sb.ToString() != "")
{
PdfPCell cell = new PdfPCell(new Phrase(sb.ToString(), f2));
cell.Colspan = 2;
cell.BackgroundColor = bgColor;
cell.BorderWidthTop = 1;
datatable.AddCell(cell);
}
return retval;
}
private void AddProcedureSectionGroup(PdfPTable datatable, string curProc, string lastProc, string curSect, string lastSect, Font f2, Color bgColor)
{
string headerText = "";
if (curProc != lastProc)
headerText = curProc + "\r\n";
if (curSect != lastSect)
headerText += " " + curSect;
if (headerText.Length > 0)
{
headerText = headerText.Replace(@"\u8209?", "-");// repace unicode with dash char
headerText = headerText.Replace(@"\u160?", " "); // replace Hard Space with normal Space
PdfPCell cell = new PdfPCell(new Phrase(headerText, f2));
cell.Colspan = 2;
cell.BackgroundColor = bgColor;
cell.BorderWidthTop = 1;
datatable.AddCell(cell);
}
}
private string GetCurProcNum(string path)
{
string[] NewPath = path.Split("\x7".ToCharArray());
string pnumtitle = NewPath[1];
pnumtitle = pnumtitle.Replace('\x11', ' ');
return pnumtitle;
}
private string GetCurSectionNumTitle(ItemInfo itm)
{
string rtnstr = "";
rtnstr = itm.ActiveSection.DisplayNumber;
if (rtnstr.Length > 0) rtnstr += " ";
rtnstr += itm.ActiveSection.DisplayText;
return rtnstr; // srting containing section and subsection number/titles
}
//private string GetStepNumberFromSearchPath(string path)
//{
// string[] NewPath = path.Split("\x7".ToCharArray());
// int idx = NewPath.Length - 1;
// string retval = NewPath[idx];
// if (retval.Contains("\x11"))
// retval = retval.Substring(0, retval.IndexOf("\x11")); // this is the step number
// return retval;
//}
private int FindSpitLevel()
{
int level = 0;
bool foundMisMatch = false;
string lastPath = "";
foreach (string p in ProcSetList)
{
string[] NewPath = p.Split("\x7".ToCharArray());
if (lastPath != "")
{
string[] OldPath = lastPath.Split("\x7".ToCharArray());
int n = NewPath.Length;
int lvl = 0;
foundMisMatch = false;
for (int j = 0; j < n && !foundMisMatch; j++)
{
if (NewPath[j] != "" && (OldPath.Length < j + 1 || NewPath[j] != OldPath[j]))
foundMisMatch = true;
lvl++;
}
if (level == 0) level = lvl;
if (foundMisMatch)
level = Math.Min(level, lvl);
}
lastPath = p;
if (ProcSetList.Count == 1)
level = NewPath.Length - 1;
}
//if (level > 0) level--;
return level;
}
public void AddMainPathGroup(PdfPTable datatable, string dvPath, int splitLevel, Font f2, Color bgColor, int colSpan)
{
int level = 0;
StringBuilder sb = new StringBuilder();
string[] NewPath = dvPath.Split("\x7".ToCharArray());
string sep = "";
int n = NewPath.Length;
for (int j = 1; j < n && j < splitLevel; j++)
{
sb.Append(sep + "".PadLeft(2 * level) + NewPath[j].Replace("\x11", " ")).Replace(@"\u8209?", "-");
sep = "\r\n";
level++;
}
if (sb.ToString() != "")
{
PdfPCell cell = new PdfPCell(new Phrase(sb.ToString(), f2));
cell.Colspan = colSpan;
cell.BackgroundColor = bgColor;
cell.BorderWidthTop = 1;
datatable.AddCell(cell);
}
}
public void AddSubPathGroup(PdfPTable datatable, string dvPath, int splitLevel, Font f2, Color bgColor, int colSpan)
{
int level = 0;
StringBuilder sb = new StringBuilder();
string[] NewPath = dvPath.Split("\x7".ToCharArray());
string sep = "";
int n = NewPath.Length;
if (splitLevel < n)
{
for (int j = splitLevel; j < n; j++)
{
sb.Append(sep + "".PadLeft(2 * level) + NewPath[j].Replace("\x11", " ")).Replace(@"\u8209?", "-");
sep = "\r\n";
level++;
}
if (sb.ToString() != "")
{
PdfPCell cell = new PdfPCell(new Phrase(sb.ToString(), f2));
cell.Colspan = colSpan;
cell.BackgroundColor = bgColor;
cell.BorderWidthTop = 1;
datatable.AddCell(cell);
}
}
}
public void Build()
{
iTextSharp.text.Document document = new iTextSharp.text.Document(PageSize.LETTER, 36, 36, 36, 36);
if (!CreateResultsPDF(document)) return;
try
{
switch (_ReportType) // set in the PDFReport constructor
{
case (int)ReportType.SearchResults:
BuildSearchResultsTable(document);
break;
case (int)ReportType.LibraryDocUsage:
BuildLibDocUsageReport(document);
break;
case (int)ReportType.ReferencedObjectsUsage:
if (_SortUsageByProcedure)
BuildROUsageTableByProcedure(document);
else
BuildROUsageTableByRO(document);
break;
case (int)ReportType.ReferencedObjectComplete:
BuildCompleteROReport(document);
break;
case (int)ReportType.ReferencedObjectSummary:
BuildROSummaryReport(document);
break;
}
}
catch (Exception ex)
{
StringBuilder msg = new StringBuilder();
document.Add(new Paragraph("Error:"));
while (ex != null)
{
document.Add(new Paragraph(ex.GetType().Name));
document.Add(new Paragraph(ex.Message));
ex = ex.InnerException;
}
}
finally
{
if (document.IsOpen())
{
document.Close();
System.Diagnostics.Process.Start(_FileName);
}
}
}
/// <summary>
/// Attempt to open a file for the PDF output.
/// If the file cannot be opened because it is in use, try adding a suffix
/// If the file cannot be opened for some other reason, display an error message
/// </summary>
/// <param name="document"></param>
/// <returns></returns>
private bool CreateResultsPDF(iTextSharp.text.Document document)
{
bool result = false;
string suffix = "";
int i = 0;
// Try to open a file for creating the PDF.
while (result == false)
{
string fileName = _FileName.ToLower().Replace(".pdf", suffix + ".pdf");
try
{
_MyPdfWriter = PdfWriter.GetInstance(document, new FileStream(fileName, FileMode.Create));
_MyPdfWriter.PageEvent = new MyPageHelper(_ByLine); // JSJ - 7/8/2011
document.SetMargins(36, 36, 36, 36);
document.Open();
_FileName = fileName;
result = true;
}
catch (System.IO.IOException exIO)
{
if (exIO.Message.Contains("because it is being used by another process"))
suffix = string.Format("_{0}", ++i);// If this file is in use, increment the suffix and try again
else // If some other error, display a message and don't print the results
{
ShowException(exIO);
return false;
}
}
catch (Exception ex)
{
ShowException(ex);
return false; // Could not open the output file
}
}
return true;
}
private static void ShowException(Exception ex)
{
Console.WriteLine("{0} - {1}", ex.GetType().Name, ex.Message);
StringBuilder msg = new StringBuilder();
string sep = "";
string indent = "";
while (ex != null)
{
msg.Append(string.Format("{0}{1}{2}:\r\n{1}{3}", sep, indent, ex.GetType().Name, ex.Message));
ex = ex.InnerException;
sep = "\r\n";
indent += " ";
}
System.Windows.Forms.MessageBox.Show(msg.ToString(), "Error during PDF creation for search:", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation);
}
/// <summary>
/// Use Cells within Cells to see if I can limit the way Cells break from Page to Page
/// </summary>
/// <param name="document"></param>
private void BuildSearchResultsTable(iTextSharp.text.Document document)
{
float[] headerwidths = { 20, 80 };
PdfPTable datatable = new PdfPTable(1);
PdfPTable colHeader = new PdfPTable(headerwidths);
//datatable.FooterRows = 1;
datatable.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin;
datatable.LockedWidth = true;
iTextSharp.text.Font f1 = pdf.GetFont("Arial Unicode MS", 14, 1, Color.BLACK);
iTextSharp.text.Font f2 = pdf.GetFont("Arial Unicode MS", 10, 0, Color.BLACK);
iTextSharp.text.Font f3 = pdf.GetFont("Arial Unicode MS", 12, 0, Color.BLACK);
PdfPCell cell = new PdfPCell(new Phrase(ReportTitle, f1));
cell.HorizontalAlignment = Element.ALIGN_CENTER;
cell.BackgroundColor = new Color(0xD0, 0xF0, 0xF0);
datatable.AddCell(cell);
cell = new PdfPCell(new Phrase(TypesSelected, f3));
cell.HorizontalAlignment = Element.ALIGN_LEFT;
cell.BackgroundColor = new Color(0xD0, 0xF0, 0xF0);
datatable.AddCell(cell);
BuildSearchResultsProcSetList();
datatable.HeaderRows = 3 + (ProcSetList.Count == 1 ? 1 : 0);
int splitAt = FindSpitLevel(); // find the split level of the common path - for all procedure sets that use these library documents
Color subHeaderColor = new Color(0xD0, 0xF0, 0xD0);
datatable.DefaultCell.Padding = 4;
datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER;
AddCell(colHeader, "Step", f2, subHeaderColor);
AddCell(colHeader, "Text", f2, subHeaderColor);
//datatable.AddCell(colHeader);
// This puts "Step" and "Text" column headers at the bottom of the page
//AddCell(datatable, "Step", f2, subHeaderColor);
//AddCell(datatable, "Text", f2, subHeaderColor);
datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_LEFT;
string lastPath = "";
Color AnnoColor = new Color(0xFF, 0xFF, 0xC0);
Color TextColor = Color.WHITE;
Color SectColor = new Color(0xE0, 0xFF, 0xE0);//new Color(0xC0, 0xFF, 0xC0);//Color.LIGHT_GRAY;
PdfPTable subTable = new PdfPTable(headerwidths);
string lastProcNum = "";
string lastDVPath = "";
foreach (ItemInfo item in _ResultList)
{
if (lastDVPath != item.SearchDVPath)
{
datatable.AddCell(subTable);
subTable = new PdfPTable(headerwidths);
AddMainPathGroup(datatable, item.SearchDVPath, splitAt, f2, Color.LIGHT_GRAY, 0);
datatable.AddCell(colHeader);
lastProcNum = "";
}
lastDVPath = item.SearchDVPath;
string curProcNum = GetCurProcNum(item.SearchPath);
if (lastProcNum != "" && curProcNum != lastProcNum)
{
datatable.AddCell(subTable);
subTable = new PdfPTable(headerwidths);
}
lastProcNum = curProcNum;
string stepPath = AddGroup(subTable, item.SearchPath ?? item.ShortPath, lastPath, f2, true, new Color(0xC0, 0xFF, 0xC0), true);
lastPath = item.SearchPath ?? item.ShortPath;
stepPath = BuildStepTab(item);
AddCell(subTable, stepPath, f2, (item.IsSection ? SectColor : TextColor));
// This was for the old 16-bit style of table - jsj 7/7/2011
//if (item.DisplayText.Contains("|")) // Need a better way to determine if it is a table.
// AddCell(datatable, item.DisplayText, f3, TextColor);
//else
//AddCell(datatable, item.DisplayText, f2, (item.IsSection ? SectColor : TextColor));
AddCell(subTable, item.DisplayText, f2, (item.IsSection ? SectColor : TextColor));
if (item.ItemAnnotationCount > 0)
{
foreach (AnnotationInfo ai in item.ItemAnnotations)
{
AddCell(subTable, ai.MyAnnotationType.Name, f2, AnnoColor);
AddCell(subTable, ai.SearchText, f2, AnnoColor);
}
}
}
datatable.AddCell(subTable);
document.Add(datatable);
}
private void AddCell(PdfPTable datatable, string str, iTextSharp.text.Font fnt, Color bgColor)
{
iTextSharp.text.Font fntBold = new Font(fnt.BaseFont, fnt.Size, Font.BOLD, Color.RED);
Phrase p = BuildPhrase2(str, fnt, fntBold);
PdfPCell cell = new PdfPCell(p);
cell.PaddingBottom = 4;
cell.BackgroundColor = bgColor;
datatable.AddCell(cell);
}
private void AddColSpanCell(PdfPTable datatable, string str, iTextSharp.text.Font fnt, Color bgColor, int span, int txtAlign)
{
iTextSharp.text.Font fntBold = new Font(fnt.BaseFont, fnt.Size, Font.BOLD, Color.RED);
Phrase p = BuildPhrase2(str, fnt, fntBold);
PdfPCell cell = new PdfPCell(p);
cell.PaddingBottom = 4;
cell.BackgroundColor = bgColor;
cell.Colspan = span;
cell.HorizontalAlignment = txtAlign;
datatable.AddCell(cell);
}
private Phrase BuildPhrase(string str, Font fnt, Font fntBold)
{
Phrase p = new Phrase();
if (_SearchString != null)
{
while (str.ToLower().Contains(_SearchString.ToLower()))
{
int iStart = str.ToLower().IndexOf(_SearchString.ToLower());
if (iStart > 0) p.Add(new Phrase(str.Substring(0, iStart), fnt));
Phrase p2 = new Phrase(str.Substring(iStart, _SearchString.Length), fntBold);
p.Add(p2);
str = str.Substring(iStart + _SearchString.Length);
}
}
if (str.Length > 0) p.Add(new Phrase(str, fnt));
return p;
}
private string _RegexSearchString = null;
private string RegexSearchString
{
get
{
if (_RegexSearchString == null)
{
_RegexSearchString = _SearchString;
// Make it match the smallest matching string
_RegexSearchString = _RegexSearchString.Replace("*", ".*?");
// If search string starts with a wildcard use the beginning of line token (^)
if (_RegexSearchString.StartsWith(".*?"))
_RegexSearchString = "^" + _RegexSearchString;
// If search string ends with a wildcard use the end of line token ($)
if (_RegexSearchString.EndsWith(".*?"))
_RegexSearchString = _RegexSearchString + "$";
_RegexSearchString = _RegexSearchString.Replace("[", @"\[");
_RegexSearchString = _RegexSearchString.Replace("]", @"\]");
}
return _RegexSearchString;
}
}
private Phrase BuildPhrase2(string str, Font fnt, Font fntBold)
{
Phrase p = new Phrase();
int lastIndex = 0;
if ((_SearchString ?? "") != "")
{
Regex reg = new Regex(RegexSearchString, RegexOptions.Multiline | RegexOptions.IgnoreCase);
foreach (Match m in reg.Matches(str))
{
if (m.Index > 0)
p.Add(new Phrase(str.Substring(lastIndex, m.Index - lastIndex), fnt));
Chunk chk = new Chunk(m.Value, fnt);
//Phrase p2 = new Phrase();
//foreach (Chunk chk in p2.Chunks)
chk.SetBackground(Color.YELLOW);
p.Add(chk);
lastIndex = m.Index + m.Length;
}
}
p.Add(new Phrase(str.Substring(lastIndex), fnt));
return p;
}
private void BuildLibDocUsageReport(iTextSharp.text.Document document)
{
float[] headerwidths = { 20, 80 };
PdfPTable datatable = new PdfPTable(1);// (headerwidths);
PdfPTable colheader = new PdfPTable(headerwidths);
datatable.HeaderRows = 3;
datatable.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin;
datatable.LockedWidth = true;
iTextSharp.text.Font f1 = pdf.GetFont("Arial Unicode MS", 14, 1, Color.BLACK);
iTextSharp.text.Font f2 = pdf.GetFont("Arial Unicode MS", 10, 0, Color.BLACK);
iTextSharp.text.Font f3 = pdf.GetFont("Arial Unicode MS", 12, 0, Color.BLACK);
PdfPCell cell = new PdfPCell(new Phrase(ReportTitle, f1));
cell.HorizontalAlignment = Element.ALIGN_CENTER;
//cell.Colspan = 2;
cell.BackgroundColor = new Color(0xD0, 0xF0, 0xF0);
datatable.AddCell(cell);
BuildLibDocProcSetList();
int splitAt = FindSpitLevel(); // find the split level of the common path - for all procedure sets that use these library documents
AddMainPathGroup(datatable, ProcSetList[0].ToString(), splitAt, f2, Color.LIGHT_GRAY, 0);//2);
Color subHeaderColor = new Color(0xD0, 0xF0, 0xD0);
datatable.DefaultCell.Padding = 4;
datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER;
AddCell(colheader, "Procedure", f2, subHeaderColor);
AddCell(colheader, "Section", f2, subHeaderColor);
datatable.AddCell(colheader);
datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_LEFT;
string lastDvPath = "";
Color AnnoBackgroundColor = new Color(0xFF, 0xFF, 0xC0);
Color TextBackgroundColor = Color.WHITE;
Color NotUsedBackgroundColor = Color.WHITE;
foreach (DocumentInfo di in _LibDocList)
{
PdfPTable subtable = new PdfPTable(headerwidths);
subtable.HeaderRows = 0;
AddGroup(subtable, di.DocumentTitle, "", f2, false, new Color(0xC0, 0xFF, 0xC0), false); // Library Document Title
if (di.DocumentConfig.LibDoc_Comment != null && di.DocumentConfig.LibDoc_Comment.Length > 0)
{
AddCell(subtable, "Comment", f2, AnnoBackgroundColor);
AddCell(subtable, di.DocumentConfig.LibDoc_Comment, f2, AnnoBackgroundColor); // lib doc comment
}
if (di.DocumentEntries == null || di.DocumentEntries.Count == 0)
{
AddColSpanCell(subtable, "*No References To This Library Document", f2, NotUsedBackgroundColor, 2, Element.ALIGN_LEFT);
}
else
{
System.Collections.ArrayList LibDocUsageList = GetSortedItemInfoList(di.LibraryDocumentUsageList);
lastDvPath = "";
foreach (ItemInfo item in LibDocUsageList)//di.LibraryDocumentUsageList)
{
string ProcNumber = item.MyProcedure.ProcedureConfig.Number;
ProcNumber = ProcNumber.Replace(@"\u8209?", "-"); // repace unicode with dash char
ProcNumber = ProcNumber.Replace(@"\u160?", " "); // replace Hard Space with normal Space
if (item.SearchDVPath != lastDvPath)
AddSubPathGroup(subtable, item.SearchDVPath, splitAt, f2, Color.LIGHT_GRAY, 2);//new Color(0xC0, 0xFF, 0xC0));
lastDvPath = item.SearchDVPath;
AddCell(subtable, ProcNumber, f2, TextBackgroundColor);
AddCell(subtable, item.MyContent.Number + " - " + item.MyContent.Text, f2, TextBackgroundColor);
}
}
datatable.AddCell(subtable);
}
document.Add(datatable);
}
private void AddROUsages(ItemInfo item, Dictionary<string, List<ItemInfo>> roUse)
{
if (item.FoundROID != null && item.FoundROID != "")
{
string roid = item.FoundROID;
if (roUse.ContainsKey(roid))
((List<ItemInfo>)roUse[roid]).Add(item);
else
{
List<ItemInfo> itmIfoLst = new List<ItemInfo>();
itmIfoLst.Add(item);
roUse.Add(roid, itmIfoLst);
}
}
}
private void PutROusageForProcedure(PdfPTable curTable, Dictionary<string, List<ItemInfo>> rosused, float[] headerwidths)
{
//if (rosused.Count == 0) return; // nothing to process
iTextSharp.text.Font f2 = pdf.GetFont("Arial Unicode MS", 10, 0, Color.BLACK);
foreach (string roKey in rosused.Keys)
{
PdfPTable rotable = new PdfPTable(headerwidths);
string rotitle = "";
foreach (ItemInfo itm in rosused[roKey])
{
if (rotitle == "")
{
rotitle = GetROTitleAndGroup(roKey, itm);
if (rotitle != null && rotitle != "")
{
PdfPCell ROTitleCell = new PdfPCell(new Phrase(rotitle, f2));
ROTitleCell.Colspan = 2;
ROTitleCell.HorizontalAlignment = Element.ALIGN_LEFT;
if (rotitle.StartsWith("Missing RO"))
ROTitleCell.BackgroundColor = Color.PINK;
else
ROTitleCell.BackgroundColor = new Color(0xDC, 0xE7, 0xC9); //new Color(0xD0, 0xF0, 0xD0);//ligt green //new Color(0xC8, 0xC8, 0x91);//(0xAF, 0xD8, 0xD8);//(0xF5, 0xE4, 0xA0);
rotable.AddCell(ROTitleCell); // put RO value and description
}
}
string stepnum = "";
string sectitle = itm.ActiveSection.DisplayText;
if (itm.IsSection)
stepnum = itm.MyActiveSection.DisplayNumber;
else
stepnum = BuildStepTab(itm);//GetStepNumberFromSearchPath(itm.SearchPath);//stepnum.Substring(itm.SearchPath.LastIndexOf(sectitle) + sectitle.Length +1);
AddCell(rotable, stepnum, f2, Color.WHITE);
AddCell(rotable, itm.DisplayText, f2, Color.WHITE);
}
curTable.AddCell(rotable);
}
}
private static string BuildStepTab(ItemInfo item)
{
if (item == null) return "";
string sret = "";
switch (item.MyContent.Type / 10000)
{
case 0: //procedure
sret = ProcedureInfo.Get(item.ItemID).MyTab.CleanText;
break;
case 1: // section
sret = SectionInfo.Get(item.ItemID).MyTab.CleanText;
break;
case 2: // step
ItemInfo pitem = item;
bool hasDelim = item.ActiveFormat.PlantFormat.FormatData.TransData.StepSubstepDelimeter != null;
List<string> DelimList = null;
DelimList = new List<string>();
if (!hasDelim)
{
SeqTabFmtList seqtabs = item.ActiveFormat.PlantFormat.FormatData.SectData.StepSectionData.SeqTabFmtList;
foreach (SeqTabFmt seqtab in seqtabs)
{
string delim = seqtab.PrintTabFormat.Replace("{seq}", "");
if (!DelimList.Contains(delim))
DelimList.Add(delim.Trim());
}
}
else
{
string stpdelms = item.ActiveFormat.PlantFormat.FormatData.TransData.StepSubstepDelimeter;
foreach (char c in stpdelms)
{
if (!DelimList.Contains(c.ToString()))
DelimList.Add(c.ToString());
}
}
while (!pitem.IsHigh)
{
StepInfo stpinfo = StepInfo.Get(pitem.ItemID);
string thisTab = stpinfo.MyTab.CleanText; //StepInfo.Get(pitem.ItemID).MyTab.CleanText;
if (IncludesParentToHLS(stpinfo))
return thisTab;
string typeName = stpinfo.FormatStepData.StepEditData.TypeMenu.MenuItem;//stpinfo.FormatStepData.ToString();
// remove delimiters of '.' and ')' in tab.
if (thisTab != null)
{
// get list of delimiters to remove from the format:
foreach (string rmvDelim in DelimList) thisTab = thisTab.Replace(rmvDelim, "");
}
if (thisTab != null) thisTab = thisTab.Trim();
// if the tab is null or
// if the the tab is not a letter or number OR
// the tab is an AND or OR type and is the letter "o"
// then reset the tab an empty string so that the type name along with the count of that type
// (ex. "AND 2", "OR 3")
if (thisTab == null || (thisTab != "" && (!(char.IsLetterOrDigit(thisTab[0])) || ((pitem.IsAnd || pitem.IsOr || pitem.IsCaution || pitem.IsNote) && thisTab.Contains("o")))))
thisTab = "";
if (pitem.IsRNOPart)
{
if (thisTab == "")
sret = "RNO." + sret; //"RNO." + sret;
else
{
thisTab = thisTab.Trim(" ".ToCharArray());
if (!thisTab.EndsWith(".") && !thisTab.EndsWith(")")) thisTab = thisTab + ".";
sret = "RNO." + thisTab + sret; //"RNO." + thisTab + sret;
}
}
else if (pitem.IsCaution || pitem.IsNote)
{
// add the Caution or Note count to the tab (ex "Caution 1", "Note 2")
if (thisTab == "")
sret = "{" + typeName + " " + pitem.Ordinal.ToString() + "}";
else
{
thisTab = thisTab.Trim(" ".ToCharArray());
sret = thisTab + " " + pitem.Ordinal.ToString() + sret;
}
}
else
{
if (thisTab != "")
{
thisTab = thisTab.Trim(" ".ToCharArray());
if (!thisTab.EndsWith(".") && !thisTab.EndsWith(")")) thisTab = thisTab + ".";
}
else
thisTab = "{" + typeName + " " + pitem.Ordinal.ToString() + "}.";
sret = thisTab + sret;
}
pitem = pitem.ActiveParent as ItemInfo;
if (pitem == null) break;
}
// add hls tab if it's not already in the tab.
if (pitem.IsHigh)
{
StepInfo stpinfo = StepInfo.Get(pitem.ItemID);
string hlsTab = stpinfo.MyTab.CleanTextNoSymbols; //StepInfo.Get(pitem.ItemID).MyTab.CleanTextNoSymbols;
string typeName = stpinfo.FormatStepData.StepEditData.TypeMenu.MenuItem;//stpinfo.FormatStepData.GetPDDisplayName(); //.ToString();
if (hlsTab == null || hlsTab == "")
hlsTab = "{" + typeName + " " + pitem.Ordinal.ToString() + "}.";
else if (!sret.StartsWith(hlsTab.Trim(" ".ToCharArray())))
{
foreach (string rmvDelim in DelimList) hlsTab = hlsTab.Replace(rmvDelim, "");
hlsTab = hlsTab.Trim(" ".ToCharArray());
if (!hlsTab.EndsWith(".") && !hlsTab.EndsWith(")")) hlsTab = hlsTab + ".";
}
sret = hlsTab + sret;
}
break;
}
sret = sret.Trim(" .)".ToCharArray());
return sret;
}
private static bool IncludesParentToHLS(StepInfo stpinfo)
{
if (stpinfo.IsHigh)
return true;
StepInfo parent = StepInfo.Get((stpinfo.ActiveParent as ItemInfo).ItemID);
if (stpinfo.MyTab.CleanText.StartsWith(parent.MyTab.CleanText.Trim()) && stpinfo.MyTab.CleanText.Length > parent.MyTab.CleanText.Length)
return IncludesParentToHLS(parent);
return false;
}
private void BuildROUsageTableByProcedure(iTextSharp.text.Document document)
{
Dictionary<string, List<ItemInfo>> roUse = new Dictionary<string, List<ItemInfo>>();
float[] headerwidths = { 20, 80 };
PdfPTable datatable = new PdfPTable(1);
PdfPTable colHeader = new PdfPTable(headerwidths);
//datatable.FooterRows = 1;
datatable.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin;
datatable.LockedWidth = true;
iTextSharp.text.Font f1 = pdf.GetFont("Arial Unicode MS", 14, 1, Color.BLACK);
iTextSharp.text.Font f2 = pdf.GetFont("Arial Unicode MS", 10, 0, Color.BLACK);
iTextSharp.text.Font f3 = pdf.GetFont("Arial Unicode MS", 12, 0, Color.BLACK);
PdfPCell cell = new PdfPCell(new Phrase(ReportTitle, f1));
cell.HorizontalAlignment = Element.ALIGN_CENTER;
//cell.Colspan = 2;
cell.BackgroundColor = new Color(0xD0, 0xF0, 0xF0); // light blue
datatable.AddCell(cell);
BuildSearchResultsProcSetList();
datatable.HeaderRows = 2;//3 + (ProcSetList.Count == 1 ? 1 : 0);
int splitAt = FindSpitLevel(); // find the split level of the common path - for all procedure sets that use these library documents
Color subHeaderColor = new Color(0xD0, 0xF0, 0xF0); // light blue //new Color(0xD0, 0xF0, 0xD0);//ligt green
datatable.DefaultCell.Padding = 4;
datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER;
// This puts "Step" and "Text" column headers at the bottom of the page
AddCell(colHeader, "Step", f2, subHeaderColor);
AddCell(colHeader, "Text", f2, subHeaderColor);
datatable.AddCell(colHeader);
datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_LEFT;
Color AnnoColor = new Color(0xFF, 0xFF, 0xC0);
Color TextColor = Color.WHITE;
Color SectColor = new Color(0xE0, 0xFF, 0xE0);//new Color(0xC0, 0xFF, 0xC0);//Color.LIGHT_GRAY;
PdfPTable subTable = new PdfPTable(headerwidths);
datatable.AddCell(subTable);
string lastProcNum = "";
string lastSection = "";
string lastDVPath = "";
foreach (ItemInfo item in _ResultList)
{
// Check Doc Version path
if (lastDVPath != item.SearchDVPath)
{
subTable = new PdfPTable(headerwidths);
AddMainPathGroup(datatable, item.SearchDVPath, splitAt, f2, Color.LIGHT_GRAY, 0);
lastProcNum = "";
lastSection = "";
}
lastDVPath = item.SearchDVPath;
//check for different procedure number
string curProcNum = GetCurProcNum(item.SearchPath);
string curSection = GetCurSectionNumTitle(item);
if (lastProcNum != "" && (curProcNum != lastProcNum))
{
if (roUse.Count > 0)
{
PutROusageForProcedure(datatable, roUse, headerwidths);
roUse.Clear();
}
lastSection = "";
}
if (lastSection != "" && (curSection != lastSection))
{
if (roUse.Count > 0)
{
PutROusageForProcedure(datatable, roUse, headerwidths);
roUse.Clear();
}
}
AddROUsages(item, roUse); // add the used ro to the list for this procedure
AddProcedureSectionGroup(datatable, curProcNum, lastProcNum, curSection, lastSection, f2, new Color(0xC0, 0xFF, 0xC0));
lastProcNum = curProcNum;
lastSection = curSection;
}
PutROusageForProcedure(datatable, roUse, headerwidths);
document.Add(datatable);
}
private void AddProcROUse(ItemInfo item, SortedDictionary<string, List<ItemInfo>> procRoUse)
{
string dictKey = GetCurProcNum(item.SearchPath) + " " + GetCurSectionNumTitle(item);
if (dictKey != null && dictKey != "")
{
if (procRoUse.ContainsKey(dictKey))
((List<ItemInfo>)procRoUse[dictKey]).Add(item);
else
{
List<ItemInfo> itmIfoLst = new List<ItemInfo>();
itmIfoLst.Add(item);
procRoUse.Add(dictKey, itmIfoLst);
}
}
}
private void PutStepListForProcedure(PdfPTable rotable, SortedDictionary<string, ItemInfo> sortedStepList)
{
iTextSharp.text.Font f2 = pdf.GetFont("Arial Unicode MS", 10, 0, Color.BLACK);
foreach (ItemInfo itm in sortedStepList.Values)
{
string stepnum = (itm.IsSection)? itm.MyActiveSection.DisplayNumber:stepnum = BuildStepTab(itm);
AddCell(rotable, stepnum, f2, Color.WHITE);
AddCell(rotable, itm.DisplayText, f2, Color.WHITE);
}
sortedStepList.Clear();
}
private void PutROusageForROID(PdfPTable curTable, SortedDictionary<string, List<ItemInfo>> procRoUse, float[] headerwidths, int splitAt , bool moreThanOneProcSet)
{
SortedDictionary<string, ItemInfo> sortedStepList = new SortedDictionary<string, ItemInfo>();
iTextSharp.text.Font f2 = pdf.GetFont("Arial Unicode MS", 10, 0, Color.BLACK);
string lastProcKey = "";
string lastProcNumTitle = "";
string lastDVPath = "";
string curProcNumTitle = "";
foreach (string procKey in procRoUse.Keys)
{
PdfPTable rotable = new PdfPTable(headerwidths);
foreach (ItemInfo itm in procRoUse[procKey])
{
bool didProcSetTitle = false;
// Check Doc Version path
// where we are reporting on more than one procedure set
// output the procedure set title within the RO value grouping on the report
if (moreThanOneProcSet && lastDVPath != itm.SearchDVPath)
{
AddMainPathGroup(curTable, itm.SearchDVPath, splitAt, f2, Color.LIGHT_GRAY, 0);
didProcSetTitle = true;
}
else
didProcSetTitle = false;
lastDVPath = itm.SearchDVPath;
if (didProcSetTitle || procKey != lastProcKey)
{
if (sortedStepList.Count > 0) PutStepListForProcedure(rotable, sortedStepList);
string procNumTitleSect = "";
curProcNumTitle = GetCurProcNum(itm.SearchPath);
if (lastProcNumTitle == "" || lastProcNumTitle != curProcNumTitle)
{
procNumTitleSect = curProcNumTitle + "\r\n";
lastProcNumTitle = curProcNumTitle;
}
procNumTitleSect += " " + GetCurSectionNumTitle(itm);
procNumTitleSect = procNumTitleSect.Replace(@"\u8209?", "-"); // repace unicode with dash char
procNumTitleSect = procNumTitleSect.Replace(@"\u160?", " "); // replace Hard Space with normal Space
PdfPCell ProcTitleCell = new PdfPCell(new Phrase(procNumTitleSect, f2));
ProcTitleCell.Colspan = 2;
ProcTitleCell.HorizontalAlignment = Element.ALIGN_LEFT;
ProcTitleCell.BackgroundColor = new Color(0xDC, 0xE7, 0xC9); //new Color(0xD0, 0xF0, 0xD0);//ligt green //new Color(0xC8, 0xC8, 0x91);//(0xAF, 0xD8, 0xD8);//(0xF5, 0xE4, 0xA0);
rotable.AddCell(ProcTitleCell); // put RO value and description
lastProcKey = procKey;
}
string stepnum = (itm.IsSection)?itm.MyActiveSection.DisplayNumber:BuildStepTab(itm);
string itemkey = stepnum + " " + itm.ItemID.ToString(); // add ItemId to stepnum, sometimes we have idential stepnum text for different steps (ex: blank section numbers)
if (!sortedStepList.ContainsKey(itemkey))
sortedStepList.Add(itemkey, itm);
}
if (sortedStepList.Count > 0) PutStepListForProcedure(rotable, sortedStepList);
curTable.AddCell(rotable);
}
}
//private static string GetROTitleAndGroup(string roid, ItemInfo itm)
private string GetROTitleAndGroup(string roid, ItemInfo itm)
{
string rotitle = "";
ROFSTLookup myrofstlookup = (itm == null)? _ROFSTLookup : itm.MyDocVersion.DocVersionAssociations[0].MyROFst.GetROFSTLookup(itm.MyDocVersion);
List<string> roTitleList = myrofstlookup.GetROTitleAndGroupPath(roid,_IncludeMissingROs,_ConvertCaretToDelta);
if (roTitleList != null && roTitleList.Count > 0)
for (int cnt = 0; cnt < roTitleList.Count; cnt++)
{
if (cnt == roTitleList.Count - 1)
rotitle += roTitleList[cnt];
else
rotitle += roTitleList[cnt] + "\n ";
}
return rotitle;
}
private void AddROHeaderGroup(PdfPTable datatable, string curROID, ItemInfo itm, Font f2, Color bgColor)
{
string headerText = GetROTitleAndGroup(curROID, itm);
if (headerText != null && headerText.Length > 0)
{
PdfPCell cell = new PdfPCell(new Phrase(headerText, f2));
cell.Colspan = 2;
if (headerText.StartsWith("Missing RO"))
cell.BackgroundColor = Color.PINK;
else
cell.BackgroundColor = bgColor;
cell.BorderWidthTop = 1;
datatable.AddCell(cell);
}
}
private void BuildROUsageTableByRO(iTextSharp.text.Document document)
{
SortedDictionary<string, List<ItemInfo>> procRoUse = new SortedDictionary<string, List<ItemInfo>>();
float[] headerwidths = { 20, 80 };
PdfPTable datatable = new PdfPTable(1);
PdfPTable colHeader = new PdfPTable(headerwidths);
//datatable.FooterRows = 1;
datatable.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin;
datatable.LockedWidth = true;
iTextSharp.text.Font f1 = pdf.GetFont("Arial Unicode MS", 14, 1, Color.BLACK);
iTextSharp.text.Font f2 = pdf.GetFont("Arial Unicode MS", 10, 0, Color.BLACK);
iTextSharp.text.Font f3 = pdf.GetFont("Arial Unicode MS", 12, 0, Color.BLACK);
PdfPCell cell = new PdfPCell(new Phrase(ReportTitle, f1));
cell.HorizontalAlignment = Element.ALIGN_CENTER;
cell.BackgroundColor = new Color(0xD0, 0xF0, 0xF0); // light blue
datatable.AddCell(cell);
BuildSearchResultsProcSetList();
datatable.HeaderRows = 2;//3 + (ProcSetList.Count == 1 ? 1 : 0);
int splitAt = FindSpitLevel(); // find the split level of the common path
Color subHeaderColor = new Color(0xD0, 0xF0, 0xF0); // light blue //new Color(0xD0, 0xF0, 0xD0);//ligt green
datatable.DefaultCell.Padding = 4;
datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER;
// This puts "Step" and "Text" column headers at the bottom of the page
AddCell(colHeader, "Step", f2, subHeaderColor);
AddCell(colHeader, "Text", f2, subHeaderColor);
datatable.AddCell(colHeader);
datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_LEFT;
Color AnnoColor = new Color(0xFF, 0xFF, 0xC0);
Color TextColor = Color.WHITE;
Color SectColor = new Color(0xE0, 0xFF, 0xE0);//new Color(0xC0, 0xFF, 0xC0);//Color.LIGHT_GRAY;
PdfPTable subTable = new PdfPTable(headerwidths);
datatable.AddCell(subTable);
string lastDVPath = "";
string lastROID = "";
bool moreThanOneProcSet = false;
bool printedSetTitle = false;
bool printedROHeader = false;
ItemInfo lastItem = null;
if (_ResultList.Count == 0)
{
PdfPCell cell2 = new PdfPCell(new Phrase("Selected RO is not used", f2));
cell2.Colspan = 0;
cell2.BorderWidthTop = 1;
datatable.AddCell(cell2);
document.Add(datatable);
return;
}
foreach (ItemInfo item in _ResultList)
{
bool differentProcSet = false;
bool differentRO = false;
// Check Doc Version path
// if more than one procedure set is in the report data, then
// we will output the procedure set title inside the grouping of each RO
// otherwise, if we are reporting on only one procedure set, print the
// procedure set title at the top of the report (once).
if (lastDVPath != "" && lastDVPath != item.SearchDVPath)
{
moreThanOneProcSet = true;
differentProcSet = true;
}
lastDVPath = item.SearchDVPath;
// Check for different ROID
string curROID = item.FoundROID;
differentRO = lastROID != "" && curROID.Substring(0, 12) != lastROID.Substring(0, 12);
if (procRoUse.Count > 0 && (differentProcSet || differentRO))
{
if (!moreThanOneProcSet && !printedSetTitle)
{
AddMainPathGroup(datatable, lastDVPath, splitAt, f2, Color.LIGHT_GRAY, 0);
printedSetTitle = true;
}
if (!printedROHeader)
{
AddROHeaderGroup(datatable, lastROID, lastItem, f2, new Color(0xC0, 0xFF, 0xC0));
printedROHeader = true;
}
PutROusageForROID(datatable, procRoUse, headerwidths, splitAt, moreThanOneProcSet);
procRoUse.Clear();
differentProcSet = false;
}
if (differentRO)
printedROHeader = false;
AddProcROUse(item, procRoUse);
lastROID = curROID;
lastItem = item;
}
if (!moreThanOneProcSet && !printedSetTitle)
AddMainPathGroup(datatable, lastDVPath, splitAt, f2, Color.LIGHT_GRAY, 0);
if (!printedROHeader)
AddROHeaderGroup(datatable, lastROID, lastItem, f2, new Color(0xC0, 0xFF, 0xC0));
PutROusageForROID(datatable, procRoUse, headerwidths, splitAt, moreThanOneProcSet);
document.Add(datatable);
}
private System.Collections.ArrayList ProcSetList;
private void BuildSearchResultsProcSetList()
{
ProcSetList = new System.Collections.ArrayList();
foreach (ItemInfo item in _ResultList)
{
if (!ProcSetList.Contains(item.SearchDVPath))
ProcSetList.Add(item.SearchDVPath);
}
}
private void BuildLibDocProcSetList()
{
ProcSetList = new System.Collections.ArrayList();
foreach (DocumentInfo di in _LibDocList)
{
if (di.LibraryDocumentUsageList != null && di.LibraryDocumentUsageList.Count > 0)
foreach (ItemInfo item in di.LibraryDocumentUsageList)
{
if (!ProcSetList.Contains(item.SearchDVPath))
ProcSetList.Add(item.SearchDVPath);
}
}
}
private System.Collections.ArrayList GetSortedItemInfoList(ItemInfoList orgIFL)
{
System.Collections.ArrayList libDocProcSetList = new System.Collections.ArrayList();
System.Collections.ArrayList rtnIFL = new System.Collections.ArrayList();
foreach (ItemInfo item in orgIFL)
{
if (!libDocProcSetList.Contains(item.SearchDVPath))
libDocProcSetList.Add(item.SearchDVPath);
}
foreach (string pset in libDocProcSetList)
{
foreach (ItemInfo item in orgIFL)
{
if (item.SearchDVPath.Equals(pset))
rtnIFL.Add(item);
}
}
return rtnIFL;
}
private void BuildCompleteROReport(iTextSharp.text.Document document)
{
CompleteROReport compRORpt = new CompleteROReport(_MyPdfWriter, document,_RODataFile, _ConvertCaretToDelta, _IncludeEmptyROFields);
compRORpt.F10 = pdf.GetFont("Courier New", 10, 0, Color.BLACK);
compRORpt.F10Bold = pdf.GetFont("Courier New", 10, 1, Color.BLACK);
compRORpt.F12 = pdf.GetFont("Courier New", 12, 0, Color.BLACK);
compRORpt.F12Bold = pdf.GetFont("Courier New", 12, 1, Color.BLACK);
compRORpt.F14 = pdf.GetFont("Arial Unicode MS", 14, 1, Color.BLACK);
compRORpt.ROFstID = _ROFSTLookup.MyDocVersionInfo.DocVersionAssociations[0].MyROFst.ROFstID;
compRORpt.Run();
}
private string GetROTitleAndGroupsForSummary(List<string>roTitleList, List<string> prevROTitleList)
{
string rotitle = "";
string indent = "";
for (int icnt = 0; icnt < roTitleList.Count; icnt++)
{
indent += " ";
if (icnt == roTitleList.Count - 1)
{
rotitle += indent + roTitleList[icnt]; // this should be the ro description
break; //break out of for loop
}
if (prevROTitleList == null || (icnt < roTitleList.Count && icnt < prevROTitleList.Count && prevROTitleList[icnt] != roTitleList[icnt]))
{
if (rotitle == "" && prevROTitleList != null)
rotitle = "\n";
rotitle += indent + roTitleList[icnt] + "\n";
}
}
return rotitle;
}
private List<string> AddROHeaderGroupForSummary(PdfPTable datatable, string curROID,List<string> prevROTitleList, Font f2, Color bgColor)
{
List<string> roTitleList = _ROFSTLookup.GetROTitleAndGroupPath(curROID,_IncludeMissingROs,_ConvertCaretToDelta);
string headerText = GetROTitleAndGroupsForSummary(roTitleList, prevROTitleList);
if (headerText.Length > 0)
{
Paragraph pgh = new Paragraph(headerText, f2);
PdfPCell cell = new PdfPCell(pgh);
cell.FollowingIndent = 72;
cell.Colspan = 2;
cell.BorderColor = Color.WHITE;
cell.BackgroundColor = Color.WHITE;
cell.BorderWidthTop = 1;
datatable.AddCell(cell);
}
return roTitleList;
}
public void AddMainRODatabaseTitle(PdfPTable datatable, int dbTitleIndex, Font f2, Color bgColor)
{
string dbTitle = _ROFSTLookup.GetRODatabaseTitle(dbTitleIndex);
PdfPCell cell = new PdfPCell(new Phrase(dbTitle, f2));
cell.BorderColor = Color.WHITE;
cell.Colspan = 2;
cell.BackgroundColor = bgColor;
datatable.AddCell(cell);
return;
}
private void BuildROSummaryReport(iTextSharp.text.Document document)
{
float[] headerwidths = { 10, 20, 80 };
PdfPTable datatable = new PdfPTable(1);
datatable.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin;
datatable.LockedWidth = true;
iTextSharp.text.Font f1 = pdf.GetFont("Arial Unicode MS", 14, 1, Color.BLACK);
iTextSharp.text.Font f2 = pdf.GetFont("Arial Unicode MS", 10, 0, Color.BLACK);
iTextSharp.text.Font f3 = pdf.GetFont("Arial Unicode MS", 12, 1, Color.BLACK);
PdfPCell cell = new PdfPCell(new Phrase(ReportTitle, f1));
cell.HorizontalAlignment = Element.ALIGN_CENTER;
//cell.Colspan = 2;
cell.BackgroundColor = Color.WHITE;//new Color(0xD0, 0xF0, 0xF0); // light blue
cell.BorderColor = Color.WHITE;
datatable.AddCell(cell);
string roFSTDateTime = "RO.FST Last Created: " + _ROFSTLookup.GetRoFSTdts().ToLongDateString() + " @ " + _ROFSTLookup.GetRoFSTdts().ToShortTimeString() + "\n ";
cell = new PdfPCell(new Phrase(roFSTDateTime, f2));
cell.BorderColor = Color.WHITE;
datatable.AddCell(cell);
datatable.HeaderRows = 2;//3 + (ProcSetList.Count == 1 ? 1 : 0);
datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_LEFT;
string lastROID = "";
List<string> prevROTitleList = null;
int lastDBindex = -1;
foreach (string curROID in _ROList)
{
string[] tmp = curROID.TrimEnd(',').Split(':'); //curROID.Split(':');// this is the RO FST id number (for plants with multiple RO FSTs)
string rolst = (tmp.Length == 2)? tmp[1] : tmp[0];
string[] roIdslst = rolst.Split(',');
foreach (string cROID in roIdslst)
{
if (cROID == "") break;
if (cROID.Length == 4)
ProcessROdb(datatable, f2, f3, ref cell, ref lastROID, ref prevROTitleList, ref lastDBindex, cROID);
else
ProcessROID(datatable, f2, f3, ref cell, ref lastROID, ref prevROTitleList, ref lastDBindex, cROID);
}
}
document.Add(datatable);
}
private void ProcessROdb(PdfPTable datatable, iTextSharp.text.Font f2, iTextSharp.text.Font f3, ref PdfPCell cell, ref string lastROID, ref List<string> prevROTitleList, ref int lastDBindex, string cROID)
{
ROFSTLookup.rodbi roDBI = _ROFSTLookup.GetRODatabase(cROID);
foreach (ROFSTLookup.rochild cld in roDBI.children)
ProcessROChild(datatable, f2, f3, ref cell, ref lastROID, ref prevROTitleList, ref lastDBindex, cld);
}
private void ProcessROChild(PdfPTable datatable, iTextSharp.text.Font f2, iTextSharp.text.Font f3, ref PdfPCell cell, ref string lastROID, ref List<string> prevROTitleList, ref int lastDBindex,ROFSTLookup.rochild cld)
{
if (cld.children == null) // leaf node
ProcessROID(datatable, f2, f3, ref cell, ref lastROID, ref prevROTitleList, ref lastDBindex, cld.roid);
else if (cld.children[0].ParentID == 0) // multiple return value
ProcessROID(datatable, f2, f3, ref cell, ref lastROID, ref prevROTitleList, ref lastDBindex, cld.roid);
else
foreach (ROFSTLookup.rochild gcld in cld.children)
ProcessROChild(datatable, f2, f3, ref cell, ref lastROID, ref prevROTitleList, ref lastDBindex, gcld);
}
private void ProcessROID(PdfPTable datatable, iTextSharp.text.Font f2, iTextSharp.text.Font f3, ref PdfPCell cell, ref string lastROID, ref List<string> prevROTitleList, ref int lastDBindex, string cROID)
{
int curDBindex = _ROFSTLookup.GetRODatabaseTitleIndex(cROID);// Convert.ToInt32(cROID.Substring(0, 4));
if (lastDBindex == -1 || curDBindex != lastDBindex)
{
if (prevROTitleList != null)
{
// add blank line to separate groups on the report
cell = new PdfPCell(new Phrase(" ", f2));
cell.BorderColor = Color.WHITE;
datatable.AddCell(cell);
}
AddMainRODatabaseTitle(datatable, curDBindex, f3, Color.WHITE);
lastDBindex = curDBindex;
}
if (lastROID == "" || cROID != lastROID)
prevROTitleList = AddROHeaderGroupForSummary(datatable, cROID, prevROTitleList, f2, new Color(0xC0, 0xFF, 0xC0));
lastROID = cROID;
}
}
public class MyPageHelper : PdfPageEventHelper
{
protected PdfTemplate total;
protected BaseFont helv;
private int ptSize = 10; // text point size of page number and page total
string _ByLine = "PROMS";
public MyPageHelper(string byLine)
{
_ByLine = byLine;
}
public override void OnOpenDocument(PdfWriter writer, iTextSharp.text.Document document)
{
total = writer.DirectContent.CreateTemplate(100, 100);
total.BoundingBox = new Rectangle(-20, -20, 100, 100);
//try
//{
helv = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);
//}
//catch (Exception)
//{
// //throw new ExceptionConverter(e);
//}
}
public override void OnEndPage(PdfWriter writer, iTextSharp.text.Document document)
{
PdfContentByte cb = writer.DirectContent;
cb.SaveState();
String text = "Page " + writer.PageNumber + " of ";
float textBase = document.Bottom - 19;//20;
float textSize = helv.GetWidthPoint(text, ptSize);
cb.BeginText();
cb.SetFontAndSize(helv, ptSize);
//if ((writer.PageNumber % 2) == 1)
//{
// cb.SetTextMatrix(document.Left, textBase);
// cb.ShowText(text);
// cb.EndText();
// cb.AddTemplate(total, document.Left + textSize, textBase);
//}
//else
//{
// float adjust = helv.GetWidthPoint("0", 12);
// cb.SetTextMatrix(
// document.Right - textSize - adjust, textBase);
// cb.ShowText(text);
// cb.EndText();
// cb.AddTemplate(total, document.Right - adjust, textBase);
//}
float posCenter = document.Left + ((document.Right - document.Left) / 2) - (helv.GetWidthPoint(text+"XX", ptSize) / 2);
cb.SetTextMatrix(posCenter, textBase);
cb.ShowText(text);
cb.EndText();
cb.AddTemplate(total, posCenter + helv.GetWidthPoint(text, ptSize), textBase);
cb.RestoreState();
AddVolianFooter(writer,document);
AddDateFooter(writer, document);
}
private void AddVolianFooter(PdfWriter writer, iTextSharp.text.Document document)
{
PdfContentByte cb = writer.DirectContent;
cb.SaveState();
String text = _ByLine;//"PROMS Search Results";
float textBase = document.Bottom - 19;//20;
float textSize = helv.GetWidthPoint(text, ptSize);
cb.BeginText();
cb.SetFontAndSize(helv, ptSize);
cb.SetTextMatrix(document.Left, textBase);
cb.ShowText(text);
cb.EndText();
cb.RestoreState();
}
private void AddDateFooter(PdfWriter writer, iTextSharp.text.Document document)
{
PdfContentByte cb = writer.DirectContent;
cb.SaveState();
String text = DateTime.Today.ToShortDateString();
float textBase = document.Bottom - 19;//20;
float textSize = helv.GetWidthPoint(text, ptSize);
float posRight = document.Right - helv.GetWidthPoint(text, ptSize);
cb.BeginText();
cb.SetFontAndSize(helv, ptSize);
cb.SetTextMatrix(posRight, textBase);
cb.ShowText(text);
cb.EndText();
cb.RestoreState();
}
public override void OnCloseDocument(PdfWriter writer, iTextSharp.text.Document document)
{
total.BeginText();
total.SetFontAndSize(helv, ptSize);
total.SetTextMatrix(0, 0);
total.ShowText((writer.PageNumber - 1).ToString());
total.EndText();
base.OnCloseDocument(writer, document);
}
}
}