diff --git a/Results/Output/Printers/Enhanced/EnhancedPrintDocument.cs b/Results/Output/Printers/Enhanced/EnhancedPrintDocument.cs index d19d98b70..023b960c9 100644 --- a/Results/Output/Printers/Enhanced/EnhancedPrintDocument.cs +++ b/Results/Output/Printers/Enhanced/EnhancedPrintDocument.cs @@ -44,6 +44,8 @@ namespace Results.Output.Printers.Enhanced Font font; Font footerFont; + TableStyle style; + /// /// Data to print /// @@ -75,7 +77,7 @@ namespace Results.Output.Printers.Enhanced /// Text to be printed public EnhancedPrintDocument(Results.Entities.Batch batch, EnhancedPrinterCfg cfg, string documentName) { - this.batch = batch; + this.batch = batch; this.cfg = cfg; DocumentName = documentName; @@ -94,7 +96,20 @@ namespace Results.Output.Printers.Enhanced font = new Font((cfg.BodyFntFml != null ? cfg.BodyFntFml : "Arial"), (cfg.BodyFntSz > 0 ? cfg.BodyFntSz : 10), (FontStyle)cfg.BodyFntSty); footerFont = new Font((cfg.FooterFntFml != null ? cfg.FooterFntFml : "Arial"), (cfg.FooterFntSz > 0 ? cfg.FooterFntSz : 10), (FontStyle)cfg.FooterFntSty); - /// Set print area size and margins (in dots using 100 dpi) + /// Table style of one water meter table where tests are rows + style = new TableStyle + { + Font = font, + HeaderFont = headerFont, + MarginX = 5, + MarginY = 3, + LineWidth = 1, + TopHeadersCount = 1, + HorizLines = TableLines.FirstSecondAndLast, + VertLines = TableLines.All + }; + + /// Set print area size and margins (in dots using 100 dpi) DefaultPageSettings.Landscape = (cfg.PageOrientation == PageOrientation.Landscape); /// if (DefaultPageSettings.Landscape) @@ -108,39 +123,15 @@ namespace Results.Output.Printers.Enhanced printWidth = base.DefaultPageSettings.PaperSize.Width - leftMargin - leftMargin; } - SpacingOne = System.Windows.Forms.TextRenderer.MeasureText("Abcgq", font).Height; - SpacingOneAndHalf = (3 * SpacingOne) / 2; - SpacingOne4Header = System.Windows.Forms.TextRenderer.MeasureText("Abcgq", headerFont).Height; - SpacingOneAndHalf4Header = (3 * SpacingOne4Header) / 2; + /// Document outline preliminary calculations + SpacingOne = System.Windows.Forms.TextRenderer.MeasureText("Abcgq", font).Height; + SpacingOneAndHalf = (3 * SpacingOne) / 2; + SpacingOne4Header = System.Windows.Forms.TextRenderer.MeasureText("Abcgq", headerFont).Height; + SpacingOneAndHalf4Header = (3 * SpacingOne4Header) / 2; SpacingOne4Footer = System.Windows.Forms.TextRenderer.MeasureText("Abcgq", footerFont).Height; - /// Calculate the tests count - int testsCount = 0; - if (batch.WaterMeters.Count > 0) - { - foreach (var mtr in batch.WaterMeters[0].MeterTestRslts) - { - if (mtr.Publish() == Config.Entities.Publish.Always && mtr.IsPilotRslt()) testsCount++; - } - } - - /// Prepare document outline - TitleX = cfg.LeftMargin; - TitleY = cfg.TopMargin; - - titleHeight = System.Windows.Forms.TextRenderer.MeasureText(header, titleFont).Height; - CommonTop = TitleY + titleHeight + SpacingOne4Header; - - commonHeight = commonItems.Count * SpacingOne; - BodyTop = CommonTop + commonHeight + SpacingOne4Header; - - int wmSectionHeight = (testsCount + 1) * SpacingOne + 3 * SpacingOne4Header; - - nrWMsOnFirstPage = (printHeight - BodyTop + TitleY - 2 * SpacingOne) / wmSectionHeight; - nrWMsOnNextPage = (printHeight - 2 * SpacingOne) / wmSectionHeight; - nrWMsOnNextPage = Math.Max(nrWMsOnNextPage, 1); /// Prevent division by zero if there are too many WM tests - - nrPages = 1 + (batch.WaterMeters.Count - nrWMsOnFirstPage + nrWMsOnNextPage - 1) / nrWMsOnNextPage; + TitleX = cfg.LeftMargin; + TitleY = cfg.TopMargin; pageNr = 1; nextWMNr = 0; @@ -183,7 +174,27 @@ namespace Results.Output.Printers.Enhanced if (pageNr == 1) { - ///---------- + ///---------- + /// Prepare document outline + ///---------- + titleHeight = System.Windows.Forms.TextRenderer.MeasureText(header, titleFont).Height; + CommonTop = TitleY + titleHeight + SpacingOne4Header; + + commonHeight = commonItems.Count * SpacingOne; + BodyTop = CommonTop + commonHeight + SpacingOne4Header; + + Table table0 = GetTable_TestsAreRows(batch.WaterMeters[0], testItems, style); + SizeF tableSize = table0.Measure(e); + int wmSectionHeight = (int)tableSize.Height + 3 * SpacingOne4Header; + + nrWMsOnFirstPage = (printHeight - BodyTop + TitleY - 2 * SpacingOne) / wmSectionHeight; + nrWMsOnNextPage = (printHeight - 2 * SpacingOne) / wmSectionHeight; + nrWMsOnNextPage = Math.Max(nrWMsOnNextPage, 1); /// Prevent division by zero if there are too many WM tests + + nrPages = 1 + (batch.WaterMeters.Count - nrWMsOnFirstPage + nrWMsOnNextPage - 1) / nrWMsOnNextPage; + + + ///---------- /// Title ///---------- RectangleF printArea = new RectangleF(TitleX, TitleY, printWidth, titleHeight); @@ -228,8 +239,7 @@ namespace Results.Output.Printers.Enhanced for (int wmNr = nextWMNr; wmNr < Math.Min(nextWMNr + nrWMsOnPage, batch.WaterMeters.Count); wmNr++) /// wmNr is 0-based { int wmPosition = true ? batch.WaterMeters[wmNr].WMPosition : (wmNr + 1); - int sectionHght = PrintWM(e, batch.WaterMeters[wmNr], wmPosition, nextWmTop); - nextWmTop += sectionHght; + nextWmTop = (int)PrintWM(e, batch.WaterMeters[wmNr], wmPosition, nextWmTop) + SpacingOneAndHalf4Header; } nextWMNr += nrWMsOnPage; @@ -254,88 +264,21 @@ namespace Results.Output.Printers.Enhanced /// Number of the water meter printed /// Top coordinate of watermeter data /// The height of the printed section - int PrintWM(System.Drawing.Printing.PrintPageEventArgs e, + float PrintWM(System.Drawing.Printing.PrintPageEventArgs e, Results.Entities.WaterMeter wm, int printedWMNr, int top) { - /// Determin column widths - float[] columnPos = new float[testItems.Count + 1]; - columnPos[0] = (float)leftMargin; + /// Print the water meter number and the serial number + string wmText = string.Format("{0} {1}", Strings.Water_Meter, printedWMNr); + PrintHeaderAt(e, leftMargin, top, wmText); + if (!string.IsNullOrEmpty(wm.SerialNr)) + { + PrintHeaderAt(e, leftMargin + (int)e.Graphics.MeasureString(wmText, headerFont).Width, top, + string.Format(" {0} = {1}", Strings.sn, wm.SerialNr)); + } - for (int i = 0; i < testItems.Count; i++) - { - float columnWidth = e.Graphics.MeasureString(testItems[i].Caption, headerFont).Width; - foreach (var mtr in wm.MeterTestRslts) - { - if (mtr != null && mtr.IsPilotRslt() && mtr.Publish() == Config.Entities.Publish.Always) - { - string itemText = testItems[i].Print(wm, mtr.Name()); + Table table = GetTable_TestsAreRows(wm, testItems, style); - /// Strip color information - string[] texts = itemText.Split(new char[] { '|' }); - if (texts.Length == 2) { itemText = texts[0]; } - - float width = e.Graphics.MeasureString(itemText, font).Width; - if (width > columnWidth) columnWidth = width; - } - } - columnPos[i + 1] = columnPos[i] + columnWidth + 20.0f; - } - int tableLeftX = (int)columnPos[0]; - int tableRightX = (int)columnPos[testItems.Count] - 20; - - string wmText = string.Format("{0} {1}", Strings.Water_Meter, printedWMNr); - PrintHeaderAt(e, leftMargin, top, wmText); - if (!string.IsNullOrEmpty(wm.SerialNr)) - { - PrintHeaderAt(e, leftMargin + (int)e.Graphics.MeasureString(wmText, headerFont).Width, top, - string.Format(" {0} = {1}", Strings.sn, wm.SerialNr)); - } - - /// Horizontal line - int horY = top + SpacingOneAndHalf4Header; - e.Graphics.DrawLine(new Pen(Color.Black, 2), new Point(tableLeftX, horY), new Point(tableRightX, horY)); - - for (int i = 0; i < testItems.Count; i++) - { - PrintHeaderAt(e, (int)columnPos[i], top + (int)(1.6 * SpacingOne4Header), testItems[i].Caption); - } - - /// Horizontal line - horY = top + (int)(2.8 * SpacingOne4Header); - e.Graphics.DrawLine(new Pen(Color.Black, 2), new Point(tableLeftX, horY), new Point(tableRightX, horY)); - - int testsCount = 0; - foreach (var mtr in wm.MeterTestRslts) - { - if ((mtr != null) && (mtr.Publish() == Config.Entities.Publish.Always)) - { - WMeterRsltItemSpec.TableRowNr = ++testsCount; - - for (int i = 0; i < testItems.Count; i++) - { - WMeterRsltItemSpec.TableColumnNr = i + 1; - - string itemText = testItems[i].Print(wm, mtr.Name()); - - /// Strip color information - string[] texts = itemText.Split(new char[] { '|' }); - if (texts.Length == 2) - { - itemText = texts[0]; - Color color = texts[1].Equals("Green") ? Color.Green : (texts[1].Equals("Red") ? Color.Red : Color.White); - /// TODO: How to print colors? - } - - PrintAt(e, (int)columnPos[i], top + 2 * SpacingOne4Header + SpacingOne * testsCount, itemText); - } - } - } - - /// Horizontal line - horY = top + 2 * SpacingOneAndHalf4Header + SpacingOne * testsCount; - e.Graphics.DrawLine(new Pen(Color.Black, 2), new Point(tableLeftX, horY), new Point(tableRightX, horY)); - - return (testsCount + 1) * SpacingOne + 3 * SpacingOne4Header; + return table.Draw(e, leftMargin, top + SpacingOneAndHalf4Header); } @@ -370,5 +313,50 @@ namespace Results.Output.Printers.Enhanced RectangleF printArea = new RectangleF(x, y, 2000, SpacingOne4Footer); e.Graphics.DrawString(text, this.footerFont, Brushes.Black, printArea); } + + + Table GetTable_TestsAreRows(Results.Entities.WaterMeter wm, IList items, TableStyle style) + { + /// Top row contains column captions + + Table table = new Table(items.Count); + table.Style = style; + + string[] tableHeader = new string[table.ColumnsCount]; + Alignment[] horizAlignment = new Alignment[table.ColumnsCount]; + VertAlignment[] vertAlignment = new VertAlignment[table.ColumnsCount]; + for (int i = 0; i < table.ColumnsCount; i++) + { + tableHeader[i] = items[i].Caption; + horizAlignment[i] = Alignment.Center; + vertAlignment[i] = VertAlignment.Middle; + } + table.AddRow(tableHeader, horizAlignment, vertAlignment); + + WMeterRsltItemSpec.TableRowNr = 1; + foreach (var mtr in wm.MeterTestRslts) + { + if (mtr != null && mtr.IsPilotRslt() && mtr.Publish() == Config.Entities.Publish.Always) + { + string[] oneTableRow = new string[table.ColumnsCount]; + horizAlignment = new Alignment[table.ColumnsCount]; + vertAlignment = new VertAlignment[table.ColumnsCount]; + + for (int i = 0; i < table.ColumnsCount; i++) + { + WMeterRsltItemSpec.TableColumnNr = i + 1; + oneTableRow[i] = items[i].Print(wm, mtr.Name()).Split(new char[] { '|' })[0]; + horizAlignment[i] = items[i].Alignment; + vertAlignment[i] = VertAlignment.Middle; + } + + table.AddRow(oneTableRow, horizAlignment, vertAlignment); + + WMeterRsltItemSpec.TableRowNr++; + } + } + + return table; + } } } diff --git a/Results/Properties/AssemblyInfo.cs b/Results/Properties/AssemblyInfo.cs index b54da8918..d2c9f41e0 100644 --- a/Results/Properties/AssemblyInfo.cs +++ b/Results/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.18.844.0")] -[assembly: AssemblyFileVersion("2.18.844.0")] +[assembly: AssemblyVersion("2.18.855.0")] +[assembly: AssemblyFileVersion("2.18.855.0")] diff --git a/TBF/Properties/AssemblyInfo.cs b/TBF/Properties/AssemblyInfo.cs index 2f27712c7..feb32bbe6 100644 --- a/TBF/Properties/AssemblyInfo.cs +++ b/TBF/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("2.18.854.0")] -[assembly: AssemblyFileVersion("2.18.854.0")] +[assembly: AssemblyVersion("2.18.855.0")] +[assembly: AssemblyFileVersion("2.18.855.0")]