Move pagination code to pagination.cs
Add error handler if _MyStepRTB is null
This commit is contained in:
parent
9b7a8ee6fa
commit
c9d962d01d
@ -177,6 +177,7 @@ namespace Volian.Controls.Library
|
|||||||
|
|
||||||
void _MyStepRTB_TextChanged(object sender, EventArgs e)
|
void _MyStepRTB_TextChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
if (_MyStepRTB == null) return;
|
||||||
// if we are in view mode or the edit window is empty, then don't allow inserting steps/substeps,
|
// if we are in view mode or the edit window is empty, then don't allow inserting steps/substeps,
|
||||||
// page breaks, copy step, nor creating a pdf
|
// page breaks, copy step, nor creating a pdf
|
||||||
bool allow = (_MyStepRTB.TextLength > 0);
|
bool allow = (_MyStepRTB.TextLength > 0);
|
||||||
|
315
PROMS/Volian.Print.Library/Pagination.cs
Normal file
315
PROMS/Volian.Print.Library/Pagination.cs
Normal file
@ -0,0 +1,315 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using VEPROMS.CSLA.Library;
|
||||||
|
using Volian.Base.Library;
|
||||||
|
using iTextSharp.text.pdf;
|
||||||
|
using Volian.Svg.Library;
|
||||||
|
|
||||||
|
namespace Volian.Print.Library
|
||||||
|
{
|
||||||
|
public partial class vlnParagraph
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// This variable is used to match 16 bit pagination
|
||||||
|
/// </summary>
|
||||||
|
private bool _Match16BitPagination = false;
|
||||||
|
/// <summary>
|
||||||
|
/// Dtermines if the current step is preceded by a Page Break
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="yLocation"></param>
|
||||||
|
/// <param name="yTopMargin"></param>
|
||||||
|
/// <param name="yBottomMargin"></param>
|
||||||
|
/// <returns>
|
||||||
|
/// 0 - No page break
|
||||||
|
/// 1 - Break on High Level Step
|
||||||
|
/// 2 - Break within a Step
|
||||||
|
/// 3 - Break on High Level Step (SevenLinesPerInch)
|
||||||
|
/// </returns>
|
||||||
|
private int Paginate(float yLocation, float yTopMargin, float yBottomMargin)
|
||||||
|
{
|
||||||
|
float yPageSize = yTopMargin - yBottomMargin;
|
||||||
|
// TODO: This does not account for a long step as the last step that would exceed more than one page and
|
||||||
|
// that has an end message that needs to be accounted for in determining pagination. To do that the last
|
||||||
|
// child should be the only paragraph that accounts for the End message.
|
||||||
|
//
|
||||||
|
// If last step & there should be an end message, pagination tests need to account for the 3 lines the end
|
||||||
|
// message uses. The 3 is for a line above, the end message line & the line below (in case there is a border/box line).
|
||||||
|
|
||||||
|
// The 3 was changed to 2 for the end line & the line below. The blank line below the step gives the blank
|
||||||
|
// line above the end message, thus 2 not 3. This change was made on July 20, 2011 by RHM & KBR. The
|
||||||
|
// procedure in questions was VEWCNEMG\EMGAPP.PRC, ES-01, Step 8.
|
||||||
|
float yEndMsg = !MyItemInfo.IsSection && MyItemInfo.MyHLS.NextItem == null && (MyItemInfo.MyDocStyle.End.Message ?? "") != "" ? 2 * SixLinesPerInch : 0;
|
||||||
|
float yWithinMargins = CalculateYLocation(yLocation, yTopMargin) - yBottomMargin; // -SixLinesPerInch;
|
||||||
|
// if step is breaking over a number of pages, determine if the current step is the
|
||||||
|
// location of a pagebreak.
|
||||||
|
if (MyPageHelper.ParaBreaks.Count > 0)
|
||||||
|
{
|
||||||
|
if (this == MyPageHelper.ParaBreaks[0] || this.YTopMost > MyPageHelper.ParaBreaks[0].YTopMost)
|
||||||
|
{
|
||||||
|
MyPageHelper.ParaBreaks.RemoveAt(0);
|
||||||
|
//Console.WriteLine("'PageBreak',6,'Yes','Page Break within Step',{0},{1},{2},{3}, {4},'{5}'", MyItemInfo.ItemID, YSize, 0, 0, 0, MyItemInfo.ShortPath);
|
||||||
|
//Console.WriteLine("Prev = {0}", MyItemInfo.MyPrevious==null ? "''" : MyItemInfo.DBSequence);
|
||||||
|
ShowPageBreak(1, "Page Break within Step", "Yes", YSize, yPageSize, yWithinMargins);
|
||||||
|
return 2; // break on this item within a step
|
||||||
|
}
|
||||||
|
return 0; // this is not an item with a break
|
||||||
|
}
|
||||||
|
float mySize = YSize * MyPageHelper.YMultiplier;
|
||||||
|
bool ManualPageBreak = false;
|
||||||
|
if (MyItemInfo.IsStepSection)
|
||||||
|
{
|
||||||
|
if (yLocation < yTopMargin) // continuous section
|
||||||
|
{
|
||||||
|
if (ChildrenBelow == null || ChildrenBelow.Count == 0) return 0;
|
||||||
|
vlnParagraph firstChild = ChildrenBelow[0];
|
||||||
|
|
||||||
|
// This is a continuous section. There may be cases where the user put a manual page
|
||||||
|
// break on the first step (child) in the section. if so, break on the section. The
|
||||||
|
// flag SectionPageBreak is set to true to flag that a pagebreak should not be done
|
||||||
|
// on that first step.
|
||||||
|
StepConfig sc = firstChild.MyItemInfo.MyConfig as StepConfig;
|
||||||
|
ManualPageBreak = MyPageHelper.OriginalPageBreak ? (sc == null ? false : sc.Step_ManualPagebreak) :
|
||||||
|
sc == null ? false : sc.Step_NewManualPagebreak;
|
||||||
|
if (ManualPageBreak)
|
||||||
|
{
|
||||||
|
SectionPageBreak = true;
|
||||||
|
ShowPageBreak(2, "Manual Page Break", "Yes", YSize, yPageSize, yWithinMargins);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// can the title and the first step fit?
|
||||||
|
// add the first child's size + (the section title's size)
|
||||||
|
float ySizeIncludingFirst = firstChild.YSize + (firstChild.YTop - YTop);
|
||||||
|
//if (ySizeIncludingFirst > (yLocation - yBottomMargin - SixLinesPerInch)) return 1;
|
||||||
|
//if (ySizeIncludingFirst > (yLocation - yBottomMargin) && ySizeIncludingFirst < yPageSize)
|
||||||
|
if (ySizeIncludingFirst > (yLocation - yBottomMargin))
|
||||||
|
{
|
||||||
|
ShowPageBreak(4, "Page Break Before Continuous Step Section", "Yes", YSize, yPageSize, yWithinMargins);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0; // Don't Paginate (page break) on a Step Section if it's first thing on page
|
||||||
|
}
|
||||||
|
if (!MyItemInfo.IsHigh) return 0; // Don't Paginate on a Substep level
|
||||||
|
StepConfig sc1 = MyItemInfo.MyConfig as StepConfig;
|
||||||
|
ManualPageBreak = MyPageHelper.OriginalPageBreak ? (sc1 == null ? false : sc1.Step_ManualPagebreak) :
|
||||||
|
sc1 == null ? false : sc1.Step_NewManualPagebreak;
|
||||||
|
if (MyItemInfo.FirstSibling == MyItemInfo && ManualPageBreak)
|
||||||
|
{
|
||||||
|
// if parent/section used this pagebreak, skip it.
|
||||||
|
if (MyParent.SectionPageBreak)
|
||||||
|
{
|
||||||
|
ManualPageBreak = false;
|
||||||
|
MyParent.SectionPageBreak = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_Match16BitPagination) mySize = YSize;
|
||||||
|
float ySize7LPI = YSize; // +SixLinesPerInch;
|
||||||
|
if (_Match16BitPagination) ySize7LPI += SixLinesPerInch;
|
||||||
|
string firstStep = "No";
|
||||||
|
if (MyItemInfo.IsHigh && MyItemInfo.MyPrevious == null)
|
||||||
|
firstStep = "Yes";
|
||||||
|
if (!ManualPageBreak && mySize + yEndMsg <= yWithinMargins) // Don't Paginate if there is enough room, will fit on page
|
||||||
|
//if (!ManualPageBreak && mySize + yEndMsg <= yWithinMargins + SixLinesPerInch) // Don't Paginate if there is enough room, will fit on page
|
||||||
|
{
|
||||||
|
//Console.WriteLine("'PageBreak',1,'No','HLS will fit on page',{0},{1},{2}, {3}, {4},'{5}'", MyItemInfo.ItemID, YSize, yPageSize, yWithinMargins, (int)(100 * yWithinMargins / yPageSize), MyItemInfo.ShortPath);
|
||||||
|
ShowPageBreak(-1, "HLS will fit on page", firstStep, YSize, yPageSize, yWithinMargins);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// !MyItemInfo.IsHigh - if (MyItemInfo.IsRNOPart && MyParent.XOffset < XOffset) return 0; // Don't paginate on an RNO to the right
|
||||||
|
|
||||||
|
// YSize includes a blank line after the step which we don't want to include in the page break test, thus the
|
||||||
|
// YSize - SixLinesPerInch:
|
||||||
|
if (YSize - SixLinesPerInch + yEndMsg <= yPageSize) // if the entire step can fit on one page, do a page break
|
||||||
|
{
|
||||||
|
// Don't want extra line before step
|
||||||
|
//Console.WriteLine("'PageBreak',2,'Yes','HLS will fit on 1 Page',{0},{1},{2}, {3}, {4},'{5}'", MyItemInfo.ItemID, YSize, yPageSize, yWithinMargins, (int)(100 * yWithinMargins / yPageSize), MyItemInfo.ShortPath);
|
||||||
|
ShowPageBreak(5, "HLS will fit on 1 Page at 6 LPI", "Yes", YSize, yPageSize, yWithinMargins);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// TODO - yEndMsg - compressed size?
|
||||||
|
|
||||||
|
// ySize7LPI includes a blank line after the step which we don't want to include in the page break test.
|
||||||
|
else if (MyItemInfo.ActiveFormat.MyStepSectionLayoutData.CompressSteps && (ySize7LPI - SixLinesPerInch) < (yPageSize * SixLinesPerInch / _SevenLinesPerInch))
|
||||||
|
{
|
||||||
|
//Console.WriteLine("'PageBreak',3,'Yes','HLS will fit on 1 Page at 7 LPI',{0},{1},{2}, {3}, {4},'{5}'", MyItemInfo.ItemID, YSize, yPageSize, yWithinMargins, (int)(100 * yWithinMargins / yPageSize), MyItemInfo.ShortPath);
|
||||||
|
ShowPageBreak(7, "HLS will fit on 1 Page at 7 LPI", "Yes", YSize, yPageSize, yWithinMargins);
|
||||||
|
//Console.WriteLine("'7LPI',{0},{1}", MyItemInfo.DBSequence, YSize);
|
||||||
|
return 3; // High Level Step can fit at SevenLinesPerInch
|
||||||
|
}
|
||||||
|
else // The entire step cannot fit on a blank page.
|
||||||
|
{
|
||||||
|
// if there is more than half a page left, then start to print on the current page
|
||||||
|
float myFirstPieceSize = GetFirstPieceSize(); //Case 0
|
||||||
|
if (_Match16BitPagination) myFirstPieceSize += 2 * SixLinesPerInch;
|
||||||
|
// TODO: Put this line back to case 0, i.e. previous line. This fixes a 16-bit vs 32-bit pagination diff in EO30 Step 20.
|
||||||
|
//float myFirstPieceSize = GetFirstPieceSize() + 2 * SixLinesPerInch; //Case 10 - this is to match 16bit
|
||||||
|
if (!ManualPageBreak && MyItemInfo.ActiveFormat.MyStepSectionLayoutData.SpecialPageBreakFlag && yWithinMargins > yPageSize / 2 &&
|
||||||
|
myFirstPieceSize < yWithinMargins)
|
||||||
|
{
|
||||||
|
//Console.WriteLine("'PageBreak',4,'No','HLS will have to split anyway',{0},{1},{2}, {3}, {4},'{5}'", MyItemInfo.ItemID, YSize, yPageSize, yWithinMargins, (int)(100 * yWithinMargins / yPageSize), MyItemInfo.ShortPath);
|
||||||
|
ShowPageBreak(-4, "HLS will have to split anyway", firstStep, YSize, yPageSize, yWithinMargins);
|
||||||
|
//BuildPageBreakList(yWithinMargins+SixLinesPerInch,yPageSize-2*SixLinesPerInch); // Determine items where page break(s) occur
|
||||||
|
BuildPageBreakList(yWithinMargins + SixLinesPerInch, yPageSize); // Case 5 - Determine items where page break(s) occur
|
||||||
|
return 0; // Stay on this page
|
||||||
|
}
|
||||||
|
|
||||||
|
// Less than half a page left, start printing on a new page.
|
||||||
|
//Console.WriteLine("'PageBreak',5,'Yes','HLS will have to split',{0},{1},{2}, {3}, {4},'{5}'", MyItemInfo.ItemID, YSize, yPageSize, yWithinMargins, (int)(100 * yWithinMargins / yPageSize), MyItemInfo.ShortPath);
|
||||||
|
ShowPageBreak(3, "HLS will have to split", "Yes", YSize, yPageSize, yWithinMargins);
|
||||||
|
// Determine items where page break(s) occur
|
||||||
|
//BuildPageBreakList(yPageSize, yPageSize - 2 * SixLinesPerInch); // Case Base
|
||||||
|
BuildPageBreakList(yPageSize, yPageSize); // Case 1 :Works for ES05 Step 15 SubStep 7
|
||||||
|
return 1; // Paginate on High Level Steps
|
||||||
|
}
|
||||||
|
//if (yWithinMargins > yPageSize / 2)
|
||||||
|
//{
|
||||||
|
// Console.WriteLine("'PageBreak',4,'No','Not Half way down the page',{0},{1},{2}, {3}, {4},'{5}'", MyItemInfo.ItemID, YSize, yPageSize, yWithinMargins, (int)(100 * yWithinMargins / yPageSize), MyItemInfo.ShortPath);
|
||||||
|
// return 0; // More than half way down the page
|
||||||
|
//}
|
||||||
|
//if (ChildrenBelow.Count > 0 && ChildrenBelow[0].YSize < yWithinMargins)
|
||||||
|
// return 0;
|
||||||
|
//Console.WriteLine("'PageBreak',5,'Yes','At least half the page is filled',{0},{1},{2},{3}, {4},'{5}'", MyItemInfo.ItemID, YSize, yPageSize, yWithinMargins, (int)(100 * yWithinMargins / yPageSize), MyItemInfo.ShortPath);
|
||||||
|
//return 2;
|
||||||
|
throw new Exception("PageBreak Logic Missing, vlnParagraph.cs");
|
||||||
|
}
|
||||||
|
private void ForcePagination(PdfContentByte cb, ref float yPageStart, float yTopMargin, float yBottomMargin, ref float yLocation, ref float retval)
|
||||||
|
{
|
||||||
|
cb.PdfDocument.NewPage(); // pagination issue
|
||||||
|
DebugText.WriteLine("*****PaginateError");
|
||||||
|
yPageStart = yTopMargin + YVeryTop;
|
||||||
|
yLocation = yPageStart - YOffset;
|
||||||
|
//MyItemInfo.ItemID, YSize, yPageSize, yLocation
|
||||||
|
DebugPagination.WriteLine("-1,'Yes','Forced Pagination',{0},{1},,{3},{4}", MyItemInfo.ItemID, YSize, 0, yLocation, MyItemInfo.DBSequence);
|
||||||
|
retval = Rtf2Pdf.TextAt(cb, IParagraph, XOffset, yLocation, Width, 100, DebugInfo, yBottomMargin);
|
||||||
|
}
|
||||||
|
private void ShowPageBreak(int instance, string message, string breakOrNot, float YSize, float yPageSize, float yWithinMargins)
|
||||||
|
{
|
||||||
|
if (breakOrNot == "Yes")
|
||||||
|
{
|
||||||
|
// DebugPagination.WriteLine("{0}", MyItemInfo.DBSequence); //,instance);
|
||||||
|
DebugPagination.WriteLine("{0},'{1}',{2},'{3}','{4}',{5},{6},{7},{8},{9}", MyPageHelper.MyPdfContentByte.PdfWriter.CurrentPageNumber, MyItemInfo.ShortPath, instance, message, breakOrNot,
|
||||||
|
MyItemInfo.ItemID, YSize, yPageSize, yWithinMargins, (int)(100 * yWithinMargins / yPageSize));
|
||||||
|
}
|
||||||
|
// Console.WriteLine("{0},{1}", MyItemInfo.DBSequence, IsFirstSubStep(MyItemInfo)); //,instance);
|
||||||
|
}
|
||||||
|
private void BuildPageBreakList(float ySpaceOnCurPage, float yPageSize)
|
||||||
|
{
|
||||||
|
ParagraphLocations myLocations = new ParagraphLocations();
|
||||||
|
BuildLocationList(YTopMost, myLocations);
|
||||||
|
StepLevelList myList = myLocations.BuildStepLevelList();
|
||||||
|
// Find Break Locations in the list based upon StepLevel and yLocation
|
||||||
|
float yTop = 0;
|
||||||
|
float yLowerLimit = (yPageSize - 2 * SixLinesPerInch) / 2;
|
||||||
|
float yStart = Math.Max(0, (yPageSize - 2 * SixLinesPerInch) - ySpaceOnCurPage);
|
||||||
|
//Console.WriteLine("'yStart',{0},{1}", MyItemInfo.DBSequence, yStart);
|
||||||
|
|
||||||
|
// The following three lines make page breaking match 16-bit:
|
||||||
|
if (_Match16BitPagination)
|
||||||
|
{
|
||||||
|
yLowerLimit = yStart - SixLinesPerInch + ySpaceOnCurPage / 2;
|
||||||
|
if ((yStart + MyItemInfo.MyDocStyle.Layout.TopMargin + 2 * SixLinesPerInch) > ((MyItemInfo.MyDocStyle.Layout.TopMargin + yPageSize - 2 * SixLinesPerInch) / 2))
|
||||||
|
yLowerLimit = yStart + 2 * SixLinesPerInch;
|
||||||
|
}
|
||||||
|
// Make sure that the FirstPiece (Caution Note HLS and First Substeps) fit
|
||||||
|
float myFirstPieceSize = GetFirstPieceSize(); //Case 0
|
||||||
|
if (myFirstPieceSize < ySpaceOnCurPage) yLowerLimit = Math.Max(myFirstPieceSize + yStart, yLowerLimit);
|
||||||
|
while ((YSize - yTop) >= ySpaceOnCurPage)
|
||||||
|
{
|
||||||
|
vlnParagraph paraBreak = FindPageBreak(yStart, ySpaceOnCurPage, yLowerLimit, myList);
|
||||||
|
if (paraBreak == null) break;
|
||||||
|
// yTopNew is y Location of this page break. YTopMost is top of HLS, including any Cautions/Notes/Boxes/etc
|
||||||
|
float yTopNew = paraBreak.YVeryTop - YTopMost;
|
||||||
|
RemoveProcessedParagraphs(myList, yTopNew - yTop);
|
||||||
|
yTop = yTopNew;
|
||||||
|
MyPageHelper.ParaBreaks.Add(paraBreak);
|
||||||
|
ySpaceOnCurPage = yPageSize - 2 * SixLinesPerInch; // Allow for continue message and blank line.
|
||||||
|
//ySpaceOnCurPage = yPageSize; // Allow for continue message and blank line.
|
||||||
|
//DocStyle docstyle = MyItemInfo.MyDocStyle;
|
||||||
|
//string myMsg = docstyle.Continue.Bottom.Message;
|
||||||
|
//if ((myMsg ?? "") != "") ySpaceOnCurPage -= 2 * SixLinesPerInch; // Allow for continue message and blank line.
|
||||||
|
yLowerLimit = ySpaceOnCurPage / 2;
|
||||||
|
if (_Match16BitPagination) yLowerLimit -= 1.5F * SixLinesPerInch; // 276 for HLP
|
||||||
|
yStart = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Finds the highest StepLevel (lowest StepLevel number, 0 = HLS, 1 = first substep) that
|
||||||
|
/// fills the page sufficiently (more than half-full)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="yWithinMargins"></param>
|
||||||
|
/// <param name="yTop"></param>
|
||||||
|
/// <param name="myList"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static vlnParagraph FindPageBreak(float yStart, float yUpperLimit, float yLowerLimit, StepLevelList myList)
|
||||||
|
{
|
||||||
|
foreach (int stepLevel in myList.Keys) // loop thru StepLevels, starting with lowest.
|
||||||
|
{
|
||||||
|
foreach (float yLocation in myList[stepLevel].Keys) // loop thru yLocation
|
||||||
|
{
|
||||||
|
// The top of this step will fit onto page (-yLocation < yWithinMargins)
|
||||||
|
if (-yLocation <= yUpperLimit) // Fix for OFN-RJ-23
|
||||||
|
//if (-yLocation < yUpperLimit) // Before
|
||||||
|
//if (-yLocation < yWithinMargins && myList[stepLevel][yLocation].MyItemInfo.MyPrevious != null)
|
||||||
|
{
|
||||||
|
//ItemInfo prev = myList[stepLevel][yLocation].MyItemInfo.MyPrevious;
|
||||||
|
//if (myList[stepLevel][yLocation].MyItemInfo.ItemID == 5609) Console.WriteLine("aer");
|
||||||
|
//if (myList[stepLevel][yLocation].MyItemInfo.ItemID == 4312) Console.WriteLine("rno");
|
||||||
|
// The top of this step is more than 1/2 way down the page
|
||||||
|
if ((-yLocation + yStart) >= yLowerLimit)
|
||||||
|
{
|
||||||
|
return myList[stepLevel][yLocation];
|
||||||
|
}
|
||||||
|
// if is a caution or note & parent is a substep and entire substep doesn't fit, break.
|
||||||
|
if ((myList[stepLevel][yLocation].MyItemInfo.IsNote || myList[stepLevel][yLocation].MyItemInfo.IsCaution) &&
|
||||||
|
!myList[stepLevel][yLocation].MyParent.MyItemInfo.IsHigh &&
|
||||||
|
myList[stepLevel][yLocation].MyParent.YSize > (yUpperLimit + yLocation))
|
||||||
|
{
|
||||||
|
return myList[stepLevel][yLocation];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
//private void WalkStepLevel(float yTopMost)
|
||||||
|
//{
|
||||||
|
// foreach (vlnParagraph child in ChildrenAbove)
|
||||||
|
// child.WalkStepLevel(yTopMost);
|
||||||
|
// foreach (vlnParagraph child in ChildrenLeft)
|
||||||
|
// child.WalkStepLevel(yTopMost);
|
||||||
|
// ShowStepLevel(yTopMost);
|
||||||
|
// foreach (vlnParagraph child in ChildrenRight)
|
||||||
|
// child.WalkStepLevel(yTopMost);
|
||||||
|
// foreach (vlnParagraph child in ChildrenBelow)
|
||||||
|
// child.WalkStepLevel(yTopMost);
|
||||||
|
//}
|
||||||
|
//private void ShowStepLevel(float yTopMost)
|
||||||
|
//{
|
||||||
|
// ItemInfo item = MyItemInfo;
|
||||||
|
// ItemInfo parent = item.ActiveParent as ItemInfo;
|
||||||
|
// //if (para.MyItemInfo.ItemID == 205)
|
||||||
|
// // Console.Write("");
|
||||||
|
// DebugPagination.WriteLine("'StepLevel',{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}", YVeryTop - yTopMost, YSize, YBottomMost - yTopMost, item.ItemID, item.DBSequence, item.StepLevel, item.MyContent.Type % 10000,
|
||||||
|
// parent.MyContent.Type % 10000, item.HasCautionOrNote ? 1 : 0, parent.Cautions == null ? 0 : 1);
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
public partial class VlnSvgPageHelper : SvgPageHelper
|
||||||
|
{
|
||||||
|
private bool _OriginalPageBreak; // use 16bit page breaks.
|
||||||
|
public bool OriginalPageBreak
|
||||||
|
{
|
||||||
|
get { return _OriginalPageBreak; }
|
||||||
|
set { _OriginalPageBreak = value; }
|
||||||
|
}
|
||||||
|
// This handles Page Breaks within a Step
|
||||||
|
private List<vlnParagraph> _ParaBreaks = new List<vlnParagraph>();
|
||||||
|
public List<vlnParagraph> ParaBreaks
|
||||||
|
{
|
||||||
|
get { return _ParaBreaks; }
|
||||||
|
set { _ParaBreaks = value; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -11,16 +11,9 @@ using VEPROMS.CSLA.Library;
|
|||||||
|
|
||||||
namespace Volian.Print.Library
|
namespace Volian.Print.Library
|
||||||
{
|
{
|
||||||
public class VlnSvgPageHelper:SvgPageHelper
|
public partial class VlnSvgPageHelper:SvgPageHelper
|
||||||
{
|
{
|
||||||
private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
// This handles Page Breaks within a Step
|
|
||||||
private List<vlnParagraph> _ParaBreaks = new List<vlnParagraph>();
|
|
||||||
public List<vlnParagraph> ParaBreaks
|
|
||||||
{
|
|
||||||
get { return _ParaBreaks; }
|
|
||||||
set { _ParaBreaks = value; }
|
|
||||||
}
|
|
||||||
private PageBookmarks _PageBookmarks = new PageBookmarks();
|
private PageBookmarks _PageBookmarks = new PageBookmarks();
|
||||||
public PageBookmarks PageBookmarks
|
public PageBookmarks PageBookmarks
|
||||||
{
|
{
|
||||||
@ -305,12 +298,6 @@ namespace Volian.Print.Library
|
|||||||
get { return _MyChangeBars; }
|
get { return _MyChangeBars; }
|
||||||
set { _MyChangeBars = value; }
|
set { _MyChangeBars = value; }
|
||||||
}
|
}
|
||||||
private bool _OriginalPageBreak; // use 16bit page breaks.
|
|
||||||
public bool OriginalPageBreak
|
|
||||||
{
|
|
||||||
get { return _OriginalPageBreak; }
|
|
||||||
set { _OriginalPageBreak = value; }
|
|
||||||
}
|
|
||||||
public void AddChangeBar(vlnChangeBar vcb, string cbmess)
|
public void AddChangeBar(vlnChangeBar vcb, string cbmess)
|
||||||
{
|
{
|
||||||
if (vcb == null) return;
|
if (vcb == null) return;
|
||||||
|
@ -41,7 +41,7 @@ namespace Volian.Print.Library
|
|||||||
yoff = Add(cb, childItemInfo.Cautions, xoff, yoff, yoffRight, rnoLevel, maxRNO, formatInfo);
|
yoff = Add(cb, childItemInfo.Cautions, xoff, yoff, yoffRight, rnoLevel, maxRNO, formatInfo);
|
||||||
if (childItemInfo.Notes != null && (childItemInfo.IsCaution || childItemInfo.IsNote))
|
if (childItemInfo.Notes != null && (childItemInfo.IsCaution || childItemInfo.IsNote))
|
||||||
yoff = Add(cb, childItemInfo.Notes, xoff, yoff, yoffRight, rnoLevel, maxRNO, formatInfo);
|
yoff = Add(cb, childItemInfo.Notes, xoff, yoff, yoffRight, rnoLevel, maxRNO, formatInfo);
|
||||||
int? bxIndx = childItemInfo.FormatStepData == null ? -1 : childItemInfo.FormatStepData.StepLayoutData.STBoxindex;
|
int? bxIndx = childItemInfo.FormatStepData==null?-1:childItemInfo.FormatStepData.StepLayoutData.STBoxindex;
|
||||||
if (bxIndx != -1 && (bxIndex != bxIndx || childItemInfo.FormatStepData.BoxIt))
|
if (bxIndx != -1 && (bxIndex != bxIndx || childItemInfo.FormatStepData.BoxIt))
|
||||||
{
|
{
|
||||||
if (childItemInfo.FormatStepData.BoxIt) // this is a boxed HLS
|
if (childItemInfo.FormatStepData.BoxIt) // this is a boxed HLS
|
||||||
@ -52,7 +52,7 @@ namespace Volian.Print.Library
|
|||||||
StepSectionLayoutData ssld = formatInfo.MyStepSectionLayoutData;
|
StepSectionLayoutData ssld = formatInfo.MyStepSectionLayoutData;
|
||||||
int colR = int.Parse(formatInfo.MyStepSectionLayoutData.ColRTable.Split(",".ToCharArray())[childItemInfo.ColumnMode]);
|
int colR = int.Parse(formatInfo.MyStepSectionLayoutData.ColRTable.Split(",".ToCharArray())[childItemInfo.ColumnMode]);
|
||||||
int widS = vlnPrintObject.ToInt(formatInfo.MyStepSectionLayoutData.WidSTablePrint, maxRNO);
|
int widS = vlnPrintObject.ToInt(formatInfo.MyStepSectionLayoutData.WidSTablePrint, maxRNO);
|
||||||
box.DefEnd = (float)(ssld.ColS + colR + widS + (60 / 4.8));
|
box.DefEnd = (float)(ssld.ColS + colR + widS + (60/4.8));
|
||||||
box.YOffset = yoff - .75F * vlnPrintObject.SixLinesPerInch;
|
box.YOffset = yoff - .75F * vlnPrintObject.SixLinesPerInch;
|
||||||
}
|
}
|
||||||
else if (bxIndex == null) // First boxed step
|
else if (bxIndex == null) // First boxed step
|
||||||
@ -81,8 +81,8 @@ namespace Volian.Print.Library
|
|||||||
}
|
}
|
||||||
if (childItemInfo is SectionInfo) formatInfo = (childItemInfo as SectionInfo).LocalFormat ?? formatInfo;
|
if (childItemInfo is SectionInfo) formatInfo = (childItemInfo as SectionInfo).LocalFormat ?? formatInfo;
|
||||||
if (rnoLevel < maxRNO && childItemInfo.RNOs != null) yoff = Math.Max(yoff, yoffRight);
|
if (rnoLevel < maxRNO && childItemInfo.RNOs != null) yoff = Math.Max(yoff, yoffRight);
|
||||||
|
|
||||||
|
|
||||||
vlnParagraph para = new vlnParagraph(Parent, cb, childItemInfo, xoff, yoff, rnoLevel, maxRNO, formatInfo);
|
vlnParagraph para = new vlnParagraph(Parent, cb, childItemInfo, xoff, yoff, rnoLevel, maxRNO, formatInfo);
|
||||||
if (box != null && box.MyParent == null)
|
if (box != null && box.MyParent == null)
|
||||||
{
|
{
|
||||||
@ -103,7 +103,6 @@ namespace Volian.Print.Library
|
|||||||
box.Height = yoff - box.YOffset; // new height, with children
|
box.Height = yoff - box.YOffset; // new height, with children
|
||||||
yoff += 2 * vlnPrintObject.SixLinesPerInch;
|
yoff += 2 * vlnPrintObject.SixLinesPerInch;
|
||||||
}
|
}
|
||||||
|
|
||||||
return yoff;
|
return yoff;
|
||||||
}
|
}
|
||||||
public float ToPdf(PdfContentByte cb, float yPageStart, float yTopMargin, float yBottomMargin)
|
public float ToPdf(PdfContentByte cb, float yPageStart, float yTopMargin, float yBottomMargin)
|
||||||
@ -124,10 +123,6 @@ namespace Volian.Print.Library
|
|||||||
set { _MyGrid = value; }
|
set { _MyGrid = value; }
|
||||||
}
|
}
|
||||||
public float SectYPageStart = 0;
|
public float SectYPageStart = 0;
|
||||||
/// <summary>
|
|
||||||
/// This variable is used to match 16 bit pagination
|
|
||||||
/// </summary>
|
|
||||||
private bool _Match16BitPagination = false;
|
|
||||||
private bool _IsWordDocPara = false;
|
private bool _IsWordDocPara = false;
|
||||||
public bool IsWordDocPara
|
public bool IsWordDocPara
|
||||||
{
|
{
|
||||||
@ -226,13 +221,7 @@ namespace Volian.Print.Library
|
|||||||
retval = Rtf2Pdf.TextAt(cb, IParagraph, XOffset, yLocation, Width, 100, DebugInfo, yBottomMargin);
|
retval = Rtf2Pdf.TextAt(cb, IParagraph, XOffset, yLocation, Width, 100, DebugInfo, yBottomMargin);
|
||||||
if (retval == 0) // problem occurred - paragraph was not able to be printed on page
|
if (retval == 0) // problem occurred - paragraph was not able to be printed on page
|
||||||
{ // pagination logic needs to be fixed.
|
{ // pagination logic needs to be fixed.
|
||||||
cb.PdfDocument.NewPage(); // pagination issue
|
ForcePagination(cb, ref yPageStart, yTopMargin, yBottomMargin, ref yLocation, ref retval);
|
||||||
DebugText.WriteLine("*****PaginateError");
|
|
||||||
yPageStart = yTopMargin + YVeryTop;
|
|
||||||
yLocation = yPageStart - YOffset;
|
|
||||||
//MyItemInfo.ItemID, YSize, yPageSize, yLocation
|
|
||||||
DebugPagination.WriteLine("-1,'Yes','Forced Pagination',{0},{1},,{3},{4}", MyItemInfo.ItemID, YSize, 0, yLocation, MyItemInfo.DBSequence);
|
|
||||||
retval = Rtf2Pdf.TextAt(cb, IParagraph, XOffset, yLocation, Width, 100, DebugInfo, yBottomMargin);
|
|
||||||
}
|
}
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
@ -347,7 +336,7 @@ namespace Volian.Print.Library
|
|||||||
bool firstHighLevelStep = MyItemInfo.IsHigh && (MyItemInfo.MyPrevious == null);
|
bool firstHighLevelStep = MyItemInfo.IsHigh && (MyItemInfo.MyPrevious == null);
|
||||||
switch (paginate)
|
switch (paginate)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0: // No page break
|
||||||
if (MyItemInfo.IsSection)
|
if (MyItemInfo.IsSection)
|
||||||
{
|
{
|
||||||
SectionInfo si = MyItemInfo as SectionInfo;
|
SectionInfo si = MyItemInfo as SectionInfo;
|
||||||
@ -526,27 +515,6 @@ namespace Volian.Print.Library
|
|||||||
vPara.ParagraphToPdf(cb, yPageStart, yTopMargin, yBottomMargin);
|
vPara.ParagraphToPdf(cb, yPageStart, yTopMargin, yBottomMargin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void WalkStepLevel(float yTopMost)
|
|
||||||
{
|
|
||||||
foreach (vlnParagraph child in ChildrenAbove)
|
|
||||||
child.WalkStepLevel(yTopMost);
|
|
||||||
foreach (vlnParagraph child in ChildrenLeft)
|
|
||||||
child.WalkStepLevel(yTopMost);
|
|
||||||
ShowStepLevel(yTopMost);
|
|
||||||
foreach (vlnParagraph child in ChildrenRight)
|
|
||||||
child.WalkStepLevel(yTopMost);
|
|
||||||
foreach (vlnParagraph child in ChildrenBelow)
|
|
||||||
child.WalkStepLevel(yTopMost);
|
|
||||||
}
|
|
||||||
private void ShowStepLevel(float yTopMost)
|
|
||||||
{
|
|
||||||
ItemInfo item = MyItemInfo;
|
|
||||||
ItemInfo parent = item.ActiveParent as ItemInfo;
|
|
||||||
//if (para.MyItemInfo.ItemID == 205)
|
|
||||||
// Console.Write("");
|
|
||||||
DebugPagination.WriteLine("'StepLevel',{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}", YVeryTop - yTopMost, YSize, YBottomMost - yTopMost, item.ItemID, item.DBSequence, item.StepLevel, item.MyContent.Type % 10000,
|
|
||||||
parent.MyContent.Type % 10000, item.HasCautionOrNote ? 1 : 0, parent.Cautions == null ? 0 : 1);
|
|
||||||
}
|
|
||||||
private float _YVeryTop = -1;
|
private float _YVeryTop = -1;
|
||||||
public float YVeryTop
|
public float YVeryTop
|
||||||
{
|
{
|
||||||
@ -570,152 +538,6 @@ namespace Volian.Print.Library
|
|||||||
yVeryTop = part.YOffset;
|
yVeryTop = part.YOffset;
|
||||||
return yVeryTop;
|
return yVeryTop;
|
||||||
}
|
}
|
||||||
private int Paginate(float yLocation, float yTopMargin, float yBottomMargin)
|
|
||||||
{
|
|
||||||
float yPageSize = yTopMargin - yBottomMargin;
|
|
||||||
// TODO: This does not account for a long step as the last step that would exceed more than one page and
|
|
||||||
// that has an end message that needs to be accounted for in determining pagination. To do that the last
|
|
||||||
// child should be the only paragraph that accounts for the End message.
|
|
||||||
//
|
|
||||||
// If last step & there should be an end message, pagination tests need to account for the 3 lines the end
|
|
||||||
// message uses. The 3 is for a line above, the end message line & the line below (in case there is a border/box line).
|
|
||||||
|
|
||||||
// The 3 was changed to 2 for the end line & the line below. The blank line below the step gives the blank
|
|
||||||
// line above the end message, thus 2 not 3. This change was made on July 20, 2011 by RHM & KBR. The
|
|
||||||
// procedure in questions was VEWCNEMG\EMGAPP.PRC, ES-01, Step 8.
|
|
||||||
float yEndMsg = !MyItemInfo.IsSection && MyItemInfo.MyHLS.NextItem == null && (MyItemInfo.MyDocStyle.End.Message ?? "") != "" ? 2 * SixLinesPerInch : 0;
|
|
||||||
float yWithinMargins = CalculateYLocation(yLocation, yTopMargin) - yBottomMargin; // -SixLinesPerInch;
|
|
||||||
// if step is breaking over a number of pages, determine if the current step is the
|
|
||||||
// location of a pagebreak.
|
|
||||||
if (MyPageHelper.ParaBreaks.Count > 0)
|
|
||||||
{
|
|
||||||
if (this == MyPageHelper.ParaBreaks[0] || this.YTopMost > MyPageHelper.ParaBreaks[0].YTopMost)
|
|
||||||
{
|
|
||||||
MyPageHelper.ParaBreaks.RemoveAt(0);
|
|
||||||
//Console.WriteLine("'PageBreak',6,'Yes','Page Break within Step',{0},{1},{2},{3}, {4},'{5}'", MyItemInfo.ItemID, YSize, 0, 0, 0, MyItemInfo.ShortPath);
|
|
||||||
//Console.WriteLine("Prev = {0}", MyItemInfo.MyPrevious==null ? "''" : MyItemInfo.DBSequence);
|
|
||||||
ShowPageBreak(100,"Page Break within Step","Yes",YSize, yPageSize, yWithinMargins);
|
|
||||||
return 2; // break on this item within a step
|
|
||||||
}
|
|
||||||
return 0; // this is not an item with a break
|
|
||||||
}
|
|
||||||
float mySize = YSize * MyPageHelper.YMultiplier;
|
|
||||||
bool ManualPageBreak = false;
|
|
||||||
if (MyItemInfo.IsStepSection)
|
|
||||||
{
|
|
||||||
if (yLocation < yTopMargin) // continuous section
|
|
||||||
{
|
|
||||||
if (ChildrenBelow == null || ChildrenBelow.Count==0) return 0;
|
|
||||||
vlnParagraph firstChild = ChildrenBelow[0];
|
|
||||||
|
|
||||||
// This is a continuous section. There may be cases where the user put a manual page
|
|
||||||
// break on the first step (child) in the section. if so, break on the section. The
|
|
||||||
// flag SectionPageBreak is set to true to flag that a pagebreak should not be done
|
|
||||||
// on that first step.
|
|
||||||
StepConfig sc = firstChild.MyItemInfo.MyConfig as StepConfig;
|
|
||||||
ManualPageBreak = MyPageHelper.OriginalPageBreak ? (sc == null?false: sc.Step_ManualPagebreak):
|
|
||||||
sc == null? false: sc.Step_NewManualPagebreak;
|
|
||||||
if (ManualPageBreak)
|
|
||||||
{
|
|
||||||
SectionPageBreak = true;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// can the title and the first step fit?
|
|
||||||
// add the first child's size + (the section title's size)
|
|
||||||
float ySizeIncludingFirst = firstChild.YSize + (firstChild.YTop - YTop);
|
|
||||||
//if (ySizeIncludingFirst > (yLocation - yBottomMargin - SixLinesPerInch)) return 1;
|
|
||||||
if (ySizeIncludingFirst > (yLocation - yBottomMargin))
|
|
||||||
{
|
|
||||||
ShowPageBreak(100, "Page Break Before Step Section", "Yes", YSize, yPageSize, yWithinMargins);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0; // Don't Paginate (page break) on a Step Section if it's first thing on page
|
|
||||||
}
|
|
||||||
if (!MyItemInfo.IsHigh) return 0; // Don't Paginate on a Substep level
|
|
||||||
StepConfig sc1 = MyItemInfo.MyConfig as StepConfig;
|
|
||||||
ManualPageBreak = MyPageHelper.OriginalPageBreak ? (sc1 == null ? false : sc1.Step_ManualPagebreak) :
|
|
||||||
sc1 == null ? false : sc1.Step_NewManualPagebreak;
|
|
||||||
if (MyItemInfo.FirstSibling == MyItemInfo && ManualPageBreak)
|
|
||||||
{
|
|
||||||
// if parent/section used this pagebreak, skip it.
|
|
||||||
if (MyParent.SectionPageBreak)
|
|
||||||
{
|
|
||||||
ManualPageBreak = false;
|
|
||||||
MyParent.SectionPageBreak = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (_Match16BitPagination) mySize = YSize;
|
|
||||||
float ySize7LPI = YSize; // +SixLinesPerInch;
|
|
||||||
if (_Match16BitPagination) ySize7LPI += SixLinesPerInch;
|
|
||||||
string firstStep = "No";
|
|
||||||
if (MyItemInfo.IsHigh && MyItemInfo.MyPrevious == null)
|
|
||||||
firstStep = "Yes";
|
|
||||||
if (!ManualPageBreak && mySize + yEndMsg <= yWithinMargins) // Don't Paginate if there is enough room, will fit on page
|
|
||||||
//if (!ManualPageBreak && mySize + yEndMsg <= yWithinMargins + SixLinesPerInch) // Don't Paginate if there is enough room, will fit on page
|
|
||||||
{
|
|
||||||
//Console.WriteLine("'PageBreak',1,'No','HLS will fit on page',{0},{1},{2}, {3}, {4},'{5}'", MyItemInfo.ItemID, YSize, yPageSize, yWithinMargins, (int)(100 * yWithinMargins / yPageSize), MyItemInfo.ShortPath);
|
|
||||||
ShowPageBreak(-1, "HLS will fit on page", firstStep, YSize, yPageSize, yWithinMargins);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// !MyItemInfo.IsHigh - if (MyItemInfo.IsRNOPart && MyParent.XOffset < XOffset) return 0; // Don't paginate on an RNO to the right
|
|
||||||
|
|
||||||
// YSize includes a blank line after the step which we don't want to include in the page break test, thus the
|
|
||||||
// YSize - SixLinesPerInch:
|
|
||||||
if (YSize - SixLinesPerInch + yEndMsg <= yPageSize) // if the entire step can fit on one page, do a page break
|
|
||||||
{
|
|
||||||
// Don't want extra line before step
|
|
||||||
//Console.WriteLine("'PageBreak',2,'Yes','HLS will fit on 1 Page',{0},{1},{2}, {3}, {4},'{5}'", MyItemInfo.ItemID, YSize, yPageSize, yWithinMargins, (int)(100 * yWithinMargins / yPageSize), MyItemInfo.ShortPath);
|
|
||||||
ShowPageBreak(5, "HLS will fit on 1 Page at 6 LPI", "Yes", YSize, yPageSize, yWithinMargins);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
// TODO - yEndMsg - compressed size?
|
|
||||||
|
|
||||||
// ySize7LPI includes a blank line after the step which we don't want to include in the page break test.
|
|
||||||
else if (MyItemInfo.ActiveFormat.MyStepSectionLayoutData.CompressSteps && (ySize7LPI - SixLinesPerInch) < (yPageSize * SixLinesPerInch / _SevenLinesPerInch))
|
|
||||||
{
|
|
||||||
//Console.WriteLine("'PageBreak',3,'Yes','HLS will fit on 1 Page at 7 LPI',{0},{1},{2}, {3}, {4},'{5}'", MyItemInfo.ItemID, YSize, yPageSize, yWithinMargins, (int)(100 * yWithinMargins / yPageSize), MyItemInfo.ShortPath);
|
|
||||||
ShowPageBreak(7, "HLS will fit on 1 Page at 7 LPI", "Yes", YSize, yPageSize, yWithinMargins);
|
|
||||||
//Console.WriteLine("'7LPI',{0},{1}", MyItemInfo.DBSequence, YSize);
|
|
||||||
return 3; // High Level Step can fit at SevenLinesPerInch
|
|
||||||
}
|
|
||||||
else // The entire step cannot fit on a blank page.
|
|
||||||
{
|
|
||||||
// if there is more than half a page left, then start to print on the current page
|
|
||||||
float myFirstPieceSize = GetFirstPieceSize(); //Case 0
|
|
||||||
if (_Match16BitPagination) myFirstPieceSize += 2 * SixLinesPerInch;
|
|
||||||
// TODO: Put this line back to case 0, i.e. previous line. This fixes a 16-bit vs 32-bit pagination diff in EO30 Step 20.
|
|
||||||
//float myFirstPieceSize = GetFirstPieceSize() + 2 * SixLinesPerInch; //Case 10 - this is to match 16bit
|
|
||||||
if (!ManualPageBreak && MyItemInfo.ActiveFormat.MyStepSectionLayoutData.SpecialPageBreakFlag && yWithinMargins > yPageSize / 2 &&
|
|
||||||
myFirstPieceSize < yWithinMargins )
|
|
||||||
{
|
|
||||||
//Console.WriteLine("'PageBreak',4,'No','HLS will have to split anyway',{0},{1},{2}, {3}, {4},'{5}'", MyItemInfo.ItemID, YSize, yPageSize, yWithinMargins, (int)(100 * yWithinMargins / yPageSize), MyItemInfo.ShortPath);
|
|
||||||
ShowPageBreak(-4, "HLS will have to split anyway", firstStep , YSize, yPageSize, yWithinMargins);
|
|
||||||
//BuildPageBreakList(yWithinMargins+SixLinesPerInch,yPageSize-2*SixLinesPerInch); // Determine items where page break(s) occur
|
|
||||||
BuildPageBreakList(yWithinMargins + SixLinesPerInch, yPageSize); // Case 5 - Determine items where page break(s) occur
|
|
||||||
return 0; // Stay on this page
|
|
||||||
}
|
|
||||||
|
|
||||||
// Less than half a page left, start printing on a new page.
|
|
||||||
//Console.WriteLine("'PageBreak',5,'Yes','HLS will have to split',{0},{1},{2}, {3}, {4},'{5}'", MyItemInfo.ItemID, YSize, yPageSize, yWithinMargins, (int)(100 * yWithinMargins / yPageSize), MyItemInfo.ShortPath);
|
|
||||||
ShowPageBreak(3, "HLS will have to split", "Yes", YSize, yPageSize, yWithinMargins);
|
|
||||||
// Determine items where page break(s) occur
|
|
||||||
//BuildPageBreakList(yPageSize, yPageSize - 2 * SixLinesPerInch); // Case Base
|
|
||||||
BuildPageBreakList(yPageSize, yPageSize); // Case 1 :Works for ES05 Step 15 SubStep 7
|
|
||||||
return 1; // Paginate on High Level Steps
|
|
||||||
}
|
|
||||||
//if (yWithinMargins > yPageSize / 2)
|
|
||||||
//{
|
|
||||||
// Console.WriteLine("'PageBreak',4,'No','Not Half way down the page',{0},{1},{2}, {3}, {4},'{5}'", MyItemInfo.ItemID, YSize, yPageSize, yWithinMargins, (int)(100 * yWithinMargins / yPageSize), MyItemInfo.ShortPath);
|
|
||||||
// return 0; // More than half way down the page
|
|
||||||
//}
|
|
||||||
//if (ChildrenBelow.Count > 0 && ChildrenBelow[0].YSize < yWithinMargins)
|
|
||||||
// return 0;
|
|
||||||
//Console.WriteLine("'PageBreak',5,'Yes','At least half the page is filled',{0},{1},{2},{3}, {4},'{5}'", MyItemInfo.ItemID, YSize, yPageSize, yWithinMargins, (int)(100 * yWithinMargins / yPageSize), MyItemInfo.ShortPath);
|
|
||||||
//return 2;
|
|
||||||
throw new Exception("PageBreak Logic Missing, vlnParagraph.cs");
|
|
||||||
}
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This gets the height of the step with it's Caution's, Notes and potentially any First Substeps
|
/// This gets the height of the step with it's Caution's, Notes and potentially any First Substeps
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -768,56 +590,6 @@ namespace Volian.Print.Library
|
|||||||
}
|
}
|
||||||
return para;
|
return para;
|
||||||
}
|
}
|
||||||
private void ShowPageBreak(int instance, string message, string breakOrNot, float YSize, float yPageSize, float yWithinMargins)
|
|
||||||
{
|
|
||||||
if (breakOrNot == "Yes")
|
|
||||||
{
|
|
||||||
// DebugPagination.WriteLine("{0}", MyItemInfo.DBSequence); //,instance);
|
|
||||||
DebugPagination.WriteLine("{0},'{1}',{2},'{3}','{4}',{5},{6},{7},{8},{9}",MyPageHelper.MyPdfContentByte.PdfWriter.CurrentPageNumber, MyItemInfo.ShortPath, instance, message, breakOrNot,
|
|
||||||
MyItemInfo.ItemID, YSize, yPageSize, yWithinMargins, (int)(100 * yWithinMargins / yPageSize));
|
|
||||||
}
|
|
||||||
// Console.WriteLine("{0},{1}", MyItemInfo.DBSequence, IsFirstSubStep(MyItemInfo)); //,instance);
|
|
||||||
}
|
|
||||||
private void BuildPageBreakList(float ySpaceOnCurPage, float yPageSize)
|
|
||||||
{
|
|
||||||
ParagraphLocations myLocations = new ParagraphLocations();
|
|
||||||
BuildLocationList(YTopMost, myLocations);
|
|
||||||
StepLevelList myList = myLocations.BuildStepLevelList();
|
|
||||||
// Find Break Locations in the list based upon StepLevel and yLocation
|
|
||||||
float yTop = 0;
|
|
||||||
float yLowerLimit = (yPageSize - 2 * SixLinesPerInch) / 2;
|
|
||||||
float yStart = Math.Max(0,(yPageSize - 2 * SixLinesPerInch) - ySpaceOnCurPage);
|
|
||||||
//Console.WriteLine("'yStart',{0},{1}", MyItemInfo.DBSequence, yStart);
|
|
||||||
|
|
||||||
// The following three lines make page breaking match 16-bit:
|
|
||||||
if (_Match16BitPagination)
|
|
||||||
{
|
|
||||||
yLowerLimit = yStart - SixLinesPerInch + ySpaceOnCurPage / 2;
|
|
||||||
if ((yStart + MyItemInfo.MyDocStyle.Layout.TopMargin + 2 * SixLinesPerInch) > ((MyItemInfo.MyDocStyle.Layout.TopMargin + yPageSize - 2 * SixLinesPerInch) / 2))
|
|
||||||
yLowerLimit = yStart + 2 * SixLinesPerInch;
|
|
||||||
}
|
|
||||||
// Make sure that the FirstPiece (Caution Note HLS and First Substeps) fit
|
|
||||||
float myFirstPieceSize = GetFirstPieceSize(); //Case 0
|
|
||||||
if (myFirstPieceSize < ySpaceOnCurPage) yLowerLimit = Math.Max(myFirstPieceSize + yStart, yLowerLimit);
|
|
||||||
while ((YSize - yTop) >= ySpaceOnCurPage)
|
|
||||||
{
|
|
||||||
vlnParagraph paraBreak = FindPageBreak(yStart, ySpaceOnCurPage, yLowerLimit, myList);
|
|
||||||
if (paraBreak == null) break;
|
|
||||||
// yTopNew is y Location of this page break. YTopMost is top of HLS, including any Cautions/Notes/Boxes/etc
|
|
||||||
float yTopNew = paraBreak.YVeryTop - YTopMost;
|
|
||||||
RemoveProcessedParagraphs(myList, yTopNew-yTop);
|
|
||||||
yTop = yTopNew;
|
|
||||||
MyPageHelper.ParaBreaks.Add(paraBreak);
|
|
||||||
ySpaceOnCurPage = yPageSize - 2 * SixLinesPerInch; // Allow for continue message and blank line.
|
|
||||||
//ySpaceOnCurPage = yPageSize; // Allow for continue message and blank line.
|
|
||||||
//DocStyle docstyle = MyItemInfo.MyDocStyle;
|
|
||||||
//string myMsg = docstyle.Continue.Bottom.Message;
|
|
||||||
//if ((myMsg ?? "") != "") ySpaceOnCurPage -= 2 * SixLinesPerInch; // Allow for continue message and blank line.
|
|
||||||
yLowerLimit = ySpaceOnCurPage / 2;
|
|
||||||
if(_Match16BitPagination)yLowerLimit -= 1.5F * SixLinesPerInch; // 276 for HLP
|
|
||||||
yStart = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Find items from previous page (yLocation less than yTop) and remove them from the list.
|
/// Find items from previous page (yLocation less than yTop) and remove them from the list.
|
||||||
/// yTop is the new starting location on the next page for this step.
|
/// yTop is the new starting location on the next page for this step.
|
||||||
@ -861,45 +633,6 @@ namespace Volian.Print.Library
|
|||||||
myList.Remove(stepLevel);
|
myList.Remove(stepLevel);
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Finds the highest StepLevel (lowest StepLevel number, 0 = HLS, 1 = first substep) that
|
|
||||||
/// fills the page sufficiently (more than half-full)
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="yWithinMargins"></param>
|
|
||||||
/// <param name="yTop"></param>
|
|
||||||
/// <param name="myList"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
private static vlnParagraph FindPageBreak(float yStart, float yUpperLimit, float yLowerLimit, StepLevelList myList)
|
|
||||||
{
|
|
||||||
foreach (int stepLevel in myList.Keys) // loop thru StepLevels, starting with lowest.
|
|
||||||
{
|
|
||||||
foreach (float yLocation in myList[stepLevel].Keys) // loop thru yLocation
|
|
||||||
{
|
|
||||||
// The top of this step will fit onto page (-yLocation < yWithinMargins)
|
|
||||||
if (-yLocation <= yUpperLimit) // Fix for OFN-RJ-23
|
|
||||||
//if (-yLocation < yUpperLimit) // Before
|
|
||||||
//if (-yLocation < yWithinMargins && myList[stepLevel][yLocation].MyItemInfo.MyPrevious != null)
|
|
||||||
{
|
|
||||||
//ItemInfo prev = myList[stepLevel][yLocation].MyItemInfo.MyPrevious;
|
|
||||||
//if (myList[stepLevel][yLocation].MyItemInfo.ItemID == 5609) Console.WriteLine("aer");
|
|
||||||
//if (myList[stepLevel][yLocation].MyItemInfo.ItemID == 4312) Console.WriteLine("rno");
|
|
||||||
// The top of this step is more than 1/2 way down the page
|
|
||||||
if ((-yLocation + yStart) >= yLowerLimit)
|
|
||||||
{
|
|
||||||
return myList[stepLevel][yLocation];
|
|
||||||
}
|
|
||||||
// if is a caution or note & parent is a substep and entire substep doesn't fit, break.
|
|
||||||
if ((myList[stepLevel][yLocation].MyItemInfo.IsNote || myList[stepLevel][yLocation].MyItemInfo.IsCaution) &&
|
|
||||||
!myList[stepLevel][yLocation].MyParent.MyItemInfo.IsHigh &&
|
|
||||||
myList[stepLevel][yLocation].MyParent.YSize > (yUpperLimit + yLocation))
|
|
||||||
{
|
|
||||||
return myList[stepLevel][yLocation];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// Builds a list of paragraphs by StepLevel and yLocation in descending order.
|
/// Builds a list of paragraphs by StepLevel and yLocation in descending order.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="yTopMost"></param>
|
/// <param name="yTopMost"></param>
|
||||||
@ -1109,7 +842,6 @@ namespace Volian.Print.Library
|
|||||||
else
|
else
|
||||||
if (itemInfo.FormatStepData != null && itemInfo.FormatStepData.StepPrintData != null) XOffset += (float)(itemInfo.FormatStepData.StepPrintData.PosAdjust ?? 0);
|
if (itemInfo.FormatStepData != null && itemInfo.FormatStepData.StepPrintData != null) XOffset += (float)(itemInfo.FormatStepData.StepPrintData.PosAdjust ?? 0);
|
||||||
|
|
||||||
|
|
||||||
bool printMetaHdr = false;
|
bool printMetaHdr = false;
|
||||||
if (itemInfo.Steps != null && itemInfo.IsSection && itemInfo.Sections != null && itemInfo.Sections.Count > 0)
|
if (itemInfo.Steps != null && itemInfo.IsSection && itemInfo.Sections != null && itemInfo.Sections.Count > 0)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user