
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
301 lines
12 KiB
C#
301 lines
12 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Drawing;
|
|
using iTextSharp.text.pdf;
|
|
using iTextSharp.text;
|
|
using VEPROMS.CSLA.Library;
|
|
|
|
namespace Volian.Print.Library
|
|
{
|
|
public partial class vlnTab : vlnText
|
|
{
|
|
/// <summary>
|
|
/// Used to Align Tabs for numeric tabs that can go to 2 digits
|
|
/// </summary>
|
|
private float? _TabAlign;
|
|
public float TabAlign // Offset to Last printable character
|
|
{
|
|
get
|
|
{
|
|
if (_TabAlign == null)
|
|
{
|
|
_TabAlign = 0;
|
|
if (Text != null)
|
|
{
|
|
while (_TabAlign < Text.Length && Text[(int)_TabAlign] == ' ')
|
|
_TabAlign++;
|
|
if (_TabAlign < Text.Length)
|
|
{
|
|
if ("0123456789".Contains(Text[(int)_TabAlign].ToString()))
|
|
{
|
|
while ("0123456789".Contains(Text[(int)_TabAlign].ToString()))
|
|
_TabAlign++;
|
|
_TabAlign--;
|
|
}
|
|
}
|
|
else
|
|
_TabAlign = 0;
|
|
}
|
|
}
|
|
return (float)_TabAlign * MyFont.CharsToTwips;
|
|
}
|
|
}
|
|
private float? _TabOffset;
|
|
public float TabOffset // Offset to first printable character
|
|
{
|
|
get
|
|
{
|
|
if (_TabOffset == null)
|
|
{
|
|
_TabOffset = 0;
|
|
if (Text != null)
|
|
{
|
|
while (_TabOffset<Text.Length && Text[(int)_TabOffset] == ' ')
|
|
_TabOffset++;
|
|
}
|
|
}
|
|
if (_TabOffset >= Text.Length) _TabOffset = 0;
|
|
return (float)_TabOffset * MyFont.CharsToTwips;
|
|
}
|
|
}
|
|
private vlnMacro _MyMacro;
|
|
public vlnMacro MyMacro
|
|
{
|
|
get { return _MyMacro; }
|
|
set { _MyMacro = value; }
|
|
}
|
|
|
|
private string symblsStr = "\u25CF\u0394"; // string of possible symbol character in a tab
|
|
// add symbol characters as needed
|
|
// "\u25CF" - solid bullet
|
|
// \x0394 - delta
|
|
|
|
private System.Drawing.FontStyle GetSysFontStyle(VE_Font f)
|
|
{
|
|
if (f.Style == E_Style.Italics)
|
|
return System.Drawing.FontStyle.Italic;
|
|
return FontStyle.Regular;
|
|
}
|
|
private float GetTextWidth(VE_Font vefont, string txt, string symblFontName)
|
|
{
|
|
System.Drawing.Font font = new System.Drawing.Font(vefont.Family, (float)vefont.Size, GetSysFontStyle(vefont));
|
|
System.Drawing.Font symbFont = new System.Drawing.Font(symblFontName, (float)vefont.Size);
|
|
iTextSharp.text.Font iFont = Volian.Svg.Library.VolianPdf.GetFont(font);
|
|
iTextSharp.text.Font iSymblFont = Volian.Svg.Library.VolianPdf.GetFont(symbFont);
|
|
float w = 0;
|
|
foreach (char c in txt)
|
|
{
|
|
int idx = symblsStr.IndexOf(c);
|
|
if (idx >= 0) // symbol character - use symbol font to find its width
|
|
w += iSymblFont.BaseFont.GetWidthPointKerned(symblsStr[idx].ToString(), (float)vefont.Size);
|
|
else
|
|
w += iFont.BaseFont.GetWidthPointKerned(c.ToString(), (float)vefont.Size);
|
|
}
|
|
//float w = iFont.BaseFont.GetWidthPointKerned(Text.Replace("\u25CF","@"), (float)vefont.Size);
|
|
return w;
|
|
}
|
|
bool _ScriptCaution = false;
|
|
|
|
public bool ScriptCaution
|
|
{
|
|
get { return _ScriptCaution; }
|
|
set { _ScriptCaution = value; }
|
|
}
|
|
bool _SeparateBullet = false;
|
|
|
|
public bool SeparateBullet
|
|
{
|
|
get { return _SeparateBullet; }
|
|
set { _SeparateBullet = value; }
|
|
}
|
|
public vlnTab(PdfContentByte cb, vlnParagraph myparent, string origTab, string cleanTab, float xoffset, float yoffset, VE_Font vFont, bool doSectTab, string symblFontName, bool removedUnderline)
|
|
{
|
|
bool alignAsIfBulleted = false;
|
|
ScriptCaution = (origTab.Contains("Caution") && vFont.Family == "VolianScript");
|
|
MyContentByte = cb;
|
|
MyParent = myparent;
|
|
YOffset = yoffset;
|
|
Text = cleanTab;
|
|
MyFont = vFont;
|
|
float CCCs = GetTextWidth(MyFont, "CCCCCCCCCC", symblFontName);
|
|
float IIIs = GetTextWidth(MyFont, "iiiiiiiiii", symblFontName);
|
|
string origTab1 = origTab;
|
|
if (ScriptCaution)
|
|
{
|
|
Text = origTab.Replace("Caution ", "\uF043\uF061\uF069\uF06E\uF06F\uF074\uF075\uF020\uF020");
|
|
Width = 90;
|
|
}
|
|
else if ((myparent.MyItemInfo.FormatStepData != null) && (myparent.MyItemInfo.FormatStepData.TabData.IdentWidth ?? 0) > 0)
|
|
//if ((myparent.MyItemInfo.FormatStepData != null) && (myparent.MyItemInfo.FormatStepData.TabData.IdentWidth ?? 0) > 0)
|
|
Width = (float)myparent.MyItemInfo.FormatStepData.TabData.IdentWidth;
|
|
else if (CCCs != IIIs)
|
|
{
|
|
float tPtPerChar = myparent.MyItemInfo.ActiveFormat.PlantFormat.FormatData.SectData.StepSectionData.StepSectionLayoutData.TabPtsPerChar ?? 6;
|
|
Width = tPtPerChar * origTab.Length;
|
|
// Check the following, it may be needed for FPL:
|
|
//origTab1 = origTab1.TrimStart(" ".ToCharArray());
|
|
// 6 = number of points per character. 4 characters between end of tab and beginning of text
|
|
// origTab1.Trim... is number of non-space characters of the tab string.
|
|
//Width = 6 * (4 + origTab1.Trim(" ".ToCharArray()).Length);
|
|
}
|
|
else
|
|
Width = GetTextWidth(MyFont, (Text != null ? Text : origTab), symblFontName); //MyFont.CharsToTwips * (Text != null ? Text.Length : origTab.Length);
|
|
|
|
// Pairie Island (NSP) Caution and Note tabs use a larger font
|
|
// When using a bullet, we need to use the font size of the Caution/Note text instead of the tab.
|
|
// To do this we set the TabData.Bullet.Separate to true (currently - 4/26/2013 - only NSP uses this).
|
|
// Because of the different font sizes, when the Caution/Note did have have a bullet, the positioning
|
|
// was off by the lenght of IdentB (the bullet string), thus the "alignAsIfBulleted" bool
|
|
if ((myparent.MyItemInfo.FormatStepData != null) && myparent.MyItemInfo.FormatStepData.TabData.Bullet.Separate)
|
|
if (myparent.MyItemInfo.MyPrevious != null || myparent.MyItemInfo.NextItem != null)
|
|
SeparateBullet = true;
|
|
else
|
|
alignAsIfBulleted = true;
|
|
|
|
if (origTab.Contains(@"{!"))
|
|
{
|
|
int mindx = origTab.IndexOf(@"{!");
|
|
int meindx = origTab.IndexOf(@"}", mindx);
|
|
string macro = origTab.Substring(mindx, meindx - mindx + 1);
|
|
// Width for placement of macro should be position in the string where the macro was located.
|
|
float lwidth = MyFont.CharsToTwips * (origTab.Length - meindx - 1);
|
|
MyMacro = new vlnMacro(xoffset - lwidth, yoffset, macro.Substring(2, macro.Length - 3));
|
|
xoffset += myparent.MyItemInfo.FormatStepData.TabData.MacroTabAdjust ?? 0;
|
|
origTab = origTab.Replace(macro, "");
|
|
cleanTab = origTab;
|
|
if (CCCs != IIIs)
|
|
{
|
|
float? tPtPerChar1 = myparent.MyItemInfo.ActiveFormat.PlantFormat.FormatData.SectData.StepSectionData.StepSectionLayoutData.TabPtsPerChar;
|
|
if (tPtPerChar1!=null)
|
|
Width = (float)tPtPerChar1 * origTab.Length;
|
|
else
|
|
{
|
|
origTab = origTab + " ";
|
|
origTab = origTab.TrimStart(" ".ToCharArray());
|
|
if (mindx > 2) // ouch!
|
|
Width = 6f * (origTab.Length - 1); // FPL (macro is after {numeric}) FPL is good with genmac output!
|
|
else
|
|
Width = 3 + (6f * origTab.Length); // NSP (macro is before {numeric})
|
|
}
|
|
}
|
|
else
|
|
Width = GetTextWidth(MyFont, (cleanTab != null ? cleanTab : origTab), symblFontName);//MyFont.CharsToTwips * (cleanTab != null ? cleanTab.Length : origTab.Length);
|
|
}
|
|
else
|
|
{
|
|
origTab = origTab1;
|
|
}
|
|
|
|
// if this tab was underlined, we may need to add partial underlining back in, if it was
|
|
// removed when the bullet was added. This handles the case where the bullet was appended
|
|
// to the tab, for example "NOTE: o".
|
|
if (removedUnderline)
|
|
{
|
|
int sep = origTab.IndexOfAny(". ".ToCharArray());
|
|
origTab = @"\ul " + origTab.Substring(0, sep-1) + @"\ulnone" + origTab.Substring(sep-1);
|
|
}
|
|
// if this tab is underlined, the underlining should not underline the ':'. Check for "NOTE:"
|
|
// or "CAUTION:", i.e. only underline up to ':'
|
|
if (myparent.MyItemInfo.IsStep && ((myparent.MyItemInfo.FormatStepData.AlwaysTab || myparent.MyItemInfo.MyPrevious == null)
|
|
&& ((vFont.Style & E_Style.Underline) > 0) && (origTab.ToUpper().Contains("NOTE:") ||
|
|
origTab.ToUpper().Contains("CAUTION:"))))
|
|
{
|
|
FontStyle style = FontStyle.Regular;
|
|
if ((vFont.Style & E_Style.Bold) > 0) style |= FontStyle.Bold;
|
|
if ((vFont.Style & E_Style.Italics) > 0) style |= FontStyle.Italic;
|
|
vFont.WindowsFont = new System.Drawing.Font(vFont.Family, (float)vFont.Size, style);
|
|
int indxC = origTab.IndexOf(":");
|
|
origTab = @"\ul " + origTab.Substring(0, indxC) + @"\ulnone" + origTab.Substring(indxC);
|
|
}
|
|
Rtf = GetRtf(origTab, vFont);
|
|
Rtf = Rtf.Replace("\u0394", @"\f1\u916?\f0 "); // delta 0x0394
|
|
if (ScriptCaution)
|
|
{
|
|
Rtf = GetRtf("\u25CFCaution ", vFont);
|
|
Rtf = Rtf.Replace("\u25CF", @"\f1\fs20 \u9679?\f0\par\f0\fs64 "); // bullet 25CF // jsj- force bullet size (is different than tab text)
|
|
if (myparent.MyItemInfo.FormatStepData != null && !myparent.MyItemInfo.FormatStepData.AlwaysTab && myparent.MyItemInfo.MyPrevious != null)
|
|
Rtf = Rtf.Replace("Caution ", @"\u61472?\u61472?\u61472?\u61472?\u61472?\u61472?\u61472?\u61472?\u61472?");
|
|
else
|
|
{
|
|
if (myparent.MyItemInfo.FormatStepData != null && !myparent.MyItemInfo.FormatStepData.AlwaysTab && myparent.MyItemInfo.NextItem == null)
|
|
Rtf = Rtf.Replace(@"\u9679?", "");
|
|
Rtf = Rtf.Replace("Caution ", @"\u61507?\u61537?\u61557?\u61556?\u61545?\u61551?\u61550?\u61472?\u61472?");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (SeparateBullet)
|
|
Rtf = Rtf.Replace("\u25CF", "");
|
|
else
|
|
Rtf = Rtf.Replace("\u25CF", @"\f1\u9679?\f0 "); // bullet 25CF // jsj- add space after \f0
|
|
//Rtf = Rtf.Replace("\u25CF", @"\f1\fs18\b0\i0 \u9679?\f0 "); // bullet 25CF // jsj- add space after \f0
|
|
if (myparent.MyItemInfo.FormatStepData != null && !myparent.MyItemInfo.FormatStepData.AlwaysTab && myparent.MyItemInfo.MyPrevious != null)
|
|
{
|
|
//if (scriptCaution)
|
|
// Rtf = Rtf.Replace("CAUTION ", @"\u61472?\u61472?\u61472?\u61472?\u61472?\u61472?\u61472?\u61472?\u61472?");
|
|
Rtf = Rtf.Replace("Caution:", " ");
|
|
Rtf = Rtf.Replace("Note:", " ");
|
|
Rtf = Rtf.Replace("CAUTION:", " ");
|
|
Rtf = Rtf.Replace("NOTE:", " ");
|
|
Rtf = Rtf.Replace("Caution", " ");
|
|
Rtf = Rtf.Replace("Note", " ");
|
|
Rtf = Rtf.Replace("CAUTION", " ");
|
|
Rtf = Rtf.Replace("NOTE", " ");
|
|
}
|
|
}
|
|
//if (ScriptCaution && Rtf.Contains("Caution"))
|
|
//{
|
|
// // NSP script caution
|
|
// iTextSharp.text.Font myfont = pdf.GetFont(vFont.Family, 28, 0, iTextSharp.text.Color.BLACK);
|
|
// if (!myfont.BaseFont.CharExists(0x43)) // Capital 'C' exists as text
|
|
// {
|
|
// //VE_Font vf = new VE_Font("VolianScript", 28, E_Style.Italics, 12);
|
|
// // Capital 'C' exists as Symbol
|
|
// Rtf = Rtf.Replace("Caution ", @"\u61507?\u61537?\u61557?\u61556?\u61545?\u61551?\u61550?\u61472?\u61472?");
|
|
// }
|
|
|
|
//}
|
|
|
|
|
|
// do positioning based on whether format has locations for section 'header'. If it's not centered, treat
|
|
// it's location more like a 'tab'.
|
|
if (doSectTab)
|
|
{
|
|
XOffset = xoffset;
|
|
// the width was just a little small, so it was wrapping - but only if there were no spaces at end
|
|
// so use this condition to do minimal impact (WCN1 format, for section tabs with three places, i.e. 6.1.2
|
|
if (!cleanTab.EndsWith(" "))Width += .1f;
|
|
}
|
|
else
|
|
{
|
|
// if using a proportional font and the tab font/size is different than the text font/size
|
|
if (CCCs != IIIs &&
|
|
(MyFont.Family != myparent.MyItemInfo.FormatStepData.Font.Family ||
|
|
MyFont.Size != myparent.MyItemInfo.FormatStepData.Font.Size))
|
|
{
|
|
// This is needed for Prairie Island (NSP) Caution/Note tabs to consistantly position
|
|
// them at the same horizontal (column) position on the page
|
|
string txt = Text;
|
|
if (alignAsIfBulleted)
|
|
txt += myparent.MyItemInfo.ActiveFormat.PlantFormat.FormatData.SectData.StepSectionData.IdentB;
|
|
System.Drawing.Font font = new System.Drawing.Font(MyFont.Family,(float)MyFont.Size);
|
|
iTextSharp.text.Font iFont = Volian.Svg.Library.VolianPdf.GetFont(font);
|
|
float w = iFont.BaseFont.GetWidthPointKerned(txt, (float)MyFont.Size);
|
|
Width = w;
|
|
}
|
|
XOffset = xoffset - Width;
|
|
}
|
|
|
|
}
|
|
public override float ToPdf(PdfContentByte cb, float yPageStart, ref float yTopMargin, ref float yBottomMargin)
|
|
{
|
|
if (MyParent.MyItemInfo.FormatStepData != null && MyParent.MyItemInfo.FormatStepData.StepPrintData != null)
|
|
XOffset += (float)(MyParent.MyItemInfo.FormatStepData.StepPrintData.PosAdjust ?? 0);
|
|
float yLocation = CalculateYOffset(yPageStart, yTopMargin);
|
|
Rtf2Pdf.TextAt(cb, IParagraph, XOffset, yLocation, Width, 100, "", yBottomMargin);
|
|
return yPageStart;
|
|
}
|
|
}
|
|
}
|