tbf/TestBenchFramework/BenchControl/ResultsPrinters/LabelPrinter/PrintLabelDocument.cs
2015-12-14 19:19:48 +01:00

302 lines
9.1 KiB
C#

///
/// Copyright (c) 2015 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Printing;
using System.IO;
using Config.Entities;
using TBF.Resources;
namespace TBF.BenchControl.ResultsPrinters.LabelPrinter
{
public class PrintLabelDocument : PrintDocument
{
const int FontSize = 9;
const string FontFamilyName = "Arial"; //"Times New Roman";
readonly int paperWidth;
readonly int paperHeight;
readonly string templateFile;
/// <summary> Property variable for the Font the user wishes to use </summary>
Font font;
///
/// Data to print
///
readonly GenericDevices.IBenchInfo benchId;
readonly Procedure procedure;
readonly IList<TestResult> unsortedResults;
readonly bool combined;
readonly DateTime dateTime;
///
/// Items to print
///
readonly IList<Config.ResultItemSpec> resultItems;
///
/// Layout and status
///
int nextWMNr; /// nr. of watermeter to be printed as the first one on the next page
int nrPages;
int pageNr; /// Page number to be printed at the bottom of the page
/// <summary>
/// Constructor
/// </summary>
/// <param name="textToPrint">Text to be printed</param>
public PrintLabelDocument(GenericDevices.IBenchInfo benchId,
Procedure procedure,
IList<TestResult> unsortedResults,
PageOrientation pageOrientation,
int paperWidth,
int paperHeight,
string templateFile)
{
this.benchId = benchId;
this.procedure = procedure;
this.unsortedResults = unsortedResults;
this.paperWidth = paperWidth;
this.paperHeight = paperHeight;
this.templateFile = templateFile;
DefaultPageSettings.Landscape = (pageOrientation == PageOrientation.Landscape);
dateTime = DateTime.Now;
if ((unsortedResults != null) && (unsortedResults.Count != 0) && (unsortedResults[0].MetersKind == MetersKind.Single))
{
resultItems = Config.ResultItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Printer_SingleWM);
combined = false;
}
else
{
resultItems = Config.ResultItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Printer_CombinedWM);
combined = true;
}
/// Set print area size and margins (in dots using 80 dpi)
int printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom;
int printWidth = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right;
int leftMargin = base.DefaultPageSettings.Margins.Left; /// X
int topMargin = base.DefaultPageSettings.Margins.Top; /// Y
/// Check if the user selected to print in Landscape mode
/// if they did then we need to swap height/width parameters
if (DefaultPageSettings.Landscape)
{
int tmp = printHeight;
printHeight = printWidth;
printWidth = tmp;
}
/// One watermeter per label/page
nrPages = (combined ? Config.Data.CompoundWMsCount : Config.Data.WMsCount);
pageNr = 1;
nextWMNr = 0;
}
/// <summary>
/// Override the default onbeginPrint method of the PrintDocument Object
/// </summary>
/// <param name=e></param>
/// <remarks></remarks>
protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e)
{
base.OnBeginPrint(e);
if (font == null) { font = new Font(FontFamilyName, FontSize, FontStyle.Regular); }
}
/// <summary>
/// Override the default OnPrintPage method of the PrintDocument.
/// </summary>
/// <param name=e></param>
/// <remarks>This provides the print logic for our document</remarks>
protected override void OnPrintPage(System.Drawing.Printing.PrintPageEventArgs e)
{
/// Run base code
base.OnPrintPage(e);
if (File.Exists(templateFile))
{
Image img = Image.FromFile(templateFile);
e.Graphics.DrawImage(new Bitmap(img), new Rectangle(0, 0, paperWidth, paperHeight));
}
/// Set print area size and margins (in dots using 80 dpi)
int printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom;
int printWidth = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right;
int leftMargin = base.DefaultPageSettings.Margins.Left; /// X
int topMargin = base.DefaultPageSettings.Margins.Top; /// Y
/// Check if the user selected to print in Landscape mode
/// if they did then we need to swap height/width parameters
if (base.DefaultPageSettings.Landscape)
{
int tmp = printHeight;
printHeight = printWidth;
printWidth = tmp;
}
int x = leftMargin;
int y = topMargin;
/// Use the StringFormat class for the text layout of our document
StringFormat format = new StringFormat(StringFormatFlags.LineLimit);
///--------
/// Body
///--------
if (combined)
{
PrintCombinedWM(e, nextWMNr + 1);
nextWMNr++;
e.HasMorePages = (nextWMNr < Config.Data.CompoundWMsCount);
}
else
{
/// Skip disabled water meters
while ((nextWMNr < Config.Data.WMsCount) && unsortedResults[0].Meters[nextWMNr].Disabled) nextWMNr++;
if (nextWMNr < Config.Data.WMsCount)
{
PrintSingleWM(e, nextWMNr);
bool anyMore = false;
for (int i = nextWMNr + 1; i < Config.Data.WMsCount; i++)
{
if (!unsortedResults[0].Meters[i].Disabled)
{
anyMore = true;
break;
}
}
e.HasMorePages = anyMore;
}
nextWMNr++;
}
}
/// <summary>
/// Print one water meter results
/// </summary>
/// <param name="wmNr">Water meter number (0-based)</param>
void PrintSingleWM(System.Drawing.Printing.PrintPageEventArgs e, int wmNr)
{
/// Serial number
if (!string.IsNullOrEmpty(unsortedResults[0].Meters[wmNr].SerialNr))
{
PrintAt(e, 20, 62, unsortedResults[0].Meters[wmNr].SerialNr);
}
/// Watermeter type
PrintAt(e, 20, 74, unsortedResults[0].ProtocolTitle);
/// Date
string dateTimeStr = string.Format("{0}/{1}/{2}", dateTime.Day.ToString("D2"), dateTime.Month.ToString("D2"), (dateTime.Year % 100).ToString("D2"));
PrintAt(e, 135, 74, dateTimeStr);
IList<TestResult> results = Utils.GetSortedTestResults(procedure, unsortedResults, Utils.PartNr(wmNr+1, combined));
for (int printPosition = 1; printPosition <= 3; printPosition++)
{
for (int r = 0; r < results.Count; r++)
{
if (results[r] != null && (r + 1) == printPosition)
{
if (resultItems.Count > 0)
{
string text = resultItems[0].Print(results[r].Meters[wmNr]);
string[] texts = text.Split(new char[] { '|' });
if (texts.Length == 2)
{
Color color = texts[1].Equals("Green") ? Color.Green : (texts[1].Equals("Red") ? Color.Red : Color.White);
text = texts[0];
/// TODO: How to print colors?
}
PrintAt(e, 78, 6 + 14 * printPosition, string.Format("{0}%", text));
}
}
}
}
}
/// <summary>
/// Print one combined water meter results
/// </summary>
/// <param name="wmNr1">Water meter number (1-based)</param>
/// <param name="top">Top coordinate of watermeter data</param>
/// <returns>The height of the printed section</returns>
void PrintCombinedWM(System.Drawing.Printing.PrintPageEventArgs e, int wmNr1)
{
/// Serial number
if (!string.IsNullOrEmpty(unsortedResults[0].Meters[2 * wmNr1 - 2].SerialNr))
{
PrintAt(e, 20, 62, unsortedResults[0].Meters[2 * wmNr1 - 2].SerialNr);
}
/// Watermeter type
PrintAt(e, 20, 74, unsortedResults[0].ProtocolTitle);
/// Date
string dateTimeStr = string.Format("{0}/{1}/{2}", dateTime.Day.ToString("D2"), dateTime.Month.ToString("D2"), (dateTime.Year % 100).ToString("D2"));
PrintAt(e, 135, 74, dateTimeStr);
IList<TestResult> results = Utils.GetSortedTestResults(procedure, unsortedResults, Utils.PartNr(wmNr1, combined));
for (int printPosition = 1; printPosition <= 3; printPosition++)
{
for (int r = 0; r < results.Count; r++)
{
if (results[r] != null && (r + 1) == printPosition)
{
if (resultItems.Count > 0)
{
string text = resultItems[0].PrintCombined(results[r].Meters[2 * wmNr1 - 2],
results[r].Meters[2 * wmNr1 - 1],
results[r].CombinedMeters[wmNr1 - 1]);
string[] texts = text.Split(new char[] { '|' });
if (texts.Length == 2)
{
Color color = texts[1].Equals("Green") ? Color.Green : (texts[1].Equals("Red") ? Color.Red : Color.White);
text = texts[0];
/// TODO: How to print colors?
}
PrintAt(e, 78, 6 + 14 * printPosition, string.Format("{0}%", text));
}
}
}
}
}
void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text)
{
PrintAt(e, p.X, p.Y, text);
}
void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text)
{
RectangleF printArea = new RectangleF(x, y, 667, 18);
e.Graphics.DrawString(text, this.font, Brushes.Black, printArea);
}
}
}