/// <summary> /// Override of FormResultPdfReport.PrintGenericSection /// /// This will delegate to the special-case section printing methods above, or use the base PrintGenericSection implimentation /// </summary> /// <param name="output"></param> /// <param name="section"></param> /// <param name="indentLevel"></param> override protected void PrintGenericSection(PdfOutput output, def_Sections section, int indentLevel) { if (sectionsToSkip.Contains(section.identifier)) { Debug.WriteLine("AdapPdfReport.PrintGenericSection Skip it: " + section.identifier); return; } else if (specialCaseSections.ContainsKey(section.identifier)) { if (output.drawY < 1.5) { output.appendPageBreak(); } if (indentLevel < 2) { output.appendSectionBreak(); } double sectionLabelIndent = .5 + labelIndent * (indentLevel - 1); double itemLabelIndent = labelIndent * indentLevel; double responseIndent = valueIndent + labelIndent * (indentLevel - 1); //print section content using special case handler specialCaseSections[section.identifier].Invoke(section, indentLevel, sectionLabelIndent, itemLabelIndent, responseIndent); } else { //print section header and content generically, excluding application comments except in the "finalCert" section Dictionary <string, string> responsesByItemVariable = GetResponsesByItemVariableIdentifierThroughLookupTables(section); if (section.identifier != "ADAP_finalCert") { responsesByItemVariable.Remove("ADAP_Application_Comments_txt"); } Debug.WriteLine("AdapPdfReport.base.PrintGenericSection: " + section.identifier); base.PrintGenericSection(output, section, indentLevel, responsesByItemVariable); } }
protected void PrintGenericSection( PdfOutput output, def_Sections section, int indentLevel, Dictionary <string, string> responsesByItemVariable) { if (output.drawY < 1.5) { output.appendPageBreak(); } if (indentLevel < 2) { output.appendSectionBreak(); } //print section title + identifier double sectionLabelIndent = .5 + labelIndent * (indentLevel - 1); double itemLabelIndent = labelIndent * indentLevel; double responseIndent = valueIndent + labelIndent * (indentLevel - 1); output.appendWrappedText(buildSectionHeaderText(section), sectionLabelIndent, 8 - sectionLabelIndent, output.sectionHeaderFontSize); output.drawY -= .1; List <def_Items> ignoreList = new List <def_Items>(); int singleBoolCount = 0; formsRepo.GetSectionItems(section); //add items wtihout responses to the ignore list, count the number of single-boolean items Debug.WriteLine("FormResultPdfReport.PrintGenericSection section: " + section.identifier); foreach (def_SectionItems si in section.def_SectionItems.Where(si => !si.subSectionId.HasValue)) { def_Items itm = formsRepo.GetItemById(si.itemId); Debug.WriteLine(" itm: " + itm.identifier); ICollection <def_ItemVariables> ivs = formsRepo.GetItemVariablesByItemId(itm.itemId); if (ivs.Any(iv => !responsesByItemVariable.ContainsKey(iv.identifier) || String.IsNullOrWhiteSpace(responsesByItemVariable[iv.identifier]))) { ignoreList.Add(itm); } if ((ivs.Count == 1) && (ivs.First().baseTypeId == 1)) { singleBoolCount++; } } //if there at least 4 boolean items in this section, ignore all labeled items with single negative boolean responses if (singleBoolCount >= 4) { foreach (def_SectionItems si in section.def_SectionItems.Where(si => !si.subSectionId.HasValue)) { def_Items itm = formsRepo.GetItemById(si.itemId); ICollection <def_ItemVariables> ivs = formsRepo.GetItemVariablesByItemId(itm.itemId); if (ignoreList.Contains(itm) || itm.label.Trim().Length == 0) { continue; } if (ivs.Count == 1) { def_ItemVariables iv = ivs.First(); if ((iv.baseTypeId == 1) && (!responsesByItemVariable.ContainsKey(iv.identifier) || responsesByItemVariable[iv.identifier].Equals("No"))) { ignoreList.Add(itm); } } } } //iterate through section items, printing to pdf output foreach (def_SectionItems si in section.def_SectionItems) { if (si.subSectionId.HasValue) { PrintGenericSection(output, formsRepo.GetSubSectionById(si.subSectionId.Value), indentLevel + 1); } else { def_Items itm = formsRepo.GetItemById(si.itemId); if (ignoreList.Where(x => x.itemId == itm.itemId).Any()) { continue; } formsRepo.GetEnterpriseItems(new def_Items[] { itm }.ToList(), formResults.EnterpriseID.Value); appendItemLabelAndResponses(itm, itemLabelIndent, responseIndent, responsesByItemVariable); } } }
protected void PrintSupplementalQuestions(PdfOutput output) { def_Parts part = formsRepo.GetPartByFormAndIdentifier(form, "Supplemental Questions"); AppendPartHeader(output, part.identifier); def_Sections topSct = formsRepo.GetSectionsInPart(part).FirstOrDefault(); if (topSct == null) { throw new Exception("not sections found in part with partId " + part.partId); } List <def_Sections> sectionList = new List <def_Sections>(); formsRepo.SortSectionItems(topSct); foreach (def_SectionItems sctnItm in topSct.def_SectionItems) { if (sctnItm.display == false) { continue; } def_Sections subSctns = formsRepo.GetSubSectionById(sctnItm.subSectionId);// sctnItm.def_SubSections.def_Sections; sectionList.Add(subSctns); } int grayCount = 0; bool showWhiteQuestions = true; foreach (def_Sections sct in sectionList) { formsRepo.SortSectionItems(sct); foreach (def_SectionItems si in sct.def_SectionItems) { if (si.display == false) { continue; } //if this is a "gray" question... (high-level questions pertaining to a set of "white" questions) if (si.subSectionId == null) { grayCount++; if (grayCount > 1) { output.drawY -= .5; } def_Items itm = si.def_Items; def_ItemVariables iv = itm.def_ItemVariables.FirstOrDefault(); if (iv == null) { throw new Exception("no item variable for question with itemId " + si.itemId); } def_ResponseVariables rv = formsRepo.GetResponseVariablesByFormResultItemVarId(formResultId, iv.itemVariableId);//iv.def_ResponseVariables.FirstOrDefault(); if (rv == null) { continue; } //don't show the white questions if the response value is false if (iv.baseTypeId == 1 && (rv.rspValue.ToLower().Equals("false") || rv.rspValue.Equals("0"))) { showWhiteQuestions = false; } else { showWhiteQuestions = true; } if (output.drawY < .5) { output.appendPageBreak(); } if (!itm.label.Equals("Page Notes")) { double y = output.drawY; output.appendWrappedText(grayCount + ".", .8, 6, output.boldFont); output.drawY = y; } output.appendWrappedText(itm.label, 1, 7, output.boldFont); output.appendWrappedText(GetSupplementalResponseText(iv, rv), 1.5, 6, output.boldFont); output.drawY -= PdfOutput.itemSpacing; } // if this is a "white" question-set else { if (!showWhiteQuestions) { continue; } foreach (def_SectionItems ssi in si.def_SubSections.def_Sections.def_SectionItems) { def_Items itm = ssi.def_Items; if (itm == null) { throw new Exception("no item for setionItems with sectionItemId " + ssi.sectionItemId); } def_ItemVariables iv = itm.def_ItemVariables.FirstOrDefault(); if (iv == null) { throw new Exception("no item variable for item with itemId " + itm.itemId); } def_ResponseVariables rv = formsRepo.GetResponseVariablesByFormResultItemVarId(formResultId, iv.itemVariableId); try { output.appendWrappedText(itm.label, 1.1, 6); } catch (ApplicationException e) { string msg = "Exception appending label \"" + itm.label + "\" for item with itemId " + itm.itemId + "\nchars:"; foreach (char c in itm.label.ToCharArray()) { msg += " " + c + "(" + ((int)c) + ")"; } throw new Exception(msg, e); } output.appendWrappedText(GetSupplementalResponseText(iv, rv), 1.5, 6); output.drawY -= PdfOutput.itemSpacing; } } } } }
//this is for the sections in the "Exceptional medical... needs" part private void PrintExceptMedNeedsTable(def_Parts part, PdfOutput output, def_Sections sct) { int nCols = 4; string[] headers = { sct.title, "", "Score", "Important \"To\" or \"For\"" }; double[] indents = { .5, .75, 5.6, 6.75 }; //headers output.drawY -= .1; for (int i = 0; i < nCols; i++) { output.DrawText(output.boldFont, output.fontSize, indents[i], output.drawY, headers[i]); } output.drawY += .13; output.appendSectionBreak(); output.drawY -= PdfOutput.itemSpacing; indents = new double[] { .5, .75, 5.73, 6.75 }; List <def_Items> itms = new List <def_Items>(); formsRepo.SortSectionItems(sct); foreach (def_SectionItems si in sct.def_SectionItems) { if (si.subSectionId == null) // NOTE: this case probably never occurs for this Part { itms.Add(formsRepo.GetItemById(si.itemId)); } else { def_Sections sctn = formsRepo.GetSubSectionById(si.subSectionId); formsRepo.SortSectionItems(sctn); foreach (def_SectionItems ssi in sctn.def_SectionItems) { if (ssi.subSectionId == null) { itms.Add(formsRepo.GetItemById(ssi.itemId)); } } } } int nRows = itms.Count() + 1; // Load the Values for (int row = 0; row < itms.Count; row++) { def_Items itm = itms[row]; formsRepo.GetItemResultByFormResItem(formResultId, itm.itemId); def_ItemResults itmResults = itm.def_ItemResults.SingleOrDefault(ir => (ir.formResultId == formResultId)); formsRepo.GetItemResultsResponseVariables(itmResults); foreach (def_ResponseVariables rv in itmResults.def_ResponseVariables) { rv.def_ItemVariables = formsRepo.GetItemVariableById(rv.itemVariableId); } output.drawY -= .1; for (int col = 0; col < nCols; col++) { string s = "ERROR"; switch (col) { case 0: s = (row + 1).ToString(); break; case 1: s = itm.label; break; case 2: def_ResponseVariables rv = itmResults.def_ResponseVariables.SingleOrDefault(r => r.def_ItemVariables.identifier.EndsWith("_ExMedSupport")); s = ((rv == null) ? "" : rv.rspValue); break; case 3: s = String.Empty; break; } output.DrawText(output.contentFont, output.fontSize, indents[col], output.drawY, s); } output.drawY -= PdfOutput.itemSpacing * 2.5; if (output.drawY < 1) { output.appendPageBreak(); } } output.drawY -= .1; output.DrawText(output.boldFont, output.fontSize, indents[1], output.drawY, "Page Notes:"); output.drawY -= PdfOutput.itemSpacing * 4; if (output.drawY < 1) { output.appendPageBreak(); } }
// This is for the sets of items that have 3 numerical response values private void BuildDetailedResponseTable(def_Parts part, PdfOutput output, def_Sections sct) { int nCols = 6; string[] headers = { sct.title, "", "Freq", "Time", "Type", "Important \"To\" or \"For\"" }; double[] indents = { .5, .75, 5.3, 5.6, 5.95, 6.75 }; //headers output.drawY -= .1; for (int i = 0; i < nCols; i++) { output.DrawText(output.boldFont, output.fontSize, indents[i], output.drawY, headers[i]); } output.drawY += .13; output.appendSectionBreak(); output.drawY -= PdfOutput.itemSpacing; indents = new double[] { .5, .75, 5.38, 5.73, 6.05, 6.75 }; List <def_Items> itms = formsRepo.GetSectionItems(sct); // Values for (int row = 0; row < itms.Count; row++) { def_Items itm = itms[row]; def_ItemResults itmResults = formsRepo.GetItemResultByFormResItem(formResultId, itm.itemId); formsRepo.GetItemResultsResponseVariables(itmResults); foreach (def_ResponseVariables rv in itmResults.def_ResponseVariables) { rv.def_ItemVariables = formsRepo.GetItemVariableById(rv.itemVariableId); } output.drawY -= .1; for (int col = 0; col < nCols; col++) { string s = "ERROR"; switch (col) { case 0: s = (row + 1).ToString(); break; case 1: s = itm.label; break; case 2: case 3: case 4: s = null; string suffix = SupportNeedsColumnSuffixes[col - 2]; try { //Debug.WriteLine("\titemvariableId= " + ivEnum.Current.itemVariableId); s = itmResults.def_ResponseVariables.SingleOrDefault(rv => rv.def_ItemVariables.identifier.EndsWith(suffix)).rspValue; } catch (System.NullReferenceException ex) { Debug.Print("for itemId " + itm.itemId + ", could not find responseVariable linked to itemVariableIdentifier with suffix \"" + suffix + "\""); Debug.Print(" NullReferenceException: " + ex.Message); } s = String.IsNullOrEmpty(s) ? "N/A" : s; break; case 5: s = String.Empty; break; } output.DrawText(output.contentFont, output.fontSize, indents[col], output.drawY, s); } output.drawY -= PdfOutput.itemSpacing * 2.5; if (output.drawY < 1) { output.appendPageBreak(); } } output.drawY -= .1; output.DrawText(output.boldFont, output.fontSize, indents[1], output.drawY, "Page Notes:"); output.drawY -= PdfOutput.itemSpacing * 4; if (output.drawY < 1) { output.appendPageBreak(); } }
public void printTable(PdfOutput output) { if (rows.Count == 0) { throw new Exception("Cannot print a table with no rows"); } //draw top table border output.SetColor(Color.Black); output.DrawLine(bordersX[0], output.drawY, bordersX[columnCount], output.drawY, cellBorderWidth); foreach (Row r in rows) { //compute row thickness before drawing, add page break if necessary double rowThickness = getRowThickness(output, r); if (output.drawY - rowThickness < 0) { output.appendPageBreak(); } if (r is RegularRow) { string[] rowVals = ((RegularRow)r).contents; //draw row background, if applicable double y = output.drawY; if (!r.background.Equals(Color.White)) { output.SetColor(r.background); output.FillRectangle(bordersX[0], output.drawY - rowThickness, bordersX[columnCount] - bordersX[0], rowThickness); output.drawY = y; output.SetColor(Color.Black); } //draw cell contents for (int col = 0; col < columnCount; col++) { output.DrawWrappedText( r.font, r.fontSize, bordersX[col] + cellPaddingLeft, output.drawY - cellContentsDy, bordersX[col + 1] - bordersX[col] - cellPaddingRight, TextJustify.Left, rowVals[col] == null ? "N/A" : rowVals[col]); output.drawY = y; } //draw cell borders for (int col = 0; col <= columnCount; col++) { output.DrawLine(bordersX[col], output.drawY, bordersX[col], output.drawY - rowThickness, cellBorderWidth); } output.DrawLine(bordersX[0], output.drawY - rowThickness, bordersX[columnCount], output.drawY - rowThickness, cellBorderWidth); //move down the page for the next row output.drawY -= rowThickness; } else if (r is MergedRow) { string content = ((MergedRow)r).contents; //draw row background, if applicable double y = output.drawY; if (!r.background.Equals(Color.White)) { output.SetColor(r.background); output.FillRectangle(bordersX[0], output.drawY - rowThickness, bordersX[columnCount] - bordersX[0], rowThickness); output.drawY = y; output.SetColor(Color.Black); } //draw cell content output.DrawWrappedText( r.font, r.fontSize, bordersX[0] + cellPaddingLeft, output.drawY - cellContentsDy, bordersX[columnCount] - bordersX[0] - cellPaddingRight, TextJustify.Left, content); output.drawY = y; //draw cell borders output.DrawLine(bordersX[0], output.drawY, bordersX[0], output.drawY - rowThickness, cellBorderWidth); output.DrawLine(bordersX[columnCount], output.drawY, bordersX[columnCount], output.drawY - rowThickness, cellBorderWidth); output.DrawLine(bordersX[0], output.drawY - rowThickness, bordersX[columnCount], output.drawY - rowThickness, cellBorderWidth); //move down the page for the next row output.drawY -= rowThickness; } else { throw new Exception("Unrecognized row subclass \"" + r.GetType() + "\""); } } }