302 lines
9.1 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|