// Add detailed information about each individual device, starting on the current page and adding new pages as necessary. private void InsertDetailsList(Report report, FontDef fontDefinition, Page page, double verticalMillimeters, DateTime now, int pageNumber) { const double ColumnPaddingMillimeters = 10.0D; const double RowPaddingMillimeters = 2.0D; const double SignalIndentMillimeters = 25.4D; double[] deviceColumnWidthMillimeters; double[] signalColumnWidthMillimeters; double listWidthMillimeters; double horizontalMillimeters; FontProp deviceHeaderFont = new FontPropMM(fontDefinition, 0.0D); FontProp deviceRowFont = new FontPropMM(fontDefinition, 0.0D); FontProp signalHeaderFont = new FontPropMM(fontDefinition, 0.0D); FontProp signalRowFont = new FontPropMM(fontDefinition, 0.0D); List<DeviceStats> badDevices; List<SignalStats> badSignals; int deviceIndex; int signalIndex; string[] deviceHeaders; string[] signalHeaders; string[][] deviceDetails; string[][][] signalDetails; // Set up fonts to be used in the details list deviceHeaderFont.rSizePoint = 12.0D; deviceRowFont.rSizePoint = 12.0D; signalHeaderFont.rSizePoint = 10.0D; signalRowFont.rSizePoint = 10.0D; deviceHeaderFont.bBold = true; signalHeaderFont.bBold = true; // Set up the column header and the initial values for the column widths deviceHeaders = new string[] { "Name", "Correctness" }; signalHeaders = new string[] { "Name", "Latched", "Unreasonable", "Total" }; deviceColumnWidthMillimeters = deviceHeaders.Select(deviceHeaderFont.rGetTextWidthMM).ToArray(); signalColumnWidthMillimeters = signalHeaders.Select(deviceHeaderFont.rGetTextWidthMM).ToArray(); badDevices = m_deviceStatsList .Where(dev => dev.GetMeasurementsLatched(ReportDays - 1) + dev.GetMeasurementsUnreasonable(ReportDays - 1) > 0) .OrderByDescending(dev => (dev.GetMeasurementsLatched(ReportDays - 1) + dev.GetMeasurementsUnreasonable(ReportDays - 1)) / dev.MeasurementsExpected[ReportDays - 1]) .ToList(); deviceIndex = 0; deviceDetails = new string[badDevices.Count][]; signalDetails = new string[badDevices.Count][][]; foreach (DeviceStats deviceStats in badDevices) { deviceDetails[deviceIndex] = new string[2]; deviceDetails[deviceIndex][0] = deviceStats.Name; deviceDetails[deviceIndex][1] = deviceStats.GetCorrectness(ReportDays - 1).ToString("0.##") + "%"; deviceColumnWidthMillimeters = deviceColumnWidthMillimeters.Zip(deviceDetails[deviceIndex], (currentWidth, text) => Math.Max(currentWidth, deviceRowFont.rGetTextWidthMM(text))).ToArray(); badSignals = deviceStats.SignalStatsLookup.Values .Where(stats => stats.MeasurementsLatched[ReportDays - 1] + stats.MeasurementsUnreasonable[ReportDays - 1] > 0) .OrderByDescending(stats => stats.MeasurementsLatched[ReportDays - 1] + stats.MeasurementsUnreasonable[ReportDays - 1]) .ToList(); signalIndex = 0; signalDetails[deviceIndex] = new string[badSignals.Count][]; foreach (SignalStats signalStats in badSignals) { signalDetails[deviceIndex][signalIndex] = new string[4]; signalDetails[deviceIndex][signalIndex][0] = signalStats.Name; signalDetails[deviceIndex][signalIndex][1] = signalStats.MeasurementsLatched[ReportDays - 1].ToString("#,##0"); signalDetails[deviceIndex][signalIndex][2] = signalStats.MeasurementsUnreasonable[ReportDays - 1].ToString("#,##0"); signalDetails[deviceIndex][signalIndex][3] = (signalStats.MeasurementsLatched[ReportDays - 1] + signalStats.MeasurementsUnreasonable[ReportDays - 1]).ToString("#,##0"); signalColumnWidthMillimeters = signalColumnWidthMillimeters.Zip(signalDetails[deviceIndex][signalIndex], (currentWidth, text) => Math.Max(currentWidth, signalRowFont.rGetTextWidthMM(text))).ToArray(); signalIndex++; } deviceIndex++; } // Determine the total width of the list so that it can be centered listWidthMillimeters = Math.Max(deviceColumnWidthMillimeters.Sum(width => width + ColumnPaddingMillimeters) - ColumnPaddingMillimeters, SignalIndentMillimeters + signalColumnWidthMillimeters.Sum(width => width + ColumnPaddingMillimeters) - ColumnPaddingMillimeters); for (deviceIndex = 0; deviceIndex < deviceDetails.Length; deviceIndex++) { // If the height of the device header, plus the device row, plus the signal header, plus one signal row reaches beyond the bottom of the page, start a new page if (verticalMillimeters + deviceHeaderFont.rSizeMM + deviceRowFont.rSizeMM + signalHeaderFont.rSizeMM + signalRowFont.rSizeMM + 4.0D * RowPaddingMillimeters > PageHeightMillimeters - PageMarginMillimeters - FooterHeightMillimeters - SpacingMillimeters) { // Insert footer on the current page first InsertFooter(fontDefinition, page, now, pageNumber); // Increment the page number and create a new page page = CreatePage(report); pageNumber++; // Add the report date to the top of the page verticalMillimeters = PageMarginMillimeters; verticalMillimeters += InsertReportDate(fontDefinition, page, PageMarginMillimeters) + SpacingMillimeters; } // Add the device header to the page horizontalMillimeters = (PageWidthMillimeters - listWidthMillimeters) / 2.0D; for (int i = 0; i < deviceHeaders.Length; i++) { page.AddMM(horizontalMillimeters, verticalMillimeters + deviceHeaderFont.rSizeMM, new RepString(deviceHeaderFont, deviceHeaders[i])); horizontalMillimeters += deviceColumnWidthMillimeters[i] + ColumnPaddingMillimeters; } verticalMillimeters += deviceHeaderFont.rSizeMM + RowPaddingMillimeters; // Add the device row to the page horizontalMillimeters = (PageWidthMillimeters - listWidthMillimeters) / 2.0D; for (int i = 0; i < deviceDetails[deviceIndex].Length; i++) { page.AddMM(horizontalMillimeters, verticalMillimeters + deviceRowFont.rSizeMM, new RepString(deviceRowFont, deviceDetails[deviceIndex][i])); horizontalMillimeters += deviceColumnWidthMillimeters[i] + ColumnPaddingMillimeters; } verticalMillimeters += deviceRowFont.rSizeMM + RowPaddingMillimeters * 2.0D; // Add the signal header to the page horizontalMillimeters = (PageWidthMillimeters - listWidthMillimeters) / 2.0D + SignalIndentMillimeters; for (int i = 0; i < signalHeaders.Length; i++) { page.AddMM(horizontalMillimeters, verticalMillimeters + signalHeaderFont.rSizeMM, new RepString(signalHeaderFont, signalHeaders[i])); horizontalMillimeters += signalColumnWidthMillimeters[i] + ColumnPaddingMillimeters; } verticalMillimeters += signalHeaderFont.rSizeMM + RowPaddingMillimeters; // Each signal is on its own row in the details list foreach (string[] row in signalDetails[deviceIndex]) { // If the height of the row reaches beyond the bottom of the page, start a new page if (verticalMillimeters + signalRowFont.rSizeMM > PageHeightMillimeters - PageMarginMillimeters - FooterHeightMillimeters - SpacingMillimeters) { // Insert footer on the current page first InsertFooter(fontDefinition, page, now, pageNumber); // Increment the page number and create a new page page = CreatePage(report); pageNumber++; // Add the report date to the top of the page verticalMillimeters = PageMarginMillimeters; verticalMillimeters += InsertReportDate(fontDefinition, page, PageMarginMillimeters) + SpacingMillimeters; // Add the device header to the new page horizontalMillimeters = (PageWidthMillimeters - listWidthMillimeters) / 2.0D; for (int i = 0; i < deviceHeaders.Length; i++) { page.AddMM(horizontalMillimeters, verticalMillimeters + deviceHeaderFont.rSizeMM, new RepString(deviceHeaderFont, deviceHeaders[i])); horizontalMillimeters += deviceColumnWidthMillimeters[i] + ColumnPaddingMillimeters; } verticalMillimeters += deviceHeaderFont.rSizeMM + RowPaddingMillimeters; // Add the device row to the new page horizontalMillimeters = (PageWidthMillimeters - listWidthMillimeters) / 2.0D; for (int i = 0; i < deviceDetails[deviceIndex].Length; i++) { page.AddMM(horizontalMillimeters, verticalMillimeters + deviceRowFont.rSizeMM, new RepString(deviceRowFont, deviceDetails[deviceIndex][i])); horizontalMillimeters += deviceColumnWidthMillimeters[i] + ColumnPaddingMillimeters; } verticalMillimeters += deviceRowFont.rSizeMM + RowPaddingMillimeters * 2.0D; // Add the signal header to the new page horizontalMillimeters = (PageWidthMillimeters - listWidthMillimeters) / 2.0D + SignalIndentMillimeters; for (int i = 0; i < signalHeaders.Length; i++) { page.AddMM(horizontalMillimeters, verticalMillimeters + signalHeaderFont.rSizeMM, new RepString(signalHeaderFont, signalHeaders[i])); horizontalMillimeters += signalColumnWidthMillimeters[i] + ColumnPaddingMillimeters; } verticalMillimeters += signalHeaderFont.rSizeMM + RowPaddingMillimeters; } // Add the signal row to the details list horizontalMillimeters = (PageWidthMillimeters - listWidthMillimeters) / 2.0D + SignalIndentMillimeters; for (int i = 0; i < row.Length; i++) { page.AddMM(horizontalMillimeters, verticalMillimeters + signalRowFont.rSizeMM, new RepString(signalRowFont, row[i])); horizontalMillimeters += signalColumnWidthMillimeters[i] + ColumnPaddingMillimeters; } verticalMillimeters += signalRowFont.rSizeMM + RowPaddingMillimeters; } // Add space between devices verticalMillimeters += RowPaddingMillimeters * 3; } // Insert the footer on the last page of the report InsertFooter(fontDefinition, page, now, pageNumber); }
// Add detailed information about each individual device, starting on the current page and adding new pages as necessary. private void InsertDetailsList(Report report, FontDef fontDefinition, Page page, double verticalMillimeters, DateTime now, int pageNumber) { const double ColumnPaddingMillimeters = 10.0D; const double RowPaddingMillimeters = 2.0D; const double SignalIndentMillimeters = 25.4D; double[] deviceColumnWidthMillimeters; double[] signalColumnWidthMillimeters; double listWidthMillimeters; double horizontalMillimeters; FontProp deviceHeaderFont = new FontPropMM(fontDefinition, 0.0D); FontProp deviceRowFont = new FontPropMM(fontDefinition, 0.0D); FontProp signalHeaderFont = new FontPropMM(fontDefinition, 0.0D); FontProp signalRowFont = new FontPropMM(fontDefinition, 0.0D); List <DeviceStats> badDevices; List <SignalStats> badSignals; int deviceIndex; int signalIndex; string[] deviceHeaders; string[] signalHeaders; string[][] deviceDetails; string[][][] signalDetails; // Set up fonts to be used in the details list deviceHeaderFont.rSizePoint = 12.0D; deviceRowFont.rSizePoint = 12.0D; signalHeaderFont.rSizePoint = 10.0D; signalRowFont.rSizePoint = 10.0D; deviceHeaderFont.bBold = true; signalHeaderFont.bBold = true; // Set up the column header and the initial values for the column widths deviceHeaders = new string[] { "Name", "Correctness" }; signalHeaders = new string[] { "Name", "Latched", "Unreasonable", "Total" }; deviceColumnWidthMillimeters = deviceHeaders.Select(deviceHeaderFont.rGetTextWidthMM).ToArray(); signalColumnWidthMillimeters = signalHeaders.Select(deviceHeaderFont.rGetTextWidthMM).ToArray(); badDevices = m_deviceStatsList .Where(dev => dev.GetMeasurementsLatched(ReportDays - 1) + dev.GetMeasurementsUnreasonable(ReportDays - 1) > 0) .OrderByDescending(dev => (dev.GetMeasurementsLatched(ReportDays - 1) + dev.GetMeasurementsUnreasonable(ReportDays - 1)) / dev.MeasurementsExpected[ReportDays - 1]) .ToList(); deviceIndex = 0; deviceDetails = new string[badDevices.Count][]; signalDetails = new string[badDevices.Count][][]; foreach (DeviceStats deviceStats in badDevices) { deviceDetails[deviceIndex] = new string[2]; deviceDetails[deviceIndex][0] = deviceStats.Name; deviceDetails[deviceIndex][1] = deviceStats.GetCorrectness(ReportDays - 1).ToString("0.##") + "%"; deviceColumnWidthMillimeters = deviceColumnWidthMillimeters.Zip(deviceDetails[deviceIndex], (currentWidth, text) => Math.Max(currentWidth, deviceRowFont.rGetTextWidthMM(text))).ToArray(); badSignals = deviceStats.SignalStatsLookup.Values .Where(stats => stats.MeasurementsLatched[ReportDays - 1] + stats.MeasurementsUnreasonable[ReportDays - 1] > 0) .OrderByDescending(stats => stats.MeasurementsLatched[ReportDays - 1] + stats.MeasurementsUnreasonable[ReportDays - 1]) .ToList(); signalIndex = 0; signalDetails[deviceIndex] = new string[badSignals.Count][]; foreach (SignalStats signalStats in badSignals) { signalDetails[deviceIndex][signalIndex] = new string[4]; signalDetails[deviceIndex][signalIndex][0] = signalStats.Name; signalDetails[deviceIndex][signalIndex][1] = signalStats.MeasurementsLatched[ReportDays - 1].ToString("#,##0"); signalDetails[deviceIndex][signalIndex][2] = signalStats.MeasurementsUnreasonable[ReportDays - 1].ToString("#,##0"); signalDetails[deviceIndex][signalIndex][3] = (signalStats.MeasurementsLatched[ReportDays - 1] + signalStats.MeasurementsUnreasonable[ReportDays - 1]).ToString("#,##0"); signalColumnWidthMillimeters = signalColumnWidthMillimeters.Zip(signalDetails[deviceIndex][signalIndex], (currentWidth, text) => Math.Max(currentWidth, signalRowFont.rGetTextWidthMM(text))).ToArray(); signalIndex++; } deviceIndex++; } // Determine the total width of the list so that it can be centered listWidthMillimeters = Math.Max(deviceColumnWidthMillimeters.Sum(width => width + ColumnPaddingMillimeters) - ColumnPaddingMillimeters, SignalIndentMillimeters + signalColumnWidthMillimeters.Sum(width => width + ColumnPaddingMillimeters) - ColumnPaddingMillimeters); for (deviceIndex = 0; deviceIndex < deviceDetails.Length; deviceIndex++) { // If the height of the device header, plus the device row, plus the signal header, plus one signal row reaches beyond the bottom of the page, start a new page if (verticalMillimeters + deviceHeaderFont.rSizeMM + deviceRowFont.rSizeMM + signalHeaderFont.rSizeMM + signalRowFont.rSizeMM + 4.0D * RowPaddingMillimeters > PageHeightMillimeters - PageMarginMillimeters - FooterHeightMillimeters - SpacingMillimeters) { // Insert footer on the current page first InsertFooter(fontDefinition, page, now, pageNumber); // Increment the page number and create a new page page = CreatePage(report); pageNumber++; // Add the report date to the top of the page verticalMillimeters = PageMarginMillimeters; verticalMillimeters += InsertReportDate(fontDefinition, page, PageMarginMillimeters) + SpacingMillimeters; } // Add the device header to the page horizontalMillimeters = (PageWidthMillimeters - listWidthMillimeters) / 2.0D; for (int i = 0; i < deviceHeaders.Length; i++) { page.AddMM(horizontalMillimeters, verticalMillimeters + deviceHeaderFont.rSizeMM, new RepString(deviceHeaderFont, deviceHeaders[i])); horizontalMillimeters += deviceColumnWidthMillimeters[i] + ColumnPaddingMillimeters; } verticalMillimeters += deviceHeaderFont.rSizeMM + RowPaddingMillimeters; // Add the device row to the page horizontalMillimeters = (PageWidthMillimeters - listWidthMillimeters) / 2.0D; for (int i = 0; i < deviceDetails[deviceIndex].Length; i++) { page.AddMM(horizontalMillimeters, verticalMillimeters + deviceRowFont.rSizeMM, new RepString(deviceRowFont, deviceDetails[deviceIndex][i])); horizontalMillimeters += deviceColumnWidthMillimeters[i] + ColumnPaddingMillimeters; } verticalMillimeters += deviceRowFont.rSizeMM + RowPaddingMillimeters * 2.0D; // Add the signal header to the page horizontalMillimeters = (PageWidthMillimeters - listWidthMillimeters) / 2.0D + SignalIndentMillimeters; for (int i = 0; i < signalHeaders.Length; i++) { page.AddMM(horizontalMillimeters, verticalMillimeters + signalHeaderFont.rSizeMM, new RepString(signalHeaderFont, signalHeaders[i])); horizontalMillimeters += signalColumnWidthMillimeters[i] + ColumnPaddingMillimeters; } verticalMillimeters += signalHeaderFont.rSizeMM + RowPaddingMillimeters; // Each signal is on its own row in the details list foreach (string[] row in signalDetails[deviceIndex]) { // If the height of the row reaches beyond the bottom of the page, start a new page if (verticalMillimeters + signalRowFont.rSizeMM > PageHeightMillimeters - PageMarginMillimeters - FooterHeightMillimeters - SpacingMillimeters) { // Insert footer on the current page first InsertFooter(fontDefinition, page, now, pageNumber); // Increment the page number and create a new page page = CreatePage(report); pageNumber++; // Add the report date to the top of the page verticalMillimeters = PageMarginMillimeters; verticalMillimeters += InsertReportDate(fontDefinition, page, PageMarginMillimeters) + SpacingMillimeters; // Add the device header to the new page horizontalMillimeters = (PageWidthMillimeters - listWidthMillimeters) / 2.0D; for (int i = 0; i < deviceHeaders.Length; i++) { page.AddMM(horizontalMillimeters, verticalMillimeters + deviceHeaderFont.rSizeMM, new RepString(deviceHeaderFont, deviceHeaders[i])); horizontalMillimeters += deviceColumnWidthMillimeters[i] + ColumnPaddingMillimeters; } verticalMillimeters += deviceHeaderFont.rSizeMM + RowPaddingMillimeters; // Add the device row to the new page horizontalMillimeters = (PageWidthMillimeters - listWidthMillimeters) / 2.0D; for (int i = 0; i < deviceDetails[deviceIndex].Length; i++) { page.AddMM(horizontalMillimeters, verticalMillimeters + deviceRowFont.rSizeMM, new RepString(deviceRowFont, deviceDetails[deviceIndex][i])); horizontalMillimeters += deviceColumnWidthMillimeters[i] + ColumnPaddingMillimeters; } verticalMillimeters += deviceRowFont.rSizeMM + RowPaddingMillimeters * 2.0D; // Add the signal header to the new page horizontalMillimeters = (PageWidthMillimeters - listWidthMillimeters) / 2.0D + SignalIndentMillimeters; for (int i = 0; i < signalHeaders.Length; i++) { page.AddMM(horizontalMillimeters, verticalMillimeters + signalHeaderFont.rSizeMM, new RepString(signalHeaderFont, signalHeaders[i])); horizontalMillimeters += signalColumnWidthMillimeters[i] + ColumnPaddingMillimeters; } verticalMillimeters += signalHeaderFont.rSizeMM + RowPaddingMillimeters; } // Add the signal row to the details list horizontalMillimeters = (PageWidthMillimeters - listWidthMillimeters) / 2.0D + SignalIndentMillimeters; for (int i = 0; i < row.Length; i++) { page.AddMM(horizontalMillimeters, verticalMillimeters + signalRowFont.rSizeMM, new RepString(signalRowFont, row[i])); horizontalMillimeters += signalColumnWidthMillimeters[i] + ColumnPaddingMillimeters; } verticalMillimeters += signalRowFont.rSizeMM + RowPaddingMillimeters; } // Add space between devices verticalMillimeters += RowPaddingMillimeters * 3; } // Insert the footer on the last page of the report InsertFooter(fontDefinition, page, now, pageNumber); }
// Add detailed information about each individual device, starting on the current page and adding new pages as necessary. private void InsertDetailsList(Report report, FontDef fontDefinition, Page page, double verticalMillimeters, DateTime now, int pageNumber) { const double ColumnPaddingMillimeters = 10.0D; const double RowPaddingMillimeters = 2.0D; double[] columnWidthMillimeters; double listWidthMillimeters; double horizontalMillimeters; FontProp levelFont = new FontPropMM(fontDefinition, 0.0D); FontProp columnHeaderFont = new FontPropMM(fontDefinition, 0.0D); FontProp rowFont = new FontPropMM(fontDefinition, 0.0D); List<DeviceStats>[] levels = GetLevels(ReportDays); string[][][] levelDetails = new string[levels.Length][][]; string[][] deviceDetails; string[] columnHeaders; // Set up fonts to be used in the details list levelFont.rSizePoint = 12.0D; columnHeaderFont.rSizePoint = 10.0D; rowFont.rSizePoint = 10.0D; levelFont.bBold = true; columnHeaderFont.bBold = true; // Set up the column header and the initial values for the column widths columnHeaders = new string[] { "Name", "Completeness", "Data Errors", "Time Errors" }; columnWidthMillimeters = columnHeaders.Select(columnHeaderFont.rGetTextWidthMM).ToArray(); for (int level = 0; level < levels.Length; level++) { // Set up the device details array for the current level deviceDetails = new string[levels[level].Count][]; levelDetails[level] = deviceDetails; // Sort the devices in this level by name levels[level].Sort((device1, device2) => string.Compare(device1.Name, device2.Name, StringComparison.Ordinal)); for (int device = 0; device < levels[level].Count; device++) { // Populate the device details with data for each device deviceDetails[device] = new string[] { levels[level][device].Name, (levels[level][device].MeasurementsReceived[ReportDays - 1] / levels[level][device].MeasurementsExpected[ReportDays - 1]).ToString("0.##%"), levels[level][device].DataQualityErrors[ReportDays - 1].ToString("#,##0"), levels[level][device].TimeQualityErrors[ReportDays - 1].ToString("#,##0") }; // Update the column widths if they need to be widened to accomodate the data columnWidthMillimeters = columnWidthMillimeters.Zip(deviceDetails[device], (currentWidth, text) => Math.Max(currentWidth, rowFont.rGetTextWidthMM(text))).ToArray(); } } // Determine the total width of the list so that it can be centered listWidthMillimeters = columnWidthMillimeters.Sum(width => width + ColumnPaddingMillimeters) - ColumnPaddingMillimeters; for (int level = 0; level < levels.Length; level++) { // Get the device details for the current level deviceDetails = levelDetails[level]; // If the level has no data, don't bother adding it to the details list if (deviceDetails.Length > 0) { // If the height of the level header, plus the column header, plus one row of data reaches beyond the bottom of the page, start a new page if (verticalMillimeters + levelFont.rSizeMM + columnHeaderFont.rSizeMM + rowFont.rSizeMM > PageHeightMillimeters - PageMarginMillimeters - FooterHeightMillimeters - SpacingMillimeters) { // Insert footer on the current page first InsertFooter(fontDefinition, page, now, pageNumber); // Increment the page number and create a new page page = CreatePage(report); pageNumber++; // Add the report date to the top of the page verticalMillimeters = PageMarginMillimeters; verticalMillimeters += InsertReportDate(fontDefinition, page, PageMarginMillimeters) + SpacingMillimeters; } // Add the level header to the page horizontalMillimeters = (PageWidthMillimeters - listWidthMillimeters) / 2.0D; page.AddMM(horizontalMillimeters, verticalMillimeters + levelFont.rSizeMM, new RepString(levelFont, "Level " + level)); verticalMillimeters += levelFont.rSizeMM + RowPaddingMillimeters; // Add the column header to the page for (int i = 0; i < columnHeaders.Length; i++) { page.AddMM(horizontalMillimeters, verticalMillimeters + columnHeaderFont.rSizeMM, new RepString(columnHeaderFont, columnHeaders[i])); horizontalMillimeters += columnWidthMillimeters[i] + ColumnPaddingMillimeters; } verticalMillimeters += columnHeaderFont.rSizeMM + RowPaddingMillimeters; // Each device is on its own row in the details list foreach (string[] row in deviceDetails) { // If the height of the row reaches beyond the bottom of the page, start a new page if (verticalMillimeters + rowFont.rSizeMM > PageHeightMillimeters - PageMarginMillimeters - FooterHeightMillimeters - SpacingMillimeters) { // Insert footer on the current page first InsertFooter(fontDefinition, page, now, pageNumber); // Increment the page number and create a new page page = CreatePage(report); pageNumber++; // Add the report date to the top of the page verticalMillimeters = PageMarginMillimeters; verticalMillimeters += InsertReportDate(fontDefinition, page, PageMarginMillimeters) + SpacingMillimeters; // Add the level header again, designated with the abbreviation "contd." horizontalMillimeters = (PageWidthMillimeters - listWidthMillimeters) / 2.0D; page.AddMM(horizontalMillimeters, verticalMillimeters + levelFont.rSizeMM, new RepString(levelFont, "Level " + level + " (contd.)")); verticalMillimeters += levelFont.rSizeMM + RowPaddingMillimeters; // Add the column header again to the top of the new page for (int i = 0; i < columnHeaders.Length; i++) { page.AddMM(horizontalMillimeters, verticalMillimeters + columnHeaderFont.rSizeMM, new RepString(columnHeaderFont, columnHeaders[i])); horizontalMillimeters += columnWidthMillimeters[i] + ColumnPaddingMillimeters; } verticalMillimeters += columnHeaderFont.rSizeMM + RowPaddingMillimeters; } // Add the device data, on its own row, to the details list horizontalMillimeters = (PageWidthMillimeters - listWidthMillimeters) / 2.0D; for (int column = 0; column < row.Length; column++) { page.AddMM(horizontalMillimeters, verticalMillimeters + rowFont.rSizeMM, new RepString(rowFont, row[column])); horizontalMillimeters += columnWidthMillimeters[column] + ColumnPaddingMillimeters; } verticalMillimeters += rowFont.rSizeMM + RowPaddingMillimeters; } // Add space between levels verticalMillimeters += levelFont.rSizeMM; } } // Insert the footer on the last page of the report InsertFooter(fontDefinition, page, now, pageNumber); }
//----------------------------------------------------------------------------------------------------x /// <summary>Creates this report</summary> protected override void Create() { FontDef fd = new FontDef(this, FontDef.StandardFont.Helvetica); FontProp fp = new FontPropMM(fd, 3); FontProp fp_Title = new FontPropMM(fd, 20); fp_Title.bBold = true; FontProp fp_Small = new FontPropMM(fd, 1.3); PenProp pp = new PenPropMM(this, 0.2, Color.Blue); BrushProp bp = new BrushProp(this, Color.FromArgb(240, 240, 240)); #region Page 1 Page page = new Page(this); page.AddCB_MM(40, new RepString(fp_Title, "Text Sample")); fp_Title.rSizeMM = 4; fp_Title.rLineFeedMM = 8; // font sample Double rX = 20; Double rY = 60; page.AddMM(rX, rY, new RepString(fp_Title, "Fonts")); rY += fp_Title.rLineFeedMM; FontDef[] aFontDef = { new FontDef(this, FontDef.StandardFont.Courier), fd, new FontDef(this, FontDef.StandardFont.TimesRoman) }; foreach (FontDef fontDef in aFontDef) { FontProp fp_Test = new FontPropMM(fontDef, 2.8); page.AddMM(rX, rY, new RepString(fp_Test, fontDef.sFontName)); fp_Test.bBold = true; page.AddMM(rX + 30, rY, new RepString(fp_Test, fontDef.sFontName + " Bold")); fp_Test.bBold = false; fp_Test.bItalic = true; page.AddMM(rX + 72, rY, new RepString(fp_Test, fontDef.sFontName + " Italic")); fp_Test.bItalic = false; fp_Test.bUnderline = true; page.AddMM(rX + 120, rY, new RepString(fp_Test, fontDef.sFontName + " Underline")); rY += fp.rLineFeedMM; } rY += 3; aFontDef = new FontDef[] { new FontDef(this, "Symbol"), new FontDef(this, "ZapfDingbats") }; foreach (FontDef fontDef in aFontDef) { FontProp fp_Test = new FontPropMM(fontDef, 3); page.AddMM(rX, rY, new RepString(fp, fontDef.sFontName)); page.AddMM(rX + 30, rY, new RepString(fp_Test, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")); rY += fp.rLineFeedMM; } rY += 10; // Int32 sample rX = 20; Double rYcopy = rY; page.AddMM(rX, rY, new RepString(fp_Title, "Int32 Values")); rY += fp_Title.rLineFeedMM; page.AddMM(rX, rY, new RepString(fp, "no format string")); page.AddRightMM(rX + 80, rY, new RepInt32(fp, 12345)); rY += fp.rLineFeedMM; page.AddMM(rX, rY, new RepString(fp, "format \"0000000\"")); page.AddRightMM(rX + 80, rY, new RepInt32(fp, 12345, "0000000")); rY += fp.rLineFeedMM; page.AddMM(rX, rY, new RepString(fp, "format \"$#,#\"")); page.AddRightMM(rX + 80, rY, new RepInt32(fp, 12345, "$#,#")); rY += fp.rLineFeedMM; page.AddMM(rX, rY, new RepString(fp, "format \"$#;($#);Zero\"")); page.AddRightMM(rX + 80, rY, new RepInt32(fp, 12345, "$#;($#);Zero")); rY += fp.rLineFeedMM; page.AddMM(rX, rY, new RepString(fp, "format \"$#;($#);Zero\"")); page.AddRightMM(rX + 80, rY, new RepInt32(fp, -12345, "$#;($#);Zero")); rY += fp.rLineFeedMM; page.AddMM(rX, rY, new RepString(fp, "format \"$#;($#);Zero\"")); page.AddRightMM(rX + 80, rY, new RepInt32(fp, 0, "$#;($#);Zero")); // Single / Double sample rX = 115; rY = rYcopy; page.AddMM(rX, rY, new RepString(fp_Title, "Single / Double Values")); rY += fp_Title.rLineFeedMM; page.AddMM(rX, rY, new RepString(fp, "no format string")); page.AddRightMM(rX + 80, rY, new RepReal64(fp, 123.456)); rY += fp.rLineFeedMM; page.AddMM(rX, rY, new RepString(fp, "format \"0.0000\"")); page.AddRightMM(rX + 80, rY, new RepReal64(fp, 123.456, "0.0000")); rY += fp.rLineFeedMM; page.AddMM(rX, rY, new RepString(fp, "format \"$#,#0.00\"")); page.AddRightMM(rX + 80, rY, new RepReal64(fp, 123.456, "$#,#0.00")); rY += fp.rLineFeedMM; page.AddMM(rX, rY, new RepString(fp, "format \"$#.0;($#.0);Zero\"")); page.AddRightMM(rX + 80, rY, new RepReal64(fp, 123.456, "$#.0;($#.0);Zero")); rY += fp.rLineFeedMM; page.AddMM(rX, rY, new RepString(fp, "format \"$#.0;($#.0);Zero\"")); page.AddRightMM(rX + 80, rY, new RepReal64(fp, -123.456, "$#.0;($#.0);Zero")); rY += fp.rLineFeedMM; page.AddMM(rX, rY, new RepString(fp, "format \"$#.0;($#.0);Zero\"")); page.AddRightMM(rX + 80, rY, new RepReal64(fp, 0, "$#.0;($#.0);Zero")); rY += fp.rLineFeedMM + 10; // DateTime sample rX = 20; rYcopy = rY; page.AddMM(rX, rY, new RepString(fp_Title, "DateTime Values")); rY += fp_Title.rLineFeedMM; page.AddMM(rX, rY, new RepString(fp, "no format string")); page.AddRightMM(rX + 80, rY, new RepDateTime(fp, DateTime.Now)); rY += fp.rLineFeedMM; page.AddMM(rX, rY, new RepString(fp, "format \"D\"")); page.AddRightMM(rX + 80, rY, new RepDateTime(fp, DateTime.Now, "D")); rY += fp.rLineFeedMM; page.AddMM(rX, rY, new RepString(fp, "format \"t\"")); page.AddRightMM(rX + 80, rY, new RepDateTime(fp, DateTime.Now, "t")); rY += fp.rLineFeedMM; page.AddMM(rX, rY, new RepString(fp, "format \"dd.MM.yyyy\"")); page.AddRightMM(rX + 80, rY, new RepDateTime(fp, DateTime.Now, "dd.MM.yyyy")); // color sample StaticContainer sc = new StaticContainer(RT.rPointFromMM(100), RT.rPointFromMM(100)); page.AddMM(115, rYcopy + 5, sc); sc.RotateTransform(-8); sc.AddAlignedMM(-2, RepObj.rAlignLeft, -6, RepObj.rAlignTop, new RepRectMM(bp, 85, 33)); rY = 0; sc.AddMM(0, rY, new RepString(fp_Title, "Colors")); rY += fp_Title.rLineFeedMM; sc.AddMM(0, rY, new RepString(fp, "Red")); fp.color = Color.Red; fp.bUnderline = true; sc.AddRightMM(80, rY, new RepString(fp, "ABCDEFGHIJKLM")); fp.color = Color.Black; fp.bUnderline = false; rY += fp.rLineFeedMM; sc.AddMM(0, rY, new RepString(fp, "Green")); fp.color = Color.Green; fp.bUnderline = true; sc.AddRightMM(80, rY, new RepString(fp, "ABCDEFGHIJKLM")); fp.color = Color.Black; fp.bUnderline = false; rY += fp.rLineFeedMM; sc.AddMM(0, rY, new RepString(fp, "Blue")); fp.color = Color.Blue; fp.bUnderline = true; sc.AddRightMM(80, rY, new RepString(fp, "ABCDEFGHIJKLM")); fp.color = Color.Black; fp.bUnderline = false; rY += fp.rLineFeedMM; sc.AddMM(0, rY, new RepString(fp, "RGB(255,180,255)")); fp.color = Color.FromArgb(200, 200, 255); fp.bUnderline = true; sc.AddRightMM(80, rY, new RepString(fp, "ABCDEFGHIJKLM")); fp.color = Color.Black; fp.bUnderline = false; rY += rYcopy + fp.rLineFeedMM + 10; // alignment sample rX = 20; String s = "Alignment"; page.AddMM(rX, rY, new RepString(fp_Title, s)); Double rLengthMM = fp_Title.rGetTextWidthMM(s); page.AddMM(rX, rY + 3, new RepLineMM(pp, rLengthMM, 0)); page.AddMM(rX, rY + 2, new RepLineMM(pp, 0, 2)); page.AddMM(rX + rLengthMM, rY + 2, new RepLineMM(pp, 0, 2)); page.AddAlignedMM(rX + rLengthMM / 2, RepObj.rAlignCenter, rY + 4, RepObj.rAlignTop, new RepReal64(fp_Small, rLengthMM, "0.0 mm")); rX = 100; rY += fp_Title.rLineFeedMM; Double rD = 15; bp.color = Color.LightSkyBlue; page.AddMM(rX, rY + rD, new RepRectMM(bp, rD, rD)); page.AddAlignedMM(rX, RepObj.rAlignRight, rY, RepObj.rAlignBottom, new RepString(fp, "right - bottom")); page.AddAlignedMM(rX, RepObj.rAlignRight, rY + rD, RepObj.rAlignTop, new RepString(fp, "right - top")); page.AddMM(rX + rD, rY, new RepString(fp, "left - bottom")); // default page.AddAlignedMM(rX + rD, RepObj.rAlignLeft, rY + rD, RepObj.rAlignTop, new RepString(fp, "left - top")); page.AddAlignedMM(rX + rD / 2, RepObj.rAlignCenter, rY + rD / 2, RepObj.rAlignCenter, new RepString(fp, "center")); rY += 30; // rotated string rX = 60; page.AddMM(20, rY, new RepString(fp_Title, "Rotated Strings")); rY += fp_Title.rLineFeedMM + 10; rYcopy = rY; rD = 10; page.AddMM(rX, rY + rD, new RepRectMM(bp, rD, rD)); fp.rAngle = 45; page.AddAlignedMM(rX + rD, RepObj.rAlignLeft, rY + rD, RepObj.rAlignTop, new RepString(fp, "[45°]")); fp.rAngle = 135; page.AddMM(rX, rY + rD, new RepString(fp, "[135°]")); fp.rAngle = 225; page.AddAlignedMM(rX, RepObj.rAlignLeft, rY, RepObj.rAlignTop, new RepString(fp, "[225°]")); fp.rAngle = 315; page.AddMM(rX + rD, rY, new RepString(fp, "[315°]")); fp.rAngle = 0; rX = 155; rY = rYcopy; fp.bUnderline = true; page.AddMM(rX, rY + rD, new RepRectMM(bp, rD, rD)); fp.rAngle = 45; page.AddAlignedMM(rX, RepObj.rAlignRight, rY, RepObj.rAlignBottom, new RepString(fp, "1/4 * PI")); fp.rAngle = 135; page.AddAlignedMM(rX + rD, RepObj.rAlignRight, rY, RepObj.rAlignTop, new RepString(fp, "3/4 * PI")); fp.rAngle = 225; page.AddAlignedMM(rX + rD, RepObj.rAlignRight, rY + rD, RepObj.rAlignBottom, new RepString(fp, "5/4 * PI")); fp.rAngle = 315; page.AddAlignedMM(rX, RepObj.rAlignRight, rY + rD, RepObj.rAlignTop, new RepString(fp, "7/4 * PI")); fp.rAngle = 0.0; fp.bUnderline = false; rY += 35; #endregion #region Page 2 rX = 20; rY = 60; String sText = "Once upon a time there was a miller who was poor, but he had a beautiful daughter." + Environment.NewLine + "Now it happened that he was talking with the king one time, and in order to make himself seem important, " + "he said to the king, \"I have a daughter who can spin straw into gold.\""; page = new Page(this); page.AddMM(rX, rY, new RepString(fp_Title, "Best Fitting Font")); rY += fp_Title.rLineFeedMM; page.AddLT_MM(rX, rY, new RepRectMM(bp, 80, 40)); FontProp fp_BestFit = fp_Title.fontProp_GetBestFitMM(sText, 80, 40, 1); rY += fp_BestFit.rLineFeedMM; Int32 iStart = 0; while (iStart <= sText.Length) { String sLine = fp_BestFit.sGetTextLine(sText, RT.rPointFromMM(80), ref iStart, TextSplitMode.Line); page.AddMM(rX, rY, new RepString(fp_BestFit, sLine)); rY += fp_BestFit.rLineFeedMM; } rY += 10; page.AddLT_MM(rX, rY, new RepRectMM(bp, 40, 40)); fp_BestFit = fp.fontProp_GetBestFitMM(sText, 40, 40, 1); rY += fp_BestFit.rLineFeedMM; iStart = 0; while (iStart <= sText.Length) { String sLine = fp_BestFit.sGetTextLine(sText, RT.rPointFromMM(40), ref iStart, TextSplitMode.Line); page.AddMM(rX, rY, new RepString(fp_BestFit, sLine)); rY += fp_BestFit.rLineFeedMM; } rY += 10; page.AddLT_MM(rX, rY, new RepRectMM(bp, 30, 30)); fp_BestFit = fp.fontProp_GetBestFitMM(sText, 30, 30, 1); rY += fp_BestFit.rLineFeedMM; iStart = 0; while (iStart <= sText.Length) { String sLine = fp_BestFit.sGetTextLine(sText, RT.rPointFromMM(30), ref iStart, TextSplitMode.Line); page.AddMM(rX, rY, new RepString(fp_BestFit, sLine)); rY += fp_BestFit.rLineFeedMM; } #endregion }