diff --git a/PROMS/Volian.Print.Library/Pagination.cs b/PROMS/Volian.Print.Library/Pagination.cs index fa1d6de6..262e6369 100644 --- a/PROMS/Volian.Print.Library/Pagination.cs +++ b/PROMS/Volian.Print.Library/Pagination.cs @@ -234,6 +234,23 @@ namespace Volian.Print.Library // 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 //is the amount of space left (yWithinMargins) is greater than 1/2 of the current page (yPageSize / 2): + // VCS EOP-4.3 Step 15 + // ***** Adjust yWithinMargins for the bottom continue message + //DocStyle docstyle = MyItemInfo.MyDocStyle; + //string myBottomMsg = docstyle.Continue.Bottom.Message; + //float myBottomMsgSpace = ((myBottomMsg ?? "") != "") ? 2 * SixLinesPerInch : 0; + //switch (docstyle.Continue.Bottom.Location) + //{ + // case E_ContBottomLoc.BottomOfPage: // place continue message at bottom of page + // // The following format flag was added for FNP, without the flag (which stops the reset of BottomMsgSpace) + // // a number of FNP procedures had overwritten steps/bottom continue message. An example can be + // // found in FNP = SAMGS;FNP-1-SACRG-2, step 1. + // if (!docstyle.Continue.Bottom.NoOverrideSpace) + // myBottomMsgSpace = 0; + // break; + //} + //float yWithinMarginsCM = yWithinMargins - myBottomMsgSpace; + //// **** Adjust yWithinMargins for the bottom continue message if (KeepWithHeader ||( !ManualPageBreak && ((MyItemInfo.ActiveFormat.MyStepSectionLayoutData.SpecialPageBreakFlag && yWithinMargins > yPageSize / 2 && myFirstPieceSize < yWithinMargins) || KeepStepsOnPage))) { @@ -309,7 +326,7 @@ namespace Volian.Print.Library //_MyLog.ErrorFormat("<<< ERROR >>> Forced Pagination - ItemID = {0}\r\nLocation = '{1}'", MyItemInfo.ItemID, MyItemInfo.ShortPath); _MyLog.ErrorFormat("<<< ERROR >>> Forced Pagination\r\n==>'Forced Pagination',{0},'{1}','{2}'" , MyItemInfo.ItemID, MyItemInfo.MyDocVersion.MyFolder.Name, MyItemInfo.ShortPath); - DebugPagination.WriteLine("------,'Yes','Forced Pagination',{0},{1},,{3},{4}", MyItemInfo.ItemID, YSize, 0, yLocation, MyItemInfo.DBSequence); + DebugPagination.WriteLine("=====>,'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, bool manualPageBreak) @@ -385,12 +402,15 @@ namespace Volian.Print.Library vlnParagraph paraBreak = null; while (((YSize - yTop) > ySpaceOnCurPage) || PageBreakOnStepList.Count > 0) { + float ySpaceOnCurPageSave = ySpaceOnCurPage; ySpaceOnCurPage -= myBottomMsgSpace; vlnParagraph lastBreak = paraBreak; paraBreak = FindPageBreak(yStart, ySpaceOnCurPage, yLowerLimit, myList, paraBreak, yPageSize - (myTopMsgSpace + SixLinesPerInch) - myBottomMsgSpace); //Console.WriteLine("Break at {0}", paraBreak.MyItemInfo.ShortPath);//Comment Out before release if (paraBreak == null) { + DebugPagination.WriteLine("<<< ERROR >>> Cannot find a place to break ==>,{0},'{1}','{2}',{3},{4}" + , MyItemInfo.ItemID, MyItemInfo.MyDocVersion.MyFolder.Name, MyItemInfo.ShortPath, YSize - yTop, ySpaceOnCurPageSave); _MyLog.ErrorFormat("<<< ERROR >>> Cannot find a place to break\r\n==>'Cannot Find Place to Break',{0},'{1}','{2}'" , MyItemInfo.ItemID, MyItemInfo.MyDocVersion.MyFolder.Name, MyItemInfo.ShortPath); break; @@ -446,6 +466,10 @@ namespace Volian.Print.Library private static vlnParagraph FindPageBreak(float yStart, float yUpperLimit, float yLowerLimit, StepLevelList myList, vlnParagraph lastBreak, float fullPage) { vlnParagraph minPara = null; + //StringBuilder minBuff = new StringBuilder(); + float? yLocationMin=null; + vlnParagraph minPara2 = null; + float? yLocationMin2=null; foreach (int stepLevel in myList.Keys) // loop thru StepLevels, starting with lowest. { foreach (float yLocation in myList[stepLevel].Keys) // loop thru yLocation @@ -473,9 +497,51 @@ namespace Volian.Print.Library // The top of this step will fit onto page (-yLocation < yWithinMargins) float wcnChkLstBorder = myPara.MyItemInfo.MyHLS != null && myPara.MyItemInfo.MyHLS.FormatStepData.UseSmartTemplate && (myPara.MyItemInfo.MyHLS.FormatStepData.Suffix ?? "") != "" ? 2*SixLinesPerInch : 0; - if (myPara != lastBreak && (minPara == null || minPara.YTop > myPara.YTop)) - if ((-yLocation + yStart) >= yLowerLimit) // Only if it is more than the lower limit + if(myPara != lastBreak) + { + if ((-yLocation + yStart) >= yLowerLimit) // More than the lower limit + { + if (yLocationMin == null) // No old location + { + //minBuff.AppendLine(string.Format("OLD1 >>>>> '{0}',{1},{2}", myPara.MyItemInfo.ShortPath, -yLocation, yUpperLimit)); + yLocationMin = yLocation; minPara = myPara; + } + else if (-yLocation < -yLocationMin && -yLocationMin >= yUpperLimit) // New location is smaller and old location excedes limit + { + //minBuff.AppendLine(string.Format("NEW1A >>>>> '{0}',{1},{2}", myPara.MyItemInfo.ShortPath, -yLocation, yUpperLimit)); + yLocationMin = yLocation; + minPara = myPara; + } + else if (-yLocation > -yLocationMin && -yLocation <= yUpperLimit) // New location is larger and new location is less than limit + { + //minBuff.AppendLine(string.Format("NEWB1 >>>>> '{0}',{1},{2}", myPara.MyItemInfo.ShortPath, -yLocation, yUpperLimit)); + yLocationMin = yLocation; + minPara = myPara; + } + } + else // Less than the lower limit + { + if (yLocationMin2 == null) + { + //minBuff.AppendLine(string.Format("OLD2 >>>>> '{0}',{1},{2}", myPara.MyItemInfo.ShortPath, -yLocation, yUpperLimit)); + yLocationMin2 = yLocation; + minPara2 = myPara; + } + else if (-yLocation < -yLocationMin2 && -yLocationMin2 >= yUpperLimit) // New location is smaller and old location excedes limit + { + //minBuff.AppendLine(string.Format("NEW2A >>>>> '{0}',{1},{2}", myPara.MyItemInfo.ShortPath, -yLocation, yUpperLimit)); + yLocationMin2 = yLocation; + minPara2 = myPara; + } + else if (-yLocation > -yLocationMin2 && -yLocation <= yUpperLimit) // New location is larger and new location is less than limit + { + //minBuff.AppendLine(string.Format("NEW2B >>>>> '{0}',{1},{2}", myPara.MyItemInfo.ShortPath, -yLocation, yUpperLimit)); + yLocationMin2 = yLocation; + minPara2 = myPara; + } + } + } if (myPara.MyParent.YTop == myPara.YTop) myPara = myPara.MyParent; if (wcnChkLstBorder -yLocation <= yUpperLimit) // Fix for OFN-RJ-23 //if (-yLocation < yUpperLimit) // Before @@ -491,7 +557,7 @@ namespace Volian.Print.Library return myPara; // If this item will not fit on the current page, put a page break - if (myPara.YBottom - myPara.YTop > (yUpperLimit - (-yLocation + yStart))) + if (myPara.YBottom - myPara.YTop > (yUpperLimit + yLocation)) if (myPara != lastBreak) if ((-yLocation + yStart) >= yLowerLimit) // Only if it is more than the lower limit return myPara; @@ -507,7 +573,11 @@ namespace Volian.Print.Library } } } - return minPara; + //DebugPagination.Write(minBuff.ToString()); + if (-yLocationMin > yUpperLimit && minPara2 != null) minPara = null; + //if (minPara != null) DebugPagination.WriteLine("### 111111 {0}", minPara); + //if(minPara2 != null) DebugPagination.WriteLine("### n222222 {0}", minPara2); + return minPara ?? minPara2; } //private void WalkStepLevel(float yTopMost)