(1) E9,E10,E15,E16 implemented, (2)Zapiska: Each WM is in one table row, (3) TableRowNr,TableColumnNr,WMRemark added to RsltItems

This commit is contained in:
Milan Hanajik
2017-09-25 22:25:09 +02:00
parent 2e1d497aad
commit 3fb487b67b
20 changed files with 874 additions and 653 deletions
@@ -7,12 +7,15 @@ using System.Drawing;
using System.Drawing.Printing;
using System.IO;
using Config.Entities;
using Results;
using Results.Resources;
namespace Results.Output.Printers.Zapiska
{
public class ZapiskaPrintDocument : PrintDocument
{
const int GapBetweenCommonColumns = 10;
/// Size of the printed area without margins, after taking into account 'pageOrientation'
readonly int printHeight;
readonly int printWidth;
@@ -22,8 +25,6 @@ namespace Results.Output.Printers.Zapiska
readonly int leftMargin;
readonly int leftMargin2;
readonly int leftMargin3;
readonly int TitleX;
readonly int TitleY; /// Depends on the size of the header
readonly int SpacingOne;
readonly int SpacingOneAndHalf;
@@ -57,15 +58,14 @@ namespace Results.Output.Printers.Zapiska
IList<WMeterRsltItemSpec> commonItems1;
IList<WMeterRsltItemSpec> commonItems2;
IList<WMeterRsltItemSpec> commonItems3;
IList<WMeterRsltItemSpec> testItems;
IList<WMeterRsltItemSpec> selectedItems;
string footer;
///
/// Layout and status
///
int nrWMsOnFirstPage;
int nrWMsOnNextPage;
int nextWMNr; /// nr. of watermeter to be printed as the first one on the next page
int tablesOnFirstPage;
int tablesOnNextPage;
int nrPages;
int pageNr; /// Page number to be printed at the bottom of the page
@@ -87,7 +87,7 @@ namespace Results.Output.Printers.Zapiska
commonItems1 = Results.WMeterRsltItemSpec.FromStrArray(cfg.CommonItems1);
commonItems2 = Results.WMeterRsltItemSpec.FromStrArray(cfg.CommonItems2);
commonItems3 = Results.WMeterRsltItemSpec.FromStrArray(cfg.CommonItems3);
testItems = Results.WMeterRsltItemSpec.FromStrArray(cfg.TestItems); /// TestID info will be overwritten later on
selectedItems = Results.WMeterRsltItemSpec.FromStrArray(cfg.SelectedItems);
footer = string.IsNullOrEmpty(cfg.Footer) ? string.Empty : cfg.Footer.Replace("~", Environment.NewLine);
/// Initialize fonts
@@ -117,37 +117,32 @@ namespace Results.Output.Printers.Zapiska
SpacingOne4Header = System.Windows.Forms.TextRenderer.MeasureText("Abcgq", headerFont).Height;
SpacingOneAndHalf4Header = (3 * SpacingOne4Header) / 2;
/// 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++;
}
}
/// Calculate the table rows count
int tableRowsCount = batch.WaterMeters.Count;
/// Prepare document outline
TitleX = cfg.LeftMargin;
TitleY = cfg.TopMargin;
titleHeight = System.Windows.Forms.TextRenderer.MeasureText(header, titleFont).Height;
CommonTop = TitleY + titleHeight + SpacingOne4Header;
CommonTop = cfg.TopMargin + titleHeight + SpacingOne4Header;
int commonCount = Math.Max(commonItems1.Count, Math.Max(commonItems2.Count, commonItems3.Count));
commonHeight = commonCount * SpacingOne;
BodyTop = CommonTop + commonHeight + SpacingOne4Header;
int wmSectionHeight = (testsCount + 1) * SpacingOne + 3 * SpacingOne4Header;
int wmSectionHeight = (tableRowsCount + 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
tablesOnFirstPage = (printHeight - BodyTop + cfg.TopMargin - 2 * SpacingOne) / wmSectionHeight;
tablesOnNextPage = Math.Max((printHeight - 2 * SpacingOne) / wmSectionHeight, 1); /// Min. 1, prevent division by zero
nrPages = 1 + (batch.WaterMeters.Count - nrWMsOnFirstPage + nrWMsOnNextPage - 1) / nrWMsOnNextPage;
if (tablesOnFirstPage >= 1)
{
nrPages = 1;
}
else
{
nrPages = 2;
}
pageNr = 1;
nextWMNr = 0;
}
/// <summary>
@@ -184,7 +179,9 @@ namespace Results.Output.Printers.Zapiska
///----------
/// Title
///----------
RectangleF printArea = new RectangleF(TitleX, TitleY, printWidth, titleHeight);
int titleWid = (int)(e.Graphics.MeasureString(header, titleFont).Width + 1);
RectangleF printArea = new RectangleF(cfg.LeftMargin + Math.Max(0, (printWidth - titleWid)) / 2, cfg.TopMargin,
titleWid, titleHeight);
e.Graphics.DrawString(header, titleFont, Brushes.Black, printArea);
///----------------
@@ -227,7 +224,7 @@ namespace Results.Output.Printers.Zapiska
for (int i = 0; i < Math.Min(leftColumn.Length, rightColumn.Length); i++)
{
PrintAt(e, lMargin, CommonTop + SpacingOne * i, leftColumn[i]);
PrintAt(e, lMargin + leftColWidth + 30, CommonTop + SpacingOne * i, rightColumn[i]);
PrintAt(e, lMargin + leftColWidth + GapBetweenCommonColumns, CommonTop + SpacingOne * i, rightColumn[i]);
}
}
}
@@ -238,18 +235,14 @@ namespace Results.Output.Printers.Zapiska
/// This variable represents the top coordinate of the area where WM results are printed
/// and it is updated (increased by) the value returned by PrintXyzWM() - the section size.
int nextWmTop = (pageNr == 1) ? BodyTop : TitleY;
int nextWmTop = (pageNr == 1) ? BodyTop : cfg.TopMargin;
int nrWMsOnPage = (pageNr == 1) ? nrWMsOnFirstPage : nrWMsOnNextPage;
if (tablesOnFirstPage > 0 || pageNr == 2)
{
PrintWMs(e, batch.WaterMeters, nextWmTop);
}
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);
nextWmTop += PrintWM(e, batch.WaterMeters[wmNr], wmPosition, nextWmTop);
}
nextWMNr += nrWMsOnPage;
e.HasMorePages = (nextWMNr < batch.WaterMeters.Count);
e.HasMorePages = (nrPages > 1) && (pageNr == 1);
///----------
/// Footer
@@ -270,85 +263,76 @@ namespace Results.Output.Printers.Zapiska
/// <param name="printedWMNr">Number of the water meter printed</param>
/// <param name="top">Top coordinate of watermeter data</param>
/// <returns>The height of the printed section</returns>
int PrintWM(System.Drawing.Printing.PrintPageEventArgs e,
Results.Entities.WaterMeter wm, int printedWMNr, int top)
int PrintWMs(System.Drawing.Printing.PrintPageEventArgs e,
IList<Results.Entities.WaterMeter> wms, int top)
{
/// Determin column widths
float[] columnPos = new float[testItems.Count + 1];
/// Determine column widths
WMeterRsltItemSpec.TableRowNr = 99;
WMeterRsltItemSpec.TableColumnNr = 99;
float[] columnPos = new float[selectedItems.Count + 1];
columnPos[0] = (float)leftMargin;
for (int i = 0; i < testItems.Count; i++)
for (int i = 0; i < selectedItems.Count; i++)
{
float columnWidth = e.Graphics.MeasureString(testItems[i].Caption, headerFont).Width;
foreach (var mtr in wm.MeterTestRslts)
float columnWidth = e.Graphics.MeasureString(selectedItems[i].Caption, headerFont).Width;
foreach (var wm in wms)
{
if (mtr != null && mtr.IsPilotRslt() && mtr.Publish() == Config.Entities.Publish.Always)
{
string itemText = testItems[i].Print(wm, mtr.Name());
string itemText = selectedItems[i].Print(wm);
/// Strip color information
string[] texts = itemText.Split(new char[] { '|' });
if (texts.Length == 2) { itemText = texts[0]; }
/// 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;
}
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));
}
int tableRightX = (int)columnPos[selectedItems.Count] - 20;
/// 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++)
for (int i = 0; i < selectedItems.Count; i++)
{
PrintHeaderAt(e, (int)columnPos[i], top + (int)(1.6 * SpacingOne4Header), testItems[i].Caption);
PrintHeaderAt(e, (int)columnPos[i], top + (int)(1.6 * SpacingOne4Header), selectedItems[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))
int rowsCount = 0;
foreach (var wm in wms)
{
WMeterRsltItemSpec.TableRowNr = ++rowsCount;
for (int i = 0; i < selectedItems.Count; i++)
{
testsCount++;
for (int i = 0; i < testItems.Count; i++)
WMeterRsltItemSpec.TableColumnNr = i + 1;
string itemText = selectedItems[i].Print(wm);
/// Strip color information
string[] texts = itemText.Split(new char[] { '|' });
if (texts.Length == 2)
{
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);
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 * rowsCount, itemText);
}
}
/// Horizontal line
horY = top + 2 * SpacingOneAndHalf4Header + SpacingOne * testsCount;
horY = top + 2 * SpacingOneAndHalf4Header + SpacingOne * rowsCount;
e.Graphics.DrawLine(new Pen(Color.Black, 2), new Point(tableLeftX, horY), new Point(tableRightX, horY));
return (testsCount + 1) * SpacingOne + 3 * SpacingOne4Header;
return (rowsCount + 1) * SpacingOne + 3 * SpacingOne4Header;
}