Fix for auto TOC grouping logic (B2016-200) and for line spacing consistency (B2016-205)
This commit is contained in:
parent
ae4d9fa4b1
commit
6a737a961d
@ -1093,7 +1093,7 @@ namespace Volian.Print.Library
|
||||
//ItemInfo procItem = ItemInfo.Get(myProcedure.ItemID);
|
||||
ItemInfo procItem = myProcedure;
|
||||
lastyLocation = 0;
|
||||
AddSectionToTOC(tocSection, procItem, tOfC, cb, yTopMargin, 0);
|
||||
AddSectionToTOC(tocSection, procItem, tOfC, cb, yTopMargin, 0, false); // add all of the marked sections and sub-sections to the table of contents
|
||||
if (textLayer != null) cb.EndLayer();
|
||||
NewPage();
|
||||
//_MyLog.InfoFormat("NewPage 4 {0}", cb.PdfWriter.CurrentPageNumber);
|
||||
@ -1119,7 +1119,7 @@ namespace Volian.Print.Library
|
||||
_RtfSB.Append("}");
|
||||
return _RtfSB.ToString();
|
||||
}
|
||||
private float AddSectionToTOC(SectionInfo tocSection, ItemInfo ii, TableOfContentsData tOfC, PdfContentByte cb, float yPageStart, float yLocation)
|
||||
private float AddSectionToTOC(SectionInfo tocSection, ItemInfo ii, TableOfContentsData tOfC, PdfContentByte cb, float yPageStart, float yLocation, bool didSubSecLineSpacing)
|
||||
{
|
||||
// The following adjustments are for WCN1:
|
||||
// for xAdjNumber: 6 is for 1 char less in 16bit (\promsnt\exe\print\tabocont.c, method 'howMany'.
|
||||
@ -1140,12 +1140,39 @@ namespace Volian.Print.Library
|
||||
string lastTOCGroupHeading = "";
|
||||
if (ii.Sections != null)
|
||||
{
|
||||
int sectCnt = 0; // keep count of which section/sub-section we are processing
|
||||
bool doSubY = false;
|
||||
foreach (SectionInfo mySection in ii.Sections)
|
||||
{
|
||||
sectCnt++;
|
||||
SectionConfig sc = mySection.MyConfig as SectionConfig;
|
||||
if ((mySection.MyDocStyle != null && mySection.MyDocStyle.IncludeInTOC && (sc == null || sc.Section_TOC != "Y"))
|
||||
|| ((mySection.MyDocStyle == null || !mySection.MyDocStyle.IncludeInTOC) && (sc != null && sc.Section_TOC == "Y")))
|
||||
{
|
||||
// for indenting of subsections, count up tree. Only start indenting
|
||||
// at third level, i.e. not indent on 1.0 and 1.1, but indent on 1.1.1:
|
||||
int level = 0;
|
||||
ItemInfo iilvl = mySection as ItemInfo;
|
||||
while (!iilvl.IsProcedure)
|
||||
{
|
||||
level++;
|
||||
iilvl = iilvl.MyParent;
|
||||
}
|
||||
// check what level the plant wants the auto ToC indented:
|
||||
int tofCNumLevels = tocSection.ActiveFormat.PlantFormat.FormatData.SectData.AccSectionData.TableOfContentsData.TofCNumLevels ?? 0;
|
||||
if (tofCNumLevels > 0 && level > tofCNumLevels) return yLocation;
|
||||
|
||||
int startIndentAfterLevel = tocSection.ActiveFormat.PlantFormat.FormatData.SectData.AccSectionData.TableOfContentsData.TofCStartIndentAfterLevel ?? 2; //
|
||||
//level = level <= 2 ? 0 : level - 2; // no indenting until third level
|
||||
level = level <= startIndentAfterLevel ? 0 : level - startIndentAfterLevel;
|
||||
float indentOffset = (level * (secTitlePos - secNumPos));
|
||||
|
||||
if (didSubSecLineSpacing && sectCnt == 1 && indentOffset > 0) // processing first sub-section and we are indenting B2016-205
|
||||
{
|
||||
// processed last sub-section so use the main section line spacing (most times is double spaced)
|
||||
yLocation -= (float)(tOfC.TofCLineSpacingSub ?? 1) * vlnPrintObject.SixLinesPerInch;
|
||||
yLocation += (float)(tOfC.TofCLineSpacing ?? 1) * vlnPrintObject.SixLinesPerInch;
|
||||
}
|
||||
// The Group Title logic was added for V.C. Summer and Farley(new writer guide format)
|
||||
// It allows the user to enter a Table of Contents Grouping Title on the Section Property (under automation)
|
||||
// The grouping title will print if the same title wasn't last printed
|
||||
@ -1158,7 +1185,7 @@ namespace Volian.Print.Library
|
||||
string rtfGrpingText = GetRtfToC(tocGrpHeading, tOfC, grpingFont);
|
||||
Paragraph myparagraphtc = vlnPrintObject.RtfToParagraph(rtfGrpingText);
|
||||
float w = secPagePos - 6;
|
||||
if (yLocation > 0) yLocation += vlnPrintObject.SixLinesPerInch; // for two blank line between last TOC title and the new grouping title
|
||||
//if (yLocation > 0) yLocation += vlnPrintObject.SixLinesPerInch;// commented out for B2016-200 // for two blank line between last TOC title and the new grouping title
|
||||
float rtnval = Rtf2Pdf.TextAt(cb, myparagraphtc, leftMargin + secNumPos, yPageStart - yLocation, w, height, "", yBottomMargin);
|
||||
if (rtnval == 0) // couldn't fit, flags need for a page break.
|
||||
{
|
||||
@ -1167,6 +1194,7 @@ namespace Volian.Print.Library
|
||||
yLocation = lastyLocation = 0;
|
||||
rtnval = Rtf2Pdf.TextAt(cb, myparagraphtc, leftMargin + secNumPos, yPageStart - yLocation, w, height, "", yBottomMargin);
|
||||
}
|
||||
yLocation += vlnPrintObject.SixLinesPerInch; // for two blank line between last TOC title and the new grouping title - added for B2016-200
|
||||
int lnaftergroup = ((tocSection.ActiveFormat.PlantFormat.FormatData.SectData.AccSectionData.TableOfContentsData.TofCLineSpacingSub ?? 0) > 0) ? 1 : 2;
|
||||
yLocation += (lnaftergroup * vlnPrintObject.SixLinesPerInch); // new line
|
||||
}
|
||||
@ -1194,24 +1222,6 @@ namespace Volian.Print.Library
|
||||
float numwidth = width;
|
||||
Rtf2Pdf.Offset = new PointF(0, 2.5F);
|
||||
|
||||
// for indenting of subsections, count up tree. Only start indenting
|
||||
// at third level, i.e. not indent on 1.0 and 1.1, but indent on 1.1.1:
|
||||
int level = 0;
|
||||
ItemInfo iilvl = mySection as ItemInfo;
|
||||
while (!iilvl.IsProcedure)
|
||||
{
|
||||
level++;
|
||||
iilvl = iilvl.MyParent;
|
||||
}
|
||||
// check what level the plant wants the auto ToC indented:
|
||||
int tofCNumLevels = tocSection.ActiveFormat.PlantFormat.FormatData.SectData.AccSectionData.TableOfContentsData.TofCNumLevels ?? 0;
|
||||
if (tofCNumLevels > 0 && level > tofCNumLevels) return yLocation;
|
||||
|
||||
int startIndentAfterLevel = tocSection.ActiveFormat.PlantFormat.FormatData.SectData.AccSectionData.TableOfContentsData.TofCStartIndentAfterLevel ?? 2; //
|
||||
//level = level <= 2 ? 0 : level - 2; // no indenting until third level
|
||||
level = level <= startIndentAfterLevel ? 0 : level - startIndentAfterLevel;
|
||||
float indentOffset = (level * (secTitlePos - secNumPos));
|
||||
|
||||
// if the starting column of text would be in 'middle of' the number, just put it
|
||||
// a few spaces after the number. The '18' below represents 3 chars.
|
||||
float adjSecTitlePos = secTitlePos + indentOffset + (level * 6);
|
||||
@ -1333,15 +1343,28 @@ namespace Volian.Print.Library
|
||||
}
|
||||
//If the format wants single spacing within subsections (2nd level and lower), then need to figure out
|
||||
// spacing (vcb1 table of contents)
|
||||
bool dosuby = (((tocSection.ActiveFormat.PlantFormat.FormatData.SectData.AccSectionData.TableOfContentsData.TofCLineSpacingSub ?? 1) > 0)
|
||||
&& (mySection.MyParent.IsSection && ((mySection.Sections != null && mySection.Sections.Count > 0) || (level > 0 && mySection.NextItem != null))))
|
||||
//bool dosuby = (((tocSection.ActiveFormat.PlantFormat.FormatData.SectData.AccSectionData.TableOfContentsData.TofCLineSpacingSub ?? 1) > 0)
|
||||
// && (mySection.MyParent.IsSection && ((mySection.Sections != null && mySection.Sections.Count > 0) || (level > 0 && mySection.NextItem != null))))
|
||||
// || didGrp;
|
||||
doSubY = (((tocSection.ActiveFormat.PlantFormat.FormatData.SectData.AccSectionData.TableOfContentsData.TofCLineSpacingSub ?? 1) > 0)
|
||||
&& (mySection.MyParent.IsSection && (/* mySection.Sections == null && */ sectCnt < ii.Sections.Count))) // B2016-205
|
||||
|| didGrp;
|
||||
if (dosuby)
|
||||
if (doSubY)
|
||||
yLocation += (float)(tOfC.TofCLineSpacingSub ?? 1) * vlnPrintObject.SixLinesPerInch;
|
||||
else
|
||||
yLocation += (float)(tOfC.TofCLineSpacing ?? 1) * vlnPrintObject.SixLinesPerInch;
|
||||
}
|
||||
yLocation = AddSectionToTOC(tocSection, mySection, tOfC, cb, yPageStart, yLocation);
|
||||
float savYLoc = yLocation;
|
||||
yLocation = AddSectionToTOC(tocSection, mySection, tOfC, cb, yPageStart, yLocation, doSubY);
|
||||
if (savYLoc == yLocation) // nothing was outputted i.e. the subsections are not included on the TOC // B2016-205
|
||||
{
|
||||
if (doSubY && sectCnt == ii.Sections.Count)
|
||||
{
|
||||
// processed last sub-section so use the main section line spacing (most times is double spaced)
|
||||
yLocation -= (float)(tOfC.TofCLineSpacingSub ?? 1) * vlnPrintObject.SixLinesPerInch;
|
||||
yLocation += (float)(tOfC.TofCLineSpacing ?? 1) * vlnPrintObject.SixLinesPerInch;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return yLocation;
|
||||
|
Loading…
x
Reference in New Issue
Block a user