Compare commits

...
Author SHA1 Message Date
Milan Hanajik 32762f0fdb Bug fix in MeasurementCorrection.GetCorrection( ), ver. 3.1.1853 2022-01-17 12:45:47 +01:00
Milan Hanajik d42ad8c5cf GenericTest and RecordProessing modifications for Laser in Nanjing, ver. 3.0.1 2022-01-17 10:26:56 +01:00
Milan Hanajik 2eaf2b044c SharedDatabase.WorkflowSummary.ReadFromDB(), int wm.ProcessId -> string wm.Workflow, etc. 2022-01-17 10:26:55 +01:00
Milan Hanajik 0b400fcbd0 SharedDatabase.WorkflowSummary added. 2022-01-17 10:26:45 +01:00
Milan Hanajik 7facefb305 Radio address format "D9" defined on one place: SharedDatabase.Const.RAFormat 2022-01-15 13:01:50 +01:00
Milan Hanajik 917051f072 Water meter test results graph fixed, ver. 3.1.1849 2022-01-12 12:38:01 +01:00
Milan Hanajik 589fd9cf18 OrderManagement bug fix, ver. 3.0.11 2022-01-12 10:39:05 +01:00
Milan Hanajik 4914ded61d Workplace ver. 3.1.15 2022-01-12 09:33:52 +01:00
Milan Hanajik 1af0b71503 Production tracing clean-up, ver. 3.1.1848 2022-01-12 07:53:03 +01:00
Milan Hanajik 2f1a8cc9d6 Production tracing : Saving records OK, Verification should be OK (TODO: Test) 2022-01-11 20:28:28 +01:00
Milan Hanajik 32047ef76a Clean-up 2022-01-11 20:27:06 +01:00
Milan Hanajik 18f7de5f97 WorkflowConfigurator handles case CurrrentUser==null correctly, Max. part name len.=10, ver. 3.0.4 2022-01-11 14:52:50 +01:00
Milan Hanajik 6d3fa9b110 Added DB columns : SharedDatabase.Entities.OrderInfo.Year, ...ReferenceRecord.Name1,Name2, OrderManagement ver. 3.0.10 2022-01-11 13:03:16 +01:00
Milan Hanajik eea94d1d9f ProductionTracing : saving StepRecord and updating ReferenceRecord. ver. 3.1.1847 2022-01-10 08:11:52 +01:00
Milan Hanajik a6ba6e26b2 SharedDatabase entities/mappings changes, StepRecord added, RR.Code1,2,3,4, etc. Workplace ver. 3.1.14 2022-01-10 07:27:18 +01:00
Milan Hanajik c75e3d08d3 GenericTest project added. 2022-01-07 16:04:16 +01:00
Milan Hanajik 43a32adb7e Workplace, DataMatrix4Net and RecordProcessing projects added. 2022-01-07 14:15:02 +01:00
Milan Hanajik 9a7ed9668b SharedDatabase : DoubleLoginDlg, TripleLoginDlg. 2022-01-07 12:23:31 +01:00
Milan Hanajik 068aee3cbd WorkflowConfigurator project added. 2022-01-07 12:23:23 +01:00
Milan Hanajik 2710823931 ListViewEx clean-up. 2022-01-07 12:23:22 +01:00
Milan Hanajik 6150c5b808 Common : QuitAppException class added, ModelessForm troubleshooted 2022-01-07 12:22:54 +01:00
Milan Hanajik 3c93e56b67 SharedDatabase clean-up 2022-01-06 15:41:19 +01:00
Milan Hanajik af13e2f2b4 Events.EndSession added, after S640Communication at the end 'End session' is invoked automatically. 2022-01-06 08:00:07 +01:00
Milan Hanajik 4d018a8ba8 DataEntry.iPerl bug fixes when invoked without the production tracing, ver. 3.1.1846 2022-01-06 08:00:07 +01:00
Milan Hanajik df89050d78 DataEntry.S620 bug fixes when invoked without an order (after restoring results). 2022-01-06 08:00:06 +01:00
Milan Hanajik 6071d7f598 Bug fixes : Ambient temperature, pressure, humidity calculation in Results. 2022-01-06 08:00:06 +01:00
Milan Hanajik 1b767f6298 MeterTestRslt.Passed set correctly in iPerlCommunicationSeq.MakeQ2CorrectedFrom( ), etc., ver. 3.1.1845 2022-01-05 08:18:48 +01:00
Milan Hanajik 8da5512eb0 enum FillState in Common.Enums, FillState ProcessData.FillState introduced and used in TBF.Rig.Sequences. 2022-01-04 18:10:44 +01:00
Milan Hanajik 1133a2d5bf Bug fixes : 1 Saving results cannot be stopped, 2 Processing statistics, 3 SensusTestInfo 2022-01-04 15:30:10 +01:00
Milan Hanajik c8ff5f8813 ResultsBrowser with Assigned s/n, Complete s/n and RadioAddress (Nanjing), ver. 3.1.1803 2021-12-21 09:25:46 +01:00
Milan Hanajik 1f0bbc0d4e DataEntry.S620 : Serial number assignment fixed, AssignedSN = -1 when not assigned, ver. 3.1.1843 2021-12-17 11:51:53 +01:00
Milan Hanajik ba549cbaee MainWnd: Reload procedures button. 2021-12-17 11:51:53 +01:00
Milan Hanajik 1a8a6defd9 OrderManagement.OrderStateDlg displays order progress information, ver. 3.0.9 2021-12-16 10:01:35 +01:00
Milan Hanajik 9a5f2c1a60 OrderInfo : CurrentNr1,2,3,4,5 added, 2021-12-16 08:18:54 +01:00
Milan Hanajik ee89158ae3 Uni.FlowMeter nominal frequency is a parameter, ver. 3.1.1840 2021-12-15 14:34:45 +01:00
Milan Hanajik 15e9c25dcf DataEntry.S620 : Serial number assignment, ver. 3.1.1839 2021-12-15 09:36:21 +01:00
Milan Hanajik c826b40e80 OrderManagement: Conflict check, OrderInfo.VacoDescription/MadeInText/Packing Varchar(255) added, etc. ver. 3.0.7 2021-12-14 23:08:36 +01:00
Milan Hanajik 804cf2aaea ver. 3.1.1836 2021-12-14 08:15:05 +01:00
Milan Hanajik 47511ef873 Tracing: CurrentPcsCount/CurrentSN/CurrentRA incremented, OrderInfo, Workflow and Workplace re-read from DB after sel., ver. 3.1.1835. 2021-12-13 15:03:52 +01:00
Milan Hanajik 43caffd73d S640CommForm Start/Ende.pro fixed, OriRadioAddress added to results, OrderInfo.Clone9) fixed, ver. 3.1.1833 2021-12-10 11:39:16 +01:00
Milan Hanajik 0d0355c65a ProductionTracing for Nanjing, OrderInfo updated after assignment of serial numbers, ver. 3.1.1831 2021-12-10 07:59:58 +01:00
Milan Hanajik dfddc8a980 OrderManagement : Copy button, ver. 3.0.7 2021-12-10 07:59:58 +01:00
Milan Hanajik 68c3ccbef6 SelectedProcedure stored in ProcessData, used in DataEntry.iPERL and S620, S640Comm cleaned, IOrderInfo, I640Cfg, OrderManagement v.3.0.6, etc. 2021-12-09 17:12:52 +01:00
Milan Hanajik ff28d507cf TestMethods.Evacuation added. 2021-12-09 17:12:51 +01:00
Milan Hanajik 2c00ed6dc4 SensusOracle : UID and Pwd invisible, CreateWztypIfMissing, VtAuftragPd, VtPruefpunktSollSd.Qbezeichnung max 8 char, more logging 2021-12-09 17:12:51 +01:00
Milan Hanajik cd84c82475 SensusOracle : Automatic WZ_TYPE_ID assignment and creation OK, ver. 3.1.1815 2021-12-09 17:12:51 +01:00
Milan Hanajik e324de985f Metrology and Uncertainties dialogs display tabs for Rig.Scales.MettlerToledo. 2021-12-09 17:12:51 +01:00
Milan Hanajik 0e45ef6689 TBF.Rig.Network.Comet.Ambient fixed : UpdateProcessData() was missing. 2021-12-09 16:35:04 +01:00
Milan Hanajik edc48d8723 Gitignore modified. 2021-12-09 16:35:04 +01:00
Milan Hanajik 3630af4a59 OrderManagement ver. 3.0.4 : Support for predefined orders 2021-12-01 16:55:06 +01:00
Milan Hanajik d1e0d1466d SharedDatabase synchronized with Production-Monitoring.TracingDB 2021-12-01 13:13:59 +01:00
Milan Hanajik bbffc3b406 TBF.UI.ResultsMI.SendAainDBAndWMSelectionForm as in 2.27 2021-11-29 22:17:45 +01:00
Milan Hanajik 9bc9db1792 DB.SensusOracle : Automatic WMTypeId assignment in progress. 2021-11-29 14:01:57 +01:00
Milan Hanajik 19c9e3a2da FileWriters,IperlLogger fixed in DesigMode == Based_on_procedure 2021-11-28 07:58:16 +01:00
Milan Hanajik 9a79ff1344 Scales.MettlerToledo : SICS command I4 : Zero length scale S/N is accepted, ver. 3.1.1814 2021-11-26 14:14:26 +01:00
Milan Hanajik 021f17c774 SharedDatabase.Entities.Part.CodeType and CodeForm --> sbyte, ver. 3.1.1813 2021-11-26 10:33:21 +01:00
Milan Hanajik 513c808f2b OrderManagement : barcode size, State and RA sort orders, EditOrderDlg localization, ver. 3.0.3 2021-11-22 23:31:25 +01:00
Milan Hanajik 09a0968b76 Workflow used in DataEntry.S620, LaserMarking stored to WaterMeter.Remark. 2021-11-18 14:54:03 +01:00
Milan Hanajik 351157dbba LaserMarking added to OrderInfo, OrderInfo printing, bug fixes. 2021-11-18 14:53:12 +01:00
Milan Hanajik 0494054171 Yet more MainWnd, MainSeq, etc. changes,ver. 3.1.1811 2021-11-18 14:53:12 +01:00
Milan Hanajik 587f6dffd0 More MainWnd, MainSeq, DataEntry.S620 and OrderManagement changes, ver. 3.1.1810 2021-11-18 14:53:12 +01:00
Milan Hanajik a35716733d MainWnd and DataEntry.S620 changes 2021-11-18 14:53:12 +01:00
Milan Hanajik 44761ff411 OrderManagement project added, ver. 3.1.1809 2021-11-18 14:53:11 +01:00
Milan Hanajik 5f7a80b826 SharedDatabase : OrderInfo table modified. 2021-11-18 14:53:11 +01:00
Milan Hanajik 99337ba7d9 Results.Output.Printers.PrintersCommon --> Common.Printers.PrintersCommon 2021-11-18 14:53:11 +01:00
Milan Hanajik 772080ae3b ListViewEx and MySortOrder related changes. 2021-11-13 05:38:10 +01:00
Milan Hanajik 9b5ee442a6 DataEntry.S620.FormForMechanicalMetersWithTracing localization. 2021-11-11 15:26:56 +01:00
Milan Hanajik 51b3e994c3 Bug fixes : (1) UniCB timing after a delay in worker thread (DB request), (2) Scales.MettlerToledo.ScaleCfg, ver. 3.1.1806 2021-11-11 13:32:54 +01:00
Milan Hanajik 335fce3e39 Bug fix : 6x try / catch to resolve crashes caused by GemCard, etc., ver. 3.1.1805 2021-11-11 08:19:35 +01:00
Milan Hanajik 44fc7b92fd TM.S640Communication as in 2.27 branch (EnterSerialNumbers, 40 wms), DataEntry.iPerl with Direction and Orders enum parameters. 2021-11-10 09:40:56 +01:00
Milan Hanajik 0f5c4b083d Unit selection in UI.Procedures.ProcedureDlg and UI.Procedures.TestWizard, ver. 3.1.1801 2021-11-09 08:48:27 +01:00
Milan Hanajik 5996fda348 SensusOracle.Database synchronized with 2.26/27, TestBenchGroupId, idBenutzer, ver. 3.1.1800 2021-11-08 09:17:00 +01:00
Milan Hanajik 339d79595d Uni.FlowMetersInParallel in schematic drawing, ver. 3.1.1795 2021-11-04 12:37:37 +01:00
Milan Hanajik a2a3d5940e Uni.FlowMetersInParallel enabled, CB.Uni.OutputMessage supports parallel flow meters, etc, ver. 3.1.1794 2021-11-04 11:57:32 +01:00
Milan Hanajik 62913cf68f Uni.RegValve position can be changed by mouse-clicks on the set point bar, ver. 3.1.1792 2021-11-02 14:36:11 +01:00
Milan Hanajik 3b70baeff0 Artefacts when drawing set points or tank level fixed, style changes. 2021-11-02 14:07:12 +01:00
Milan Hanajik bfa69ef611 Inputs mapped to route bits 80..119, UniCB to bit 120, Emergency stop from bit 96* (not from State), ver. 3.1.1788 2021-10-29 16:00:42 +02:00
Milan Hanajik 8c7bd51ca8 More logging PID (ActionID.SetFlow), SetFlowOp : ValveMove command send in case Flow == 0, ver. 3.1.1785 2021-10-29 15:59:41 +02:00
Milan Hanajik 87fa7fb669 Changes done in 2.26 branch. 2021-10-27 12:02:43 +02:00
Milan Hanajik 7205682d75 Bug fix : prevent SW crash when Scale.MettlerToledo is added in 'Not controlled by this PC' mode, ver.3.1.1773 2021-10-11 13:46:52 +02:00
Milan Hanajik 235da5e9e1 Platform target AnyCPU whereever possible. 2021-10-11 13:19:32 +02:00
Milan Hanajik 13b30b2caf DB.SensusOracle.DatabaseCfg : database access passwords are not readable 2021-10-11 09:22:20 +02:00
Milan Hanajik b5e2a7bdc9 TBF.UI.Procedures clean-up 2021-10-11 09:14:19 +02:00
Milan Hanajik 078bd8aaf4 TBF.Rig.Scales.MettlerToledo replaces three MettlerToledo components, ver. 3.1.1772 2021-10-11 09:14:05 +02:00
Milan Hanajik cef5dc3c10 ResultsBrowser supports 9 test benches, config directory is a s.ibling to bin directory 2021-09-23 09:34:07 +02:00
Milan Hanajik 1355777fe0 MettlerToledo.Standard.BalanceDev processes ID1 commands (only), ver. 3.1.1746 2021-09-22 18:42:14 +02:00
Milan Hanajik f82da6e4c8 Bug fix in TBF.Data.SetData( ) - divide by zero, ver. 3.1.1740 2021-09-20 15:11:24 +02:00
572 changed files with 51422 additions and 6802 deletions
+26 -14
View File
@@ -2,6 +2,8 @@ Common/bin/
Common/obj/
Config/bin/
Config/obj/
DataMatrix4Net/bin/
DataMatrix4Net/obj/
DataStreamInterface/bin/
DataStreamInterface/obj/
Decrypt/bin/
@@ -18,24 +20,30 @@ Events/bin/
Events/obj/
FeatureVectorCalculator/bin/
FeatureVectorCalculator/obj/
GemCard/bin
GemCard/obj
GenCode128/bin
GenCode128/obj
GraphLib/bin
GraphLib/obj
MergeResultsDBs/bin
MergeResultsDBs/obj
TracingDB/bin
TracingDB/obj
ResetBatchNr/bin
ResetBatchNr/obj
RestClient/bin
RestClient/obj
GemCard/bin/
GemCard/obj/
GenCode128/bin/
GenCode128/obj/
GenericTest/bin/
GenericTest/obj/
GraphLib/bin/
GraphLib/obj/
MergeResultsDBs/bin/
MergeResultsDBs/obj/
OrderManagement/bin/
OrderManagement/obj/
RecordProcessing/bin/
RecordProcessing/obj/
ResetBatchNr/bin/
ResetBatchNr/obj/
RestClient/bin/
RestClient/obj/
Results/bin/
Results/obj/
ResultsBrowser/bin/
ResultsBrowser/obj/
ResultsParser/bin/
ResultsParser/obj/
SharedDatabase/bin
SharedDatabase/obj
SchematicDrawing/bin
@@ -52,6 +60,10 @@ Users/bin/
Users/obj/
UserManagement/bin/
UserManagement/obj/
WorkflowConfigurator/bin/
WorkflowConfigurator/obj/
Workplace/bin/
Workplace/obj/
.vs/
*.suo
*.bak
+6 -8
View File
@@ -52,6 +52,7 @@
<SubType>Component</SubType>
</Compile>
<Compile Include="Forms\ListViewExtensions.cs" />
<Compile Include="Forms\LviDateTimeColumnComparer.cs" />
<Compile Include="Forms\LviIntColumnComparer.cs" />
<Compile Include="Forms\LviNameSurnameColumnComparer.cs" />
<Compile Include="Forms\LviTextColumnComparer.cs" />
@@ -65,11 +66,15 @@
<Compile Include="Formulas.cs" />
<Compile Include="GlobalData.cs" />
<Compile Include="IMeasurementCorrection.cs" />
<Compile Include="IOrderInfo.cs" />
<Compile Include="IParamsProvider.cs" />
<Compile Include="Iperl\OptoTelegramRaw.cs" />
<Compile Include="IUncertainty.cs" />
<Compile Include="IUser.cs" />
<Compile Include="ProcedureInfo.cs" />
<Compile Include="Printers\PrintersCommon.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="QuitAppException.cs" />
<Compile Include="SerializableDictionary.cs" />
<Compile Include="Telegram.cs" />
<Compile Include="UIControls\CoolButtonCtrl.cs">
@@ -78,17 +83,10 @@
<Compile Include="UIControls\CoolButtonCtrl.Designer.cs">
<DependentUpon>CoolButtonCtrl.cs</DependentUpon>
</Compile>
<Compile Include="UIControls\LviDateTimeColumnComparer.cs" />
<Compile Include="UIControls\RoundedRectangle.cs" />
<Compile Include="Units.cs" />
<Compile Include="Utils.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="UIControls\ListViewEx.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="UIControls\ListViewExtensions.cs" />
<Compile Include="UIControls\LviIntColumnComparer.cs" />
<Compile Include="UIControls\LviTextColumnComparer.cs" />
</ItemGroup>
<ItemGroup />
<ItemGroup>
+15 -6
View File
@@ -70,8 +70,8 @@ namespace Common
[Description("None")] None,
[Description("Local procedures")] FromLocalDB,
[Description("Shared procedures")] FromSharedDB,
[Description("Orders from Oracle DB")] OrderNrFromOracleDB,
[Description("Orders from Tracing DB")] OrderNrFromTracingDB,
[Description("Orders from Oracle DB")] OrderFromOracleDB,
[Description("Orders from Tracing DB")] OrderFromTracingDB,
#endif
Count
}
@@ -350,6 +350,17 @@ namespace Common
Count
}
/// <summary>
/// State of water filled in the test bench.
/// </summary>
public enum FillState
{
Unknown, /// Test bench fill state is unknown
Empty, /// Test bench is empty, no water
Full, /// Test bench is full of water
Count
}
public enum MeretProtocol
{
[Description("<undefined>")] Undefined,
@@ -759,10 +770,8 @@ namespace Common
[Description("Levá")] Left,
[Description("Pravá")] Right,
#else
[Description("Left")]
Left,
[Description("Right")]
Right,
[Description("Left")] Left,
[Description("Right")] Right,
#endif
Count
}
+37 -11
View File
@@ -1,5 +1,5 @@
///
/// Copyright (c) 2016-2021 Sensus Slovensko a.s.
/// Copyright (c) 2013-2022 Sensus Slovensko a.s.
///
using System;
using System.Collections;
@@ -61,17 +61,14 @@ namespace Common.Forms
private const int HDN_ITEMCHANGINGW = (HDN_FIRST-20);
#endregion
public SortOrder SortOrder = SortOrder.None;
public int SortColumn = -1;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public event SubItemEventHandler SubItemClicked;
public event SubItemEventHandler SubItemBeginEditing;
public event SubItemEventHandler SubItemRightClicked;
public event SubItemEventHandler SubItemBeginEditing;
public event SubItemEndEditingEventHandler SubItemEndEditing;
public ListViewEx()
@@ -241,12 +238,22 @@ namespace Common.Forms
{
base.OnMouseUp(e);
if (DoubleClickActivation)
{
return;
}
MouseEventArgs me = (MouseEventArgs)e;
if (me.Button == MouseButtons.Right)
{
/// Right mouse button click function
RightClickFunctionSubitemAt(new Point(e.X, e.Y));
}
else
{
/// Normal function (=edit item)
if (DoubleClickActivation)
{
return;
}
EditSubitemAt(new Point(e.X, e.Y));
EditSubitemAt(new Point(e.X, e.Y));
}
}
protected override void OnDoubleClick(EventArgs e)
@@ -277,6 +284,20 @@ namespace Common.Forms
}
}
///<summary>
/// Fire SubItemRightClicked
///</summary>
///<param name="p">Point of click/doubleclick</param>
private void RightClickFunctionSubitemAt(Point p)
{
ListViewItem item;
int idx = GetSubItemAt(p.X, p.Y, out item);
if (idx >= 0)
{
OnSubItemRightClicked(new SubItemEventArgs(item, idx));
}
}
#endregion
#region In-place editing functions
@@ -302,6 +323,11 @@ namespace Common.Forms
if (SubItemClicked != null) SubItemClicked(this, e);
}
protected void OnSubItemRightClicked(SubItemEventArgs e)
{
if (SubItemRightClicked != null) SubItemRightClicked(this, e);
}
/// <summary>
/// Begin in-place editing of given cell
+10 -5
View File
@@ -1,4 +1,7 @@
using System;
///
/// Copyright (c) 2019-2020 Sensus Slovensko a.s.
///
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;
@@ -55,7 +58,7 @@ namespace Common.Forms
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, ref HDITEM lParam);
public static void SetSortIcon(this ListViewEx listViewControl, int columnIndex, SortOrder order)
public static void SetSortIcon(this ListViewEx listViewControl, int columnIndex, MySortOrder order)
{
IntPtr columnHeader = SendMessage(listViewControl.Handle, LVM_GETHEADER, IntPtr.Zero, IntPtr.Zero);
for (int columnNumber = 0; columnNumber <= listViewControl.Columns.Count - 1; columnNumber++)
@@ -71,16 +74,18 @@ namespace Common.Forms
throw new Win32Exception();
}
if (order != SortOrder.None && columnNumber == columnIndex)
if (order != MySortOrder.None && columnNumber == columnIndex)
{
switch (order)
{
case SortOrder.Ascending:
case MySortOrder.Ascending:
case MySortOrder.Ascending2:
item.fmt &= ~HDITEM.Format.SortDown;
item.fmt |= HDITEM.Format.SortUp;
break;
case SortOrder.Descending:
case MySortOrder.Descending:
case MySortOrder.Descending2:
item.fmt &= ~HDITEM.Format.SortUp;
item.fmt |= HDITEM.Format.SortDown;
break;
@@ -1,24 +1,24 @@
///
/// Copyright (c) 2019-2020 Sensus Slovensko a.s.
/// Copyright (c) 2019-2021 Sensus Slovensko a.s.
///
using System;
using System.Collections;
using System.Windows.Forms;
namespace Common.UIControls
namespace Common.Forms
{
public class LviDateTimeColumnComparer : IComparer
{
int column;
SortOrder order;
MySortOrder order;
public LviDateTimeColumnComparer()
{
column = 0;
order = SortOrder.Ascending;
order = MySortOrder.Ascending;
}
public LviDateTimeColumnComparer(int column, SortOrder order)
public LviDateTimeColumnComparer(int column, MySortOrder order)
{
this.column = column;
this.order = order;
@@ -33,13 +33,13 @@ namespace Common.UIControls
{
return 0;
}
else if (order == SortOrder.Ascending)
else if ((order == MySortOrder.Descending || order == MySortOrder.Descending2))
{
return (valX > valY) ? 1 : -1;
return (valY > valX) ? 1 : -1;
}
else
{
return (valY > valX) ? 1 : -1;
return (valX > valY) ? 1 : -1;
}
}
}
+5 -3
View File
@@ -1,11 +1,13 @@
using System;
///
/// Copyright (c) 2019-2021 Sensus Slovensko a.s.
///
using System;
using System.Collections;
using System.Windows.Forms;
using Common;
namespace Common.Forms
{
class LviIntColumnComparer : IComparer
public class LviIntColumnComparer : IComparer
{
int column;
MySortOrder order;
+1 -2
View File
@@ -1,11 +1,10 @@
using System;
using System.Collections;
using System.Windows.Forms;
using Common;
namespace Common.Forms
{
class LviNameSurnameColumnComparer : IComparer
public class LviNameSurnameColumnComparer : IComparer
{
private int column;
MySortOrder order;
+5 -3
View File
@@ -1,11 +1,13 @@
using System;
///
/// Copyright (c) 2019-2021 Sensus Slovensko a.s.
///
using System;
using System.Collections;
using System.Windows.Forms;
using Common;
namespace Common.Forms
{
class LviTextColumnComparer : IComparer
public class LviTextColumnComparer : IComparer
{
private int column;
MySortOrder order;
-1
View File
@@ -51,7 +51,6 @@
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "ModelessForm";
this.Load += new System.EventHandler(this.ModelessForm_Load);
this.ResumeLayout(false);
this.PerformLayout();
+42 -58
View File
@@ -6,62 +6,27 @@ namespace Common.Forms
{
public partial class ModelessForm : Form
{
/// <summary>
/// Called from the state machine when an operation forces a modeless dialog close.
/// </summary>
public static void UpdateMessage(MessageEventArgs args)
{
if (UpdateMessageHandler == null) return;
try { UpdateMessageHandler(null, args); }
catch (Exception) { }
}
public static event EventHandler<MessageEventArgs> UpdateMessageHandler;
void OnUpdateMessage(object sender, MessageEventArgs args)
{
Message = args.Message;
if (Message != null) label1.Text = Message;
}
/// <summary>
/// Called from the state machine when an operation forces a modeless dialog close.
/// </summary>
public static void CloseForm()
{
if (CloseFormHandler == null) return;
try { CloseFormHandler(null, null); }
catch (Exception) { }
}
public static event EventHandler<EventArgs> CloseFormHandler;
void OnCloseForm(object sender, EventArgs args)
{
DialogResult = DialogResult.Cancel;
Close();
}
public string Title;
public string Message;
public Color BackgroundColor;
public Color TextColor;
public Font TextFont;
public string FontFamily;
public int FontSize;
public FontStyle FontStyle;
/// <summary>
/// Constructor to be used by the application
/// </summary>
/// <param name="title">Window title</param>
/// <param name="message">Displayed message</param>
public ModelessForm()
public ModelessForm(string message, int backArgb = 0, int textArgb = 0, Font textFont = null, string title = null)
{
InitializeComponent();
ControlBox = false;
label1.Text = (message != null) ? message : "Please wait";
BackColor = (backArgb != 0) ? Color.FromArgb(backArgb) : Color.LightGreen;
ForeColor = (textArgb != 0) ? Color.FromArgb(textArgb) : Color.Black;
label1.Font = (textFont != null) ? textFont : new Font("Arial", 14, FontStyle.Regular);
Text = (title != null) ? title : string.Empty;
float textWidth = Graphics.FromImage(new Bitmap(1, 1)).MeasureString(label1.Text, label1.Font).Width;
float textHeight = Graphics.FromImage(new Bitmap(1, 1)).MeasureString(label1.Text, label1.Font).Height;
Width = (int)textWidth + 120; /// Form width calculated from the text width
Height += (int)textHeight; /// Form height calculated from the text height
UpdateMessageHandler += delegate(object sender, MessageEventArgs args)
{
if (InvokeRequired) { Invoke(new EventHandler<MessageEventArgs>(OnUpdateMessage), sender, args); }
@@ -75,18 +40,37 @@ namespace Common.Forms
};
}
private void ModelessForm_Load(object sender, EventArgs e)
{
if (Title != null) Text = Title;
if (Message != null) label1.Text = Message;
if (BackgroundColor != null) BackColor = BackgroundColor;
if (TextColor != null) ForeColor = TextColor;
if (FontFamily != null) label1.Font = new Font(FontFamily, FontSize, FontStyle);
float textWidth = Graphics.FromImage(new Bitmap(1, 1)).MeasureString(label1.Text, label1.Font).Width;
float textHeight = Graphics.FromImage(new Bitmap(1, 1)).MeasureString(label1.Text, label1.Font).Height;
Width = (int)textWidth + 120; /// Form width calculated from the text width
Height += (int)textHeight; /// Form height calculated from the text height
/// <summary>
/// Called from the state machine when an operation forces a modeless dialog close.
/// </summary>
public void UpdateMessage(MessageEventArgs args)
{
if (UpdateMessageHandler == null) return;
try { UpdateMessageHandler(null, args); }
catch (Exception) { }
}
public event EventHandler<MessageEventArgs> UpdateMessageHandler;
void OnUpdateMessage(object sender, MessageEventArgs args)
{
if (args.Message != null) label1.Text = args.Message;
}
/// <summary>
/// Called from the state machine when an operation forces a modeless dialog close.
/// </summary>
public static void CloseForm()
{
if (CloseFormHandler == null) return;
try { CloseFormHandler(null, null); }
catch (Exception) { }
}
static public event EventHandler<EventArgs> CloseFormHandler;
void OnCloseForm(object sender, EventArgs args)
{
DialogResult = DialogResult.Cancel;
Close();
}
}
}
+12 -2
View File
@@ -18,7 +18,10 @@ namespace Common
public static DBSettings LocalUsersDB = null;
public static IUser CurrentUser;
public static Common.AuthorizedAs AuthorizedAs;
public static IUser CurrentUser2;
public static IUser CurrentUser3;
public static Common.AuthorizedAs AuthorizedAs;
public static DateTime LastAuthorization = DateTime.Now;
public static int MinPasswdLength = 0;
@@ -26,7 +29,14 @@ namespace Common
public static string GetCurrentUserName()
{
return (CurrentUser != null && CurrentUser.UserName != null) ? CurrentUser.UserName : string.Empty;
if (CurrentUser == null || CurrentUser.UserName == null)
return string.Empty;
else if (CurrentUser2 == null || CurrentUser2.UserName == null)
return CurrentUser.UserName;
else if (CurrentUser3 == null || CurrentUser3.UserName == null)
return string.Format("{0},{1}", CurrentUser.UserName, CurrentUser2.UserName);
else
return string.Format("{0},{1},{2}", CurrentUser.UserName, CurrentUser2.UserName, CurrentUser3.UserName);
}
}
}
+26
View File
@@ -0,0 +1,26 @@
///
/// Copyright (c) 2021 Sensus Slovensko a.s.
///
using System;
namespace Common
{
public interface IOrderInfo
{
string POName { get; }
string VariantCode { get; }
string ModuleParam { get; }
int PiecesCount { get; }
string SNPrefix { get; }
int SNFirst { get; }
int SNDigitsCount { get; }
string SNSuffix { get; }
string RAPrefix { get; }
int RAFirst { get; }
string RASuffix { get; }
string Remark { get; }
int CurrentPcsCount { get; set; }
int CurrentSN { get; set; }
int CurrentRA { get; set; }
}
}
@@ -2,10 +2,8 @@
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Printing;
using Common;
using Config.Entities;
namespace Results.Output.Printers
namespace Common.Printers
{
public class PrintersCommon : PrintDocument
{
+12
View File
@@ -0,0 +1,12 @@
using System;
namespace Common
{
public class QuitAppException : Exception
{
public QuitAppException(string message)
: base(message)
{
}
}
}
-486
View File
@@ -1,486 +0,0 @@
///
/// Copyright (c) 2013-2020 Sensus Slovensko a.s.
///
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace Common.UIControls
{
/// <summary>
/// Event Handler for SubItem events
/// </summary>
public delegate void SubItemEventHandler(object sender, SubItemEventArgs e);
/// <summary>
/// Event Handler for SubItemEndEditing events
/// </summary>
public delegate void SubItemEndEditingEventHandler(object sender, SubItemEndEditingEventArgs e);
/// <summary>
/// Inherited ListView to allow in-place editing of subitems
/// </summary>
public class ListViewEx : System.Windows.Forms.ListView
{
#region Interop structs, imports and constants
/// <summary>
/// MessageHeader for WM_NOTIFY
/// </summary>
private struct NMHDR
{
#pragma warning disable
public IntPtr hwndFrom;
public Int32 idFrom;
public Int32 code;
#pragma warning restore
}
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wPar, IntPtr lPar);
[DllImport("user32.dll", CharSet=CharSet.Ansi)]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, int len, ref int [] order);
// ListView messages
private const int LVM_FIRST = 0x1000;
private const int LVM_GETCOLUMNORDERARRAY = (LVM_FIRST + 59);
// Windows Messages that will abort editing
private const int WM_HSCROLL = 0x114;
private const int WM_VSCROLL = 0x115;
private const int WM_SIZE = 0x05;
private const int WM_NOTIFY = 0x4E;
private const int HDN_FIRST = -300;
private const int HDN_BEGINDRAG = (HDN_FIRST-10);
private const int HDN_ITEMCHANGINGA = (HDN_FIRST-0);
private const int HDN_ITEMCHANGINGW = (HDN_FIRST-20);
#endregion
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public event SubItemEventHandler SubItemClicked;
public event SubItemEventHandler SubItemRightClicked;
public event SubItemEventHandler SubItemBeginEditing;
public event SubItemEndEditingEventHandler SubItemEndEditing;
public ListViewEx()
{
// This call is required by the Windows.Forms Form Designer.
InitializeComponent();
base.FullRowSelect = true;
base.View = View.Details;
base.AllowColumnReorder = true;
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if( components != null )
components.Dispose();
}
base.Dispose( disposing );
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
private bool _doubleClickActivation = false;
/// <summary>
/// Is a double click required to start editing a cell?
/// </summary>
public bool DoubleClickActivation
{
get { return _doubleClickActivation; }
set { _doubleClickActivation = value; }
}
/// <summary>
/// Retrieve the order in which columns appear
/// </summary>
/// <returns>Current display order of column indices</returns>
public int[] GetColumnOrder()
{
IntPtr lPar = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int)) * Columns.Count);
IntPtr res = SendMessage(Handle, LVM_GETCOLUMNORDERARRAY, new IntPtr(Columns.Count), lPar);
if (res.ToInt32() == 0) // Something went wrong
{
Marshal.FreeHGlobal(lPar);
return null;
}
int [] order = new int[Columns.Count];
Marshal.Copy(lPar, order, 0, Columns.Count);
Marshal.FreeHGlobal(lPar);
return order;
}
/// <summary>
/// Find ListViewItem and SubItem Index at position (x,y)
/// </summary>
/// <param name="x">relative to ListView</param>
/// <param name="y">relative to ListView</param>
/// <param name="item">Item at position (x,y)</param>
/// <returns>SubItem index</returns>
public int GetSubItemAt(int x, int y, out ListViewItem item)
{
item = this.GetItemAt(x, y);
if (item != null)
{
int[] order = GetColumnOrder();
Rectangle lviBounds;
int subItemX;
lviBounds = item.GetBounds(ItemBoundsPortion.Entire);
subItemX = lviBounds.Left;
for (int i=0; i<order.Length; i++)
{
ColumnHeader h = this.Columns[order[i]];
if (x < subItemX+h.Width)
{
return h.Index;
}
subItemX += h.Width;
}
}
return -1;
}
/// <summary>
/// Get bounds for a SubItem
/// </summary>
/// <param name="Item">Target ListViewItem</param>
/// <param name="SubItem">Target SubItem index</param>
/// <returns>Bounds of SubItem (relative to ListView)</returns>
public Rectangle GetSubItemBounds(ListViewItem Item, int SubItem)
{
int[] order = GetColumnOrder();
Rectangle subItemRect = Rectangle.Empty;
if (SubItem >= order.Length)
throw new IndexOutOfRangeException("SubItem "+SubItem+" out of range");
if (Item == null)
throw new ArgumentNullException("Item");
Rectangle lviBounds = Item.GetBounds(ItemBoundsPortion.Entire);
int subItemX = lviBounds.Left;
ColumnHeader col;
int i;
for (i=0; i<order.Length; i++)
{
col = this.Columns[order[i]];
if (col.Index == SubItem)
break;
subItemX += col.Width;
}
subItemRect = new Rectangle(subItemX, lviBounds.Top, this.Columns[order[i]].Width, lviBounds.Height);
return subItemRect;
}
protected override void WndProc(ref Message msg)
{
switch (msg.Msg)
{
// Look for WM_VSCROLL,WM_HSCROLL or WM_SIZE messages.
case WM_VSCROLL:
case WM_HSCROLL:
case WM_SIZE:
EndEditing(false);
break;
case WM_NOTIFY:
// Look for WM_NOTIFY of events that might also change the
// editor's position/size: Column reordering or resizing
NMHDR h = (NMHDR)Marshal.PtrToStructure(msg.LParam, typeof(NMHDR));
if (h.code == HDN_BEGINDRAG ||
h.code == HDN_ITEMCHANGINGA ||
h.code == HDN_ITEMCHANGINGW)
EndEditing(false);
break;
}
base.WndProc(ref msg);
}
#region Initialize editing depending of DoubleClickActivation property
protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e)
{
base.OnMouseUp(e);
MouseEventArgs me = (MouseEventArgs)e;
if (me.Button == MouseButtons.Right)
{
/// Right mouse button click function
RightClickFunctionSubitemAt(new Point(e.X, e.Y));
}
else
{
/// Normal function (=edit item)
if (DoubleClickActivation)
{
return;
}
EditSubitemAt(new Point(e.X, e.Y));
}
}
protected override void OnDoubleClick(EventArgs e)
{
base.OnDoubleClick (e);
if (!DoubleClickActivation)
{
return;
}
Point pt = this.PointToClient(Cursor.Position);
EditSubitemAt(pt);
}
///<summary>
/// Fire SubItemClicked
///</summary>
///<param name="p">Point of click/doubleclick</param>
private void EditSubitemAt(Point p)
{
ListViewItem item;
int idx = GetSubItemAt(p.X, p.Y, out item);
if (idx >= 0)
{
OnSubItemClicked(new SubItemEventArgs(item, idx));
}
}
///<summary>
/// Fire SubItemRightClicked
///</summary>
///<param name="p">Point of click/doubleclick</param>
private void RightClickFunctionSubitemAt(Point p)
{
ListViewItem item;
int idx = GetSubItemAt(p.X, p.Y, out item);
if (idx >= 0)
{
OnSubItemRightClicked(new SubItemEventArgs(item, idx));
}
}
#endregion
#region In-place editing functions
// The control performing the actual editing
private Control _editingControl;
// The LVI being edited
private ListViewItem _editItem;
// The SubItem being edited
private int _editSubItem;
protected void OnSubItemBeginEditing(SubItemEventArgs e)
{
if (SubItemBeginEditing != null) SubItemBeginEditing(this, e);
}
protected void OnSubItemEndEditing(SubItemEndEditingEventArgs e)
{
if (SubItemEndEditing != null) SubItemEndEditing(this, e);
}
protected void OnSubItemClicked(SubItemEventArgs e)
{
if (SubItemClicked != null) SubItemClicked(this, e);
}
protected void OnSubItemRightClicked(SubItemEventArgs e)
{
if (SubItemRightClicked != null) SubItemRightClicked(this, e);
}
/// <summary>
/// Begin in-place editing of given cell
/// </summary>
/// <param name="c">Control used as cell editor</param>
/// <param name="Item">ListViewItem to edit</param>
/// <param name="SubItem">SubItem index to edit</param>
public void StartEditing(Control c, ListViewItem Item, int SubItem)
{
OnSubItemBeginEditing(new SubItemEventArgs(Item, SubItem));
Rectangle rcSubItem = GetSubItemBounds(Item, SubItem);
if (rcSubItem.X < 0)
{
// Left edge of SubItem not visible - adjust rectangle position and width
rcSubItem.Width += rcSubItem.X;
rcSubItem.X=0;
}
if (rcSubItem.X+rcSubItem.Width > this.Width)
{
// Right edge of SubItem not visible - adjust rectangle width
rcSubItem.Width = this.Width-rcSubItem.Left;
}
// Subitem bounds are relative to the location of the ListView!
rcSubItem.Offset(Left, Top);
// In case the editing control and the listview are on different parents,
// account for different origins
Point origin = new Point(0,0);
Point lvOrigin = this.Parent.PointToScreen(origin);
Point ctlOrigin = c.Parent.PointToScreen(origin);
rcSubItem.Offset(lvOrigin.X-ctlOrigin.X, lvOrigin.Y-ctlOrigin.Y);
// Position and show editor
c.Bounds = rcSubItem;
c.Text = Item.SubItems[SubItem].Text;
c.Visible = true;
c.BringToFront();
c.Focus();
_editingControl = c;
_editingControl.Leave += new EventHandler(_editControl_Leave);
_editingControl.KeyPress += new KeyPressEventHandler(_editControl_KeyPress);
_editItem = Item;
_editSubItem = SubItem;
}
private void _editControl_Leave(object sender, EventArgs e)
{
// cell editor losing focus
EndEditing(true);
}
private void _editControl_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
switch (e.KeyChar)
{
case (char)(int)Keys.Escape:
{
EndEditing(false);
break;
}
case (char)(int)Keys.Enter:
{
EndEditing(true);
break;
}
}
}
/// <summary>
/// Accept or discard current value of cell editor control
/// </summary>
/// <param name="AcceptChanges">Use the _editingControl's Text as new SubItem text or discard changes?</param>
public void EndEditing(bool AcceptChanges)
{
if (_editingControl == null)
return;
SubItemEndEditingEventArgs e = new SubItemEndEditingEventArgs(
_editItem, // The item being edited
_editSubItem, // The subitem index being edited
AcceptChanges ?
_editingControl.Text : // Use editControl text if changes are accepted
_editItem.SubItems[_editSubItem].Text, // or the original subitem's text, if changes are discarded
!AcceptChanges // Cancel?
);
OnSubItemEndEditing(e);
_editItem.SubItems[_editSubItem].Text = e.DisplayText;
_editingControl.Leave -= new EventHandler(_editControl_Leave);
_editingControl.KeyPress -= new KeyPressEventHandler(_editControl_KeyPress);
_editingControl.Visible = false;
_editingControl = null;
_editItem = null;
_editSubItem = -1;
}
#endregion
}
/// <summary>
/// Event Args for SubItemClicked event
/// </summary>
public class SubItemEventArgs : EventArgs
{
int subItem = -1; /// Sub-item index
ListViewItem item = null;
public int SubItem { get { return subItem; } }
public ListViewItem Item { get { return item; } }
public SubItemEventArgs(ListViewItem item, int subItem)
{
this.subItem = subItem;
this.item = item;
}
}
/// <summary>
/// Event Args for SubItemEndEditingClicked event
/// </summary>
public class SubItemEndEditingEventArgs : SubItemEventArgs
{
string displayText = string.Empty;
bool cancel = true;
public SubItemEndEditingEventArgs(ListViewItem item, int subItem, string displayText, bool cancel) :
base(item, subItem)
{
this.displayText = displayText;
this.cancel = cancel;
}
public string DisplayText
{
get { return displayText; }
set { displayText = value; }
}
public bool Cancel
{
get { return cancel; }
set { cancel = value; }
}
}
}
-42
View File
@@ -1,42 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="ResMimeType">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="Version">
<value>1.0.0.0</value>
</resheader>
<resheader name="Reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="Writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
-107
View File
@@ -1,107 +0,0 @@
///
/// Copyright (c) 2019-2020 Sensus Slovensko a.s.
///
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace Common.UIControls
{
[EditorBrowsable(EditorBrowsableState.Never)]
public static class ListViewExtensions
{
[StructLayout(LayoutKind.Sequential)]
public struct HDITEM
{
public Mask mask;
public int cxy;
[MarshalAs(UnmanagedType.LPTStr)]
public string pszText;
public IntPtr hbm;
public int cchTextMax;
public Format fmt;
public IntPtr lParam;
// _WIN32_IE >= 0x0300
public int iImage;
public int iOrder;
// _WIN32_IE >= 0x0500
public uint type;
public IntPtr pvFilter;
// _WIN32_WINNT >= 0x0600
public uint state;
[Flags]
public enum Mask
{
Format = 0x4, // HDI_FORMAT
};
[Flags]
public enum Format
{
SortDown = 0x200, // HDF_SORTDOWN
SortUp = 0x400, // HDF_SORTUP
};
};
public const int LVM_FIRST = 0x1000;
public const int LVM_GETHEADER = LVM_FIRST + 31;
public const int HDM_FIRST = 0x1200;
public const int HDM_GETITEM = HDM_FIRST + 11;
public const int HDM_SETITEM = HDM_FIRST + 12;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, ref HDITEM lParam);
public static void SetSortIcon(this ListViewEx listViewControl, int columnIndex, SortOrder order)
{
IntPtr columnHeader = SendMessage(listViewControl.Handle, LVM_GETHEADER, IntPtr.Zero, IntPtr.Zero);
for (int columnNumber = 0; columnNumber <= listViewControl.Columns.Count - 1; columnNumber++)
{
var columnPtr = new IntPtr(columnNumber);
var item = new HDITEM
{
mask = HDITEM.Mask.Format
};
if (SendMessage(columnHeader, HDM_GETITEM, columnPtr, ref item) == IntPtr.Zero)
{
throw new Win32Exception();
}
if (order != SortOrder.None && columnNumber == columnIndex)
{
switch (order)
{
case SortOrder.Ascending:
item.fmt &= ~HDITEM.Format.SortDown;
item.fmt |= HDITEM.Format.SortUp;
break;
case SortOrder.Descending:
item.fmt &= ~HDITEM.Format.SortUp;
item.fmt |= HDITEM.Format.SortDown;
break;
default:
break;
}
}
else
{
item.fmt &= ~HDITEM.Format.SortDown & ~HDITEM.Format.SortUp;
}
if (SendMessage(columnHeader, HDM_SETITEM, columnPtr, ref item) == IntPtr.Zero)
{
throw new Win32Exception();
}
}
}
}
}
-34
View File
@@ -1,34 +0,0 @@
///
/// Copyright (c) 2019-2020 Sensus Slovensko a.s.
///
using System;
using System.Collections;
using System.Windows.Forms;
namespace Common.UIControls
{
public class LviIntColumnComparer : IComparer
{
int column;
SortOrder order;
public LviIntColumnComparer()
{
column = 0;
order = SortOrder.Ascending;
}
public LviIntColumnComparer(int column, SortOrder order)
{
this.column = column;
this.order = order;
}
public int Compare(object x, object y)
{
int valX = int.Parse(((ListViewItem)x).SubItems[column].Text);
int valY = int.Parse(((ListViewItem)y).SubItems[column].Text);
return (order == SortOrder.Descending) ? (valY - valX) : (valX - valY);
}
}
}
@@ -1,34 +0,0 @@
///
/// Copyright (c) 2019-2020 Sensus Slovensko a.s.
///
using System;
using System.Collections;
using System.Windows.Forms;
namespace Common.UIControls
{
public class LviTextColumnComparer : IComparer
{
private int column;
SortOrder order;
public LviTextColumnComparer()
{
column = 0;
order = SortOrder.Ascending;
}
public LviTextColumnComparer(int column, SortOrder order)
{
this.column = column;
this.order = order;
}
public int Compare(object x, object y)
{
string txtX = ((ListViewItem)x).SubItems[column].Text;
string txtY = ((ListViewItem)y).SubItems[column].Text;
return (order == SortOrder.Descending) ? String.Compare(txtY, txtX) : String.Compare(txtX, txtY);
}
}
}
+35 -8
View File
@@ -246,14 +246,14 @@ namespace Common
unit == Unit.J || unit == Unit.uSpcm || unit == Unit.ppl || unit == Unit.ppkWh;
}
public static bool IsQuantity(Unit units, Quantity quantity)
public static bool IsQuantity(Unit unit, Quantity quantity)
{
return (quantity == GetQuantity(units));
return (quantity == GetQuantity(unit));
}
public static Quantity GetQuantity(Unit units)
public static Quantity GetQuantity(Unit unit)
{
switch (units)
switch (unit)
{
case Unit.pulse:
case Unit.degree:
@@ -375,9 +375,15 @@ namespace Common
public static bool IsConductivity(Unit units) { return IsQuantity(units, Quantity.Conductivity); }
public static double ConvertTo(Unit units, double v)
public static float ConvertTo(Unit unit, float v)
{
switch (units)
return (float)ConvertTo(unit, (double)v);
}
public static double ConvertTo(Unit unit, double v)
{
switch (unit)
{
/// Volume: internal representation in l
case Unit.ml: return 1000 * v; /// 1 ml = 0.001 l
@@ -455,9 +461,15 @@ namespace Common
}
}
public static double ConvertFrom(Unit units, double v)
public static float ConvertFrom(Unit unit, float v)
{
switch (units)
return (float)ConvertFrom(unit, (double)v);
}
public static double ConvertFrom(Unit unit, double v)
{
switch (unit)
{
/// Volume: internal representation in l
case Unit.ml: return 0.001 * v; /// 0.001 l
@@ -534,5 +546,20 @@ namespace Common
default: return v; /// Do not convert
}
}
/// <summary>
/// Converts a string to a unit
/// </summary>
/// <param name="description">Unit description string</param>
/// <returns>Converted unit or Unit.None if not recognized</returns>
public static Unit FromDescription(string description)
{
for (Unit unit = 0; unit < Unit.Count; unit++)
{
if (unit.ToDescription() == description) return unit;
}
return Unit.None;
}
}
}
+1 -1
View File
@@ -23,7 +23,7 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
<PlatformTarget>x86</PlatformTarget>
<PlatformTarget>AnyCPU</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+3 -4
View File
@@ -53,10 +53,9 @@ namespace Config.Entities
return corrections[0].Correction;
}
int count = corrections.Count;
for (int i = 1; i < count; i++)
for (int i = 1; i < corrections.Count; i++)
{
if (rawValue < corrections[0].Measurement)
if (rawValue < corrections[i].Measurement)
{
double d1 = rawValue - corrections[i - 1].Measurement;
double d2 = corrections[i].Measurement - rawValue;
@@ -75,7 +74,7 @@ namespace Config.Entities
}
/// rawValue is above the highest value in the correction table
return corrections[count - 1].Correction;
return corrections[corrections.Count - 1].Correction;
}
}
}
+32 -3
View File
@@ -57,8 +57,21 @@ namespace Config.Entities
public virtual string TransBetween { get; set; }
public virtual string TransAfter { get; set; }
public virtual bool IsOuterLoopStart { get; set; } /// Not mapped to database
public virtual bool IsOuterLoopEnd { get; set; } /// Not mapped to database
public virtual bool IsOuterLoopStart { get; set; } /// Not mapped to database
public virtual bool IsOuterLoopEnd { get; set; } /// Not mapped to database
public virtual bool QtgTextChngd { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
public virtual bool QfromTextChngd { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
public virtual bool QtoTextChngd { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
public virtual bool VolumeTextChngd { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
public virtual bool TempLimLoTextChngd { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
public virtual bool TempLimHiTextChngd { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
public virtual Unit VolumeUnit { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
public virtual Unit FlowUnit { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
public virtual Unit MassUnit { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
public virtual Unit TempUnit { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
public virtual Unit PressUnit { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
public virtual Unit LengthUnit { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
public virtual IList<ComponentTest> MoreParams { get; set; }
@@ -124,6 +137,16 @@ namespace Config.Entities
return autoTests.Contains(action);
}
public virtual void ResetChngdFlags()
{
QtgTextChngd = false;
QfromTextChngd = false;
QtoTextChngd = false;
VolumeTextChngd = false;
TempLimLoTextChngd = false;
TempLimHiTextChngd = false;
}
// Makes a new copy of this object (not just a reference)
public virtual Test Clone()
{
@@ -167,7 +190,13 @@ namespace Config.Entities
result.TransBefore = TransBefore;
result.TransBetween = TransBetween;
result.TransAfter = TransAfter;
foreach (var prms in MoreParams) { result.MoreParams.Add(prms.Clone()); }
result.VolumeUnit = VolumeUnit;
result.FlowUnit = FlowUnit;
result.MassUnit = MassUnit;
result.TempUnit = TempUnit;
result.PressUnit = PressUnit;
result.LengthUnit = LengthUnit;
foreach (var prms in MoreParams) { result.MoreParams.Add(prms.Clone()); }
return result;
}
+271
View File
@@ -0,0 +1,271 @@
using System;
namespace DataMatrix4Net
{
public class DataMatrix
{
///
/// Public interface
///
public bool isContainMatrix { get { return Matrix != null; } }
public Gma.QrCodeNet.Encoding.BitMatrix Matrix;
///
/// Internal member variables
///
readonly SymbolSize chosenSize;
readonly bool[,] visited;
int width { get { return isContainMatrix ? Matrix.Width : 0; } }
int height { get { return isContainMatrix ? Matrix.Height : 0; } }
/// <summary>
/// Data matrix constructor
/// Data matrix size up to 26x26 supported, one data region.
/// </summary>
/// <param name="content">Content of the data matrix (ASCII characters only)</param>
/// <param name="symbolSize">Chosen data matrix size</param>
public DataMatrix(string content, SymbolSize symbolSize = SymbolSize.SquareAuto)
{
byte[] contentBytes = Utils.MakeByteArray(content);
if (symbolSize >= 0)
{
chosenSize = symbolSize;
}
else if (symbolSize == SymbolSize.SquareAuto)
{
for (SymbolSize ss = 0; ss < Symbol.SymbolSquareCount; ss++)
{
if (contentBytes.Length <= Symbol.GetSymbolAttribute(SymbolAttribute.SymbolDataWords, ss))
{
chosenSize = ss;
break;
}
}
}
int w = Symbol.GetSymbolAttribute(SymbolAttribute.SymbolCols, chosenSize);
int h = Symbol.GetSymbolAttribute(SymbolAttribute.SymbolRows, chosenSize);
if (w == -1 || h == -1)
{
throw new ArgumentOutOfRangeException("symboSize");
}
/// Add padding and Reed-Solomon error correction bytes to the content
byte[] data = ReedSolomon.Encode(contentBytes, chosenSize);
/// Create matrix, fill in frame cells
Matrix = new MyBitMatrix(w, h);
visited = new bool[w - 2, h - 2];
MakeFrame(chosenSize);
int ix = 0;
int x = 0; /// inside data region in the range 0 .. width-2 (x coordinate, frame excluded)
int y = 4; /// inside data region in the range 0 .. height-2 (y coordinate, frame excluded)
/// Walk through the data matrix area and fill in data bytes
do
{
if (x == 0 && y == height - 2)
{
PlaceByteSpecial1(data[ix++], width, height);
}
else if (x == 0 && y == height - 4 && (height - 2) % 4 != 0)
{
PlaceByteSpecial2(data[ix++], width, height);
}
else if (x == 0 && y == height - 4 && (height - 2) % 8 == 4)
{
PlaceByteSpecial3(data[ix++], width, height);
}
else if (x == 2 && y == height + 2 && (height - 2) % 8 == 0)
{
PlaceByteSpecial4(data[ix++], width, height);
}
do
{
if (x >= 0 && y < height - 2 && !visited[x, y])
{
PlaceByteStandard(data[ix++], x, y, width, height);
visited[x, y] = true;
}
x += 2;
y -= 2;
}
while (x < width - 2 && y >= 0);
x += 3;
y += 1;
do
{
if (x < width - 2 && y >= 0 && !visited[x, y])
{
PlaceByteStandard(data[ix++], x, y, width, height);
visited[x, y] = true;
}
x -= 2;
y += 2;
}
while (x >= 0 && y < height - 2);
x += 1;
y += 3;
}
while (ix < data.Length);
}
/// All matrix sizes
void PlaceByteSpecial1(byte dataByte, int width, int height)
{
Matrix[width - 2, 4] = (dataByte & 0x01) != 0;
Matrix[width - 2, 3] = (dataByte & 0x02) != 0;
Matrix[width - 2, 2] = (dataByte & 0x04) != 0;
Matrix[width - 2, 1] = (dataByte & 0x08) != 0;
Matrix[width - 3, 1] = (dataByte & 0x10) != 0;
Matrix[3, height - 2] = (dataByte & 0x20) != 0;
Matrix[2, height - 2] = (dataByte & 0x40) != 0;
Matrix[1, height - 2] = (dataByte & 0x80) != 0;
visited[width - 3, 3] = true;
visited[width - 3, 2] = true;
visited[width - 3, 1] = true;
visited[width - 3, 0] = true;
visited[width - 4, 0] = true;
visited[2, height - 3] = true;
visited[1, height - 3] = true;
visited[0, height - 3] = true;
}
void PlaceByteSpecial2(byte dataByte, int width, int height)
{
Matrix[width - 2, 2] = (dataByte & 0x01) != 0;
Matrix[width - 2, 1] = (dataByte & 0x02) != 0;
Matrix[width - 3, 1] = (dataByte & 0x04) != 0;
Matrix[width - 4, 1] = (dataByte & 0x08) != 0;
Matrix[width - 5, 1] = (dataByte & 0x10) != 0;
Matrix[1, height - 2] = (dataByte & 0x20) != 0;
Matrix[1, height - 3] = (dataByte & 0x40) != 0;
Matrix[1, height - 4] = (dataByte & 0x80) != 0;
visited[width - 3, 1] = true;
visited[width - 3, 0] = true;
visited[width - 4, 0] = true;
visited[width - 5, 0] = true;
visited[width - 6, 0] = true;
visited[0, height - 3] = true;
visited[0, height - 4] = true;
visited[0, height - 5] = true;
}
void PlaceByteSpecial3(byte dataByte, int width, int height)
{
Matrix[width - 2, 2] = (dataByte & 0x01) != 0;
Matrix[width - 3, 2] = (dataByte & 0x02) != 0;
Matrix[width - 4, 2] = (dataByte & 0x04) != 0;
Matrix[width - 2, 1] = (dataByte & 0x08) != 0;
Matrix[width - 3, 1] = (dataByte & 0x10) != 0;
Matrix[width - 4, 1] = (dataByte & 0x20) != 0;
Matrix[width - 2, height - 2] = (dataByte & 0x40) != 0;
Matrix[1, height - 2] = (dataByte & 0x80) != 0;
visited[width - 3, 1] = true;
visited[width - 4, 1] = true;
visited[width - 5, 1] = true;
visited[width - 3, 0] = true;
visited[width - 4, 0] = true;
visited[width - 5, 0] = true;
visited[width - 3, height - 3] = true;
visited[0, height - 3] = true;
}
void PlaceByteSpecial4(byte dataByte, int width, int height)
{
Matrix[width - 2, 4] = (dataByte & 0x01) != 0;
Matrix[width - 2, 3] = (dataByte & 0x02) != 0;
Matrix[width - 2, 2] = (dataByte & 0x04) != 0;
Matrix[width - 2, 1] = (dataByte & 0x08) != 0;
Matrix[width - 3, 1] = (dataByte & 0x10) != 0;
Matrix[1, height - 2] = (dataByte & 0x20) != 0;
Matrix[1, height - 3] = (dataByte & 0x40) != 0;
Matrix[1, height - 4] = (dataByte & 0x80) != 0;
visited[width - 3, 3] = true;
visited[width - 3, 2] = true;
visited[width - 3, 1] = true;
visited[width - 3, 0] = true;
visited[width - 4, 0] = true;
visited[0, height - 3] = true;
visited[0, height - 4] = true;
visited[0, height - 5] = true;
}
///
/// Standard bit positioning (all matrix sizes)
///
int[] xOffs = new int[8] { 1, 0, -1, 1, 0, -1, 0, -1 };
int[] yOffs = new int[8] { 1, 1, 1, 0, 0, 0, -1, -1 };
/// <summary>
/// Standard placemnt of a byte into a matrix
/// </summary>
/// <param name="dataByte">Data byte</param>
/// <param name="x">X-coordinate in range 0..width-2 (from left, frame excluded)</param>
/// <param name="y">Y-coordinate in range 0..height-2 (from top, frame excluded)</param>
/// <param name="width">Matrix width incl. frame</param>
/// <param name="height">Matrix height incl. frame</param>
void PlaceByteStandard(byte dataByte, int x, int y, int width, int height)
{
int mask = 1;
for (int i = 0; i < 8; i++)
{
int xx = x + xOffs[i];
int yy = y + yOffs[i];
if (xx < 1)
{
xx += width - 2;
yy += 4 - (width + 4) % 8;
}
else if (yy < 1)
{
xx += 4 - (height + 4) % 8;
yy += height - 2;
}
Matrix[xx, yy] = (dataByte & mask) != 0;
mask = mask << 1;
}
}
/// <summary>
/// Crate data matrix frame.
/// All square data matrix sizes supported (incl. 4, 16 and 36 data regions).
/// </summary>
void MakeFrame(SymbolSize size)
{
int drw = Symbol.GetSymbolAttribute(SymbolAttribute.DataRegionCols, size);
int drh = Symbol.GetSymbolAttribute(SymbolAttribute.DataRegionRows, size);
int totalhdr = Symbol.GetSymbolAttribute(SymbolAttribute.HorizDataRegions, size);
int totalvdr = Symbol.GetSymbolAttribute(SymbolAttribute.VertDataRegions, size);
for (int hdr = 0; hdr < totalhdr; hdr++)
{
for (int vdr = 0; vdr < totalvdr; vdr++)
{
int offsx = hdr * (drw + 2);
int offsy = vdr * (drh + 2);
for (int i = 0; i < drw + 2; i++)
{
Matrix[offsx + i, offsy + drh + 1] = true;
if (i % 2 == 0) Matrix[offsx + i, offsy] = true;
}
for (int j = 0; j < drh + 2; j++)
{
Matrix[offsx, offsy + j] = true;
if (j % 2 == 1) Matrix[offsx + drw + 1, offsy + j] = true;
}
}
}
}
}
}
+61
View File
@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{7CD2B5B4-3304-4151-B8B4-76A8B8AF9B06}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>DataMatrix4Net</RootNamespace>
<AssemblyName>DataMatrix4Net</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Gma.QrCodeNet.Encoding">
<HintPath>..\packages\QrCode.Net.0.4.0.0\net40\Gma.QrCodeNet.Encoding.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="DataMatrix.cs" />
<Compile Include="MyBitMatrix.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ReedSolomon.cs" />
<Compile Include="Symbol.cs" />
<Compile Include="Utils.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
+39
View File
@@ -0,0 +1,39 @@
using System;
namespace DataMatrix4Net
{
public class MyBitMatrix : Gma.QrCodeNet.Encoding.BitMatrix
{
///
/// Public interface
///
public override int Width { get { return width; } }
public override int Height { get { return height; } }
public override bool[,] InternalArray { get { return internalArray; } }
///
public override bool this[int i, int j]
{
get { return (i >= 0 && j >= 0 && i < width && j < height) ? internalArray[i, j] : false; }
set { if (i >= 0 && j >= 0 && i < width && j < height) internalArray[i, j] = value; }
}
///
/// Private members
///
readonly int width;
readonly int height;
readonly bool[,] internalArray;
/// <summary>
/// Public constructor
/// </summary>
/// <param name="width">Matrix width</param>
/// <param name="height">Matrix height</param>
public MyBitMatrix(int width, int height)
{
this.width = width;
this.height = height;
internalArray = new bool[width, height];
}
}
}
+36
View File
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("DataMatrix4Net")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("DataMatrix4Net")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("efc81899-2be9-4a5c-a120-667d20c5265f")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// 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("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
+156
View File
@@ -0,0 +1,156 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DataMatrix4Net
{
public class ReedSolomon
{
const int NN = 255;
const int MAX_ERROR_WORD_COUNT = 68;
static byte[] log301 = new byte[]
{
255, 0, 1, 240, 2, 225, 241, 53, 3, 38, 226, 133, 242, 43, 54, 210,
4, 195, 39, 114, 227, 106, 134, 28, 243, 140, 44, 23, 55, 118, 211, 234,
5, 219, 196, 96, 40, 222, 115, 103, 228, 78, 107, 125, 135, 8, 29, 162,
244, 186, 141, 180, 45, 99, 24, 49, 56, 13, 119, 153, 212, 199, 235, 91,
6, 76, 220, 217, 197, 11, 97, 184, 41, 36, 223, 253, 116, 138, 104, 193,
229, 86, 79, 171, 108, 165, 126, 145, 136, 34, 9, 74, 30, 32, 163, 84,
245, 173, 187, 204, 142, 81, 181, 190, 46, 88, 100, 159, 25, 231, 50, 207,
57, 147, 14, 67, 120, 128, 154, 248, 213, 167, 200, 63, 236, 110, 92, 176,
7, 161, 77, 124, 221, 102, 218, 95, 198, 90, 12, 152, 98, 48, 185, 179,
42, 209, 37, 132, 224, 52, 254, 239, 117, 233, 139, 22, 105, 27, 194, 113,
230, 206, 87, 158, 80, 189, 172, 203, 109, 175, 166, 62, 127, 247, 146, 66,
137, 192, 35, 252, 10, 183, 75, 216, 31, 83, 33, 73, 164, 144, 85, 170,
246, 65, 174, 61, 188, 202, 205, 157, 143, 169, 82, 72, 182, 215, 191, 251,
47, 178, 89, 151, 101, 94, 160, 123, 26, 112, 232, 21, 51, 238, 208, 131,
58, 69, 148, 18, 15, 16, 68, 17, 121, 149, 129, 19, 155, 59, 249, 70,
214, 250, 168, 71, 201, 156, 64, 60, 237, 130, 111, 20, 93, 122, 177, 150,
};
static byte[] antilog301 = new byte[]
{
1, 2, 4, 8, 16, 32, 64, 128, 45, 90, 180, 69, 138, 57, 114, 228,
229, 231, 227, 235, 251, 219, 155, 27, 54, 108, 216, 157, 23, 46, 92, 184,
93, 186, 89, 178, 73, 146, 9, 18, 36, 72, 144, 13, 26, 52, 104, 208,
141, 55, 110, 220, 149, 7, 14, 28, 56, 112, 224, 237, 247, 195, 171, 123,
246, 193, 175, 115, 230, 225, 239, 243, 203, 187, 91, 182, 65, 130, 41, 82,
164, 101, 202, 185, 95, 190, 81, 162, 105, 210, 137, 63, 126, 252, 213, 135,
35, 70, 140, 53, 106, 212, 133, 39, 78, 156, 21, 42, 84, 168, 125, 250,
217, 159, 19, 38, 76, 152, 29, 58, 116, 232, 253, 215, 131, 43, 86, 172,
117, 234, 249, 223, 147, 11, 22, 44, 88, 176, 77, 154, 25, 50, 100, 200,
189, 87, 174, 113, 226, 233, 255, 211, 139, 59, 118, 236, 245, 199, 163, 107,
214, 129, 47, 94, 188, 85, 170, 121, 242, 201, 191, 83, 166, 97, 194, 169,
127, 254, 209, 143, 51, 102, 204, 181, 71, 142, 49, 98, 196, 165, 103, 206,
177, 79, 158, 17, 34, 68, 136, 61, 122, 244, 197, 167, 99, 198, 161, 111,
222, 145, 15, 30, 60, 120, 240, 205, 183, 67, 134, 33, 66, 132, 37, 74,
148, 5, 10, 20, 40, 80, 160, 109, 218, 153, 31, 62, 124, 248, 221, 151,
3, 6, 12, 24, 48, 96, 192, 173, 119, 238, 241, 207, 179, 75, 150, 0,
};
/// <summary>
/// GF add (a + b)
/// </summary>
static byte GfAdd(byte a, byte b)
{
return (byte)(a ^ b);
}
/// <summary>
/// GF multiply (a * b)
/// </summary>
static byte GfMult(byte a, byte b)
{
return (a == 0 || b == 0) ? (byte)0 : antilog301[(log301[a] + log301[b]) % NN];
}
/// <summary>
/// GF multiply by antilog (a * alpha**b)
/// </summary>
static byte GfMultAntilog(byte a, byte b)
{
return (a == 0) ? (byte)0 : antilog301[(log301[a] + b) % NN];
}
/// <summary>
/// Encode a byte array using Reed-Solomon error correction
/// </summary>
/// <param name="message">Input byte array</param>
/// <param name="sizeId"></param>
/// <returns>true when successful</returns>
public static byte[] Encode(byte[] message, SymbolSize sizeId)
{
int blockStride = Symbol.GetSymbolAttribute(SymbolAttribute.InterleavedBlocks, sizeId);
int blockErrorWords = Symbol.GetSymbolAttribute(SymbolAttribute.BlockErrorWords, sizeId);
int symbolDataWords = Symbol.GetSymbolAttribute(SymbolAttribute.SymbolDataWords, sizeId);
int symbolErrorWords = Symbol.GetSymbolAttribute(SymbolAttribute.SymbolErrorWords, sizeId);
int symbolTotalWords = symbolDataWords + symbolErrorWords;
byte[] output = new byte[symbolTotalWords];
for (int i = 0; i < Math.Min(message.Length, symbolDataWords); i++)
{
output[i] = message[i]; /// Copy the original message to output
}
/// Populate generator polynomial
byte[] gen = RsGenPoly(blockErrorWords);
/// For each interleaved block...
for (int blockIdx = 0; blockIdx < blockStride; blockIdx++)
{
/// Generate error codewords
byte[] ecc = new byte[blockErrorWords];
for (int i = 0; i < blockErrorWords; i++) ecc[i] = 0;
for (int i = blockIdx; i < symbolDataWords; i += blockStride)
{
byte val = (byte)(ecc[blockErrorWords - 1] ^ output[i]);
for (int j = blockErrorWords - 1; j > 0; j--)
{
//DMTX_CHECK_BOUNDS(&ecc, j); DMTX_CHECK_BOUNDS(&ecc, j-1); DMTX_CHECK_BOUNDS(&gen, j);
ecc[j] = GfAdd(ecc[j - 1], GfMult(gen[j], val));
}
ecc[0] = GfMult(gen[0], val);
}
/// Copy to output message
int jj = blockErrorWords;
for (int i = symbolDataWords + blockIdx; i < symbolTotalWords; i += blockStride)
{
output[i] = ecc[--jj];
}
}
return output;
}
static byte[] RsGenPoly(int errorWordCount)
{
byte[] gen = new byte[errorWordCount];
/// Initialize all coefficients to 1
for (int i = 0; i < errorWordCount; i++) gen[i] = (byte)1;
/* Generate polynomial */
for (int i = 0; i < gen.Length; i++)
{
for (int j = i; j >= 0; j--)
{
gen[j] = GfMultAntilog(gen[j], (byte)(i + 1));
if (j > 0)
{
gen[j] = (byte)(gen[j] ^ gen[j - 1]);
}
}
}
return gen;
}
}
}
+108
View File
@@ -0,0 +1,108 @@
using System;
namespace DataMatrix4Net
{
public enum SymbolSize
{
RectAuto = -3,
SquareAuto = -2,
ShapeAuto = -1,
Sq10x10 = 0,
Sq12x12,
Sq14x14,
Sq16x16,
Sq18x18,
Sq20x20,
Sq22x22,
Sq24x24,
Sq26x26,
Sq32x32,
Sq36x36,
Sq40x40,
Sq44x44,
Sq48x48,
Sq52x52,
Sq64x64,
Sq72x72,
Sq80x80,
Sq88x88,
Sq96x96,
Sq104x104,
Sq120x120,
Sq132x132,
Sq144x144,
Rect8x18,
Rect8x32,
Rect12x26,
Rect12x36,
Rect16x36,
Rect16x48,
Count
}
public enum SymbolAttribute
{
SymbolRows,
SymbolCols,
DataRegionRows,
DataRegionCols,
HorizDataRegions,
VertDataRegions,
MappingMatrixRows,
MappingMatrixCols,
InterleavedBlocks,
BlockErrorWords,
BlockMaxCorrectable,
SymbolDataWords,
SymbolErrorWords,
SymbolMaxCorrectable,
}
public static class Symbol
{
public const SymbolSize SymbolSquareCount = SymbolSize.Rect8x18;
/// (---------------------------------------------- square ------------------------------------------------------) (--- rectangular ---)
static readonly int[] symbolRows = new int[] { 10, 12, 14, 16, 18, 20, 22, 24, 26, 32, 36, 40, 44, 48, 52, 64, 72, 80, 88, 96, 104, 120, 132, 144, 8, 8, 12, 12, 16, 16 };
static readonly int[] symbolCols = new int[] { 10, 12, 14, 16, 18, 20, 22, 24, 26, 32, 36, 40, 44, 48, 52, 64, 72, 80, 88, 96, 104, 120, 132, 144, 18, 32, 26, 36, 36, 48 };
static readonly int[] dataRegionRows = new int[] { 8, 10, 12, 14, 16, 18, 20, 22, 24, 14, 16, 18, 20, 22, 24, 14, 16, 18, 20, 22, 24, 18, 20, 22, 6, 6, 10, 10, 14, 14 };
static readonly int[] dataRegionCols = new int[] { 8, 10, 12, 14, 16, 18, 20, 22, 24, 14, 16, 18, 20, 22, 24, 14, 16, 18, 20, 22, 24, 18, 20, 22, 16, 14, 24, 16, 16, 22 };
static readonly int[] horizDataRegions = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 6, 6, 6, 1, 2, 1, 2, 2, 2 };
static readonly int[] interleavedBlocks = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 4, 4, 4, 4, 6, 6, 8, 10, 1, 1, 1, 1, 1, 1 };
static readonly int[] symbolDataWords = new int[] { 3, 5, 8, 12, 18, 22, 30, 36, 44, 62, 86, 114, 144, 174, 204, 280, 368, 456, 576, 696, 816, 1050, 1304, 1558, 5, 10, 16, 22, 32, 49 };
static readonly int[] blockErrorWords = new int[] { 5, 7, 10, 12, 14, 18, 20, 24, 28, 36, 42, 48, 56, 68, 42, 56, 36, 48, 56, 68, 56, 68, 62, 62, 7, 11, 14, 18, 24, 28 };
static readonly int[] blockMaxCorrectable = new int[] { 2, 3, 5, 6, 7, 9, 10, 12, 14, 18, 21, 24, 28, 34, 21, 28, 18, 24, 28, 34, 28, 34, 31, 31, 3, 5, 7, 9, 12, 14 };
/// <summary>
/// Return a symbol attribute
/// </summary>
/// <param name="attribute">Symbol attribute</param>
/// <param name="sizeId">Size ID (or index)</param>
/// <returns>Sybol attribute value, -1 when undefined</returns>
public static int GetSymbolAttribute(SymbolAttribute attribute, SymbolSize sizeId)
{
if (sizeId < 0 || sizeId >= SymbolSize.Count) return -1;
switch (attribute)
{
case SymbolAttribute.SymbolRows: return symbolRows[(int)sizeId];
case SymbolAttribute.SymbolCols: return symbolCols[(int)sizeId];
case SymbolAttribute.DataRegionRows: return dataRegionRows[(int)sizeId];
case SymbolAttribute.DataRegionCols: return dataRegionCols[(int)sizeId];
case SymbolAttribute.HorizDataRegions: return horizDataRegions[(int)sizeId];
case SymbolAttribute.VertDataRegions: return (sizeId < SymbolSquareCount) ? horizDataRegions[(int)sizeId] : 1;
case SymbolAttribute.MappingMatrixRows: return dataRegionRows[(int)sizeId] * GetSymbolAttribute(SymbolAttribute.VertDataRegions, sizeId);
case SymbolAttribute.MappingMatrixCols: return dataRegionCols[(int)sizeId] * horizDataRegions[(int)sizeId];
case SymbolAttribute.InterleavedBlocks: return interleavedBlocks[(int)sizeId];
case SymbolAttribute.BlockErrorWords: return blockErrorWords[(int)sizeId];
case SymbolAttribute.BlockMaxCorrectable: return blockMaxCorrectable[(int)sizeId];
case SymbolAttribute.SymbolDataWords: return symbolDataWords[(int)sizeId];
case SymbolAttribute.SymbolErrorWords: return blockErrorWords[(int)sizeId] * interleavedBlocks[(int)sizeId];
case SymbolAttribute.SymbolMaxCorrectable: return blockMaxCorrectable[(int)sizeId] * interleavedBlocks[(int)sizeId];
default: return -1;
}
}
}
}
+56
View File
@@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace DataMatrix4Net
{
public static class Utils
{
const byte EndOfMessage = (byte)129;
public static bool IsDigit(char znak)
{
if (znak >= '0' && znak <= '9') return true;
return false;
}
public static bool IsAscii(char znak)
{
if (znak >= 0 && znak <= '~' + 1) return true;
return false;
}
public static byte EncodeTwoDigits(char znak1, char znak2)
{
return (byte)(130 + 10 * (znak1 - '0') + znak2 - '0');
}
public static byte[] MakeByteArray(string text)
{
IList<byte> bytes = new List<byte>();
int ix = 0;
while (ix < text.Length)
{
if (ix < text.Length - 1 && Utils.IsDigit(text[ix]) && Utils.IsDigit(text[ix + 1]))
{
bytes.Add(Utils.EncodeTwoDigits(text[ix], text[ix + 1]));
ix += 2;
}
else if (Utils.IsAscii(text[ix]))
{
bytes.Add((byte)(text[ix] + 1));
ix++;
}
else
{
/// Skip non ASCII characters
ix++;
}
}
bytes.Add(EndOfMessage);
return bytes.ToArray();
}
}
}
+2 -2
View File
@@ -16,7 +16,7 @@
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</PlatformTarget>
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
@@ -27,7 +27,7 @@
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget>
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
+2 -2
View File
@@ -35,7 +35,7 @@
this.unreadEventsRadioButton = new System.Windows.Forms.RadioButton();
this.allEventsRadioButton = new System.Windows.Forms.RadioButton();
this.settingsButton = new System.Windows.Forms.Button();
this.eventsListView = new Common.UIControls.ListViewEx();
this.eventsListView = new Common.Forms.ListViewEx();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
@@ -175,7 +175,7 @@
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.Button settingsButton;
private Common.UIControls.ListViewEx eventsListView;
private Common.Forms.ListViewEx eventsListView;
private System.Windows.Forms.GroupBox eventsSelectionGroupBox;
private System.Windows.Forms.RadioButton unreadEventsRadioButton;
private System.Windows.Forms.RadioButton allEventsRadioButton;
+4 -4
View File
@@ -7,7 +7,7 @@ using System.Drawing;
using System.Windows.Forms;
using NHibernate;
using Common;
using Common.UIControls;
using Common.Forms;
using SharedDatabase;
using SharedDatabase.Entities;
using EventViewer.Resources;
@@ -33,7 +33,7 @@ namespace EventViewer
ISession session;
IList<Subscriber> subscribers;
IList<Event> events;
SortOrder sortOrder = SortOrder.Ascending;
MySortOrder sortOrder = MySortOrder.Ascending;
int sortColumn = -1; /// 0-based index of column to be used for sorting
EViewerOption eViewerOption;
@@ -222,13 +222,13 @@ namespace EventViewer
{
if (e.Column == sortColumn)
{
sortOrder = (sortOrder == SortOrder.Ascending) ? SortOrder.Descending : SortOrder.Ascending;
sortOrder = (sortOrder == MySortOrder.Ascending) ? MySortOrder.Descending : MySortOrder.Ascending;
}
else
{
/// Clicked on another column header => set sortOrder to SortOrder.Ascending
sortColumn = e.Column;
sortOrder = SortOrder.Ascending;
sortOrder = MySortOrder.Ascending;
}
switch ((Column)sortColumn)
+58 -50
View File
@@ -199,7 +199,8 @@ namespace GemCard
{
Disconnect(DISCONNECT.Unpower);
ReleaseContext();
try { ReleaseContext(); }
catch { }
}
#region ICard Members
@@ -215,66 +216,73 @@ namespace GemCard
/// <returns>A string array of the readers</returns>
public override string[] ListReaders()
{
EstablishContext(SCOPE.User);
try
{
EstablishContext(SCOPE.User);
string[] sListReaders = null;
UInt32 pchReaders = 0;
IntPtr szListReaders = IntPtr.Zero;
string[] sListReaders = null;
UInt32 pchReaders = 0;
IntPtr szListReaders = IntPtr.Zero;
m_nLastError = SCardListReaders(m_hContext, null, szListReaders, out pchReaders);
if (m_nLastError == 0)
{
szListReaders = Marshal.AllocHGlobal((int) pchReaders);
m_nLastError = SCardListReaders(m_hContext, null, szListReaders, out pchReaders);
if (m_nLastError == 0)
{
char[] caReadersData = new char[pchReaders];
int nbReaders = 0;
for (int nI = 0; nI < pchReaders; nI++)
{
caReadersData[nI] = (char) Marshal.ReadByte(szListReaders, nI);
m_nLastError = SCardListReaders(m_hContext, null, szListReaders, out pchReaders);
if (m_nLastError == 0)
{
szListReaders = Marshal.AllocHGlobal((int)pchReaders);
m_nLastError = SCardListReaders(m_hContext, null, szListReaders, out pchReaders);
if (m_nLastError == 0)
{
char[] caReadersData = new char[pchReaders];
int nbReaders = 0;
for (int nI = 0; nI < pchReaders; nI++)
{
caReadersData[nI] = (char)Marshal.ReadByte(szListReaders, nI);
if (caReadersData[nI] == 0)
nbReaders++;
}
if (caReadersData[nI] == 0)
nbReaders++;
}
// Remove last 0
--nbReaders;
// Remove last 0
--nbReaders;
if (nbReaders != 0)
{
sListReaders = new string[nbReaders];
char[] caReader = new char[pchReaders];
int nIdx = 0;
int nIdy = 0;
int nIdz = 0;
// Get the nJ string from the multi-string
if (nbReaders != 0)
{
sListReaders = new string[nbReaders];
char[] caReader = new char[pchReaders];
int nIdx = 0;
int nIdy = 0;
int nIdz = 0;
// Get the nJ string from the multi-string
while(nIdx < pchReaders - 1)
{
caReader[nIdy] = caReadersData[nIdx];
if (caReader[nIdy] == 0)
{
sListReaders[nIdz] = new string(caReader, 0, nIdy);
++nIdz;
nIdy = 0;
caReader = new char[pchReaders];
}
else
++nIdy;
while (nIdx < pchReaders - 1)
{
caReader[nIdy] = caReadersData[nIdx];
if (caReader[nIdy] == 0)
{
sListReaders[nIdz] = new string(caReader, 0, nIdy);
++nIdz;
nIdy = 0;
caReader = new char[pchReaders];
}
else
++nIdy;
++nIdx;
}
}
++nIdx;
}
}
}
}
Marshal.FreeHGlobal(szListReaders);
}
Marshal.FreeHGlobal(szListReaders);
}
ReleaseContext();
ReleaseContext();
return sListReaders;
return sListReaders;
}
catch
{
return new string[0];
}
}
/// <summary>
+2 -2
View File
@@ -97,7 +97,7 @@
<BaseAddress>285212672</BaseAddress>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<FileAlignment>4096</FileAlignment>
<PlatformTarget>x86</PlatformTarget>
<PlatformTarget>AnyCPU</PlatformTarget>
<CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
<CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
<CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
@@ -110,7 +110,7 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Optimize>true</Optimize>
<FileAlignment>4096</FileAlignment>
<PlatformTarget>x86</PlatformTarget>
<PlatformTarget>AnyCPU</PlatformTarget>
<CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
<CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
<Prefer32Bit>false</Prefer32Bit>
+52
View File
@@ -0,0 +1,52 @@
///
/// Copyright (c) 2019-2022 Sensus Slovensko a.s.
///
using System;
using System.Drawing;
namespace GenericTest
{
public enum VerifState
{
Undefined = 0, /// Undefined (only used in OnActivity(..) when start/stop info message is issued)
SNisMissing, /// S/N is missing in the parsed record
SNisInvalid, /// S/N in the parsed record is invalid
NoRefRecordOrNoMatchingWorkflow, /// No record with this S/N in tracing DB or no matching workflow for this record
VerificationIsDisabled, /// ...
NoVerificationForThisProcess,
VerificationPassed, /// Verification of a previous record passed
VerificationFailed, /// Verification of a previous record failed, no matching record found
TracingDBReadOrWriteFailed,
PrintingFailed,
}
public enum ActivityCode
{
Undefined,
StartStop,
Passed,
Failed,
}
public class ActivityEventArgs : EventArgs
{
public DateTime TimeStamp;
public string SN;
public string Message; /// message text
public ActivityCode ActivityCode; /// to print an appropriate message
public Color Color;
public int Interval;
public Color FadedColor;
public ActivityEventArgs(string sn, string message, ActivityCode activityCode, Color color, int interval, Color fadedColor)
{
TimeStamp = DateTime.Now;
this.SN = sn;
this.Message = message;
this.ActivityCode = activityCode;
this.Color = color;
this.Interval = interval;
this.FadedColor = fadedColor;
}
}
}
+163
View File
@@ -0,0 +1,163 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{1F6B4580-9D4F-43D6-9E76-E063298391E8}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>GenericTest</RootNamespace>
<AssemblyName>GenericTest</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<TargetFrameworkProfile>
</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;LASER_NANJING</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE;LASER_NANJING</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup>
<StartupObject>GenericTest.Program</StartupObject>
</PropertyGroup>
<ItemGroup>
<Reference Include="FluentNHibernate">
<HintPath>..\packages\FluentNHibernate.2.0.3.0\lib\net40\FluentNHibernate.dll</HintPath>
</Reference>
<Reference Include="Gma.QrCodeNet.Encoding, Version=0.4.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\QrCode.Net.0.4.0.0\net40\Gma.QrCodeNet.Encoding.dll</HintPath>
</Reference>
<Reference Include="Iesi.Collections">
<HintPath>..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll</HintPath>
</Reference>
<Reference Include="log4net">
<HintPath>..\packages\log4net.2.0.2\lib\net40-full\log4net.dll</HintPath>
</Reference>
<Reference Include="MySql.Data">
<HintPath>..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll</HintPath>
</Reference>
<Reference Include="NHibernate">
<HintPath>..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll</HintPath>
</Reference>
<Reference Include="Oracle.DataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Oracle\Oracle.DataAccess.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="ActivityEventArgs.cs" />
<Compile Include="LocalSettings.cs" />
<Compile Include="Resources\Strings.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Strings.resx</DependentUpon>
</Compile>
<Compile Include="GenericTestDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="GenericTestDlg.Designer.cs">
<DependentUpon>GenericTestDlg.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SettingsDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="SettingsDlg.Designer.cs">
<DependentUpon>SettingsDlg.cs</DependentUpon>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<EmbeddedResource Include="Resources\Strings.de.resx" />
<EmbeddedResource Include="Resources\Strings.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Strings.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Resources\Strings.sk.resx" />
<EmbeddedResource Include="GenericTestDlg.resx">
<DependentUpon>GenericTestDlg.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="SettingsDlg.resx">
<DependentUpon>SettingsDlg.cs</DependentUpon>
</EmbeddedResource>
<None Include="app.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Common\Common.csproj">
<Project>{c8939821-ba5c-4988-a3d0-bf53b74865c7}</Project>
<Name>Common</Name>
</ProjectReference>
<ProjectReference Include="..\RecordProcessing\RecordProcessing.csproj">
<Project>{67BD7A8F-0FED-4FDE-B875-78D5A2BC9B2C}</Project>
<Name>RecordProcessing</Name>
</ProjectReference>
<ProjectReference Include="..\SharedDatabase\SharedDatabase.csproj">
<Project>{211b5e3f-9996-48a7-abde-c878dd2d71c2}</Project>
<Name>SharedDatabase</Name>
</ProjectReference>
<ProjectReference Include="..\TBF\TBF.csproj">
<Project>{8648fd92-cda1-4c3a-b5f9-fe547ce1fa48}</Project>
<Name>TBF</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup />
<ItemGroup>
<Content Include="SampleConfig\log4netConfig.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
+285
View File
@@ -0,0 +1,285 @@
namespace GenericTest
{
partial class GenericTestDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.settingsButton = new System.Windows.Forms.Button();
this.stopButton = new System.Windows.Forms.Button();
this.horizSplitContainer = new System.Windows.Forms.SplitContainer();
this.messageLabel = new System.Windows.Forms.Label();
this.vertSplitContainer = new System.Windows.Forms.SplitContainer();
this.resultsGroupBox = new System.Windows.Forms.GroupBox();
this.activityListView = new System.Windows.Forms.ListView();
this.logoutButton = new System.Windows.Forms.Button();
this.startButton = new System.Windows.Forms.Button();
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.filteredSensorValueLabel = new System.Windows.Forms.Label();
this.sensorNameLabel = new System.Windows.Forms.Label();
this.immediateSensorValueLabel = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).BeginInit();
this.horizSplitContainer.Panel1.SuspendLayout();
this.horizSplitContainer.Panel2.SuspendLayout();
this.horizSplitContainer.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.vertSplitContainer)).BeginInit();
this.vertSplitContainer.Panel1.SuspendLayout();
this.vertSplitContainer.Panel2.SuspendLayout();
this.vertSplitContainer.SuspendLayout();
this.resultsGroupBox.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
this.SuspendLayout();
//
// settingsButton
//
this.settingsButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.settingsButton.Location = new System.Drawing.Point(1, 80);
this.settingsButton.Name = "settingsButton";
this.settingsButton.Size = new System.Drawing.Size(90, 30);
this.settingsButton.TabIndex = 0;
this.settingsButton.Text = "Settings";
this.settingsButton.UseVisualStyleBackColor = true;
this.settingsButton.Click += new System.EventHandler(this.settingsButton_Click);
//
// stopButton
//
this.stopButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.stopButton.Location = new System.Drawing.Point(1, 44);
this.stopButton.Name = "stopButton";
this.stopButton.Size = new System.Drawing.Size(90, 30);
this.stopButton.TabIndex = 2;
this.stopButton.Text = "Stop";
this.stopButton.UseVisualStyleBackColor = true;
this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
//
// horizSplitContainer
//
this.horizSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
this.horizSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
this.horizSplitContainer.IsSplitterFixed = true;
this.horizSplitContainer.Location = new System.Drawing.Point(0, 0);
this.horizSplitContainer.Name = "horizSplitContainer";
this.horizSplitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
//
// horizSplitContainer.Panel1
//
this.horizSplitContainer.Panel1.Controls.Add(this.messageLabel);
this.horizSplitContainer.Panel1MinSize = 55;
//
// horizSplitContainer.Panel2
//
this.horizSplitContainer.Panel2.Controls.Add(this.vertSplitContainer);
this.horizSplitContainer.Panel2MinSize = 60;
this.horizSplitContainer.Size = new System.Drawing.Size(1033, 207);
this.horizSplitContainer.SplitterDistance = 55;
this.horizSplitContainer.SplitterWidth = 1;
this.horizSplitContainer.TabIndex = 2;
//
// messageLabel
//
this.messageLabel.AutoSize = true;
this.messageLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.messageLabel.Location = new System.Drawing.Point(12, 9);
this.messageLabel.Name = "messageLabel";
this.messageLabel.Size = new System.Drawing.Size(106, 37);
this.messageLabel.TabIndex = 0;
this.messageLabel.Text = "label1";
//
// vertSplitContainer
//
this.vertSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
this.vertSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
this.vertSplitContainer.IsSplitterFixed = true;
this.vertSplitContainer.Location = new System.Drawing.Point(0, 0);
this.vertSplitContainer.Name = "vertSplitContainer";
//
// vertSplitContainer.Panel1
//
this.vertSplitContainer.Panel1.Controls.Add(this.resultsGroupBox);
//
// vertSplitContainer.Panel2
//
this.vertSplitContainer.Panel2.Controls.Add(this.logoutButton);
this.vertSplitContainer.Panel2.Controls.Add(this.settingsButton);
this.vertSplitContainer.Panel2.Controls.Add(this.startButton);
this.vertSplitContainer.Panel2.Controls.Add(this.stopButton);
this.vertSplitContainer.Size = new System.Drawing.Size(1033, 151);
this.vertSplitContainer.SplitterDistance = 942;
this.vertSplitContainer.SplitterWidth = 1;
this.vertSplitContainer.TabIndex = 2;
//
// resultsGroupBox
//
this.resultsGroupBox.Controls.Add(this.activityListView);
this.resultsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.resultsGroupBox.Location = new System.Drawing.Point(0, 0);
this.resultsGroupBox.Name = "resultsGroupBox";
this.resultsGroupBox.Size = new System.Drawing.Size(942, 151);
this.resultsGroupBox.TabIndex = 1;
this.resultsGroupBox.TabStop = false;
this.resultsGroupBox.Text = "Aktivita";
//
// activityListView
//
this.activityListView.Dock = System.Windows.Forms.DockStyle.Fill;
this.activityListView.GridLines = true;
this.activityListView.Location = new System.Drawing.Point(3, 16);
this.activityListView.Name = "activityListView";
this.activityListView.Scrollable = false;
this.activityListView.Size = new System.Drawing.Size(936, 132);
this.activityListView.TabIndex = 0;
this.activityListView.UseCompatibleStateImageBehavior = false;
this.activityListView.View = System.Windows.Forms.View.Details;
//
// logoutButton
//
this.logoutButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.logoutButton.Location = new System.Drawing.Point(1, 116);
this.logoutButton.Name = "logoutButton";
this.logoutButton.Size = new System.Drawing.Size(90, 30);
this.logoutButton.TabIndex = 13;
this.logoutButton.Text = "Logout";
this.logoutButton.UseVisualStyleBackColor = true;
this.logoutButton.Click += new System.EventHandler(this.logoutButton_Click);
//
// startButton
//
this.startButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.startButton.Location = new System.Drawing.Point(1, 8);
this.startButton.Name = "startButton";
this.startButton.Size = new System.Drawing.Size(90, 30);
this.startButton.TabIndex = 1;
this.startButton.Text = "Start";
this.startButton.UseVisualStyleBackColor = true;
this.startButton.Click += new System.EventHandler(this.startButton_Click);
//
// splitContainer1
//
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
this.splitContainer1.IsSplitterFixed = true;
this.splitContainer1.Location = new System.Drawing.Point(0, 0);
this.splitContainer1.Name = "splitContainer1";
//
// splitContainer1.Panel1
//
this.splitContainer1.Panel1.Controls.Add(this.filteredSensorValueLabel);
this.splitContainer1.Panel1.Controls.Add(this.sensorNameLabel);
this.splitContainer1.Panel1.Controls.Add(this.immediateSensorValueLabel);
this.splitContainer1.Panel1MinSize = 0;
//
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.horizSplitContainer);
this.splitContainer1.Size = new System.Drawing.Size(1164, 207);
this.splitContainer1.SplitterDistance = 130;
this.splitContainer1.SplitterWidth = 1;
this.splitContainer1.TabIndex = 3;
//
// filteredSensorValueLabel
//
this.filteredSensorValueLabel.AutoSize = true;
this.filteredSensorValueLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.filteredSensorValueLabel.Location = new System.Drawing.Point(3, 101);
this.filteredSensorValueLabel.Name = "filteredSensorValueLabel";
this.filteredSensorValueLabel.Size = new System.Drawing.Size(130, 37);
this.filteredSensorValueLabel.TabIndex = 3;
this.filteredSensorValueLabel.Text = "60.7 °C";
//
// sensorNameLabel
//
this.sensorNameLabel.AutoSize = true;
this.sensorNameLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.sensorNameLabel.Location = new System.Drawing.Point(3, 9);
this.sensorNameLabel.Name = "sensorNameLabel";
this.sensorNameLabel.Size = new System.Drawing.Size(113, 37);
this.sensorNameLabel.TabIndex = 2;
this.sensorNameLabel.Text = "Temp.";
//
// immediateSensorValueLabel
//
this.immediateSensorValueLabel.AutoSize = true;
this.immediateSensorValueLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.immediateSensorValueLabel.Location = new System.Drawing.Point(3, 55);
this.immediateSensorValueLabel.Name = "immediateSensorValueLabel";
this.immediateSensorValueLabel.Size = new System.Drawing.Size(130, 37);
this.immediateSensorValueLabel.TabIndex = 1;
this.immediateSensorValueLabel.Text = "60.7 °C";
//
// GenericTestDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1164, 207);
this.Controls.Add(this.splitContainer1);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "GenericTestDlg";
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
this.Text = "RF Power New / Oracle / Printing";
this.TopMost = true;
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.GenericTestDlg_FormClosing);
this.Load += new System.EventHandler(this.GenericTestDlg_Load);
this.horizSplitContainer.Panel1.ResumeLayout(false);
this.horizSplitContainer.Panel1.PerformLayout();
this.horizSplitContainer.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.horizSplitContainer)).EndInit();
this.horizSplitContainer.ResumeLayout(false);
this.vertSplitContainer.Panel1.ResumeLayout(false);
this.vertSplitContainer.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.vertSplitContainer)).EndInit();
this.vertSplitContainer.ResumeLayout(false);
this.resultsGroupBox.ResumeLayout(false);
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel1.PerformLayout();
this.splitContainer1.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
this.splitContainer1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button settingsButton;
private System.Windows.Forms.Button stopButton;
private System.Windows.Forms.SplitContainer horizSplitContainer;
private System.Windows.Forms.Button startButton;
private System.Windows.Forms.GroupBox resultsGroupBox;
private System.Windows.Forms.SplitContainer vertSplitContainer;
private System.Windows.Forms.Label messageLabel;
private System.Windows.Forms.ListView activityListView;
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.Label immediateSensorValueLabel;
private System.Windows.Forms.Label sensorNameLabel;
private System.Windows.Forms.Label filteredSensorValueLabel;
private System.Windows.Forms.Button logoutButton;
}
}
File diff suppressed because it is too large Load Diff
+207
View File
@@ -0,0 +1,207 @@
///
/// Copyright (c) 2019-2022 Sensus Slovensko a.s.
///
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Xml.Serialization;
using SharedDatabase;
namespace GenericTest
{
/// <summary>
/// Class to be serialized to an XML file...
/// </summary>
[XmlRootAttribute("GenericTest")]
public class LocalSettings
{
static XmlSerializer serializer = XmlSerializer.FromTypes(new[] { typeof(LocalSettings) })[0];
/// Configuration file ecryption/decryption key and initialization vector
static byte[] key = new byte[] { 83, 254, 105, 64, 184, 201, 195, 127, 52, 99, 77, 45, 252, 132, 163, 156 };
static byte[] IV = new byte[] { 189, 23, 137, 56, 204, 241, 242, 118, 28, 89, 9, 198, 224, 111, 186, 125 };
public string Workplace;
public bool IsUserLoginRequired;
public string Language;
public string ConnectionString;
public string UsersDBConnString;
public string TestResultsFolder;
public string ArchiveFolder;
public bool DoCheckSNsValidity;
public string ValidSNPrefixes;
public bool DoCheckPreviousTracingRecords;
public bool DoSaveTestResultToOracle;
public Mode OracleMode;
public bool DoPrintLabels;
public bool DoPrintGoodLabelsOnly;
public bool MaximizeWindowOnError;
public bool DoReadSensor;
public string SensorName;
public int SensorComPortNr;
public int SensorAddress;
public int SensorFilterTimeMinutes;
/// MainWnd
public bool MainWndMaximized;
public int MainWndLeft;
public int MainWndTop;
public int MainWndWidth;
public int MainWndHeight;
public LocalSettings()
{
}
public LocalSettings(bool createNew)
: this()
{
if (createNew)
{
/// Default settings
Workplace = GenericTestDlg.DfltWorkplaceName;
Language = "en";
ConnectionString = "SERVER=10.116.192.200; DATABASE=nanjingshared; UID=nanjingshared; PASSWORD=C1ern4V0d4; CHARSET=utf8;";
UsersDBConnString = "SERVER=10.116.192.200; DATABASE=nanjingshared; UID=nanjingshared; PASSWORD=C1ern4V0d4; CHARSET=utf8;";
TestResultsFolder = "C:\\FTS\\HookSpool\\Filemover";
ArchiveFolder = "C:\\FTS\\HookSpool\\Filemover";
DoCheckSNsValidity = false;
ValidSNPrefixes = "297,298,299,300,301,302";
DoCheckPreviousTracingRecords = true;
DoSaveTestResultToOracle = false;
OracleMode = Mode.Production;
DoPrintLabels = true;
DoPrintGoodLabelsOnly = false;
MaximizeWindowOnError = false;
MainWndMaximized = false;
MainWndWidth = 1000;
MainWndHeight = 260;
MainWndLeft = 50;
MainWndTop = 50;
DoReadSensor = false;
SensorName = "Temp.";
SensorComPortNr = 4;
SensorAddress = 1;
SensorFilterTimeMinutes = 15;
}
}
/// <summary>
/// Load public fields of this class from the XML file.
/// </summary>
/// <returns>LocalSettings object or null when Load() fails</returns>
public static LocalSettings Load(string fileName)
{
try
{
bool isEncrypted = true;
using (StreamReader reader = new StreamReader(fileName))
{
isEncrypted = !reader.ReadLine().StartsWith("<?xml version=");
reader.Close();
}
if (isEncrypted)
{
/// Write settings to a string
StringBuilder plain = new StringBuilder();
using (RijndaelManaged aes = new RijndaelManaged { Padding = PaddingMode.Zeros })
{
using (FileStream fsCrypt = new FileStream(fileName, FileMode.Open))
{
using (ICryptoTransform decryptor = aes.CreateDecryptor(key, IV))
{
using (CryptoStream cs = new CryptoStream(fsCrypt, decryptor, CryptoStreamMode.Read))
{
using (MemoryStream mStream = new MemoryStream())
{
using (var writer = new BinaryWriter(mStream))
{
int data;
while ((data = cs.ReadByte()) != -1)
{
if (data != 0) writer.Write((byte)data);
}
writer.Flush();
mStream.Position = 0;
using (var reader = new StreamReader(mStream))
{
return serializer.Deserialize(reader) as LocalSettings;
}
}
}
}
}
}
}
}
else
{
using (StreamReader reader = new StreamReader(fileName))
{
return serializer.Deserialize(reader) as LocalSettings;
}
}
}
catch (Exception e)
{
string msg = e.Message;
return null;
}
}
/// <summary>
/// Save public fields of this class to the XML file.
/// </summary>
public void Save()
{
try
{
/// Encrypt and write to file 'Program.LocalSettingsFileName'
using (RijndaelManaged aes = new RijndaelManaged { Padding = PaddingMode.Zeros })
{
using (FileStream fsCrypt = new FileStream(Program.LocalSettingsFileName, FileMode.Create))
{
using (ICryptoTransform encryptor = aes.CreateEncryptor(key, IV))
{
using (CryptoStream cs = new CryptoStream(fsCrypt, encryptor, CryptoStreamMode.Write))
{
using (MemoryStream mStream = new MemoryStream())
{
using (var writer = new StreamWriter(mStream))
{
/// Serialize and write settings to a memory stream
serializer.Serialize(writer, this);
writer.Flush();
mStream.Position = 0;
using (var reader = new StreamReader(mStream))
{
/// Encrypt and write to file 'Program.LocalSettingsFileName'
int data;
while ((data = mStream.ReadByte()) != -1) cs.WriteByte((byte)data);
}
}
}
}
}
}
}
}
catch (Exception e)
{
string msg = e.Message;
}
}
}
}
+228
View File
@@ -0,0 +1,228 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using log4net;
using NHibernate;
using Common;
using SharedDatabase.Entities;
using GenericTest.Resources;
namespace GenericTest
{
static class Program
{
/// Constants
public static GID[] SettingsAccessLevel = new GID[] { GID.TraceabilityManagement }; /// Group membership to access settings
public const string ProgramName = "GenericTest";
public const string ConfigFName = "config.xml";
public const string BackupConfigFName = "config.backup.xml";
public const string Log4NetConfigFName = "log4netConfig.xml";
/// Program information
public static readonly string Version; /// version string
public static readonly DateTime BuildDateTime; /// date and time of program build
public static readonly string ExeDirectory;
public static readonly string ConfigDirectory;
public static readonly string LogDirectory;
public static readonly string LocalSettingsFileName;
public static readonly string LocalSettingsBackupName;
/// Local settings
public static LocalSettings LocalSettings;
/// log4net
static ILog log;
static Program()
{
/// Program version string
Assembly thisAssembly = Assembly.GetExecutingAssembly();
Version ver = thisAssembly.GetName().Version;
Version = string.Format("{0}.{1}.{2}", ver.Major, ver.Minor, ver.Build);
BuildDateTime = new FileInfo(thisAssembly.Location).LastWriteTime;
/// Local program configuration directory including the trailing backslash
ExeDirectory = Path.GetDirectoryName(thisAssembly.Location);
ConfigDirectory = Path.Combine(ExeDirectory, "..", "Cfg");
LogDirectory = Path.Combine(ExeDirectory, "..", "Logs");
LocalSettingsFileName = Path.Combine(ConfigDirectory, ConfigFName);
LocalSettingsBackupName = Path.Combine(ConfigDirectory, BackupConfigFName);
}
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
///
/// Check if another instance is running
///
Assembly thisAssembly = Assembly.GetExecutingAssembly();
string processName = Path.GetFileNameWithoutExtension(thisAssembly.Location);
if (System.Diagnostics.Process.GetProcessesByName(processName).Length > 1)
{
MessageBox.Show(string.Format("{0}{1}{2}", Strings.Program_GenericTest_is_running_already,
Environment.NewLine,
Strings.Close_it_please),
Strings.Error,
MessageBoxButtons.OK,
MessageBoxIcon.Asterisk);
return;
}
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
bool configDirectoryCreated = false;
if (!Directory.Exists(ConfigDirectory) || new DirectoryInfo(ConfigDirectory).GetFileSystemInfos().Length == 0)
{
MessageBox.Show(string.Format("{0}{1}{2}", Strings.Program_is_running_for_the_1st_time_on_this_PC,
Environment.NewLine,
Strings.Default_settings_are_used),
Strings.Warning,
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
///
/// Create a new config subdirectory
///
Directory.CreateDirectory(ConfigDirectory);
configDirectoryCreated = true;
Program.LocalSettings = new LocalSettings(true);
Program.LocalSettings.Save();
if (File.Exists(Path.Combine(ExeDirectory, "SampleConfig", Log4NetConfigFName)))
{
File.Copy(Path.Combine(ExeDirectory, "SampleConfig", Log4NetConfigFName),
Path.Combine(ConfigDirectory, Log4NetConfigFName));
}
File.SetAttributes(Path.Combine(ConfigDirectory, Log4NetConfigFName), FileAttributes.Normal);
}
///
/// Configue and start logging
///
log4net.Config.XmlConfigurator.Configure(new FileInfo(Path.Combine(ConfigDirectory, Log4NetConfigFName)));
log = LogManager.GetLogger(typeof(Program));
log.Fatal("--------------------------------------------------------------------------------");
log.FatalFormat("{0} ver.{1}", ProgramName, Version);
log.FatalFormat("Executable directory is {0}", ExeDirectory);
if (configDirectoryCreated)
{
log.Fatal("A new config directory and configuration files created !");
}
///
/// Load the local settings
///
Program.LocalSettings = LocalSettings.Load(Program.LocalSettingsFileName);
if (Program.LocalSettings == null)
{
/// Loading local seetings from regular config file failed. Use the backup
Program.LocalSettings = LocalSettings.Load(Program.LocalSettingsBackupName);
if (Program.LocalSettings == null)
{
log.FatalFormat("Local settings: Could not load file {0}, nor {1}.", ConfigFName, BackupConfigFName);
log.Fatal("Application terminated.");
MessageBox.Show(string.Format("Could not load file {0}, nor {1}.", ConfigFName, BackupConfigFName), "Fatal error");
return; /// Fatal error
}
else
{
LocalSettings.Save(); /// Save the settings to overwrite the wrong file
log.FatalFormat("Local settings: Could not load file {0}, successfully loaded {1}", ConfigFName, BackupConfigFName);
}
}
else
{
/// Loading local seetings from the regular config file was successful. Update the backup
File.Copy(Program.LocalSettingsFileName, Program.LocalSettingsBackupName, true);
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
///
/// User login
///
if (LocalSettings.IsUserLoginRequired && !string.IsNullOrEmpty(LocalSettings.UsersDBConnString))
{
try
{
GlobalData.LocalUsersDB = new DBSettings(DBType.MySql, LocalSettings.UsersDBConnString);
if (new SharedDatabase.Forms.LoginDlg().ShowDialog() != DialogResult.OK) return;
}
catch (Exception exc)
{
log.ErrorFormat("Failed to connect to the database of users: {0}", exc.Message);
}
}
///
/// Run the WinForm application
///
try
{
Application.Run(new GenericTestDlg());
}
catch (Exception exc)
{
if (exc is QuitAppException)
{
Common.Forms.ModelessForm.CloseForm();
log.FatalFormat(Strings.Program_was_not_started_0, exc.Message);
MessageBox.Show(exc.Message,
Strings.Warning,
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
else
{
log.FatalFormat("Unhandled exception:{0}{1}Stack trace:{0}{2}", Environment.NewLine, exc.Message, exc.StackTrace);
MessageBox.Show("Program crashed:" +
Environment.NewLine + Environment.NewLine + exc.Message +
((exc.InnerException == null) ? string.Empty : (Environment.NewLine + exc.InnerException.Message)) +
Environment.NewLine + exc.StackTrace,
"Fatal error",
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
}
}
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
{
Exception e = args.ExceptionObject as Exception;
if (e == null) return;
LogException(log, "Unhandled exception", e);
MessageBox.Show("Program crashed:" +
Environment.NewLine + Environment.NewLine + e.Message +
((e.InnerException == null) ? string.Empty : (Environment.NewLine + e.InnerException.Message)) +
Environment.NewLine + e.StackTrace,
"Fatal error",
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
static void LogException(ILog log, string description, Exception e)
{
log.FatalFormat("---------------( {0} )---------------", description);
log.FatalFormat("Message : {0}", e.Message);
if (e.InnerException != null)
{
log.FatalFormat("InnerMessage : {0}", e.InnerException.Message);
}
log.FatalFormat("StackTrace : {0}{1}", Environment.NewLine, e.StackTrace);
log.Fatal("--------------------------------------");
}
}
}
+36
View File
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("GenericTest")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("GenericTest")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("93c7ed4a-e94e-4dea-8833-a0676f95c0d3")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// 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("3.0.1")]
[assembly: AssemblyFileVersion("3.0.1")]
+63
View File
@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace GenericTest.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("GenericTest.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}
+117
View File
@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
+26
View File
@@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace GenericTest.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}
+7
View File
@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
+333
View File
@@ -0,0 +1,333 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace GenericTest.Resources {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Strings {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Strings() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("GenericTest.Resources.Strings", typeof(Strings).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to Close it please using &apos;Task manager&apos;..
/// </summary>
internal static string Close_it_please {
get {
return ResourceManager.GetString("Close_it_please", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Date / time.
/// </summary>
internal static string DateTime {
get {
return ResourceManager.GetString("DateTime", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Default settings are used..
/// </summary>
internal static string Default_settings_are_used {
get {
return ResourceManager.GetString("Default_settings_are_used", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Do you want to change settings?.
/// </summary>
internal static string Do_you_want_to_change_settings {
get {
return ResourceManager.GetString("Do_you_want_to_change_settings", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Error.
/// </summary>
internal static string Error {
get {
return ResourceManager.GetString("Error", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Logout.
/// </summary>
internal static string Logout {
get {
return ResourceManager.GetString("Logout", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Message.
/// </summary>
internal static string Message {
get {
return ResourceManager.GetString("Message", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to OK {0}.
/// </summary>
internal static string OK_0 {
get {
return ResourceManager.GetString("OK_0", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Opening database failed..
/// </summary>
internal static string Opening_database_failed {
get {
return ResourceManager.GetString("Opening_database_failed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Opening folder {0} failed..
/// </summary>
internal static string Opening_folder_0_failed {
get {
return ResourceManager.GetString("Opening_folder_0_failed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Previous workflow step is missing or failed.
/// </summary>
internal static string Previous_workflow_step_is_missing_or_failed {
get {
return ResourceManager.GetString("Previous_workflow_step_is_missing_or_failed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Printing failed.
/// </summary>
internal static string Printing_failed {
get {
return ResourceManager.GetString("Printing_failed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Processing tester results started.
/// </summary>
internal static string Processing_tester_results_started {
get {
return ResourceManager.GetString("Processing_tester_results_started", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Processing tester results was stopped.
/// </summary>
internal static string Processing_tester_results_was_stopped {
get {
return ResourceManager.GetString("Processing_tester_results_was_stopped", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Program &apos;GenericTest&apos; is running already..
/// </summary>
internal static string Program_GenericTest_is_running_already {
get {
return ResourceManager.GetString("Program_GenericTest_is_running_already", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Program is running for the 1st time on this PC..
/// </summary>
internal static string Program_is_running_for_the_1st_time_on_this_PC {
get {
return ResourceManager.GetString("Program_is_running_for_the_1st_time_on_this_PC", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Program was not started: {0}.
/// </summary>
internal static string Program_was_not_started_0 {
get {
return ResourceManager.GetString("Program_was_not_started_0", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Reading from Tracing DB failed.
/// </summary>
internal static string Reading_from_Tracing_DB_failed {
get {
return ResourceManager.GetString("Reading_from_Tracing_DB_failed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Saving to Oracle DB failed.
/// </summary>
internal static string Saving_to_Oracle_DB_failed {
get {
return ResourceManager.GetString("Saving_to_Oracle_DB_failed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Saving to Tracing DB failed.
/// </summary>
internal static string Saving_to_Tracing_DB_failed {
get {
return ResourceManager.GetString("Saving_to_Tracing_DB_failed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Serial number.
/// </summary>
internal static string Serial_number {
get {
return ResourceManager.GetString("Serial_number", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Serial number is invalid.
/// </summary>
internal static string Serial_number_is_invalid {
get {
return ResourceManager.GetString("Serial_number_is_invalid", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Serial number is missing.
/// </summary>
internal static string Serial_number_is_missing {
get {
return ResourceManager.GetString("Serial_number_is_missing", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Settings.
/// </summary>
internal static string Settings {
get {
return ResourceManager.GetString("Settings", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Something failed.
/// </summary>
internal static string Something_failed {
get {
return ResourceManager.GetString("Something_failed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Start.
/// </summary>
internal static string Start {
get {
return ResourceManager.GetString("Start", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Stop.
/// </summary>
internal static string Stop {
get {
return ResourceManager.GetString("Stop", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Test failed {0}.
/// </summary>
internal static string Test_failed_0 {
get {
return ResourceManager.GetString("Test_failed_0", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Time.
/// </summary>
internal static string Time {
get {
return ResourceManager.GetString("Time", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Warning.
/// </summary>
internal static string Warning {
get {
return ResourceManager.GetString("Warning", resourceCulture);
}
}
}
}
+101
View File
@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 1.3
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">1.3</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1">this is my long string</data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
[base64 mime encoded serialized .NET Framework object]
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
[base64 mime encoded string representing a byte array form of the .NET Framework object]
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
+210
View File
@@ -0,0 +1,210 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Close_it_please" xml:space="preserve">
<value>Close it please using 'Task manager'.</value>
</data>
<data name="DateTime" xml:space="preserve">
<value>Date / time</value>
</data>
<data name="Default_settings_are_used" xml:space="preserve">
<value>Default settings are used.</value>
</data>
<data name="Do_you_want_to_change_settings" xml:space="preserve">
<value>Do you want to change settings?</value>
</data>
<data name="Error" xml:space="preserve">
<value>Error</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
</data>
<data name="Message" xml:space="preserve">
<value>Message</value>
</data>
<data name="OK_0" xml:space="preserve">
<value>OK {0}</value>
</data>
<data name="Opening_database_failed" xml:space="preserve">
<value>Opening database failed.</value>
</data>
<data name="Opening_folder_0_failed" xml:space="preserve">
<value>Opening folder {0} failed.</value>
</data>
<data name="Previous_workflow_step_is_missing_or_failed" xml:space="preserve">
<value>Previous workflow step is missing or failed</value>
</data>
<data name="Printing_failed" xml:space="preserve">
<value>Printing failed</value>
</data>
<data name="Processing_tester_results_started" xml:space="preserve">
<value>Processing tester results started</value>
</data>
<data name="Processing_tester_results_was_stopped" xml:space="preserve">
<value>Processing tester results was stopped</value>
</data>
<data name="Program_GenericTest_is_running_already" xml:space="preserve">
<value>Program 'GenericTest' is running already.</value>
</data>
<data name="Program_is_running_for_the_1st_time_on_this_PC" xml:space="preserve">
<value>Program is running for the 1st time on this PC.</value>
</data>
<data name="Program_was_not_started_0" xml:space="preserve">
<value>Program was not started: {0}</value>
</data>
<data name="Reading_from_Tracing_DB_failed" xml:space="preserve">
<value>Reading from Tracing DB failed</value>
</data>
<data name="Saving_to_Oracle_DB_failed" xml:space="preserve">
<value>Saving to Oracle DB failed</value>
</data>
<data name="Saving_to_Tracing_DB_failed" xml:space="preserve">
<value>Saving to Tracing DB failed</value>
</data>
<data name="Serial_number" xml:space="preserve">
<value>Serial number</value>
</data>
<data name="Serial_number_is_invalid" xml:space="preserve">
<value>Serial number is invalid</value>
</data>
<data name="Serial_number_is_missing" xml:space="preserve">
<value>Serial number is missing</value>
</data>
<data name="Settings" xml:space="preserve">
<value>Settings</value>
</data>
<data name="Something_failed" xml:space="preserve">
<value>Something failed</value>
</data>
<data name="Start" xml:space="preserve">
<value>Start</value>
</data>
<data name="Stop" xml:space="preserve">
<value>Stop</value>
</data>
<data name="Test_failed_0" xml:space="preserve">
<value>Test failed {0}</value>
</data>
<data name="Time" xml:space="preserve">
<value>Time</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Warning</value>
</data>
</root>
+207
View File
@@ -0,0 +1,207 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Close_it_please" xml:space="preserve">
<value>Zavrite ho prosím 'Správcom úloh' ('Task manager').</value>
</data>
<data name="DateTime" xml:space="preserve">
<value>Dátum / čas</value>
</data>
<data name="Default_settings_are_used" xml:space="preserve">
<value>Použijú sa základné nastavenia.</value>
</data>
<data name="Do_you_want_to_change_settings" xml:space="preserve">
<value>Chcete zmeniť nastavenia?</value>
</data>
<data name="Error" xml:space="preserve">
<value>Chyba</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Odhlásiť</value>
</data>
<data name="Message" xml:space="preserve">
<value>Správa</value>
</data>
<data name="Opening_database_failed" xml:space="preserve">
<value>Nepodarilo sa otvoriť databázu.</value>
</data>
<data name="Opening_folder_0_failed" xml:space="preserve">
<value>Nepodarilo sa otvoriť folder {0}.</value>
</data>
<data name="Previous_workflow_step_is_missing_or_failed" xml:space="preserve">
<value>Predchádzajúci krok postupu chýba alebo neprešiel</value>
</data>
<data name="Printing_failed" xml:space="preserve">
<value>Chyba pri tlačení</value>
</data>
<data name="Processing_tester_results_started" xml:space="preserve">
<value>Začalo spracovávanie výsledkov testera</value>
</data>
<data name="Processing_tester_results_was_stopped" xml:space="preserve">
<value>Skončilo spracovávanie výsledkov testera</value>
</data>
<data name="Program_GenericTest_is_running_already" xml:space="preserve">
<value>Program 'GenericTest' už beží.</value>
</data>
<data name="Program_is_running_for_the_1st_time_on_this_PC" xml:space="preserve">
<value>Na tomto počítači nebol tento program ani raz spustený.</value>
</data>
<data name="Program_was_not_started_0" xml:space="preserve">
<value>Program nebol spustený: {0}</value>
</data>
<data name="Reading_from_Tracing_DB_failed" xml:space="preserve">
<value>Chyba pri čítaní zo sledovacej databázy</value>
</data>
<data name="Saving_to_Oracle_DB_failed" xml:space="preserve">
<value>Chyba pri zápise do Oracle databázy</value>
</data>
<data name="Saving_to_Tracing_DB_failed" xml:space="preserve">
<value>Chyba pri zápise do sledovacej databázy</value>
</data>
<data name="Serial_number" xml:space="preserve">
<value>Sériové číslo</value>
</data>
<data name="Serial_number_is_invalid" xml:space="preserve">
<value>Sériové číslo je neplatné</value>
</data>
<data name="Serial_number_is_missing" xml:space="preserve">
<value>Sériové číslo chýba</value>
</data>
<data name="Settings" xml:space="preserve">
<value>Nastavenia</value>
</data>
<data name="Something_failed" xml:space="preserve">
<value>Niečo sa nepodarilo</value>
</data>
<data name="Start" xml:space="preserve">
<value>Štart</value>
</data>
<data name="Stop" xml:space="preserve">
<value>Stop</value>
</data>
<data name="Test_failed_0" xml:space="preserve">
<value>Test neprešiel {0}</value>
</data>
<data name="Time" xml:space="preserve">
<value>Čas</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Upozornenie</value>
</data>
</root>
@@ -0,0 +1,50 @@
<log4net>
<!-- Program log appenders -->
<appender name="GenericTest" type="log4net.Appender.RollingFileAppender">
<file value="..\Logs\GenericTest_Log.txt" />
<appendToFile value="true" />
<rollingMode value="Date" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %logger - %message%newline" />
</layout>
</appender>
<!-- Results appenders -->
<appender name="Results" type="log4net.Appender.RollingFileAppender">
<file value="..\Results\Results.csv" />
<appendToFile value="true" />
<rollingMode value="Date" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{dd.MM.yy HH:mm:ss} ; %message%newline" />
</layout>
</appender>
<!-- Results appenders -->
<appender name="BadResults" type="log4net.Appender.RollingFileAppender">
<file value="..\Results\BadResults.csv" />
<appendToFile value="true" />
<rollingMode value="Date" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{dd.MM.yy HH:mm:ss} ; %message%newline" />
</layout>
</appender>
<!-- Set root logger -->
<root> <level value="WARN" /> </root>
<!-- Set program loggers -->
<logger name="TracingDB"> <appender-ref ref="GenericTest" /> <level value="WARN" /> </logger>
<logger name="GenericTest"> <appender-ref ref="GenericTest" /> <level value="WARN" /> </logger>
<logger name="Results"> <appender-ref ref="Results" /> <level value="INFO" /> </logger>
<logger name="BadResults"> <appender-ref ref="BadResults" /> <level value="INFO" /> </logger>
<!-- Set program logging levels -->
<logger name="TracingDB.DB"> <level value="WARN" /> </logger>
<logger name="GenericTest.GenericTestDlg"> <level value="WARN" /> </logger>
<logger name="GenericTest.GenericTestDlg"> <level value="WARN" /> </logger>
<logger name="GenericTest.GenericTestDlg"> <level value="WARN" /> </logger>
<logger name="GenericTest.Program"> <level value="WARN" /> </logger>
</log4net>
+491
View File
@@ -0,0 +1,491 @@
namespace GenericTest
{
partial class SettingsDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.okButton = new System.Windows.Forms.Button();
this.cancelButton = new System.Windows.Forms.Button();
this.connectionStringTextBox = new System.Windows.Forms.TextBox();
this.oracleModeComboBox = new System.Windows.Forms.ComboBox();
this.workplaceTextBox = new System.Windows.Forms.TextBox();
this.archiveFolderTextBox = new System.Windows.Forms.TextBox();
this.tracingDBConnStringLabel = new System.Windows.Forms.Label();
this.testResultsFolderTextBox = new System.Windows.Forms.TextBox();
this.testResultsFolderLabel = new System.Windows.Forms.Label();
this.archiveFolderLabel = new System.Windows.Forms.Label();
this.oracleModeLabel = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.saveRFTestResultGroupBox = new System.Windows.Forms.GroupBox();
this.saveTestResultToOracleCheckBox = new System.Windows.Forms.CheckBox();
this.checkPreviousTracingRecordsCheckBox = new System.Windows.Forms.CheckBox();
this.usersDBConnStringLabel = new System.Windows.Forms.Label();
this.usersDBConnStringTextBox = new System.Windows.Forms.TextBox();
this.validSNPrefixesLabel = new System.Windows.Forms.Label();
this.validSNPrefixesTextBox = new System.Windows.Forms.TextBox();
this.validPcbPrefixesGroupBox = new System.Windows.Forms.GroupBox();
this.checkSNsValidityCheckBox = new System.Windows.Forms.CheckBox();
this.printLabelsGroupBox = new System.Windows.Forms.GroupBox();
this.printGoodLabelsOnlyCheckBox = new System.Windows.Forms.CheckBox();
this.printLabelsCheckBox = new System.Windows.Forms.CheckBox();
this.maximizeWindowOnErrorCheckBox = new System.Windows.Forms.CheckBox();
this.readSensorGroupBox = new System.Windows.Forms.GroupBox();
this.filterTimeMinLabel = new System.Windows.Forms.Label();
this.filterTimeMinTextBox = new System.Windows.Forms.TextBox();
this.sensorNameLabel = new System.Windows.Forms.Label();
this.sensorNameTextBox = new System.Windows.Forms.TextBox();
this.comPortNrLabel = new System.Windows.Forms.Label();
this.comPortNrTextBox = new System.Windows.Forms.TextBox();
this.addressLabel = new System.Windows.Forms.Label();
this.addressTextBox = new System.Windows.Forms.TextBox();
this.readSensorCheckBox = new System.Windows.Forms.CheckBox();
this.loginRequiredCheckBox = new System.Windows.Forms.CheckBox();
this.saveRFTestResultGroupBox.SuspendLayout();
this.validPcbPrefixesGroupBox.SuspendLayout();
this.printLabelsGroupBox.SuspendLayout();
this.readSensorGroupBox.SuspendLayout();
this.SuspendLayout();
//
// okButton
//
this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.okButton.Location = new System.Drawing.Point(688, 383);
this.okButton.Name = "okButton";
this.okButton.Size = new System.Drawing.Size(85, 38);
this.okButton.TabIndex = 0;
this.okButton.Text = "OK";
this.okButton.UseVisualStyleBackColor = true;
this.okButton.Click += new System.EventHandler(this.okButton_Click);
//
// cancelButton
//
this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.cancelButton.Location = new System.Drawing.Point(783, 383);
this.cancelButton.Name = "cancelButton";
this.cancelButton.Size = new System.Drawing.Size(85, 38);
this.cancelButton.TabIndex = 1;
this.cancelButton.Text = "Cancel";
this.cancelButton.UseVisualStyleBackColor = true;
this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
//
// connectionStringTextBox
//
this.connectionStringTextBox.Location = new System.Drawing.Point(158, 56);
this.connectionStringTextBox.Name = "connectionStringTextBox";
this.connectionStringTextBox.Size = new System.Drawing.Size(708, 20);
this.connectionStringTextBox.TabIndex = 5;
//
// oracleModeComboBox
//
this.oracleModeComboBox.FormattingEnabled = true;
this.oracleModeComboBox.Location = new System.Drawing.Point(163, 22);
this.oracleModeComboBox.Name = "oracleModeComboBox";
this.oracleModeComboBox.Size = new System.Drawing.Size(190, 21);
this.oracleModeComboBox.TabIndex = 1;
//
// workplaceTextBox
//
this.workplaceTextBox.Location = new System.Drawing.Point(158, 19);
this.workplaceTextBox.Name = "workplaceTextBox";
this.workplaceTextBox.Size = new System.Drawing.Size(190, 20);
this.workplaceTextBox.TabIndex = 3;
//
// archiveFolderTextBox
//
this.archiveFolderTextBox.Location = new System.Drawing.Point(158, 134);
this.archiveFolderTextBox.Name = "archiveFolderTextBox";
this.archiveFolderTextBox.Size = new System.Drawing.Size(708, 20);
this.archiveFolderTextBox.TabIndex = 11;
//
// tracingDBConnStringLabel
//
this.tracingDBConnStringLabel.AutoSize = true;
this.tracingDBConnStringLabel.Location = new System.Drawing.Point(26, 59);
this.tracingDBConnStringLabel.Name = "tracingDBConnStringLabel";
this.tracingDBConnStringLabel.Size = new System.Drawing.Size(119, 13);
this.tracingDBConnStringLabel.TabIndex = 4;
this.tracingDBConnStringLabel.Text = "Tracing DB conn. string";
//
// testResultsFolderTextBox
//
this.testResultsFolderTextBox.Location = new System.Drawing.Point(158, 108);
this.testResultsFolderTextBox.Name = "testResultsFolderTextBox";
this.testResultsFolderTextBox.Size = new System.Drawing.Size(708, 20);
this.testResultsFolderTextBox.TabIndex = 9;
//
// testResultsFolderLabel
//
this.testResultsFolderLabel.AutoSize = true;
this.testResultsFolderLabel.Location = new System.Drawing.Point(26, 111);
this.testResultsFolderLabel.Name = "testResultsFolderLabel";
this.testResultsFolderLabel.Size = new System.Drawing.Size(88, 13);
this.testResultsFolderLabel.TabIndex = 8;
this.testResultsFolderLabel.Text = "Test resuts folder";
//
// archiveFolderLabel
//
this.archiveFolderLabel.AutoSize = true;
this.archiveFolderLabel.Location = new System.Drawing.Point(26, 137);
this.archiveFolderLabel.Name = "archiveFolderLabel";
this.archiveFolderLabel.Size = new System.Drawing.Size(72, 13);
this.archiveFolderLabel.TabIndex = 10;
this.archiveFolderLabel.Text = "Archive folder";
//
// oracleModeLabel
//
this.oracleModeLabel.AutoSize = true;
this.oracleModeLabel.Location = new System.Drawing.Point(31, 25);
this.oracleModeLabel.Name = "oracleModeLabel";
this.oracleModeLabel.Size = new System.Drawing.Size(101, 13);
this.oracleModeLabel.TabIndex = 0;
this.oracleModeLabel.Text = "Oracle DB selection";
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(26, 22);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(59, 13);
this.label6.TabIndex = 2;
this.label6.Text = "Workplace";
//
// saveRFTestResultGroupBox
//
this.saveRFTestResultGroupBox.Controls.Add(this.saveTestResultToOracleCheckBox);
this.saveRFTestResultGroupBox.Controls.Add(this.oracleModeComboBox);
this.saveRFTestResultGroupBox.Controls.Add(this.oracleModeLabel);
this.saveRFTestResultGroupBox.Location = new System.Drawing.Point(29, 271);
this.saveRFTestResultGroupBox.Name = "saveRFTestResultGroupBox";
this.saveRFTestResultGroupBox.Size = new System.Drawing.Size(403, 55);
this.saveRFTestResultGroupBox.TabIndex = 18;
this.saveRFTestResultGroupBox.TabStop = false;
//
// saveTestResultToOracleCheckBox
//
this.saveTestResultToOracleCheckBox.AutoSize = true;
this.saveTestResultToOracleCheckBox.Location = new System.Drawing.Point(6, 0);
this.saveTestResultToOracleCheckBox.Name = "saveTestResultToOracleCheckBox";
this.saveTestResultToOracleCheckBox.Size = new System.Drawing.Size(163, 17);
this.saveTestResultToOracleCheckBox.TabIndex = 2;
this.saveTestResultToOracleCheckBox.Text = "Save test result to Oracle DB";
this.saveTestResultToOracleCheckBox.UseVisualStyleBackColor = true;
this.saveTestResultToOracleCheckBox.CheckedChanged += new System.EventHandler(this.saveTestResultToOracleCheckBox_CheckedChanged);
//
// checkPreviousTracingRecordsCheckBox
//
this.checkPreviousTracingRecordsCheckBox.AutoSize = true;
this.checkPreviousTracingRecordsCheckBox.Location = new System.Drawing.Point(35, 241);
this.checkPreviousTracingRecordsCheckBox.Name = "checkPreviousTracingRecordsCheckBox";
this.checkPreviousTracingRecordsCheckBox.Size = new System.Drawing.Size(173, 17);
this.checkPreviousTracingRecordsCheckBox.TabIndex = 16;
this.checkPreviousTracingRecordsCheckBox.Text = "Check previous tracing records";
this.checkPreviousTracingRecordsCheckBox.UseVisualStyleBackColor = true;
//
// usersDBConnStringLabel
//
this.usersDBConnStringLabel.AutoSize = true;
this.usersDBConnStringLabel.Location = new System.Drawing.Point(26, 85);
this.usersDBConnStringLabel.Name = "usersDBConnStringLabel";
this.usersDBConnStringLabel.Size = new System.Drawing.Size(110, 13);
this.usersDBConnStringLabel.TabIndex = 6;
this.usersDBConnStringLabel.Text = "Users DB conn. string";
//
// usersDBConnStringTextBox
//
this.usersDBConnStringTextBox.Location = new System.Drawing.Point(158, 82);
this.usersDBConnStringTextBox.Name = "usersDBConnStringTextBox";
this.usersDBConnStringTextBox.Size = new System.Drawing.Size(708, 20);
this.usersDBConnStringTextBox.TabIndex = 7;
//
// validSNPrefixesLabel
//
this.validSNPrefixesLabel.AutoSize = true;
this.validSNPrefixesLabel.Location = new System.Drawing.Point(31, 26);
this.validSNPrefixesLabel.Name = "validSNPrefixesLabel";
this.validSNPrefixesLabel.Size = new System.Drawing.Size(88, 13);
this.validSNPrefixesLabel.TabIndex = 12;
this.validSNPrefixesLabel.Text = "Valid s/n prefixes";
//
// validSNPrefixesTextBox
//
this.validSNPrefixesTextBox.Location = new System.Drawing.Point(163, 23);
this.validSNPrefixesTextBox.Name = "validSNPrefixesTextBox";
this.validSNPrefixesTextBox.Size = new System.Drawing.Size(656, 20);
this.validSNPrefixesTextBox.TabIndex = 13;
//
// validPcbPrefixesGroupBox
//
this.validPcbPrefixesGroupBox.Controls.Add(this.checkSNsValidityCheckBox);
this.validPcbPrefixesGroupBox.Controls.Add(this.validSNPrefixesTextBox);
this.validPcbPrefixesGroupBox.Controls.Add(this.validSNPrefixesLabel);
this.validPcbPrefixesGroupBox.Location = new System.Drawing.Point(29, 170);
this.validPcbPrefixesGroupBox.Name = "validPcbPrefixesGroupBox";
this.validPcbPrefixesGroupBox.Size = new System.Drawing.Size(837, 58);
this.validPcbPrefixesGroupBox.TabIndex = 20;
this.validPcbPrefixesGroupBox.TabStop = false;
//
// checkSNsValidityCheckBox
//
this.checkSNsValidityCheckBox.AutoSize = true;
this.checkSNsValidityCheckBox.Location = new System.Drawing.Point(6, 0);
this.checkSNsValidityCheckBox.Name = "checkSNsValidityCheckBox";
this.checkSNsValidityCheckBox.Size = new System.Drawing.Size(194, 17);
this.checkSNsValidityCheckBox.TabIndex = 14;
this.checkSNsValidityCheckBox.Text = "Check if PCB / flowtube s/n is valid";
this.checkSNsValidityCheckBox.UseVisualStyleBackColor = true;
this.checkSNsValidityCheckBox.CheckedChanged += new System.EventHandler(this.checkSNsValidityCheckBox_CheckedChanged);
//
// printLabelsGroupBox
//
this.printLabelsGroupBox.Controls.Add(this.printGoodLabelsOnlyCheckBox);
this.printLabelsGroupBox.Controls.Add(this.printLabelsCheckBox);
this.printLabelsGroupBox.Location = new System.Drawing.Point(29, 336);
this.printLabelsGroupBox.Name = "printLabelsGroupBox";
this.printLabelsGroupBox.Size = new System.Drawing.Size(403, 55);
this.printLabelsGroupBox.TabIndex = 21;
this.printLabelsGroupBox.TabStop = false;
//
// printGoodLabelsOnlyCheckBox
//
this.printGoodLabelsOnlyCheckBox.AutoSize = true;
this.printGoodLabelsOnlyCheckBox.Location = new System.Drawing.Point(163, 23);
this.printGoodLabelsOnlyCheckBox.Name = "printGoodLabelsOnlyCheckBox";
this.printGoodLabelsOnlyCheckBox.Size = new System.Drawing.Size(129, 17);
this.printGoodLabelsOnlyCheckBox.TabIndex = 22;
this.printGoodLabelsOnlyCheckBox.Text = "Print good results only";
this.printGoodLabelsOnlyCheckBox.UseVisualStyleBackColor = true;
//
// printLabelsCheckBox
//
this.printLabelsCheckBox.AutoSize = true;
this.printLabelsCheckBox.Location = new System.Drawing.Point(6, 0);
this.printLabelsCheckBox.Name = "printLabelsCheckBox";
this.printLabelsCheckBox.Size = new System.Drawing.Size(80, 17);
this.printLabelsCheckBox.TabIndex = 2;
this.printLabelsCheckBox.Text = "Print results";
this.printLabelsCheckBox.UseVisualStyleBackColor = true;
this.printLabelsCheckBox.CheckedChanged += new System.EventHandler(this.printLabelsCheckBox_CheckedChanged);
//
// maximizeWindowOnErrorCheckBox
//
this.maximizeWindowOnErrorCheckBox.AutoSize = true;
this.maximizeWindowOnErrorCheckBox.Location = new System.Drawing.Point(35, 404);
this.maximizeWindowOnErrorCheckBox.Name = "maximizeWindowOnErrorCheckBox";
this.maximizeWindowOnErrorCheckBox.Size = new System.Drawing.Size(147, 17);
this.maximizeWindowOnErrorCheckBox.TabIndex = 22;
this.maximizeWindowOnErrorCheckBox.Text = "Maximize window on error";
this.maximizeWindowOnErrorCheckBox.UseVisualStyleBackColor = true;
//
// readSensorGroupBox
//
this.readSensorGroupBox.Controls.Add(this.filterTimeMinLabel);
this.readSensorGroupBox.Controls.Add(this.filterTimeMinTextBox);
this.readSensorGroupBox.Controls.Add(this.sensorNameLabel);
this.readSensorGroupBox.Controls.Add(this.sensorNameTextBox);
this.readSensorGroupBox.Controls.Add(this.comPortNrLabel);
this.readSensorGroupBox.Controls.Add(this.comPortNrTextBox);
this.readSensorGroupBox.Controls.Add(this.addressLabel);
this.readSensorGroupBox.Controls.Add(this.addressTextBox);
this.readSensorGroupBox.Controls.Add(this.readSensorCheckBox);
this.readSensorGroupBox.Location = new System.Drawing.Point(450, 241);
this.readSensorGroupBox.Name = "readSensorGroupBox";
this.readSensorGroupBox.Size = new System.Drawing.Size(416, 123);
this.readSensorGroupBox.TabIndex = 23;
this.readSensorGroupBox.TabStop = false;
//
// filterTimeMinLabel
//
this.filterTimeMinLabel.AutoSize = true;
this.filterTimeMinLabel.Location = new System.Drawing.Point(81, 95);
this.filterTimeMinLabel.Name = "filterTimeMinLabel";
this.filterTimeMinLabel.Size = new System.Drawing.Size(96, 13);
this.filterTimeMinLabel.TabIndex = 31;
this.filterTimeMinLabel.Text = "Filter time (minutes)";
//
// filterTimeMinTextBox
//
this.filterTimeMinTextBox.Location = new System.Drawing.Point(197, 92);
this.filterTimeMinTextBox.Name = "filterTimeMinTextBox";
this.filterTimeMinTextBox.Size = new System.Drawing.Size(47, 20);
this.filterTimeMinTextBox.TabIndex = 32;
//
// sensorNameLabel
//
this.sensorNameLabel.AutoSize = true;
this.sensorNameLabel.Location = new System.Drawing.Point(81, 23);
this.sensorNameLabel.Name = "sensorNameLabel";
this.sensorNameLabel.Size = new System.Drawing.Size(69, 13);
this.sensorNameLabel.TabIndex = 29;
this.sensorNameLabel.Text = "Sensor name";
//
// sensorNameTextBox
//
this.sensorNameTextBox.Location = new System.Drawing.Point(197, 20);
this.sensorNameTextBox.Name = "sensorNameTextBox";
this.sensorNameTextBox.Size = new System.Drawing.Size(136, 20);
this.sensorNameTextBox.TabIndex = 30;
//
// comPortNrLabel
//
this.comPortNrLabel.AutoSize = true;
this.comPortNrLabel.Location = new System.Drawing.Point(81, 47);
this.comPortNrLabel.Name = "comPortNrLabel";
this.comPortNrLabel.Size = new System.Drawing.Size(90, 13);
this.comPortNrLabel.TabIndex = 27;
this.comPortNrLabel.Text = "COM port number";
//
// comPortNrTextBox
//
this.comPortNrTextBox.Location = new System.Drawing.Point(197, 44);
this.comPortNrTextBox.Name = "comPortNrTextBox";
this.comPortNrTextBox.Size = new System.Drawing.Size(47, 20);
this.comPortNrTextBox.TabIndex = 28;
//
// addressLabel
//
this.addressLabel.AutoSize = true;
this.addressLabel.Location = new System.Drawing.Point(81, 71);
this.addressLabel.Name = "addressLabel";
this.addressLabel.Size = new System.Drawing.Size(85, 13);
this.addressLabel.TabIndex = 25;
this.addressLabel.Text = "Modbus address";
//
// addressTextBox
//
this.addressTextBox.Location = new System.Drawing.Point(197, 68);
this.addressTextBox.Name = "addressTextBox";
this.addressTextBox.Size = new System.Drawing.Size(47, 20);
this.addressTextBox.TabIndex = 26;
//
// readSensorCheckBox
//
this.readSensorCheckBox.AutoSize = true;
this.readSensorCheckBox.Location = new System.Drawing.Point(6, 0);
this.readSensorCheckBox.Name = "readSensorCheckBox";
this.readSensorCheckBox.Size = new System.Drawing.Size(95, 17);
this.readSensorCheckBox.TabIndex = 24;
this.readSensorCheckBox.Text = "Read a sensor";
this.readSensorCheckBox.UseVisualStyleBackColor = true;
this.readSensorCheckBox.CheckedChanged += new System.EventHandler(this.readSensorCheckBox_CheckedChanged);
//
// loginRequiredCheckBox
//
this.loginRequiredCheckBox.AutoSize = true;
this.loginRequiredCheckBox.Location = new System.Drawing.Point(411, 21);
this.loginRequiredCheckBox.Name = "loginRequiredCheckBox";
this.loginRequiredCheckBox.Size = new System.Drawing.Size(114, 17);
this.loginRequiredCheckBox.TabIndex = 24;
this.loginRequiredCheckBox.Text = "User login required";
this.loginRequiredCheckBox.UseVisualStyleBackColor = true;
//
// SettingsDlg
//
this.AcceptButton = this.okButton;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.cancelButton;
this.ClientSize = new System.Drawing.Size(895, 440);
this.Controls.Add(this.loginRequiredCheckBox);
this.Controls.Add(this.readSensorGroupBox);
this.Controls.Add(this.maximizeWindowOnErrorCheckBox);
this.Controls.Add(this.printLabelsGroupBox);
this.Controls.Add(this.validPcbPrefixesGroupBox);
this.Controls.Add(this.usersDBConnStringLabel);
this.Controls.Add(this.usersDBConnStringTextBox);
this.Controls.Add(this.checkPreviousTracingRecordsCheckBox);
this.Controls.Add(this.saveRFTestResultGroupBox);
this.Controls.Add(this.label6);
this.Controls.Add(this.workplaceTextBox);
this.Controls.Add(this.archiveFolderLabel);
this.Controls.Add(this.archiveFolderTextBox);
this.Controls.Add(this.testResultsFolderLabel);
this.Controls.Add(this.testResultsFolderTextBox);
this.Controls.Add(this.tracingDBConnStringLabel);
this.Controls.Add(this.connectionStringTextBox);
this.Controls.Add(this.cancelButton);
this.Controls.Add(this.okButton);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "SettingsDlg";
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
this.Text = "Settings";
this.Load += new System.EventHandler(this.SettingsDlg_Load);
this.saveRFTestResultGroupBox.ResumeLayout(false);
this.saveRFTestResultGroupBox.PerformLayout();
this.validPcbPrefixesGroupBox.ResumeLayout(false);
this.validPcbPrefixesGroupBox.PerformLayout();
this.printLabelsGroupBox.ResumeLayout(false);
this.printLabelsGroupBox.PerformLayout();
this.readSensorGroupBox.ResumeLayout(false);
this.readSensorGroupBox.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button okButton;
private System.Windows.Forms.Button cancelButton;
private System.Windows.Forms.TextBox connectionStringTextBox;
private System.Windows.Forms.ComboBox oracleModeComboBox;
private System.Windows.Forms.TextBox workplaceTextBox;
private System.Windows.Forms.TextBox archiveFolderTextBox;
private System.Windows.Forms.Label tracingDBConnStringLabel;
private System.Windows.Forms.TextBox testResultsFolderTextBox;
private System.Windows.Forms.Label testResultsFolderLabel;
private System.Windows.Forms.Label archiveFolderLabel;
private System.Windows.Forms.Label oracleModeLabel;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.GroupBox saveRFTestResultGroupBox;
private System.Windows.Forms.CheckBox saveTestResultToOracleCheckBox;
private System.Windows.Forms.CheckBox checkPreviousTracingRecordsCheckBox;
private System.Windows.Forms.Label usersDBConnStringLabel;
private System.Windows.Forms.TextBox usersDBConnStringTextBox;
private System.Windows.Forms.Label validSNPrefixesLabel;
private System.Windows.Forms.TextBox validSNPrefixesTextBox;
private System.Windows.Forms.GroupBox validPcbPrefixesGroupBox;
private System.Windows.Forms.CheckBox checkSNsValidityCheckBox;
private System.Windows.Forms.GroupBox printLabelsGroupBox;
private System.Windows.Forms.CheckBox printLabelsCheckBox;
private System.Windows.Forms.CheckBox printGoodLabelsOnlyCheckBox;
private System.Windows.Forms.CheckBox maximizeWindowOnErrorCheckBox;
private System.Windows.Forms.GroupBox readSensorGroupBox;
private System.Windows.Forms.Label comPortNrLabel;
private System.Windows.Forms.TextBox comPortNrTextBox;
private System.Windows.Forms.Label addressLabel;
private System.Windows.Forms.TextBox addressTextBox;
private System.Windows.Forms.CheckBox readSensorCheckBox;
private System.Windows.Forms.Label sensorNameLabel;
private System.Windows.Forms.TextBox sensorNameTextBox;
private System.Windows.Forms.Label filterTimeMinLabel;
private System.Windows.Forms.TextBox filterTimeMinTextBox;
private System.Windows.Forms.CheckBox loginRequiredCheckBox;
}
}
+142
View File
@@ -0,0 +1,142 @@
///
/// Copyright (c) 2019-2021 Sensus Slovensko a.s.
///
using System;
using System.Windows.Forms;
using System.Drawing;
using SharedDatabase;
namespace GenericTest
{
public partial class SettingsDlg : Form
{
public SettingsDlg()
{
InitializeComponent();
for (Mode m = 0; m < Mode.Count; m++) oracleModeComboBox.Items.Add(m.ToString());
ManageCheckGroupBox(checkSNsValidityCheckBox, validPcbPrefixesGroupBox);
ManageCheckGroupBox(saveTestResultToOracleCheckBox, saveRFTestResultGroupBox);
ManageCheckGroupBox(printLabelsCheckBox, printLabelsGroupBox);
ManageCheckGroupBox(readSensorCheckBox, readSensorGroupBox);
}
private void SettingsDlg_Load(object sender, EventArgs e)
{
LocalSettings ls = Program.LocalSettings;
workplaceTextBox.Text = ls.Workplace;
loginRequiredCheckBox.Checked = ls.IsUserLoginRequired;
connectionStringTextBox.Text = ls.ConnectionString;
usersDBConnStringTextBox.Text = ls.UsersDBConnString;
testResultsFolderTextBox.Text = ls.TestResultsFolder;
archiveFolderTextBox.Text = ls.ArchiveFolder;
checkSNsValidityCheckBox.Checked = ls.DoCheckSNsValidity;
validSNPrefixesTextBox.Text = ls.ValidSNPrefixes;
checkPreviousTracingRecordsCheckBox.Checked = ls.DoCheckPreviousTracingRecords;
saveTestResultToOracleCheckBox.Checked = ls.DoSaveTestResultToOracle;
if (ls.OracleMode >= 0 && ls.OracleMode < Mode.Count) oracleModeComboBox.Text = ls.OracleMode.ToString();
printLabelsCheckBox.Checked = ls.DoPrintLabels;
printGoodLabelsOnlyCheckBox.Checked = ls.DoPrintGoodLabelsOnly;
maximizeWindowOnErrorCheckBox.Checked = ls.MaximizeWindowOnError;
readSensorCheckBox.Checked = ls.DoReadSensor;
sensorNameTextBox.Text = ls.SensorName;
comPortNrTextBox.Text = ls.SensorComPortNr.ToString();
addressTextBox.Text = ls.SensorAddress.ToString();
filterTimeMinTextBox.Text = ls.SensorFilterTimeMinutes.ToString();
}
private void okButton_Click(object sender, EventArgs e)
{
LocalSettings ls = Program.LocalSettings;
ls.Workplace = workplaceTextBox.Text;
ls.IsUserLoginRequired = loginRequiredCheckBox.Checked;
ls.ConnectionString = connectionStringTextBox.Text;
ls.UsersDBConnString = usersDBConnStringTextBox.Text;
ls.TestResultsFolder = testResultsFolderTextBox.Text;
ls.ArchiveFolder = archiveFolderTextBox.Text;
ls.DoCheckSNsValidity = checkSNsValidityCheckBox.Checked;
ls.ValidSNPrefixes = validSNPrefixesTextBox.Text;
ls.DoCheckPreviousTracingRecords = checkPreviousTracingRecordsCheckBox.Checked;
ls.DoSaveTestResultToOracle = saveTestResultToOracleCheckBox.Checked;
for (Mode m = 0; m < Mode.Count; m++)
{
if (oracleModeComboBox.Text == m.ToString()) { ls.OracleMode = m; break; }
}
ls.DoPrintLabels = printLabelsCheckBox.Checked;
ls.DoPrintGoodLabelsOnly = printGoodLabelsOnlyCheckBox.Checked;
ls.MaximizeWindowOnError = maximizeWindowOnErrorCheckBox.Checked;
ls.DoReadSensor = readSensorCheckBox.Checked;
if (ls.DoReadSensor)
{
ls.SensorName = sensorNameTextBox.Text;
int ival;
if (int.TryParse(comPortNrTextBox.Text, out ival)) ls.SensorComPortNr = ival;
if (int.TryParse(addressTextBox.Text, out ival)) ls.SensorAddress = ival;
if (int.TryParse(filterTimeMinTextBox.Text, out ival)) ls.SensorFilterTimeMinutes = ival;
}
ls.Save();
DialogResult = DialogResult.OK;
Close();
}
private void cancelButton_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
}
private void ManageCheckGroupBox(CheckBox chk, GroupBox grp)
{
/// Make sure the CheckBox isn't in the GroupBox. This will only happen the first time.
if (chk.Parent == grp)
{
grp.Parent.Controls.Add(chk); /// Reparent the CheckBox so it's not in the GroupBox.
chk.Location = new Point(chk.Left + grp.Left, chk.Top + grp.Top); /// Adjust the CheckBox's location.
chk.BringToFront(); /// Move the CheckBox to the top of the stacking order.
}
/// Enable or disable the GroupBox.
grp.Enabled = chk.Checked;
}
private void checkSNsValidityCheckBox_CheckedChanged(object sender, EventArgs e)
{
ManageCheckGroupBox(checkSNsValidityCheckBox, validPcbPrefixesGroupBox);
}
private void saveTestResultToOracleCheckBox_CheckedChanged(object sender, EventArgs e)
{
ManageCheckGroupBox(saveTestResultToOracleCheckBox, saveRFTestResultGroupBox);
}
private void printLabelsCheckBox_CheckedChanged(object sender, EventArgs e)
{
ManageCheckGroupBox(printLabelsCheckBox, printLabelsGroupBox);
}
private void readSensorCheckBox_CheckedChanged(object sender, EventArgs e)
{
ManageCheckGroupBox(readSensorCheckBox, readSensorGroupBox);
}
}
}
+3
View File
@@ -0,0 +1,3 @@
<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>
+99
View File
@@ -0,0 +1,99 @@
namespace OrderManagement
{
partial class EditOrderDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.cancelButton = new System.Windows.Forms.Button();
this.okButton = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
this.SuspendLayout();
//
// splitContainer1
//
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
this.splitContainer1.Location = new System.Drawing.Point(0, 0);
this.splitContainer1.Name = "splitContainer1";
//
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.cancelButton);
this.splitContainer1.Panel2.Controls.Add(this.okButton);
this.splitContainer1.Size = new System.Drawing.Size(685, 352);
this.splitContainer1.SplitterDistance = 555;
this.splitContainer1.TabIndex = 0;
//
// cancelButton
//
this.cancelButton.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.cancelButton.Location = new System.Drawing.Point(21, 70);
this.cancelButton.Name = "cancelButton";
this.cancelButton.Size = new System.Drawing.Size(85, 40);
this.cancelButton.TabIndex = 6;
this.cancelButton.Text = "Cancel";
this.cancelButton.UseVisualStyleBackColor = true;
this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
//
// okButton
//
this.okButton.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.okButton.Location = new System.Drawing.Point(21, 20);
this.okButton.Name = "okButton";
this.okButton.Size = new System.Drawing.Size(85, 40);
this.okButton.TabIndex = 5;
this.okButton.Text = "OK";
this.okButton.UseVisualStyleBackColor = true;
this.okButton.Click += new System.EventHandler(this.okButton_Click);
//
// EditOrderDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(685, 352);
this.Controls.Add(this.splitContainer1);
this.Name = "EditOrderDlg";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Production order properties";
this.splitContainer1.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
this.splitContainer1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.Button cancelButton;
private System.Windows.Forms.Button okButton;
}
}
+311
View File
@@ -0,0 +1,311 @@
///
/// Copyright (c) 2021 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using SharedDatabase;
using SharedDatabase.Entities;
using OrderManagement.Resources;
using NHibernate;
namespace OrderManagement
{
public partial class EditOrderDlg : Form
{
ISession session;
OrderInfo oriOrder;
IList<OrderInfo> listOfOrders;
bool isEnablePredefinedOrders;
bool editMode;
EditParametersCtrl editParametersCtrl;
public EditOrderDlg(ISession session, OrderInfo order, IList<OrderInfo> listOfOrders, bool isEnablePredefinedOrders = false, bool editMode = false)
{
InitializeComponent();
this.session = session;
this.oriOrder = order;
this.listOfOrders = listOfOrders;
this.isEnablePredefinedOrders = isEnablePredefinedOrders;
this.editMode = editMode;
editParametersCtrl = new EditParametersCtrl(oriOrder.Clone());
editParametersCtrl.Dock = DockStyle.Fill;
editParametersCtrl.Unlock();
splitContainer1.Panel1.Controls.Add(editParametersCtrl);
Localize();
}
void Localize()
{
Text = Strings.Producton_order_properties;
okButton.Text = Strings.OK;
cancelButton.Text = Strings.Cancel;
}
private void okButton_Click(object sender, EventArgs e)
{
OrderInfo modifiedOrder = editParametersCtrl.ParamsProvider as OrderInfo;
int modifiedOrderNr;
if (!isEnablePredefinedOrders &&
(!int.TryParse(modifiedOrder.POName, out modifiedOrderNr) || modifiedOrderNr <= OrderManagementDlg.MaxPredefinedOrderNr))
{
MessageBox.Show(string.Format(Strings.Order_number_must_be_larger_then_0, OrderManagementDlg.MaxPredefinedOrderNr));
return;
}
OrderInfo orderWithTheSameName = listOfOrders.FirstOrDefault(x => (x.POName == modifiedOrder.POName));
if (orderWithTheSameName != null && (!editMode || modifiedOrder.POName != oriOrder.POName))
{
MessageBox.Show(Strings.Order_with_the_same_ID_already_exists);
return;
}
if (IsConflict(modifiedOrder, listOfOrders, editMode ? oriOrder : null))
{
return;
}
modifiedOrder.CopyContentTo(oriOrder);
if (Save(oriOrder))
{
DialogResult = DialogResult.OK;
}
else
{
MessageBox.Show("Saving the modified order to the database failed");
DialogResult = DialogResult.Cancel;
}
Close();
}
/// <summary>
/// Saves the new or modified order to the database
/// </summary>
/// <returns>true when successful</returns>
bool Save(OrderInfo order)
{
ITransaction transaction = session.BeginTransaction();
try
{
Cursor.Current = Cursors.WaitCursor;
session.SaveOrUpdate(order);
transaction.Commit();
session.Flush();
Cursor.Current = Cursors.Default;
return true;
}
catch (Exception exc)
{
transaction.Rollback();
MessageBox.Show(string.Format("{0}{1}{2}", Strings.Saving_order_failed, Environment.NewLine, exc.Message),
Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
Cursor.Current = Cursors.Default;
return false;
}
}
private void cancelButton_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
}
/// <summary>
/// Check for conflicts of serial numbers or radio addresses
/// </summary>
/// <param name="order">New or modified order to be checked</param>
/// <param name="listOfOrders">List of all orders</param>
/// <param name="orderToIgnore">Order to be ignered when doing check (original order in the edit mode)</param>
/// <returns>false = OK, true = conflict (MessageBox appears before returning true)</returns>
bool IsConflict(OrderInfo order, IList<OrderInfo> listOfOrders, OrderInfo orderToIgnore)
{
if (order.POName[0] == '3')
{
if (MessageBox.Show(string.Format("{0}\r\n{1}", Strings.It_is_not_recommended_that_orders_start_with_3,
Strings.Abort_creating_an_order_QM),
Strings.Warning,
MessageBoxButtons.YesNo,
MessageBoxIcon.Exclamation) == DialogResult.Yes)
{
return true;
}
}
int snLength = CodeLength(order);
Int64 snOffset;
string snStdPrefix = StandardPrefix(order, out snOffset);
string snStdSuffix = StandardSuffix(order);
Int64 snFrst = First(order, snOffset);
Int64 snLast = Last(order, snOffset);
int raLength = CodeLength(order, true);
Int64 raOffset;
string raStdPrefix = StandardPrefix(order, out raOffset, true);
string raStdSuffix = StandardSuffix(order, true);
Int64 raFrst = First(order, raOffset, true);
Int64 raLast = Last(order, raOffset, true);
foreach (var another in listOfOrders)
{
if (orderToIgnore != null && orderToIgnore == another) continue;
Int64 offset;
string anotherSnStdPrefix = StandardPrefix(another, out offset);
Int64 first2 = First(another, offset);
Int64 last2 = Last(another, offset);
if (snLength == CodeLength(another) &&
snStdPrefix == anotherSnStdPrefix &&
snStdSuffix == StandardSuffix(another) &&
((first2 <= snFrst && snFrst <= last2 ) ||
(first2 <= snLast && snLast <= last2 ) ||
(snFrst <= first2 && first2 <= snLast) ||
(snFrst <= last2 && last2 <= snLast)))
{
if (MessageBox.Show(string.Format("{0}\r\n{1}: s/n {2} .. {3}\r\n{4}: s/n {5} .. {6}\r\n{7}",
Strings.There_is_a_conflict,
order.POName,
order.SNPrefix + order.SNFirst.ToString(string.Format("D{0}", order.SNDigitsCount)) + snStdSuffix,
order.SNPrefix + (order.SNFirst + order.PiecesCount - 1).ToString(string.Format("D{0}", order.SNDigitsCount)) + snStdSuffix,
another.POName,
another.SNPrefix + another.SNFirst.ToString(string.Format("D{0}", another.SNDigitsCount)) + StandardSuffix(another),
another.SNPrefix + (another.SNFirst + another.PiecesCount - 1).ToString(string.Format("D{0}", another.SNDigitsCount)) + StandardSuffix(another),
Strings.Abort_creating_an_order_QM),
Strings.Warning,
MessageBoxButtons.YesNo,
MessageBoxIcon.Exclamation) == DialogResult.Yes)
{
return true;
}
}
string anotherRaStdPrefix = StandardPrefix(another, out offset, true);
first2 = First(another, offset, true);
last2 = Last(another, offset, true);
if (!string.IsNullOrEmpty(order.RAPrefix) &&
!string.IsNullOrEmpty(another.RAPrefix) &&
raLength == CodeLength(another, true) &&
raStdPrefix == anotherRaStdPrefix &&
raStdSuffix == StandardSuffix(another, true) &&
((first2 <= raFrst && raFrst <= last2 ) ||
(first2 <= raLast && raLast <= last2 ) ||
(raFrst <= first2 && first2 <= raLast) ||
(raFrst <= last2 && last2 <= raLast)))
{
if (MessageBox.Show(string.Format("{0}\r\n{1}: radio {2} .. {3}\r\n{4}: radio {5} .. {6}\r\n{7}",
Strings.There_is_a_conflict,
order.POName,
order.RAPrefix + order.RAFirst.ToString(Const.RAFormat) + snStdSuffix,
order.RAPrefix + (order.RAFirst + order.PiecesCount).ToString(Const.RAFormat) + snStdSuffix,
another.POName,
another.RAPrefix + another.RAFirst.ToString(Const.RAFormat) + StandardSuffix(another, true),
another.RAPrefix + (another.RAFirst + another.PiecesCount).ToString(Const.RAFormat) + StandardSuffix(another, true),
Strings.Abort_creating_an_order_QM),
Strings.Warning,
MessageBoxButtons.YesNo,
MessageBoxIcon.Exclamation) == DialogResult.Yes)
{
return true;
}
}
}
return false;
}
/// <summary>
/// Prefix lenght + digits count + Suffix length
/// </summary>
/// <param name="order">Order</param>
/// <param name="isRadio">true = Radio address</param>
/// <returns>Complete S/N or RA length</returns>
int CodeLength(OrderInfo order, bool isRadio = false)
{
string prefix = isRadio ? order.RAPrefix : order.SNPrefix;
string suffix = isRadio ? order.RASuffix : order.SNSuffix;
int digitsCount = isRadio ? 9 : order.SNDigitsCount;
return (string.IsNullOrEmpty(prefix) ? 0 : prefix.Length) + digitsCount +
(string.IsNullOrEmpty(suffix) ? 0 : suffix.Length);
}
/// <summary>
/// Standar prefix does not have digits at the end
/// </summary>
/// <param name="order">Order</param>
/// <param name="offset">Offset represented by digits at the end of prefix</param>
/// <param name="isRadio">true = Radio address</param>
/// <returns></returns>
string StandardPrefix(OrderInfo order, out Int64 offset, bool isRadio = false)
{
string prefix = isRadio ? order.RAPrefix : order.SNPrefix;
int digitsCount = isRadio ? 9 : order.SNDigitsCount;
if (string.IsNullOrEmpty(prefix))
{
offset = 0;
return string.Empty;
}
for (int i = prefix.Length - 1; i >= 0; i--)
{
if (!Char.IsDigit(prefix[i]))
{
offset = (i == prefix.Length - 1) ? 0 : Int64.Parse(prefix.Substring(i + 1)) * Convert.ToInt64(Math.Pow(10, digitsCount));
return prefix.Substring(0, i + 1);
}
}
offset = Int64.Parse(prefix) * Convert.ToInt64(Math.Pow(10, digitsCount));
return string.Empty;
}
/// <summary>
/// Standar suffix is never null, null suffix is converted to string.Empty
/// </summary>
/// <param name="order">Order</param>
/// <param name="isRadio">true = Radio address</param>
/// <returns></returns>
string StandardSuffix(OrderInfo order, bool isRadio = false)
{
string suffix = isRadio ? order.RASuffix : order.SNSuffix;
return string.IsNullOrEmpty(suffix) ? string.Empty : suffix;
}
/// <summary>
/// First S/N or RA of an order extended with digits at the end of prefix
/// </summary>
/// <param name="order">Order</param>
/// <param name="offset">Offset represented by digits at the end of prefix</param>
/// <param name="isRadio">true = Radio address</param>
/// <returns>First extended S/N or RA in this order</returns>
Int64 First(OrderInfo order, Int64 offset, bool isRadio = false)
{
return offset + (isRadio ? order.RAFirst : order.SNFirst);
}
/// <summary>
/// Last S/N or RA of an order extended with digits at the end of prefix
/// </summary>
/// <param name="order">Order</param>
/// <param name="offset">Offset represented by digits at the end of prefix</param>
/// <param name="isRadio">true = Radio address</param>
/// <returns>Last extended S/N or RA in this order</returns>
Int64 Last(OrderInfo order, Int64 offset, bool isRadio = false)
{
return First(order, offset, isRadio) + order.PiecesCount - 1;
}
}
}
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
@@ -117,13 +117,4 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="okButton.Text" xml:space="preserve">
<value>OK</value>
</data>
<data name="orderGroupBox.Text" xml:space="preserve">
<value>Kolejność</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Dane partii</value>
</data>
</root>
+131
View File
@@ -0,0 +1,131 @@
///
/// Copyright (c) 2021 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using log4net;
using Common;
using OrderManagement.Resources;
namespace OrderManagement
{
public partial class EditParametersCtrl : UserControl
{
static readonly ILog log = LogManager.GetLogger(typeof(EditParametersCtrl));
public IParamsProvider ParamsProvider;
Control[] editors;
CfgUpdateFlags flags;
public EditParametersCtrl()
{
InitializeComponent();
}
/// <summary>
/// Constructor
/// </summary>
/// <param name="paramsProvider">Parameters provider implementing IComponentCfg and IParamsProvider</param>
/// <param name="parents">A list of parents or null, null hides parentComboBox</param>
public EditParametersCtrl(object paramsProvider)
: this()
{
this.ParamsProvider = paramsProvider as IParamsProvider;
if (this.ParamsProvider == null) throw(new ArgumentException("paramsProvider"));
editors = new Control[this.ParamsProvider.ParamsCount()];
for (int i = 0; i < this.ParamsProvider.ParamsCount(); i++)
{
ICollection<string> values = this.ParamsProvider.ParamValues(i);
if (values == null)
{
editors[i] = new TextBox();
}
else
{
ComboBox cb = new ComboBox();
foreach (var v in values) cb.Items.Add(v);
editors[i] = cb;
}
editors[i].Visible = false;
this.Controls.Add(editors[i]);
}
flags = CfgUpdateFlags.None;
paramsListViewEx.SubItemClicked += new Common.Forms.SubItemEventHandler(paramsListViewEx_SubItemClicked);
paramsListViewEx.SubItemEndEditing += new Common.Forms.SubItemEndEditingEventHandler(paramsListViewEx_SubItemEndEditing);
}
private void EntryFormCfgCtrl_Load(object sender, EventArgs e)
{
paramsListViewEx.Columns.Add(Strings.Parameter, 150);
paramsListViewEx.Columns.Add(Strings.Value, 400);
Redraw();
}
public void Closing()
{
/// Close CmdResponse handlers here
}
void Redraw()
{
if (ParamsProvider == null) return; /// Control was not loaded, settings were not changed
paramsListViewEx.Items.Clear();
for (int i = 0; i < ParamsProvider.ParamsCount(); i++)
{
ListViewItem lvi = new ListViewItem(ParamsProvider.ParamName(i));
lvi.SubItems.Add(ParamsProvider.ToString(i));
lvi.Tag = i;
paramsListViewEx.Items.Add(lvi);
}
}
public void Unlock()
{
paramsListViewEx.Enabled = true;
}
public CfgUpdateFlags VerifyCfg(ref string message)
{
return CfgUpdateFlags.Error;
}
public CfgUpdateFlags UpdateCfg()
{
if (ParamsProvider == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed
CfgUpdateFlags f = this.flags;
return f;
}
private void paramsListViewEx_SubItemClicked(object sender, Common.Forms.SubItemEventArgs e)
{
if (e.SubItem != 1) return;
int itemNr = (int)e.Item.Tag;
paramsListViewEx.StartEditing(editors[itemNr], e.Item, e.SubItem);
}
private void paramsListViewEx_SubItemEndEditing(object sender, Common.Forms.SubItemEndEditingEventArgs e)
{
if (e.SubItem != 1) return;
int itemNr = (int)e.Item.Tag;
string message;
if (ParamsProvider.ValidateParam(itemNr, e.DisplayText, out message))
{
flags |= ParamsProvider.UpdateParam(itemNr, e.DisplayText);
}
else
{
MessageBox.Show(message);
e.DisplayText = e.Item.SubItems[e.SubItem].Text;
e.Cancel = true;
}
}
}
}
+71
View File
@@ -0,0 +1,71 @@
///
/// Copyright (c) 2021 Sensus Slovensko a.s.
///
namespace OrderManagement
{
partial class EditParametersCtrl
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.paramsListViewEx = new Common.Forms.ListViewEx();
this.SuspendLayout();
//
// paramsListViewEx
//
this.paramsListViewEx.AllowColumnReorder = true;
this.paramsListViewEx.Dock = System.Windows.Forms.DockStyle.Fill;
this.paramsListViewEx.DoubleClickActivation = false;
this.paramsListViewEx.Enabled = false;
this.paramsListViewEx.FullRowSelect = true;
this.paramsListViewEx.GridLines = true;
this.paramsListViewEx.LabelWrap = false;
this.paramsListViewEx.Location = new System.Drawing.Point(0, 0);
this.paramsListViewEx.Name = "paramsListViewEx";
this.paramsListViewEx.Size = new System.Drawing.Size(491, 356);
this.paramsListViewEx.TabIndex = 0;
this.paramsListViewEx.UseCompatibleStateImageBehavior = false;
this.paramsListViewEx.View = System.Windows.Forms.View.Details;
this.paramsListViewEx.SubItemClicked += new Common.Forms.SubItemEventHandler(this.paramsListViewEx_SubItemClicked);
this.paramsListViewEx.SubItemEndEditing += new Common.Forms.SubItemEndEditingEventHandler(this.paramsListViewEx_SubItemEndEditing);
//
// EditParametersCtrl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.paramsListViewEx);
this.Name = "EditParametersCtrl";
this.Size = new System.Drawing.Size(491, 356);
this.Load += new System.EventHandler(this.EntryFormCfgCtrl_Load);
this.ResumeLayout(false);
}
#endregion
private Common.Forms.ListViewEx paramsListViewEx;
}
}
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
@@ -117,13 +117,4 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="okButton.Text" xml:space="preserve">
<value>OK</value>
</data>
<data name="orderGroupBox.Text" xml:space="preserve">
<value>Порядок</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Пакетные данные</value>
</data>
</root>
+247
View File
@@ -0,0 +1,247 @@
///
/// Copyright (c) 2021 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Xml.Serialization;
namespace OrderManagement
{
/// <summary>
/// Class to be serialized to an XML file...
/// </summary>
[XmlRootAttribute("SNPrinting")]
public class LocalSettings
{
static XmlSerializer serializer = XmlSerializer.FromTypes(new[] { typeof(LocalSettings) })[0];
/// Configuration file ecryption/decryption key and initialization vector
static byte[] key = new byte[] { 83, 254, 105, 64, 184, 201, 195, 127, 52, 99, 77, 45, 252, 132, 163, 156 };
static byte[] IV = new byte[] { 189, 23, 137, 56, 204, 241, 242, 118, 28, 89, 9, 198, 224, 111, 186, 125 };
public Mode Mode;
public string Language; /// User interface language used as CultureInfo(..) constructor argument
public bool IsUserLoginRequired; /// true = require user login on program start-up
public bool IsShowPredefinedOrders; /// true = show predefined orders with nr. <= 1000
public string TracingDBConnString; /// Connection string to MySQL database with production tracing records
public string UsersDBConnString; /// Connection string to MySQL database with authorized users
public string[] SapNumberHistory; /// SAP number history
public string[] SeparatorHistory; /// Separator history
public int CurrentSNTrail; /// Serial number trail to be printed now
public int RemainingSNsCount; /// Remaining count of serial numbers to be printed in this session
/// Parameterless constructor required by serialization
public LocalSettings() { }
public LocalSettings(bool createNew)
{
if (createNew)
{
Mode = Mode.Standalone;
Language = "EN";
IsUserLoginRequired = false;
IsShowPredefinedOrders = false;
#if DEBUG
TracingDBConnString = "SERVER=localhost; DATABASE=nanjingshared; UID=root; PASSWORD=kraken; CHARSET=utf8;";
#else
TracingDBConnString = "SERVER=10.116.192.200; DATABASE=nanjingshared; UID=nanjingshared; PASSWORD=C1ern4V0d4; CHARSET=utf8;";
#endif
UsersDBConnString = TracingDBConnString;
SapNumberHistory = new string[] { };
SeparatorHistory = new string[] { "7VQ" };
CurrentSNTrail = 1;
RemainingSNsCount = 0;
}
}
/// <summary>
/// Load public fields of this class from the XML file.
/// </summary>
/// <returns>LocalSettings object or null when Load() fails</returns>
public static LocalSettings Load(string fileName)
{
try
{
bool isEncrypted = true;
using (StreamReader reader = new StreamReader(fileName))
{
isEncrypted = !reader.ReadLine().StartsWith("<?xml version=");
reader.Close();
}
if (isEncrypted)
{
/// Write settings to a string
StringBuilder plain = new StringBuilder();
using (RijndaelManaged aes = new RijndaelManaged { Padding = PaddingMode.Zeros })
{
using (FileStream fsCrypt = new FileStream(fileName, FileMode.Open))
{
using (ICryptoTransform decryptor = aes.CreateDecryptor(key, IV))
{
using (CryptoStream cs = new CryptoStream(fsCrypt, decryptor, CryptoStreamMode.Read))
{
using (MemoryStream mStream = new MemoryStream())
{
using (var writer = new BinaryWriter(mStream))
{
int data;
while ((data = cs.ReadByte()) != -1)
{
if (data != 0) writer.Write((byte)data);
}
writer.Flush();
mStream.Position = 0;
using (var reader = new StreamReader(mStream))
{
return serializer.Deserialize(reader) as LocalSettings;
}
}
}
}
}
}
}
}
else
{
using (StreamReader reader = new StreamReader(fileName))
{
return serializer.Deserialize(reader) as LocalSettings;
}
}
}
catch (Exception e)
{
string msg = e.Message;
return null;
}
}
/// <summary>
/// Save public fields of this class to the XML file.
/// </summary>
public void Save()
{
try
{
/// Encrypt and write to file 'Program.LocalSettingsFileName'
using (RijndaelManaged aes = new RijndaelManaged { Padding = PaddingMode.Zeros })
{
using (FileStream fsCrypt = new FileStream(Program.LocalSettingsFileName, FileMode.Create))
{
using (ICryptoTransform encryptor = aes.CreateEncryptor(key, IV))
{
using (CryptoStream cs = new CryptoStream(fsCrypt, encryptor, CryptoStreamMode.Write))
{
using (MemoryStream mStream = new MemoryStream())
{
using (var writer = new StreamWriter(mStream))
{
/// Serialize and write settings to a memory stream
serializer.Serialize(writer, this);
writer.Flush();
mStream.Position = 0;
using (var reader = new StreamReader(mStream))
{
/// Encrypt and write to file 'Program.LocalSettingsFileName'
int data;
while ((data = mStream.ReadByte()) != -1) cs.WriteByte((byte)data);
}
}
}
}
}
}
}
}
catch (Exception e)
{
string msg = e.Message;
}
}
/// <summary>
/// Updates history stored in a string array by a new latest string.
/// </summary>
/// <param name="lastStrValue">Last entered string</param>
/// <returns>true = history updated</returns>
public static bool UpdateHistory(string lastStrValue, ref string[] history)
{
const int MaxHistoryLen = 10;
if (string.IsNullOrEmpty(lastStrValue)) return false;
int currentHistoryLength = (history != null) ? history.Length : 0;
int match = -1;
for (int i = 0; i < currentHistoryLength; i++)
{
if (history[i] == lastStrValue)
{
match = i;
break;
}
}
if (match >= 0 || currentHistoryLength >= MaxHistoryLen)
{
/// History does not have to be extended (because of a match) or should not be extended (because of the lenght)
if (match < 0) match = currentHistoryLength - 1;
for (int j = match; j > 0; j--)
{
history[j] = history[j - 1];
}
history[0] = lastStrValue;
}
else
{
/// History wiil be extended, new item inserted at the beginning
string[] newHistory = new string[currentHistoryLength + 1];
newHistory[0] = lastStrValue;
for (int j = 1; j <= currentHistoryLength; j++)
{
newHistory[j] = history[j - 1];
}
history = newHistory;
}
return true;
}
/// <summary>
/// Load Purchase order combo box items from the LocalSettings PurchaseOrderHistory array
/// </summary>
/// <param name="comboBox">Puchase order ComboBox</param>
public static void PrepareCombo(string[] history, System.Windows.Forms.ComboBox comboBox)
{
if (history != null)
{
for (int i = 0; i < history.Length; i++)
{
comboBox.Items.Add(history[i]);
}
}
if (comboBox.Items.Count > 0)
{
comboBox.Text = comboBox.Items[0].ToString();
}
}
}
public enum Mode
{
Standalone,
WithDatabase,
}
}
+182
View File
@@ -0,0 +1,182 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{7DF40C07-9A1D-403B-91D3-D45660E6D3B1}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>OrderManagement</RootNamespace>
<AssemblyName>OrderManagement</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup>
<StartupObject>OrderManagement.Program</StartupObject>
</PropertyGroup>
<ItemGroup>
<Reference Include="FluentNHibernate">
<HintPath>..\packages\FluentNHibernate.2.0.3.0\lib\net40\FluentNHibernate.dll</HintPath>
</Reference>
<Reference Include="Gma.QrCodeNet.Encoding">
<HintPath>..\packages\QrCode.Net.0.4.0.0\net40\Gma.QrCodeNet.Encoding.dll</HintPath>
</Reference>
<Reference Include="Iesi.Collections">
<HintPath>..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll</HintPath>
</Reference>
<Reference Include="log4net">
<HintPath>..\packages\log4net.2.0.2\lib\net40-full\log4net.dll</HintPath>
</Reference>
<Reference Include="MySql.Data">
<HintPath>..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll</HintPath>
</Reference>
<Reference Include="NHibernate">
<HintPath>..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="EditParametersCtrl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="EditParametersCtrl.designer.cs">
<DependentUpon>EditParametersCtrl.cs</DependentUpon>
</Compile>
<Compile Include="EditOrderDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="EditOrderDlg.Designer.cs">
<DependentUpon>EditOrderDlg.cs</DependentUpon>
</Compile>
<Compile Include="OrderPrintDocument.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="LocalSettings.cs" />
<Compile Include="OrderManagementDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="OrderManagementDlg.Designer.cs">
<DependentUpon>OrderManagementDlg.cs</DependentUpon>
</Compile>
<Compile Include="OrderStateDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="OrderStateDlg.Designer.cs">
<DependentUpon>OrderStateDlg.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Resources\Strings.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Strings.resx</DependentUpon>
</Compile>
<Compile Include="SettingsDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="SettingsDlg.designer.cs">
<DependentUpon>SettingsDlg.cs</DependentUpon>
</Compile>
<EmbeddedResource Include="EditParametersCtrl.resx">
<DependentUpon>EditParametersCtrl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="EditOrderDlg.resx">
<DependentUpon>EditOrderDlg.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="OrderManagementDlg.resx">
<DependentUpon>OrderManagementDlg.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="OrderStateDlg.resx">
<DependentUpon>OrderStateDlg.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<EmbeddedResource Include="Resources\Strings.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Strings.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="Resources\Strings.sk.resx" />
<EmbeddedResource Include="SettingsDlg.resx">
<DependentUpon>SettingsDlg.cs</DependentUpon>
</EmbeddedResource>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Common\Common.csproj">
<Project>{c8939821-ba5c-4988-a3d0-bf53b74865c7}</Project>
<Name>Common</Name>
</ProjectReference>
<ProjectReference Include="..\GenCode128\GenCode128.csproj">
<Project>{32817bf9-e380-4467-9c7f-936f4b122bc7}</Project>
<Name>GenCode128</Name>
</ProjectReference>
<ProjectReference Include="..\SharedDatabase\SharedDatabase.csproj">
<Project>{211b5e3f-9996-48a7-abde-c878dd2d71c2}</Project>
<Name>SharedDatabase</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="SampleConfig\log4netConfig.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
+208
View File
@@ -0,0 +1,208 @@
namespace OrderManagement
{
partial class OrderManagementDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.menuStrip1 = new System.Windows.Forms.MenuStrip();
this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.listViewEx1 = new Common.Forms.ListViewEx();
this.printButton = new System.Windows.Forms.Button();
this.addButton = new System.Windows.Forms.Button();
this.editButton = new System.Windows.Forms.Button();
this.closeButton = new System.Windows.Forms.Button();
this.deleteButton = new System.Windows.Forms.Button();
this.copyButton = new System.Windows.Forms.Button();
this.menuStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
this.SuspendLayout();
//
// menuStrip1
//
this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.settingsToolStripMenuItem});
this.menuStrip1.Location = new System.Drawing.Point(0, 0);
this.menuStrip1.Name = "menuStrip1";
this.menuStrip1.Size = new System.Drawing.Size(1349, 24);
this.menuStrip1.TabIndex = 0;
this.menuStrip1.Text = "menuStrip1";
//
// settingsToolStripMenuItem
//
this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem";
this.settingsToolStripMenuItem.Size = new System.Drawing.Size(61, 20);
this.settingsToolStripMenuItem.Text = "Settings";
this.settingsToolStripMenuItem.Click += new System.EventHandler(this.settingsToolStripMenuItem_Click);
//
// splitContainer1
//
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
this.splitContainer1.Location = new System.Drawing.Point(0, 24);
this.splitContainer1.Name = "splitContainer1";
//
// splitContainer1.Panel1
//
this.splitContainer1.Panel1.Controls.Add(this.listViewEx1);
//
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.copyButton);
this.splitContainer1.Panel2.Controls.Add(this.printButton);
this.splitContainer1.Panel2.Controls.Add(this.addButton);
this.splitContainer1.Panel2.Controls.Add(this.editButton);
this.splitContainer1.Panel2.Controls.Add(this.closeButton);
this.splitContainer1.Panel2.Controls.Add(this.deleteButton);
this.splitContainer1.Size = new System.Drawing.Size(1349, 481);
this.splitContainer1.SplitterDistance = 1214;
this.splitContainer1.TabIndex = 1;
//
// listViewEx1
//
this.listViewEx1.AllowColumnReorder = true;
this.listViewEx1.Dock = System.Windows.Forms.DockStyle.Fill;
this.listViewEx1.DoubleClickActivation = false;
this.listViewEx1.FullRowSelect = true;
this.listViewEx1.GridLines = true;
this.listViewEx1.Location = new System.Drawing.Point(0, 0);
this.listViewEx1.Name = "listViewEx1";
this.listViewEx1.Size = new System.Drawing.Size(1214, 481);
this.listViewEx1.TabIndex = 0;
this.listViewEx1.UseCompatibleStateImageBehavior = false;
this.listViewEx1.View = System.Windows.Forms.View.Details;
this.listViewEx1.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listViewEx1_ColumnClick);
this.listViewEx1.DoubleClick += new System.EventHandler(this.listViewEx1_DoubleClick);
//
// printButton
//
this.printButton.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.printButton.Location = new System.Drawing.Point(23, 290);
this.printButton.Name = "printButton";
this.printButton.Size = new System.Drawing.Size(85, 40);
this.printButton.TabIndex = 6;
this.printButton.Text = "Print";
this.printButton.UseVisualStyleBackColor = true;
this.printButton.Click += new System.EventHandler(this.printButton_Click);
//
// addButton
//
this.addButton.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.addButton.Location = new System.Drawing.Point(23, 88);
this.addButton.Name = "addButton";
this.addButton.Size = new System.Drawing.Size(85, 40);
this.addButton.TabIndex = 2;
this.addButton.Text = "Add";
this.addButton.UseVisualStyleBackColor = true;
this.addButton.Click += new System.EventHandler(this.addButton_Click);
//
// editButton
//
this.editButton.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.editButton.Location = new System.Drawing.Point(23, 133);
this.editButton.Name = "editButton";
this.editButton.Size = new System.Drawing.Size(85, 40);
this.editButton.TabIndex = 3;
this.editButton.Text = "Edit";
this.editButton.UseVisualStyleBackColor = true;
this.editButton.Click += new System.EventHandler(this.editButton_Click);
//
// closeButton
//
this.closeButton.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.closeButton.Location = new System.Drawing.Point(23, 21);
this.closeButton.Name = "closeButton";
this.closeButton.Size = new System.Drawing.Size(85, 40);
this.closeButton.TabIndex = 4;
this.closeButton.Text = "Close";
this.closeButton.UseVisualStyleBackColor = true;
this.closeButton.Click += new System.EventHandler(this.closeButton_Click);
//
// deleteButton
//
this.deleteButton.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.deleteButton.Location = new System.Drawing.Point(23, 223);
this.deleteButton.Name = "deleteButton";
this.deleteButton.Size = new System.Drawing.Size(85, 40);
this.deleteButton.TabIndex = 5;
this.deleteButton.Text = "Delete";
this.deleteButton.UseVisualStyleBackColor = true;
this.deleteButton.Click += new System.EventHandler(this.deleteButton_Click);
//
// copyButton
//
this.copyButton.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.copyButton.Location = new System.Drawing.Point(23, 178);
this.copyButton.Name = "copyButton";
this.copyButton.Size = new System.Drawing.Size(85, 40);
this.copyButton.TabIndex = 7;
this.copyButton.Text = "Copy";
this.copyButton.UseVisualStyleBackColor = true;
this.copyButton.Click += new System.EventHandler(this.copyButton_Click);
//
// OrderManagementDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoScroll = true;
this.ClientSize = new System.Drawing.Size(1349, 505);
this.Controls.Add(this.splitContainer1);
this.Controls.Add(this.menuStrip1);
this.MainMenuStrip = this.menuStrip1;
this.Name = "OrderManagementDlg";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Order Management";
this.Load += new System.EventHandler(this.OrderManagementDlg_Load);
this.menuStrip1.ResumeLayout(false);
this.menuStrip1.PerformLayout();
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
this.splitContainer1.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.MenuStrip menuStrip1;
private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem;
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.Button addButton;
private System.Windows.Forms.Button editButton;
private System.Windows.Forms.Button closeButton;
private System.Windows.Forms.Button deleteButton;
private Common.Forms.ListViewEx listViewEx1;
private System.Windows.Forms.Button printButton;
private System.Windows.Forms.Button copyButton;
}
}
+393
View File
@@ -0,0 +1,393 @@
///
/// Copyright (c) 2021 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using log4net;
using NHibernate;
using Common;
using SharedDatabase.Entities;
using OrderManagement.Resources;
using Common.Forms;
namespace OrderManagement
{
public partial class OrderManagementDlg : Form
{
private static readonly ILog log = LogManager.GetLogger(typeof(OrderManagementDlg));
public const int MaxPredefinedOrderNr = 1000;
ISession session;
IList<OrderInfo> listOfOrders;
IList<Process> listOfWorkflows;
MySortOrder sortOrder = MySortOrder.Ascending;
int sortColumn = -1; /// 0-based index of column to be used for sorting
public OrderManagementDlg()
{
try
{
string culture = Program.LocalSettings.Language.Replace('_', '-');
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(culture);
}
catch (Exception)
{
MessageBox.Show("Selected language is not supported.\nUsing English.",
"Warning", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
System.Threading.Thread.CurrentThread.CurrentUICulture =
new System.Globalization.CultureInfo("en");
}
InitializeComponent();
Text = string.Format("{0} v.{1}", Program.ProgramName, Program.Version); ;
}
public OrderManagementDlg(ISession session, IList<OrderInfo> listOfOrders, IList<Process> listOfWorkflows)
: this()
{
this.session = session;
this.listOfOrders = listOfOrders;
this.listOfWorkflows = listOfWorkflows;
}
private void OrderManagementDlg_Load(object sender, EventArgs e)
{
Localize();
InitializeColumns(listViewEx1);
if (Program.LocalSettings.IsShowPredefinedOrders)
{
foreach (var oi in listOfOrders) AddRow(listViewEx1, oi);
}
else
{
int orderNr;
foreach (var oi in listOfOrders)
{
if (int.TryParse(oi.POName, out orderNr) && orderNr > MaxPredefinedOrderNr)
{
AddRow(listViewEx1, oi);
}
}
}
}
void Localize()
{
settingsToolStripMenuItem.Text = Strings.Settings;
}
enum Clmn
{
Order,
State,
Workflow,
Procedure,
Variant,
VacoDescr,
MadeInText,
Year,
ModuleParam,
LaserMarking,
Packing,
Pieces,
SNPrefix,
SNFirst,
SNDigitsCount,
SNSuffix,
RAPrefix,
RAFirst,
RASuffix,
Remark,
Count
}
void InitializeColumns(ListView lv)
{
lv.Columns.Add(new ColumnHeader { Text = Strings.Order, Width = 65 });
lv.Columns.Add(new ColumnHeader { Text = Strings.State, Width = 65 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Workflow, Width = 100 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Test_procedure, Width = 200 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Variant_code, Width = 150 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Variant_description, Width = 100 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Made_in_text, Width = 100 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Year_of_calibration, Width = 50 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Module_parameter, Width = 100 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Laser_marking, Width = 100 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Packing, Width = 100 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Pieces_count, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.SN + " " + Strings.prefix, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.SN + " " + Strings.first, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.SN + " " + Strings.digits_count, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.SN + " " + Strings.suffix, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.RA + " " + Strings.prefix, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.RA + " " + Strings.first, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.RA + " " + Strings.suffix, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Remark, Width = 200 });
}
void AddRow(ListView lv, OrderInfo o)
{
ListViewItem lvi = new ListViewItem(o.POName);
lvi.SubItems.Add(((OrderState)o.POState).ToString());
lvi.SubItems.Add(o.Workflow);
lvi.SubItems.Add(o.TestProcedure);
lvi.SubItems.Add(o.VariantCode);
lvi.SubItems.Add(o.VacoDescription);
lvi.SubItems.Add(o.MadeInText);
lvi.SubItems.Add(o.Year.ToString());
lvi.SubItems.Add(o.ModuleParam);
lvi.SubItems.Add(o.LaserMarking);
lvi.SubItems.Add(o.Packing);
lvi.SubItems.Add(o.PiecesCount.ToString());
lvi.SubItems.Add(o.SNPrefix);
lvi.SubItems.Add(o.SNFirst.ToString(string.Format("D{0}", o.SNDigitsCount)));
lvi.SubItems.Add(o.SNDigitsCount.ToString());
lvi.SubItems.Add(o.SNSuffix);
lvi.SubItems.Add(o.RAPrefix);
lvi.SubItems.Add(o.RAFirst.ToString(SharedDatabase.Const.RAFormat));
lvi.SubItems.Add(o.RASuffix);
lvi.SubItems.Add(o.Remark);
lvi.Tag = o;
lv.Items.Add(lvi);
}
void UpdateRow(ListViewItem lvi, OrderInfo o)
{
int i = 0;
lvi.SubItems[i++].Text = o.POName;
lvi.SubItems[i++].Text = ((OrderState)o.POState).ToString();
lvi.SubItems[i++].Text = o.Workflow;
lvi.SubItems[i++].Text = o.TestProcedure;
lvi.SubItems[i++].Text = o.VariantCode;
lvi.SubItems[i++].Text = o.VacoDescription;
lvi.SubItems[i++].Text = o.MadeInText;
lvi.SubItems[i++].Text = o.Year.ToString();
lvi.SubItems[i++].Text = o.ModuleParam;
lvi.SubItems[i++].Text = o.LaserMarking;
lvi.SubItems[i++].Text = o.Packing;
lvi.SubItems[i++].Text = o.PiecesCount.ToString();
lvi.SubItems[i++].Text = o.SNPrefix;
lvi.SubItems[i++].Text = o.SNFirst.ToString(string.Format("D{0}", o.SNDigitsCount));
lvi.SubItems[i++].Text = o.SNDigitsCount.ToString();
lvi.SubItems[i++].Text = o.SNSuffix;
lvi.SubItems[i++].Text = o.RAPrefix;
lvi.SubItems[i++].Text = o.RAFirst.ToString(SharedDatabase.Const.RAFormat);
lvi.SubItems[i++].Text = o.RASuffix;
lvi.SubItems[i++].Text = o.Remark;
}
private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
Common.GlobalData.RemoteUsersDB = new Common.DBSettings(Common.DBType.MySql, Program.LocalSettings.UsersDBConnString);
DialogResult dr = new SharedDatabase.Forms.LoginDlg().ShowDialog();
if (dr != DialogResult.OK) return;
dr = new SettingsDlg(Program.LocalSettings).ShowDialog();
if (dr == DialogResult.OK)
{
Program.LocalSettings.Save();
MessageBox.Show(Strings.Program_restart_is_required);
Close();
}
}
catch (Exception exc)
{
log.ErrorFormat("Failed to connect to the database of users: {0}", exc.Message);
}
}
private void closeButton_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.OK;
Close();
}
private void addButton_Click(object sender, EventArgs e)
{
///
/// Determine the next production order name
///
string candidatePOName = string.Empty;
int candidatePONr;
foreach (var o in listOfOrders)
{
if (string.Compare(candidatePOName, o.POName, StringComparison.InvariantCulture) < 0) candidatePOName = o.POName;
}
if (int.TryParse(candidatePOName, out candidatePONr))
{
candidatePONr++;
candidatePOName = candidatePONr.ToString(string.Format("D{0}", candidatePOName.Length));
}
///
/// Create and edit the order
///
var order = new OrderInfo(candidatePOName);
if (new EditOrderDlg(session, order, listOfOrders, Program.LocalSettings.IsShowPredefinedOrders).ShowDialog()
== DialogResult.OK)
{
listOfOrders.Add(order);
AddRow(listViewEx1, order);
}
}
private void listViewEx1_DoubleClick(object sender, EventArgs e)
{
if (listViewEx1.SelectedItems.Count != 1 || !(listViewEx1.SelectedItems[0].Tag is OrderInfo)) return;
OrderInfo order = listViewEx1.SelectedItems[0].Tag as OrderInfo;
if (order.POState == (sbyte)OrderState.New)
{
editButton_Click(sender, e);
}
else
{
new OrderStateDlg(session, order).ShowDialog();
}
}
private void editButton_Click(object sender, EventArgs e)
{
if (listViewEx1.SelectedItems.Count != 1 || !(listViewEx1.SelectedItems[0].Tag is OrderInfo)) return;
OrderInfo order = listViewEx1.SelectedItems[0].Tag as OrderInfo;
if (order.POState == (sbyte)OrderState.New)
{
if (new EditOrderDlg(session, order, listOfOrders, Program.LocalSettings.IsShowPredefinedOrders, true).ShowDialog()
== DialogResult.OK)
{
UpdateRow(listViewEx1.SelectedItems[0], order);
}
}
else
{
MessageBox.Show(Strings.You_can_only_edit_New_porduction_orders);
}
}
private void copyButton_Click(object sender, EventArgs e)
{
if (listViewEx1.SelectedItems.Count != 1 || !(listViewEx1.SelectedItems[0].Tag is OrderInfo)) return;
OrderInfo oriOrder = listViewEx1.SelectedItems[0].Tag as OrderInfo;
///
/// Determine the next production order name
///
string candidatePOName = string.Empty;
int candidatePONr;
foreach (var o in listOfOrders)
{
if (string.Compare(candidatePOName, o.POName, StringComparison.InvariantCulture) < 0) candidatePOName = o.POName;
}
if (int.TryParse(candidatePOName, out candidatePONr))
{
candidatePONr++;
candidatePOName = candidatePONr.ToString(string.Format("D{0}", candidatePOName.Length));
}
///
/// Create and edit the order
///
OrderInfo newOrder = oriOrder.Clone() as OrderInfo;
newOrder.POName = candidatePOName;
newOrder.POState = (sbyte)OrderState.New;
newOrder.SNFirst = oriOrder.SNFirst + oriOrder.PiecesCount; /// TODO
newOrder.RAFirst = oriOrder.RAFirst + oriOrder.PiecesCount; /// TODO
newOrder.BaseNr1 = 0;
newOrder.BaseNr2 = 0;
newOrder.BaseNr3 = 0;
newOrder.BaseNr4 = 0;
newOrder.BaseNr5 = 0;
newOrder.CurrentPcsCount = 0;
newOrder.CurrentSN = 0;
newOrder.CurrentRA = 0;
newOrder.CurrentNr1 = 0;
newOrder.CurrentNr2 = 0;
newOrder.CurrentNr3 = 0;
newOrder.CurrentNr4 = 0;
newOrder.CurrentNr5 = 0;
newOrder.Remark = string.Format("Copy of order {0}", oriOrder.POName);
if (new EditOrderDlg(session, newOrder, listOfOrders, Program.LocalSettings.IsShowPredefinedOrders).ShowDialog()
== DialogResult.OK)
{
listOfOrders.Add(newOrder);
AddRow(listViewEx1, newOrder);
}
}
private void deleteButton_Click(object sender, EventArgs e)
{
if (listViewEx1.SelectedItems.Count != 1 || !(listViewEx1.SelectedItems[0].Tag is OrderInfo)) return;
OrderInfo order = listViewEx1.SelectedItems[0].Tag as OrderInfo;
if (order.POState == (sbyte)OrderState.New)
{
if (MessageBox.Show(Strings.Are_you_sure, Strings.Warning, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes)
{
try
{
session.Delete(order);
session.Flush();
listOfOrders.Remove(order);
listViewEx1.Items.Remove(listViewEx1.SelectedItems[0]);
}
catch (Exception exc)
{
MessageBox.Show(string.Format("Deleting an order failed\r\n{0}", exc.Message));
}
}
}
else
{
MessageBox.Show(Strings.You_can_only_delete_New_porduction_orders);
}
}
private void listViewEx1_ColumnClick(object sender, ColumnClickEventArgs e)
{
if (e.Column == sortColumn)
{
/// Clicked on the same column header => increment to the next applicable MySortOrder
sortOrder = (sortOrder == MySortOrder.Ascending) ? MySortOrder.Descending : MySortOrder.Ascending;
}
else
{
/// Clicked on another column header => set sortOrder to MySortOrder.Ascending
sortColumn = e.Column;
sortOrder = MySortOrder.Ascending;
}
if (sortColumn == (int)Clmn.Pieces || sortColumn == (int)Clmn.SNFirst ||
sortColumn == (int)Clmn.SNDigitsCount || sortColumn == (int)Clmn.RAFirst)
{
listViewEx1.ListViewItemSorter = new LviIntColumnComparer(sortColumn, sortOrder);
}
else
{
listViewEx1.ListViewItemSorter = new LviTextColumnComparer(sortColumn, sortOrder);
}
listViewEx1.SetSortIcon(sortColumn, sortOrder);
listViewEx1.Sort();
}
private void printButton_Click(object sender, EventArgs e)
{
if (listViewEx1.SelectedItems.Count != 1 || !(listViewEx1.SelectedItems[0].Tag is OrderInfo)) return;
OrderInfo order = listViewEx1.SelectedItems[0].Tag as OrderInfo;
new OrderPrintDocument(order).Print();
}
}
}
+123
View File
@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>
+165
View File
@@ -0,0 +1,165 @@
///
/// Copyright (c) 2021 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Printing;
using System.IO;
using Common;
using GenCode128;
using Gma.QrCodeNet.Encoding;
using SharedDatabase.Entities;
using OrderManagement.Resources;
namespace OrderManagement
{
public class OrderPrintDocument : Common.Printers.PrintersCommon
{
static QrEncoder encoder = new QrEncoder();
// Paper size
const bool IsLandscape = false;
const int PaperHeight = 1400;
const int PaperWidth = 900;
/// Texts
readonly Font font = new Font("Arial", 12, FontStyle.Bold);
const int Top = 100;
const int Column1left = 100;
const int Column2left = 300;
const int Spacing = 35;
/// Barcode
const bool IsQRCode = false;
const int BarcodeLeft = 550;
const int BarcodeTop = 100;
const int BarcodeWidth = 200;
const int BarcodeHeight = 75;
/// Data to print
OrderInfo order;
/// <summary>
/// Constructor
/// </summary>
/// <param name="textToPrint">Text to be printed</param>
public OrderPrintDocument(OrderInfo order)
{
DocumentName = order.POName;
this.order = order;
/// Set print area size and margins (in dots using 100 dpi)
DefaultPageSettings.Landscape = IsLandscape;
}
/// <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);
}
/// <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);
string[] texts = new string[]
{
Strings.Order + " :",
order.POName,
Strings.Pieces_count + " :",
order.PiecesCount.ToString(),
Strings.First_serial_number + " :",
string.Format("{0}{1}{2}", (order.SNPrefix != null) ? order.SNPrefix : string.Empty,
order.SNDigitsCount != 0 ? order.SNFirst.ToString(string.Format("D{0}", order.SNDigitsCount)) : string.Empty,
(order.SNSuffix != null) ? order.SNSuffix : string.Empty),
Strings.Last_serial_number + " :",
string.Format("{0}{1}{2}", (order.SNPrefix != null) ? order.SNPrefix : string.Empty,
order.SNDigitsCount != 0 ? (order.SNFirst + order.PiecesCount - 1).ToString(string.Format("D{0}", order.SNDigitsCount)) : string.Empty,
(order.SNSuffix != null) ? order.SNSuffix : string.Empty),
Strings.First_radio_address + " :",
string.Format("{0}{1}{2}", (order.RAPrefix != null) ? order.RAPrefix : string.Empty,
order.RAFirst.ToString(SharedDatabase.Const.RAFormat),
(order.RASuffix != null) ? order.RASuffix : string.Empty),
Strings.Last_radio_address + " :",
string.Format("{0}{1}{2}", (order.RAPrefix != null) ? order.RAPrefix : string.Empty,
(order.RAFirst + order.PiecesCount - 1).ToString(SharedDatabase.Const.RAFormat),
(order.RASuffix != null) ? order.RASuffix : string.Empty),
Strings.Workflow + " :",
(order.Workflow != null) ? order.Workflow : string.Empty,
Strings.Test_procedure + " :",
(order.TestProcedure != null) ? order.TestProcedure : string.Empty,
Strings.Variant_code + " :",
(order.VariantCode != null) ? order.VariantCode : string.Empty,
Strings.Laser_marking + " :",
(order.LaserMarking != null) ? order.LaserMarking : string.Empty,
Strings.Remark + " :",
(order.Remark != null) ? order.Remark : string.Empty,
};
int lineTop = Top;
for (int i = 0; i < texts.Length; i += 2)
{
e.Graphics.DrawString(texts[i], font, Brushes.Black, new RectangleF(Column1left, lineTop, PaperWidth, PaperHeight));
e.Graphics.DrawString(texts[i + 1], font, Brushes.Black, new RectangleF(Column2left, lineTop, PaperWidth, PaperHeight));
lineTop += Spacing;
}
try
{
if (IsQRCode)
{
QrCode qrCode = encoder.Encode(order.POName);
DrawQR(e.Graphics, qrCode, BarcodeLeft, BarcodeTop, BarcodeWidth, BarcodeHeight);
}
else
{
Image img = Code128Rendering.MakeBarcodeImage(order.POName, 1, true);
#if VERTICAL_BARCODE
img.RotateFlip(RotateFlipType.Rotate90FlipNone);
#endif
e.Graphics.DrawImage(img, BarcodeLeft, BarcodeTop, BarcodeWidth, BarcodeHeight);
}
}
catch (Exception)
{
}
}
public static void DrawQR(Graphics g, QrCode qrCode, float left, float top, float width, float height)
{
/// Assuming 100 dpi (printer)
g.SmoothingMode = SmoothingMode.AntiAlias;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
float qrPixWidth = width / qrCode.Matrix.Width;
float qrPixHeight = height / qrCode.Matrix.Height;
for (int i = 0; i < qrCode.Matrix.Height; i++)
{
for (int j = 0; j < qrCode.Matrix.Width; j++)
{
if (qrCode.Matrix[j, i])
{
g.FillRectangle(Brushes.Black, new RectangleF(left + j * qrPixWidth,
top + i * qrPixHeight,
qrPixWidth,
qrPixHeight));
}
}
}
}
}
}
+190
View File
@@ -0,0 +1,190 @@
namespace OrderManagement
{
partial class OrderStateDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.orderLabel = new System.Windows.Forms.Label();
this.orderTextBox = new System.Windows.Forms.TextBox();
this.stateLabel = new System.Windows.Forms.Label();
this.stateTextBox = new System.Windows.Forms.TextBox();
this.targetPcsCountLabel = new System.Windows.Forms.Label();
this.producedPcsCountLabel = new System.Windows.Forms.Label();
this.targetPcsCountTextBox = new System.Windows.Forms.TextBox();
this.producedPcsCountTextBox = new System.Windows.Forms.TextBox();
this.currentSnTextBox = new System.Windows.Forms.TextBox();
this.currentSnLabel = new System.Windows.Forms.Label();
this.currentRATextBox = new System.Windows.Forms.TextBox();
this.currentRALabel = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// orderLabel
//
this.orderLabel.AutoSize = true;
this.orderLabel.Location = new System.Drawing.Point(28, 26);
this.orderLabel.Name = "orderLabel";
this.orderLabel.Size = new System.Drawing.Size(33, 13);
this.orderLabel.TabIndex = 0;
this.orderLabel.Text = "Order";
//
// orderTextBox
//
this.orderTextBox.Enabled = false;
this.orderTextBox.Location = new System.Drawing.Point(191, 23);
this.orderTextBox.Name = "orderTextBox";
this.orderTextBox.Size = new System.Drawing.Size(131, 20);
this.orderTextBox.TabIndex = 1;
//
// stateLabel
//
this.stateLabel.AutoSize = true;
this.stateLabel.Location = new System.Drawing.Point(28, 56);
this.stateLabel.Name = "stateLabel";
this.stateLabel.Size = new System.Drawing.Size(32, 13);
this.stateLabel.TabIndex = 2;
this.stateLabel.Text = "State";
//
// stateTextBox
//
this.stateTextBox.Enabled = false;
this.stateTextBox.Location = new System.Drawing.Point(191, 53);
this.stateTextBox.Name = "stateTextBox";
this.stateTextBox.Size = new System.Drawing.Size(131, 20);
this.stateTextBox.TabIndex = 3;
//
// targetPcsCountLabel
//
this.targetPcsCountLabel.AutoSize = true;
this.targetPcsCountLabel.Location = new System.Drawing.Point(28, 86);
this.targetPcsCountLabel.Name = "targetPcsCountLabel";
this.targetPcsCountLabel.Size = new System.Drawing.Size(78, 13);
this.targetPcsCountLabel.TabIndex = 4;
this.targetPcsCountLabel.Text = "Target quantity";
//
// producedPcsCountLabel
//
this.producedPcsCountLabel.AutoSize = true;
this.producedPcsCountLabel.Location = new System.Drawing.Point(28, 116);
this.producedPcsCountLabel.Name = "producedPcsCountLabel";
this.producedPcsCountLabel.Size = new System.Drawing.Size(93, 13);
this.producedPcsCountLabel.TabIndex = 5;
this.producedPcsCountLabel.Text = "Produced quantity";
//
// targetPcsCountTextBox
//
this.targetPcsCountTextBox.Enabled = false;
this.targetPcsCountTextBox.Location = new System.Drawing.Point(191, 83);
this.targetPcsCountTextBox.Name = "targetPcsCountTextBox";
this.targetPcsCountTextBox.Size = new System.Drawing.Size(131, 20);
this.targetPcsCountTextBox.TabIndex = 6;
//
// producedPcsCountTextBox
//
this.producedPcsCountTextBox.Enabled = false;
this.producedPcsCountTextBox.Location = new System.Drawing.Point(191, 113);
this.producedPcsCountTextBox.Name = "producedPcsCountTextBox";
this.producedPcsCountTextBox.Size = new System.Drawing.Size(131, 20);
this.producedPcsCountTextBox.TabIndex = 7;
//
// currentSnTextBox
//
this.currentSnTextBox.Enabled = false;
this.currentSnTextBox.Location = new System.Drawing.Point(191, 143);
this.currentSnTextBox.Name = "currentSnTextBox";
this.currentSnTextBox.Size = new System.Drawing.Size(131, 20);
this.currentSnTextBox.TabIndex = 9;
//
// currentSnLabel
//
this.currentSnLabel.AutoSize = true;
this.currentSnLabel.Location = new System.Drawing.Point(28, 146);
this.currentSnLabel.Name = "currentSnLabel";
this.currentSnLabel.Size = new System.Drawing.Size(95, 13);
this.currentSnLabel.TabIndex = 8;
this.currentSnLabel.Text = "Last assigned S/N";
//
// currentRATextBox
//
this.currentRATextBox.Enabled = false;
this.currentRATextBox.Location = new System.Drawing.Point(191, 173);
this.currentRATextBox.Name = "currentRATextBox";
this.currentRATextBox.Size = new System.Drawing.Size(131, 20);
this.currentRATextBox.TabIndex = 11;
//
// currentRALabel
//
this.currentRALabel.AutoSize = true;
this.currentRALabel.Location = new System.Drawing.Point(28, 176);
this.currentRALabel.Name = "currentRALabel";
this.currentRALabel.Size = new System.Drawing.Size(138, 13);
this.currentRALabel.TabIndex = 10;
this.currentRALabel.Text = "Last assigned radio address";
//
// OrderStateDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(479, 219);
this.Controls.Add(this.currentRATextBox);
this.Controls.Add(this.currentRALabel);
this.Controls.Add(this.currentSnTextBox);
this.Controls.Add(this.currentSnLabel);
this.Controls.Add(this.producedPcsCountTextBox);
this.Controls.Add(this.targetPcsCountTextBox);
this.Controls.Add(this.producedPcsCountLabel);
this.Controls.Add(this.targetPcsCountLabel);
this.Controls.Add(this.stateTextBox);
this.Controls.Add(this.stateLabel);
this.Controls.Add(this.orderTextBox);
this.Controls.Add(this.orderLabel);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.Name = "OrderStateDlg";
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Order state";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label orderLabel;
private System.Windows.Forms.TextBox orderTextBox;
private System.Windows.Forms.Label stateLabel;
private System.Windows.Forms.TextBox stateTextBox;
private System.Windows.Forms.Label targetPcsCountLabel;
private System.Windows.Forms.Label producedPcsCountLabel;
private System.Windows.Forms.TextBox targetPcsCountTextBox;
private System.Windows.Forms.TextBox producedPcsCountTextBox;
private System.Windows.Forms.TextBox currentSnTextBox;
private System.Windows.Forms.Label currentSnLabel;
private System.Windows.Forms.TextBox currentRATextBox;
private System.Windows.Forms.Label currentRALabel;
}
}
+45
View File
@@ -0,0 +1,45 @@
///
/// Copyright (c) 2021 Sensus Slovensko a.s.
///
using System;
using System.Windows.Forms;
using NHibernate;
using SharedDatabase.Entities;
using OrderManagement.Resources;
namespace OrderManagement
{
public partial class OrderStateDlg : Form
{
ISession session;
OrderInfo order;
public OrderStateDlg()
{
InitializeComponent();
}
public OrderStateDlg(ISession session,OrderInfo order)
: this()
{
this.session = session;
this.order = order;
Localize();
orderTextBox.Text = order.POName;
stateTextBox.Text = ((OrderState)order.POState).ToString();
targetPcsCountTextBox.Text = order.PiecesCount.ToString();
producedPcsCountTextBox.Text = order.CurrentPcsCount.ToString();
currentSnTextBox.Text = (order.SNPrefix != null ? order.SNPrefix : string.Empty) + order.CurrentSN.ToString(string.Format("D{0}", order.SNDigitsCount))
+ (order.SNSuffix != null ? order.SNSuffix : string.Empty);
currentRATextBox.Text = (order.RAPrefix != null ? order.RAPrefix : string.Empty) + order.CurrentRA.ToString(SharedDatabase.Const.RAFormat)
+ (order.RASuffix != null ? order.RASuffix : string.Empty);
}
void Localize()
{
orderLabel.Text = Strings.Order;
stateLabel.Text = Strings.State;
}
}
}
+120
View File
@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
+256
View File
@@ -0,0 +1,256 @@
///
/// Copyright (c) 2021 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using log4net;
using NHibernate;
using Common;
using SharedDatabase;
using SharedDatabase.Entities;
using OrderManagement.Resources;
namespace OrderManagement
{
static class Program
{
/// Constants
public static GID[] SettingsAccessLevel = new GID[] { GID.TraceabilityManagement }; /// Group membership to access settings
public const string ProgramName = "Order Management";
public const string ConfigFName = "config.xml";
public const string BackupConfigFName = "config.backup.xml";
public const string Log4NetConfigFName = "log4netConfig.xml";
/// Program information
public static readonly string Version; /// version string
public static readonly DateTime BuildDateTime; /// date and time of program build
public static readonly string ExeDirectory;
public static readonly string ConfigDirectory;
public static readonly string LogDirectory;
public static readonly string LocalSettingsFileName;
public static readonly string LocalSettingsBackupName;
/// Local settings
public static LocalSettings LocalSettings;
/// log4net
static ILog log;
static Program()
{
/// Program version string
Assembly thisAssembly = Assembly.GetExecutingAssembly();
Version ver = thisAssembly.GetName().Version;
Version = string.Format("{0}.{1}.{2}", ver.Major, ver.Minor, ver.Build);
BuildDateTime = new FileInfo(thisAssembly.Location).LastWriteTime;
/// Local program configuration directory including the trailing backslash
ExeDirectory = Path.GetDirectoryName(thisAssembly.Location);
ConfigDirectory = Path.Combine(ExeDirectory, "..\\Cfg");
LogDirectory = Path.Combine(ExeDirectory, "..", "Logs");
LocalSettingsFileName = Path.Combine(ConfigDirectory, ConfigFName);
LocalSettingsBackupName = Path.Combine(ConfigDirectory, BackupConfigFName);
}
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
///
/// Check if another instance is running
///
Assembly thisAssembly = Assembly.GetExecutingAssembly();
string processName = Path.GetFileNameWithoutExtension(thisAssembly.Location);
if (System.Diagnostics.Process.GetProcessesByName(processName).Length > 1)
{
MessageBox.Show(string.Format("{0}{1}{2}", string.Format(Strings.Program_0_is_running_already, ProgramName),
Environment.NewLine,
Strings.Close_it_please),
Strings.Error,
MessageBoxButtons.OK,
MessageBoxIcon.Asterisk);
return;
}
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
bool configDirectoryCreated = false;
if (!Directory.Exists(ConfigDirectory) || new DirectoryInfo(ConfigDirectory).GetFileSystemInfos().Length == 0)
{
MessageBox.Show(string.Format("{0}{1}{2}", Strings.Program_is_running_for_the_1st_time_on_this_PC,
Environment.NewLine,
Strings.Default_settings_are_used),
Strings.Warning,
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
///
/// Create a new config subdirectory
///
Directory.CreateDirectory(ConfigDirectory);
configDirectoryCreated = true;
Program.LocalSettings = new LocalSettings(true);
Program.LocalSettings.Save();
if (File.Exists(Path.Combine(ExeDirectory, "SampleConfig", Log4NetConfigFName)))
{
File.Copy(Path.Combine(ExeDirectory, "SampleConfig", Log4NetConfigFName),
Path.Combine(ConfigDirectory, Log4NetConfigFName));
}
File.SetAttributes(Path.Combine(ConfigDirectory, Log4NetConfigFName), FileAttributes.Normal);
}
///
/// Configue and start logging
///
log4net.Config.XmlConfigurator.Configure(new FileInfo(Path.Combine(ConfigDirectory, Log4NetConfigFName)));
log = LogManager.GetLogger(typeof(Program));
log.Fatal("--------------------------------------------------------------------------------");
log.FatalFormat("{0} ver.{1}", ProgramName, Version);
log.FatalFormat("Executable directory is {0}", ExeDirectory);
if (configDirectoryCreated)
{
log.Fatal("A new config directory and configuration files created !");
}
///
/// Load the local settings
///
LocalSettings = LocalSettings.Load(Program.LocalSettingsFileName);
if (LocalSettings == null)
{
/// Loading local seetings from regular config file failed. Use the backup
LocalSettings = LocalSettings.Load(Program.LocalSettingsBackupName);
if (LocalSettings == null)
{
log.FatalFormat("Local settings: Could not load file {0}, nor {1}.", ConfigFName, BackupConfigFName);
log.Fatal("Application terminated.");
MessageBox.Show(string.Format("Could not load file {0}, nor {1}.", ConfigFName, BackupConfigFName), "Fatal error");
return; /// Fatal error
}
else
{
LocalSettings.Save(); /// Save the settings to overwrite the wrong file
log.FatalFormat("Local settings: Could not load file {0}, successfully loaded {1}", ConfigFName, BackupConfigFName);
}
}
else
{
/// Loading local seetings from the regular config file was successful. Update the backup
File.Copy(Program.LocalSettingsFileName, Program.LocalSettingsBackupName, true);
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
///
/// User login
///
if (LocalSettings.IsUserLoginRequired && !string.IsNullOrEmpty(LocalSettings.UsersDBConnString))
{
try
{
Common.GlobalData.RemoteUsersDB = new DBSettings(Common.DBType.MySql, LocalSettings.UsersDBConnString);
DialogResult dr = new SharedDatabase.Forms.LoginDlg().ShowDialog();
if (dr != DialogResult.OK) return;
}
catch (Exception exc)
{
log.ErrorFormat("Failed to connect to the database of users: {0}", exc.Message);
}
}
ISession session;
IList<OrderInfo> listOfOrders = null;
IList<Process> listOfWorkflows = null;
while (true)
{
try
{
session = SharedDatabase.TracingDB.CreateSession(LocalSettings.TracingDBConnString);
listOfOrders = session.QueryOver<OrderInfo>()
.List();
listOfWorkflows = session.QueryOver<Process>()
.Where(x => x.ReleaseStatus != ReleaseStatus.Deactivated)
.List();
break;
}
catch (Exception exc)
{
log.FatalFormat("Failed to connect to production tracing database: {0}", exc.Message);
if (exc.InnerException != null)
{
log.FatalFormat("InnerException: {0}", exc.InnerException.Message);
}
MessageBox.Show(string.Format("Failed to connect to production tracing database:{0}{1}", Environment.NewLine, exc.Message));
if (new SettingsDlg(Program.LocalSettings).ShowDialog() == DialogResult.OK)
{
LocalSettings.Save();
}
else
{
return;
}
}
}
try
{
OrderManagementDlg dlg = new OrderManagementDlg(session, listOfOrders, listOfWorkflows);
Application.Run(dlg);
}
catch (Exception e)
{
LogException(log, "Exception in Application.Run(MainWnd)", e);
MessageBox.Show("Program crashed:" +
Environment.NewLine + Environment.NewLine + e.Message +
((e.InnerException == null) ? string.Empty : (Environment.NewLine + e.InnerException.Message)) +
Environment.NewLine + e.StackTrace,
"Fatal error",
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
}
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
{
Exception e = args.ExceptionObject as Exception;
if (e == null) return;
LogException(log, "Unhandled exception", e);
MessageBox.Show("Program crashed:" +
Environment.NewLine + Environment.NewLine + e.Message +
((e.InnerException == null) ? string.Empty : (Environment.NewLine + e.InnerException.Message)) +
Environment.NewLine + e.StackTrace,
"Fatal error",
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
static void LogException(ILog log, string description, Exception e)
{
log.FatalFormat("---------------( {0} )---------------", description);
log.FatalFormat("Message : {0}", e.Message);
if (e.InnerException != null)
{
log.FatalFormat("InnerMessage : {0}", e.InnerException.Message);
}
log.FatalFormat("StackTrace : {0}{1}", Environment.NewLine, e.StackTrace);
log.Fatal("--------------------------------------");
}
}
}
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("OrderManagement")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("OrderManagement")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("f6b32e4f-1445-4970-bafa-dcd39d36f9b3")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// 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("3.0.11.0")]
[assembly: AssemblyFileVersion("3.0.11.0")]
+71
View File
@@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace OrderManagement.Properties
{
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OrderManagement.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}
+117
View File
@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
+30
View File
@@ -0,0 +1,30 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace OrderManagement.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}
@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
+540
View File
@@ -0,0 +1,540 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace OrderManagement.Resources {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Strings {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Strings() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OrderManagement.Resources.Strings", typeof(Strings).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to Abort creating an order?.
/// </summary>
internal static string Abort_creating_an_order_QM {
get {
return ResourceManager.GetString("Abort_creating_an_order_QM", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Are you sure ?.
/// </summary>
internal static string Are_you_sure {
get {
return ResourceManager.GetString("Are_you_sure", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Cancel.
/// </summary>
internal static string Cancel {
get {
return ResourceManager.GetString("Cancel", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Close it please using &apos;Task manager&apos;.
/// </summary>
internal static string Close_it_please {
get {
return ResourceManager.GetString("Close_it_please", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Connection string for production tracing database.
/// </summary>
internal static string Connection_string_tracing_DB {
get {
return ResourceManager.GetString("Connection_string_tracing_DB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Connection string for database of users.
/// </summary>
internal static string Connection_string_users_DB {
get {
return ResourceManager.GetString("Connection_string_users_DB", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Database.
/// </summary>
internal static string Database {
get {
return ResourceManager.GetString("Database", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Default settings are used..
/// </summary>
internal static string Default_settings_are_used {
get {
return ResourceManager.GetString("Default_settings_are_used", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to digits count.
/// </summary>
internal static string digits_count {
get {
return ResourceManager.GetString("digits_count", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Error.
/// </summary>
internal static string Error {
get {
return ResourceManager.GetString("Error", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to first.
/// </summary>
internal static string first {
get {
return ResourceManager.GetString("first", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to First radio address.
/// </summary>
internal static string First_radio_address {
get {
return ResourceManager.GetString("First_radio_address", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to First serial number.
/// </summary>
internal static string First_serial_number {
get {
return ResourceManager.GetString("First_serial_number", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Invalid &apos;{0}&apos;.
/// </summary>
internal static string Invalid_0 {
get {
return ResourceManager.GetString("Invalid_0", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to It is not recommended that orders start with &apos;3&apos;..
/// </summary>
internal static string It_is_not_recommended_that_orders_start_with_3 {
get {
return ResourceManager.GetString("It_is_not_recommended_that_orders_start_with_3", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Language, 语言, Sprache, jazyk.
/// </summary>
internal static string Language_etc {
get {
return ResourceManager.GetString("Language_etc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Laser marking.
/// </summary>
internal static string Laser_marking {
get {
return ResourceManager.GetString("Laser_marking", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Last radio address.
/// </summary>
internal static string Last_radio_address {
get {
return ResourceManager.GetString("Last_radio_address", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Last serial number.
/// </summary>
internal static string Last_serial_number {
get {
return ResourceManager.GetString("Last_serial_number", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Made in text.
/// </summary>
internal static string Made_in_text {
get {
return ResourceManager.GetString("Made_in_text", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Module parameter.
/// </summary>
internal static string Module_parameter {
get {
return ResourceManager.GetString("Module_parameter", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to OK.
/// </summary>
internal static string OK {
get {
return ResourceManager.GetString("OK", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Order.
/// </summary>
internal static string Order {
get {
return ResourceManager.GetString("Order", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Order number must be larger then {0}.
/// </summary>
internal static string Order_number_must_be_larger_then_0 {
get {
return ResourceManager.GetString("Order_number_must_be_larger_then_0", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Order with the same ID already exists.
/// </summary>
internal static string Order_with_the_same_ID_already_exists {
get {
return ResourceManager.GetString("Order_with_the_same_ID_already_exists", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Packing.
/// </summary>
internal static string Packing {
get {
return ResourceManager.GetString("Packing", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Parameter.
/// </summary>
internal static string Parameter {
get {
return ResourceManager.GetString("Parameter", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Pieces count.
/// </summary>
internal static string Pieces_count {
get {
return ResourceManager.GetString("Pieces_count", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to prefix.
/// </summary>
internal static string prefix {
get {
return ResourceManager.GetString("prefix", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Producton order properties.
/// </summary>
internal static string Producton_order_properties {
get {
return ResourceManager.GetString("Producton_order_properties", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Program &apos;{0}&apos; is running already..
/// </summary>
internal static string Program_0_is_running_already {
get {
return ResourceManager.GetString("Program_0_is_running_already", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Program is running for the 1st time on this PC..
/// </summary>
internal static string Program_is_running_for_the_1st_time_on_this_PC {
get {
return ResourceManager.GetString("Program_is_running_for_the_1st_time_on_this_PC", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Program restart is required.
/// </summary>
internal static string Program_restart_is_required {
get {
return ResourceManager.GetString("Program_restart_is_required", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to R.A..
/// </summary>
internal static string RA {
get {
return ResourceManager.GetString("RA", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Remark.
/// </summary>
internal static string Remark {
get {
return ResourceManager.GetString("Remark", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Save.
/// </summary>
internal static string Save {
get {
return ResourceManager.GetString("Save", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Saving an order failed.
/// </summary>
internal static string Saving_order_failed {
get {
return ResourceManager.GetString("Saving_order_failed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Settings.
/// </summary>
internal static string Settings {
get {
return ResourceManager.GetString("Settings", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Show predefined orders.
/// </summary>
internal static string Show_predefined_orders {
get {
return ResourceManager.GetString("Show_predefined_orders", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to S/N.
/// </summary>
internal static string SN {
get {
return ResourceManager.GetString("SN", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to State.
/// </summary>
internal static string State {
get {
return ResourceManager.GetString("State", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to suffix.
/// </summary>
internal static string suffix {
get {
return ResourceManager.GetString("suffix", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Test procedure.
/// </summary>
internal static string Test_procedure {
get {
return ResourceManager.GetString("Test_procedure", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to There is a conflict..
/// </summary>
internal static string There_is_a_conflict {
get {
return ResourceManager.GetString("There_is_a_conflict", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to User login is required.
/// </summary>
internal static string User_login_is_required {
get {
return ResourceManager.GetString("User_login_is_required", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Value.
/// </summary>
internal static string Value {
get {
return ResourceManager.GetString("Value", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Variant code.
/// </summary>
internal static string Variant_code {
get {
return ResourceManager.GetString("Variant_code", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Variant description.
/// </summary>
internal static string Variant_description {
get {
return ResourceManager.GetString("Variant_description", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Warning.
/// </summary>
internal static string Warning {
get {
return ResourceManager.GetString("Warning", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Workflow.
/// </summary>
internal static string Workflow {
get {
return ResourceManager.GetString("Workflow", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Year of calibration.
/// </summary>
internal static string Year_of_calibration {
get {
return ResourceManager.GetString("Year_of_calibration", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to You can only delete &apos;New&apos; porduction orders.
/// </summary>
internal static string You_can_only_delete_New_porduction_orders {
get {
return ResourceManager.GetString("You_can_only_delete_New_porduction_orders", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to You can only edit &apos;New&apos; porduction orders.
/// </summary>
internal static string You_can_only_edit_New_porduction_orders {
get {
return ResourceManager.GetString("You_can_only_edit_New_porduction_orders", resourceCulture);
}
}
}
}
+279
View File
@@ -0,0 +1,279 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Are_you_sure" xml:space="preserve">
<value>Are you sure ?</value>
</data>
<data name="Cancel" xml:space="preserve">
<value>Cancel</value>
</data>
<data name="Close_it_please" xml:space="preserve">
<value>Close it please using 'Task manager'</value>
</data>
<data name="Connection_string_tracing_DB" xml:space="preserve">
<value>Connection string for production tracing database</value>
</data>
<data name="Connection_string_users_DB" xml:space="preserve">
<value>Connection string for database of users</value>
</data>
<data name="Database" xml:space="preserve">
<value>Database</value>
</data>
<data name="Default_settings_are_used" xml:space="preserve">
<value>Default settings are used.</value>
</data>
<data name="Error" xml:space="preserve">
<value>Error</value>
</data>
<data name="first" xml:space="preserve">
<value>first</value>
</data>
<data name="Invalid_0" xml:space="preserve">
<value>Invalid '{0}'</value>
</data>
<data name="Language_etc" xml:space="preserve">
<value>Language, 语言, Sprache, jazyk</value>
</data>
<data name="Order" xml:space="preserve">
<value>Order</value>
</data>
<data name="State" xml:space="preserve">
<value>State</value>
</data>
<data name="Pieces_count" xml:space="preserve">
<value>Pieces count</value>
</data>
<data name="prefix" xml:space="preserve">
<value>prefix</value>
</data>
<data name="Program_0_is_running_already" xml:space="preserve">
<value>Program '{0}' is running already.</value>
</data>
<data name="Program_is_running_for_the_1st_time_on_this_PC" xml:space="preserve">
<value>Program is running for the 1st time on this PC.</value>
</data>
<data name="Program_restart_is_required" xml:space="preserve">
<value>Program restart is required</value>
</data>
<data name="Remark" xml:space="preserve">
<value>Remark</value>
</data>
<data name="Save" xml:space="preserve">
<value>Save</value>
</data>
<data name="Settings" xml:space="preserve">
<value>Settings</value>
</data>
<data name="digits_count" xml:space="preserve">
<value>digits count</value>
</data>
<data name="suffix" xml:space="preserve">
<value>suffix</value>
</data>
<data name="Test_procedure" xml:space="preserve">
<value>Test procedure</value>
</data>
<data name="User_login_is_required" xml:space="preserve">
<value>User login is required</value>
</data>
<data name="Variant_code" xml:space="preserve">
<value>Variant code</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Warning</value>
</data>
<data name="Workflow" xml:space="preserve">
<value>Workflow</value>
</data>
<data name="OK" xml:space="preserve">
<value>OK</value>
</data>
<data name="Parameter" xml:space="preserve">
<value>Parameter</value>
</data>
<data name="Value" xml:space="preserve">
<value>Value</value>
</data>
<data name="Saving_order_failed" xml:space="preserve">
<value>Saving an order failed</value>
</data>
<data name="Order_with_the_same_ID_already_exists" xml:space="preserve">
<value>Order with the same ID already exists</value>
</data>
<data name="RA" xml:space="preserve">
<value>R.A.</value>
</data>
<data name="SN" xml:space="preserve">
<value>S/N</value>
</data>
<data name="You_can_only_edit_New_porduction_orders" xml:space="preserve">
<value>You can only edit 'New' porduction orders</value>
</data>
<data name="You_can_only_delete_New_porduction_orders" xml:space="preserve">
<value>You can only delete 'New' porduction orders</value>
</data>
<data name="Laser_marking" xml:space="preserve">
<value>Laser marking</value>
</data>
<data name="First_radio_address" xml:space="preserve">
<value>First radio address</value>
</data>
<data name="First_serial_number" xml:space="preserve">
<value>First serial number</value>
</data>
<data name="Last_radio_address" xml:space="preserve">
<value>Last radio address</value>
</data>
<data name="Last_serial_number" xml:space="preserve">
<value>Last serial number</value>
</data>
<data name="Producton_order_properties" xml:space="preserve">
<value>Producton order properties</value>
</data>
<data name="Order_number_must_be_larger_then_0" xml:space="preserve">
<value>Order number must be larger then {0}</value>
</data>
<data name="Show_predefined_orders" xml:space="preserve">
<value>Show predefined orders</value>
</data>
<data name="Module_parameter" xml:space="preserve">
<value>Module parameter</value>
</data>
<data name="Made_in_text" xml:space="preserve">
<value>Made in text</value>
</data>
<data name="Packing" xml:space="preserve">
<value>Packing</value>
</data>
<data name="Variant_description" xml:space="preserve">
<value>Variant description</value>
</data>
<data name="Abort_creating_an_order_QM" xml:space="preserve">
<value>Abort creating an order?</value>
</data>
<data name="It_is_not_recommended_that_orders_start_with_3" xml:space="preserve">
<value>It is not recommended that orders start with '3'.</value>
</data>
<data name="There_is_a_conflict" xml:space="preserve">
<value>There is a conflict.</value>
</data>
<data name="Year_of_calibration" xml:space="preserve">
<value>Year of calibration</value>
</data>
</root>
+228
View File
@@ -0,0 +1,228 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Are_you_sure" xml:space="preserve">
<value>Ste si istí ?</value>
</data>
<data name="Cancel" xml:space="preserve">
<value>Zrušiť</value>
</data>
<data name="Close_it_please" xml:space="preserve">
<value>Zavrite ho prosím 'Správcom úloh' (Task manager).</value>
</data>
<data name="Connection_string_tracing_DB" xml:space="preserve">
<value>Konfigurácia databázy sledovania výroby</value>
</data>
<data name="Connection_string_users_DB" xml:space="preserve">
<value>Konfigurácia databázy používateľov</value>
</data>
<data name="Database" xml:space="preserve">
<value>Databáza</value>
</data>
<data name="Default_settings_are_used" xml:space="preserve">
<value>Použijú sa základné nastavenia</value>
</data>
<data name="Error" xml:space="preserve">
<value>Chyba</value>
</data>
<data name="first" xml:space="preserve">
<value>prvá/é</value>
</data>
<data name="Invalid_0" xml:space="preserve">
<value>Neplatný(á,é) {0}</value>
</data>
<data name="Language_etc" xml:space="preserve">
<value>Language, 语言, Sprache, jazyk</value>
</data>
<data name="Order" xml:space="preserve">
<value>Zákazka</value>
</data>
<data name="State" xml:space="preserve">
<value>Stav</value>
</data>
<data name="Pieces_count" xml:space="preserve">
<value>Počet kusov</value>
</data>
<data name="prefix" xml:space="preserve">
<value>Prefix</value>
</data>
<data name="Program_0_is_running_already" xml:space="preserve">
<value>Program '[0}' už beží.</value>
</data>
<data name="Program_is_running_for_the_1st_time_on_this_PC" xml:space="preserve">
<value>Program bol spustený na tomto počítači prvý krát.</value>
</data>
<data name="Program_restart_is_required" xml:space="preserve">
<value>je potrebný reštart programu</value>
</data>
<data name="Remark" xml:space="preserve">
<value>Poznámka</value>
</data>
<data name="Save" xml:space="preserve">
<value>Uložíť</value>
</data>
<data name="Settings" xml:space="preserve">
<value>Nastavenia</value>
</data>
<data name="digits_count" xml:space="preserve">
<value>počet číslic</value>
</data>
<data name="suffix" xml:space="preserve">
<value>Suffix</value>
</data>
<data name="Test_procedure" xml:space="preserve">
<value>Testovacia procedúra</value>
</data>
<data name="User_login_is_required" xml:space="preserve">
<value>Vyžaduje sa prihlásenie používateľa</value>
</data>
<data name="Variant_code" xml:space="preserve">
<value>Kód variantu</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Upozornenie</value>
</data>
<data name="Workflow" xml:space="preserve">
<value>Pracovný postup</value>
</data>
<data name="OK" xml:space="preserve">
<value>OK</value>
</data>
<data name="Parameter" xml:space="preserve">
<value>Parameter</value>
</data>
<data name="Value" xml:space="preserve">
<value>Hodnota</value>
</data>
<data name="Saving_order_failed" xml:space="preserve">
<value>Chyba pri ukladaní zákazky</value>
</data>
<data name="Order_with_the_same_ID_already_exists" xml:space="preserve">
<value>Existuje zákazka s rovnakým ID</value>
</data>
<data name="Order_number_must_be_larger_then_0" xml:space="preserve">
<value>Číslo zákazky musí byť väčšie ako {0} </value>
</data>
<data name="Show_predefined_orders" xml:space="preserve">
<value>Zobraziť preddefinované zákazky</value>
</data>
<data name="Year_of_calibration" xml:space="preserve">
<value>Rok overenia</value>
</data>
</root>
@@ -0,0 +1,23 @@
<log4net>
<!-- Program log appenders -->
<appender name="OrderManagementLog" type="log4net.Appender.RollingFileAppender">
<file value="..\Logs\OrderManagementLog.txt" />
<appendToFile value="true" />
<rollingMode value="Date" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %logger - %message%newline" />
</layout>
</appender>
<!-- Set root logger -->
<root>
<level value="WARN" />
</root>
<!-- Set program loggers -->
<logger name="OrderManagement"> <appender-ref ref="OrderManagementLog" /> <level value="WARN" /> </logger>
<!-- Set program logging levels -->
<logger name="OrderManagement.OrderManagementDlg"> <level value="INFO" /> </logger>
</log4net>
+192
View File
@@ -0,0 +1,192 @@
namespace OrderManagement
{
partial class SettingsDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.commonGroupBox = new System.Windows.Forms.GroupBox();
this.loginRequiredCheckBox = new System.Windows.Forms.CheckBox();
this.languageComboBox = new System.Windows.Forms.ComboBox();
this.languageLabel = new System.Windows.Forms.Label();
this.connStrForTracingGroupBox = new System.Windows.Forms.GroupBox();
this.tracingDBConnStringTextBox = new System.Windows.Forms.TextBox();
this.connStrForUsersGroupBox = new System.Windows.Forms.GroupBox();
this.usersDBConnStringTextBox = new System.Windows.Forms.TextBox();
this.saveButton = new System.Windows.Forms.Button();
this.cancelButton = new System.Windows.Forms.Button();
this.showPredefinedOrdersCheckBox = new System.Windows.Forms.CheckBox();
this.commonGroupBox.SuspendLayout();
this.connStrForTracingGroupBox.SuspendLayout();
this.connStrForUsersGroupBox.SuspendLayout();
this.SuspendLayout();
//
// commonGroupBox
//
this.commonGroupBox.Controls.Add(this.showPredefinedOrdersCheckBox);
this.commonGroupBox.Controls.Add(this.loginRequiredCheckBox);
this.commonGroupBox.Controls.Add(this.languageComboBox);
this.commonGroupBox.Controls.Add(this.languageLabel);
this.commonGroupBox.Location = new System.Drawing.Point(12, 12);
this.commonGroupBox.Name = "commonGroupBox";
this.commonGroupBox.Size = new System.Drawing.Size(418, 116);
this.commonGroupBox.TabIndex = 16;
this.commonGroupBox.TabStop = false;
//
// loginRequiredCheckBox
//
this.loginRequiredCheckBox.AutoSize = true;
this.loginRequiredCheckBox.Location = new System.Drawing.Point(22, 55);
this.loginRequiredCheckBox.Name = "loginRequiredCheckBox";
this.loginRequiredCheckBox.Size = new System.Drawing.Size(114, 17);
this.loginRequiredCheckBox.TabIndex = 2;
this.loginRequiredCheckBox.Text = "User login required";
this.loginRequiredCheckBox.UseVisualStyleBackColor = true;
//
// languageComboBox
//
this.languageComboBox.FormattingEnabled = true;
this.languageComboBox.Location = new System.Drawing.Point(292, 17);
this.languageComboBox.Name = "languageComboBox";
this.languageComboBox.Size = new System.Drawing.Size(80, 21);
this.languageComboBox.TabIndex = 1;
//
// languageLabel
//
this.languageLabel.AutoSize = true;
this.languageLabel.Location = new System.Drawing.Point(19, 20);
this.languageLabel.Name = "languageLabel";
this.languageLabel.Size = new System.Drawing.Size(134, 13);
this.languageLabel.TabIndex = 0;
this.languageLabel.Text = "Language, Sprache, Jazyk";
//
// connStrForTracingGroupBox
//
this.connStrForTracingGroupBox.Controls.Add(this.tracingDBConnStringTextBox);
this.connStrForTracingGroupBox.Location = new System.Drawing.Point(12, 137);
this.connStrForTracingGroupBox.Name = "connStrForTracingGroupBox";
this.connStrForTracingGroupBox.Size = new System.Drawing.Size(660, 50);
this.connStrForTracingGroupBox.TabIndex = 17;
this.connStrForTracingGroupBox.TabStop = false;
this.connStrForTracingGroupBox.Text = "Connection string for production tracing records";
//
// tracingDBConnStringTextBox
//
this.tracingDBConnStringTextBox.Location = new System.Drawing.Point(19, 18);
this.tracingDBConnStringTextBox.Name = "tracingDBConnStringTextBox";
this.tracingDBConnStringTextBox.Size = new System.Drawing.Size(617, 20);
this.tracingDBConnStringTextBox.TabIndex = 0;
//
// connStrForUsersGroupBox
//
this.connStrForUsersGroupBox.Controls.Add(this.usersDBConnStringTextBox);
this.connStrForUsersGroupBox.Location = new System.Drawing.Point(12, 196);
this.connStrForUsersGroupBox.Name = "connStrForUsersGroupBox";
this.connStrForUsersGroupBox.Size = new System.Drawing.Size(660, 50);
this.connStrForUsersGroupBox.TabIndex = 18;
this.connStrForUsersGroupBox.TabStop = false;
this.connStrForUsersGroupBox.Text = "Connection string for central DB of users";
//
// usersDBConnStringTextBox
//
this.usersDBConnStringTextBox.Location = new System.Drawing.Point(19, 18);
this.usersDBConnStringTextBox.Name = "usersDBConnStringTextBox";
this.usersDBConnStringTextBox.Size = new System.Drawing.Size(617, 20);
this.usersDBConnStringTextBox.TabIndex = 0;
//
// saveButton
//
this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.saveButton.Location = new System.Drawing.Point(475, 29);
this.saveButton.Name = "saveButton";
this.saveButton.Size = new System.Drawing.Size(74, 47);
this.saveButton.TabIndex = 19;
this.saveButton.Text = "Save";
this.saveButton.UseVisualStyleBackColor = true;
this.saveButton.Click += new System.EventHandler(this.saveButton_Click);
//
// cancelButton
//
this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.cancelButton.Location = new System.Drawing.Point(577, 29);
this.cancelButton.Name = "cancelButton";
this.cancelButton.Size = new System.Drawing.Size(71, 47);
this.cancelButton.TabIndex = 20;
this.cancelButton.Text = "Cancel";
this.cancelButton.UseVisualStyleBackColor = true;
this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
//
// showPredefinedOrdersCheckBox
//
this.showPredefinedOrdersCheckBox.AutoSize = true;
this.showPredefinedOrdersCheckBox.Location = new System.Drawing.Point(22, 82);
this.showPredefinedOrdersCheckBox.Name = "showPredefinedOrdersCheckBox";
this.showPredefinedOrdersCheckBox.Size = new System.Drawing.Size(138, 17);
this.showPredefinedOrdersCheckBox.TabIndex = 3;
this.showPredefinedOrdersCheckBox.Text = "Show predefined orders";
this.showPredefinedOrdersCheckBox.UseVisualStyleBackColor = true;
//
// SettingsDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(688, 261);
this.ControlBox = false;
this.Controls.Add(this.cancelButton);
this.Controls.Add(this.saveButton);
this.Controls.Add(this.connStrForUsersGroupBox);
this.Controls.Add(this.connStrForTracingGroupBox);
this.Controls.Add(this.commonGroupBox);
this.Name = "SettingsDlg";
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Settings";
this.Load += new System.EventHandler(this.SettingsDlg_Load);
this.commonGroupBox.ResumeLayout(false);
this.commonGroupBox.PerformLayout();
this.connStrForTracingGroupBox.ResumeLayout(false);
this.connStrForTracingGroupBox.PerformLayout();
this.connStrForUsersGroupBox.ResumeLayout(false);
this.connStrForUsersGroupBox.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox commonGroupBox;
private System.Windows.Forms.ComboBox languageComboBox;
private System.Windows.Forms.Label languageLabel;
private System.Windows.Forms.CheckBox loginRequiredCheckBox;
private System.Windows.Forms.GroupBox connStrForTracingGroupBox;
private System.Windows.Forms.TextBox tracingDBConnStringTextBox;
private System.Windows.Forms.GroupBox connStrForUsersGroupBox;
private System.Windows.Forms.TextBox usersDBConnStringTextBox;
private System.Windows.Forms.Button saveButton;
private System.Windows.Forms.Button cancelButton;
private System.Windows.Forms.CheckBox showPredefinedOrdersCheckBox;
}
}
+134
View File
@@ -0,0 +1,134 @@
///
/// Copyright (c) 2021 Sensus Slovensko a.s.
///
using System;
using System.Windows.Forms;
using OrderManagement.Resources;
namespace OrderManagement
{
public partial class SettingsDlg : Form
{
private LocalSettings ls;
public SettingsDlg()
{
InitializeComponent();
}
public SettingsDlg(LocalSettings localSettings)
{
InitializeComponent();
this.ls = localSettings;
}
void Localize()
{
Text = Strings.Settings;
languageLabel.Text = Strings.Language_etc;
loginRequiredCheckBox.Text = Strings.User_login_is_required;
showPredefinedOrdersCheckBox.Text = Strings.Show_predefined_orders;
saveButton.Text = Strings.Save;
cancelButton.Text = Strings.Cancel;
connStrForTracingGroupBox.Text = Strings.Connection_string_tracing_DB;
connStrForUsersGroupBox.Text = Strings.Connection_string_users_DB;
}
private void SettingsDlg_Load(object sender, EventArgs e)
{
Localize();
languageComboBox.Items.Add("EN");
languageComboBox.Items.Add("ZH_CN");
languageComboBox.Items.Add("DE");
languageComboBox.Items.Add("SK");
languageComboBox.Text = ls.Language;
if (ls == null) return;
loginRequiredCheckBox.Checked = ls.IsUserLoginRequired;
showPredefinedOrdersCheckBox.Checked = ls.IsShowPredefinedOrders;
tracingDBConnStringTextBox.Text = ls.TracingDBConnString;
usersDBConnStringTextBox.Text = ls.UsersDBConnString;
}
/// <summary>
/// Verifies UI content
/// </summary>
/// <returns>None-empty string (message) when invalid</returns>
string IsUIContentValid()
{
if (!languageComboBox.Items.Contains(languageComboBox.Text))
{
return "Invalid language";
}
return null;
}
/// <summary>
/// Updates settings, checks for differences compared to previous setrtings
/// </summary>
/// <returns>true when settings are different</returns>
bool UpdateSettings()
{
if (ls == null) return false;
bool isDifferent = false;
if (ls.Language != languageComboBox.Text)
{
ls.Language = languageComboBox.Text;
isDifferent = true;
}
if (ls.IsUserLoginRequired != loginRequiredCheckBox.Checked)
{
ls.IsUserLoginRequired = loginRequiredCheckBox.Checked;
isDifferent = true;
}
if (ls.IsShowPredefinedOrders != showPredefinedOrdersCheckBox.Checked)
{
ls.IsShowPredefinedOrders = showPredefinedOrdersCheckBox.Checked;
isDifferent = true;
}
if (ls.TracingDBConnString != tracingDBConnStringTextBox.Text)
{
ls.TracingDBConnString = tracingDBConnStringTextBox.Text;
isDifferent = true;
}
if (ls.UsersDBConnString != usersDBConnStringTextBox.Text)
{
ls.UsersDBConnString = usersDBConnStringTextBox.Text;
isDifferent = true;
}
return isDifferent;
}
private void saveButton_Click(object sender, EventArgs e)
{
string message = IsUIContentValid();
if (string.IsNullOrEmpty(message))
{
UpdateSettings();
DialogResult = DialogResult.OK;
Close();
}
else
{
MessageBox.Show(message);
}
}
private void cancelButton_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
}
}
}
+120
View File
@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
+14
View File
@@ -0,0 +1,14 @@
///
/// Copyright (c) 2019 Sensus Slovensko a.s.
///
using System;
namespace RecordProcessing
{
public enum Status
{
Failed, /// Default value after Record construction
Passed,
Interrupted,
}
}
+32
View File
@@ -0,0 +1,32 @@
///
/// Copyright (c) 2019 Sensus Slovensko a.s.
///
using System;
namespace RecordProcessing
{
public interface IRecord
{
string FileName { get; }
string SN { get; set; } /// Only RF Test implements 'set' (400 and 900 MHz)
DateTime TimeStamp { get; }
Status Status { get; }
string ResultStr { get; }
string Remark { get; } /// Optional remark
/// <returns> true when class implementing IRecord can be saved to Oracle DB </returns>
bool CanSaveRecordToOracle();
/// <summary> Save test result into Oracle DB </summary>
/// <param name="oraConn"> Oracle DB connection </param>
/// <returns> true = Result was successfully saved to DB </returns>
bool SaveRecordToOracle(Oracle.DataAccess.Client.OracleConnection oraConn);
/// <returns> true when class implementing IRecord can be printed on a printer </returns>
bool CanPrintRecord();
/// <summary> Print result on the default printer </summary>
/// <returns> true = Result was successfully printed </returns>
bool PrintRecord();
}
}
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("RecordProcessing")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("RecordProcessing")]
[assembly: AssemblyCopyright("Copyright © 2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("c8370c59-d106-46eb-a174-a2186d8f64e7")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// 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.0.77.0")]
[assembly: AssemblyFileVersion("2.0.77.0")]
+325
View File
@@ -0,0 +1,325 @@
///
/// Copyright (c) 2019 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Threading;
using log4net;
using RecordProcessing;
using RecordProcessing.Records;
namespace RecordProcessing
{
public enum RecordType
{
None, /// No record processing
RF_Test, /// RF_Test @ 433MHz or 868MHz
RF_Test_400_900, /// RF_Test for FlexNet @ 400MHz or 900MHz
CommTest, /// Communication test of water meter
FlowtubeTestHe, /// Flowtube test with Helium
FlowtubeTestAir, /// Flowtube test with air
LaserNanjing, /// Laser markig in Xylem Nanjing
Count
}
public enum RecordPostproc
{
None, /// Do nothing, leave a file where it is
Move, /// Move a file to destination directory
Compress, /// Compress a file to a destination directory (delete original file)
Count
}
public class RecordProcessing
{
static readonly ILog log = LogManager.GetLogger(typeof(RecordProcessing));
#region Constructor and parameters
public readonly RecordType RecordType;
RecordPostproc recordPostproc;
string testResultsFolder;
bool doExpandTestResultsFolder;
string archiveFolder;
bool doExpandArchiveFolder;
string fileNamePattern;
/// <summary>
/// Create a dummy RecordProcessing object, worker thread will not be started.
/// </summary>
public RecordProcessing()
{
this.RecordType = RecordType.None;
}
public RecordProcessing(RecordType recordType,
RecordPostproc recordPostproc,
string testResultsFolder,
bool doExpandTestResultsFolder,
string fileNamePattern)
{
if (recordPostproc != RecordPostproc.None)
{
throw new Exception("Argument 'recordPostproc' should be 'RecordPostproc.None' as no archive folder is defined");
}
this.RecordType = recordType;
this.recordPostproc = recordPostproc;
this.testResultsFolder = testResultsFolder;
this.doExpandTestResultsFolder = doExpandTestResultsFolder;
this.fileNamePattern = fileNamePattern;
this.archiveFolder = string.Empty;
this.doExpandArchiveFolder = false;
}
public RecordProcessing(RecordType recordType,
RecordPostproc recordPostproc,
string sourceFolder,
bool expandSourceFolder,
string fileNamePattern,
string archiveFolder,
bool expandArchiveFolder)
{
this.RecordType = recordType;
this.recordPostproc = recordPostproc;
this.testResultsFolder = sourceFolder;
this.doExpandTestResultsFolder = expandSourceFolder;
this.fileNamePattern = fileNamePattern;
this.archiveFolder = archiveFolder;
this.doExpandArchiveFolder = expandArchiveFolder;
}
#endregion Constructor and parameters
#region Worker thread and its control
public bool Running { get { return running; } }
bool running = false; /// true when worker thread is running
Thread workerThread;
public void StartProcessing()
{
if ((RecordType == RecordType.None) || running) return;
running = true;
workerThread = new Thread(Worker);
workerThread.CurrentCulture = Thread.CurrentThread.CurrentCulture;
workerThread.CurrentUICulture = Thread.CurrentThread.CurrentUICulture;
workerThread.Start();
}
public void StopProcessing()
{
if ((RecordType == RecordType.None) || !running) return;
running = false;
workerThread.Join(2000);
}
void Worker()
{
///
/// Create a reference list of files already existing in the source folder. These file would not be processed.
///
DateTime start = DateTime.Now;
string referenceFolder = doExpandTestResultsFolder ? Path.Combine(testResultsFolder, start.Year.ToString(), start.Month.ToString("D2"), start.Day.ToString("D2")) : testResultsFolder;
IList<string> referenceFiles = new List<string>();
IEnumerable<string> currentFiles = new List<string>();
try { currentFiles = Directory.EnumerateFiles(referenceFolder, fileNamePattern); }
catch (Exception) { }
foreach (var f in currentFiles) referenceFiles.Add(f);
while (running)
{
/// Wait 2.5 s, quit when 'running' flag is reset
for (int i = 0; i < 5; i++)
{
if (!running) break;
Thread.Sleep(500);
}
///
/// Expand folders if required
///
DateTime now = DateTime.Now;
string archiveFolderExt = doExpandArchiveFolder ? Path.Combine(archiveFolder, now.Year.ToString(), now.Month.ToString("D2"), now.Day.ToString("D2")) : archiveFolder;
string sourceFolderExt = doExpandTestResultsFolder ? Path.Combine(testResultsFolder, now.Year.ToString(), now.Month.ToString("D2"), now.Day.ToString("D2")) : testResultsFolder;
if (sourceFolderExt != referenceFolder)
{
/// Folder changes (after midnight when folder expansion was enabled)
/// Check if there are any new files in the original folder so that not a single record is lost
currentFiles = new List<string>();
try { currentFiles = Directory.EnumerateFiles(referenceFolder, fileNamePattern); }
catch (Exception) { }
IList<string> newFilesInPreviousFolder = GetDifference(referenceFiles, currentFiles);
referenceFolder = sourceFolderExt;
referenceFiles.Clear(); /// Clear the reference list of files so that all files in th enew folder are processed
/// Process newly added file, it is assumed there is no more then 1 such file.
if (newFilesInPreviousFolder.Count > 0)
{
ProcessOneFile(newFilesInPreviousFolder[0], archiveFolderExt);
continue;
}
}
/// Determine whether files were added
currentFiles = new List<string>();
try { currentFiles = Directory.EnumerateFiles(sourceFolderExt, fileNamePattern); }
catch (Exception) { }
IList<string> newFiles = GetDifference(referenceFiles, currentFiles);
/// Process newly added files
if (newFiles.Count > 0)
{
if (!ProcessOneFile(newFiles[0], archiveFolderExt))
{
referenceFiles.Add(newFiles[0]); /// Prevent double processing of this file
}
}
}
}
/// <summary>
/// Determine difference between a current list of files and an original list of files.
/// </summary>
/// <param name="oriFiles">Original list of files</param>
/// <param name="currentFiles">Current list of files</param>
/// <returns>List of files that were added to the original list</returns>
IList<string> GetDifference(IList<string> oriFiles, IEnumerable<string> currentFiles)
{
IList<string> newFiles = new List<string>();
foreach (var f in currentFiles)
{
if (!oriFiles.Contains(f)) newFiles.Add(f);
}
return newFiles;
}
#endregion Worker thread and its control
#region Process one file
/// <summary>
/// Process one record (one file).
/// </summary>
/// <param name="fileName">Record file name</param>
/// <param name="archiveFolder">Destination folder for a successfully processed records</param>
/// <returns>true when the record was deleted from the source directory (moved or compressed)</returns>
bool ProcessOneFile(string fileName, string archiveFolder)
{
IRecord record;
/// Extract information from the file
switch (RecordType)
{
case RecordType.RF_Test: record = RFTestRecord.FromFile(fileName); break;
case RecordType.RF_Test_400_900: record = RFTestRecord_400_900.FromFile(fileName); break;
case RecordType.CommTest: record = CommTestRecord.FromFile(fileName); break;
case RecordType.FlowtubeTestHe: record = FlowtubeTestHeRecord.FromFile(fileName); break;
case RecordType.FlowtubeTestAir: record = FlowtubeTestAirRecord.FromFile(fileName); break;
case RecordType.LaserNanjing: record = LaserNanjingRecord.FromFile(fileName); break;
default: record = null; break;
}
/// Process data extracted from the file
bool processedOK = false;
if (record == null)
{
log.ErrorFormat("Record {0} is corrupt", fileName);
}
else
{
try
{
/// Send PcbNumber to anyone who handles SubmitRecordHandler
OnRecordAvailable(this, new SubmitRecordEventArgs(record));
processedOK = true;
log.InfoFormat("Record {0} successfully processed", fileName);
}
catch (Exception)
{
log.ErrorFormat("Processing record {0} failed", fileName);
}
}
/// Move or compress the original file
if (processedOK)
{
if (recordPostproc == RecordPostproc.Move)
{
///
/// Move the file to the archive filder
///
Directory.CreateDirectory(archiveFolder);
string target = Path.Combine(archiveFolder, Path.GetFileName(fileName));
if (File.Exists(target)) File.Delete(target); /// Ensure that the target does not exist
File.Move(fileName, target);
return true;
}
else if (recordPostproc == RecordPostproc.Compress)
{
/// Compress the file to the archive folder
Directory.CreateDirectory(archiveFolder);
using (FileStream outFile = File.Create(Path.Combine(archiveFolder, string.Format("{0}.gz", Path.GetFileName(fileName)))))
{
using (FileStream inFile = File.OpenRead(fileName))
{
using (GZipStream compress = new GZipStream(outFile, CompressionMode.Compress))
{
/// Copy the source file into the compression stream.
inFile.CopyTo(compress);
}
}
}
File.Delete(fileName); /// Delete the original file
return true;
}
else
{
/// Leave the file in its current location
return false;
}
}
else
{
/// TODO: What to do when processing fails? (which is unlikely)
return false;
}
}
/// <summary>
/// Handler to submit PcbNumber-s extracted from records
/// </summary>
public event EventHandler<SubmitRecordEventArgs> SubmitRecordHandler;
/// <summary>
/// Called from ProcessOneFile()
/// </summary>
void OnRecordAvailable(object sender, SubmitRecordEventArgs data)
{
if (SubmitRecordHandler == null) return;
try
{
SubmitRecordHandler(sender, data);
}
catch (Exception e)
{
log.Error("SubmitRecordHandler(...) failed", e);
}
}
#endregion Process one file
}
}
+84
View File
@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{67BD7A8F-0FED-4FDE-B875-78D5A2BC9B2C}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>RecordProcessing</RootNamespace>
<AssemblyName>RFPowerCommon</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Gma.QrCodeNet.Encoding">
<HintPath>..\packages\QrCode.Net.0.4.0.0\net40\Gma.QrCodeNet.Encoding.dll</HintPath>
</Reference>
<Reference Include="log4net">
<HintPath>..\packages\log4net.2.0.2\lib\net40-full\log4net.dll</HintPath>
</Reference>
<Reference Include="NHibernate">
<HintPath>..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll</HintPath>
</Reference>
<Reference Include="Oracle.DataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Oracle\Oracle.DataAccess.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Enums.cs" />
<Compile Include="IRecord.cs" />
<Compile Include="RecordProcessing.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Records\CommTestRecord.cs" />
<Compile Include="Records\FlowtubeTestAirRecord.cs" />
<Compile Include="Records\FlowtubeTestHeRecord.cs" />
<Compile Include="Records\LaserNanjingRecord.cs" />
<Compile Include="Records\RFTestPrintDocument.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="Records\RFTestPrintDocument_400_900.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="Records\RFTestRecord.cs" />
<Compile Include="Records\RFTestRecord_400_900.cs" />
<Compile Include="SubmitRecordEventArgs.cs" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
@@ -0,0 +1,59 @@
///
/// Copyright (c) 2019 Sensus Slovensko a.s.
///
using System;
using System.IO;
using log4net;
namespace RecordProcessing.Records
{
public class CommTestRecord : IRecord
{
static readonly ILog log = LogManager.GetLogger(typeof(CommTestRecord));
public string FileName { get { return fileName; } }
public string SN { get { return sn; } set { } }
public DateTime TimeStamp { get { return timeStamp; } }
public Status Status { get { return status; } }
public string ResultStr { get { return string.Empty; } }
public string Remark { get { return string.Empty; } }
string fileName;
string sn;
DateTime timeStamp;
Status status;
public CommTestRecord()
{
}
/// <summary>
/// Load a record from a CommTest log file.
/// </summary>
/// <param name="fileName">Full file pathname</param>
/// <returns>Record or null</returns>
public static CommTestRecord FromFile(string pathName)
{
try
{
CommTestRecord record = new CommTestRecord();
record.fileName = Path.GetFileName(pathName);
record.sn = record.fileName.Substring(0, 12);
record.timeStamp = DateTime.Now;
record.status = Status.Passed;
return record;
}
catch (Exception exc)
{
log.ErrorFormat("Cannot open file {0}: {1}", pathName, exc.Message);
return null;
}
}
public bool CanSaveRecordToOracle() { return false; }
public bool SaveRecordToOracle(Oracle.DataAccess.Client.OracleConnection oraConn) { return false; }
public bool CanPrintRecord() { return false; }
public bool PrintRecord() { return false; }
}
}
@@ -0,0 +1,197 @@
///
/// Copyright (c) 2019 Sensus Slovensko a.s.
///
using System;
using System.Globalization;
using System.IO;
using System.Xml;
using log4net;
using Oracle.DataAccess.Client;
namespace RecordProcessing.Records
{
public class FlowtubeTestAirRecord : IRecord
{
static readonly ILog log = LogManager.GetLogger(typeof(FlowtubeTestAirRecord));
public static string Path;
public string FileName { get { return fileName; } }
public string SN { get { return sn; } set { sn = value; } }
public DateTime TimeStamp { get { return timeStamp; } }
public Status Status { get { return status; } }
public string ResultStr { get { return string.Format("({0} {1})", string.IsNullOrEmpty(Leakage_Value) ? "" : Leakage_Value, string.IsNullOrEmpty(Leakage_Unit) ? "" : Leakage_Unit); } }
public string Remark { get { return string.IsNullOrEmpty(remark) ? string.Empty : remark; } }
string fileName;
string sn;
DateTime timeStamp;
Status status;
string productName;
string remark;
public double TestTime; /// [s]
public string Leakage_Value;
public string Leakage_LoLim;
public string Leakage_HiLim;
public string Leakage_Unit;
public int ReferenceRecordsCount;
public FlowtubeTestAirRecord()
{
sn = null; /// Initially there is no PCB number
}
/// <summary>
/// Load a record from an xml-file
/// </summary>
/// <param name="fileName">xml-filename</param>
/// <returns>Record or null</returns>
public static FlowtubeTestAirRecord FromFile(string fileName)
{
try
{
string bareFileName = System.IO.Path.GetFileName(fileName).Replace(".xml", "");
using (Stream inputStream = File.OpenRead(fileName))
{
return FromFile(inputStream, bareFileName);
}
}
catch (Exception exc)
{
log.ErrorFormat("Cannot open file {0}: {1}", fileName, exc.Message);
return null;
}
}
/// <summary>
/// Load a record from a file stream (XML file format)
/// </summary>
/// <param name="inputStream">Input stream</param>
/// <param name="bareFileName">Filename for doc. purpose only</param>
/// <returns>Record</returns>
public static FlowtubeTestAirRecord FromFile(Stream inputStream, string bareFileName)
{
FlowtubeTestAirRecord record = new FlowtubeTestAirRecord();
record.fileName = bareFileName;
try
{
string[] fields = record.fileName.Split(new char[] { '_' });
string dateTimeEtc = fields[fields.Length - 2];
int yyyy = int.Parse(dateTimeEtc.Substring(0, 4));
int mo = int.Parse(dateTimeEtc.Substring(4, 2));
int dd = int.Parse(dateTimeEtc.Substring(6, 2));
int hh = int.Parse(dateTimeEtc.Substring(8, 2));
int mi = int.Parse(dateTimeEtc.Substring(10, 2));
int ss = int.Parse(dateTimeEtc.Substring(12, 2));
record.timeStamp = new DateTime(yyyy, mo, dd, hh, mi, ss);
XmlDocument xDoc = new XmlDocument();
xDoc.Load(inputStream);
bool testResultFound = false;
foreach (XmlNode node in xDoc.DocumentElement.ChildNodes)
{
if (node.Name == "PRODUCT")
{
record.productName = node.Attributes["NAME"].Value;
}
else if (node.Name == "REFS")
{
record.remark = node.Attributes["SEQ_REF"].Value;
}
else if (node.Name == "PANEL")
{
foreach (XmlNode sNode in node.ChildNodes)
{
if (sNode.Name != "DUT") continue;
record.sn = sNode.Attributes["ID"].Value;
string statusStr = sNode.Attributes["STATUS"].Value;
if (statusStr.ToLower().Equals("passed"))
{
record.status = Status.Passed;
}
else if (statusStr.ToLower().Equals("failed"))
{
record.status = Status.Failed;
}
else
{
record.status = Status.Interrupted;
}
record.TestTime = double.Parse(sNode.Attributes["TESTTIME"].Value, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture);
if (testResultFound) continue;
///
/// Search for RF_Power test result
///
foreach (XmlNode ssNode in sNode.ChildNodes)
{
if (ssNode.Name != "GROUP") continue;
foreach (XmlNode sssNode in ssNode.ChildNodes)
{
if (sssNode.Name != "GROUP" || !sssNode.HasChildNodes) continue;
foreach (XmlNode ssssNode in sssNode.ChildNodes)
{
if (ssssNode.Name != "GROUP" || !ssssNode.HasChildNodes
|| !ssssNode.Attributes["NAME"].Value.Contains("Leakage")) continue;
foreach (XmlNode terminalNode in ssssNode.ChildNodes)
{
if ((terminalNode.Name == "TEST") && (terminalNode.Attributes["NAME"].Value.Contains("Leakage")) &&
!string.IsNullOrEmpty(terminalNode.Attributes["UNIT"].Value) &&
!string.IsNullOrEmpty(terminalNode.Attributes["VALUE"].Value) &&
!string.IsNullOrEmpty(terminalNode.Attributes["LOLIM"].Value) &&
!string.IsNullOrEmpty(terminalNode.Attributes["HILIM"].Value) &&
!string.IsNullOrEmpty(terminalNode.Attributes["STATUS"].Value))
{
record.Leakage_Unit = terminalNode.Attributes["UNIT"].Value;
record.Leakage_Value = terminalNode.Attributes["VALUE"].Value;
record.Leakage_LoLim = terminalNode.Attributes["LOLIM"].Value;
record.Leakage_HiLim = terminalNode.Attributes["HILIM"].Value;
testResultFound = true;
break;
}
}
}
}
if (testResultFound) break;
}
}
}
}
}
catch (Exception exc)
{
log.ErrorFormat("Cannot parse file {0}: {1}", record.fileName, exc.Message);
return null;
}
return record;
}
public bool CanSaveRecordToOracle() { return false; }
public bool SaveRecordToOracle(OracleConnection oraConn) { return false; }
public bool CanPrintRecord() { return false; }
public bool PrintRecord() { return false; }
public override string ToString()
{
return string.Format("File={0} PcbNr={1}({2}), Rslt={3}, RF_Power={4} {5}",
fileName,
sn,
ReferenceRecordsCount,
status,
Leakage_Value,
Leakage_Unit);
}
}
}
@@ -0,0 +1,79 @@
///
/// Copyright (c) 2019 Sensus Slovensko a.s.
///
using System;
using System.IO;
using log4net;
namespace RecordProcessing.Records
{
public class FlowtubeTestHeRecord : IRecord
{
static readonly ILog log = LogManager.GetLogger(typeof(FlowtubeTestHeRecord));
public string FileName { get { return fileName; } }
public string SN { get { return sn; } set { } }
public DateTime TimeStamp { get { return timeStamp; } }
public Status Status { get { return status; } }
public string ResultStr { get { return resultStr; } }
public string Remark { get { return string.Empty; } }
string fileName;
string sn;
DateTime timeStamp;
Status status;
string resultStr;
public FlowtubeTestHeRecord()
{
}
/// <summary>
/// Load a record from Helium tester.
/// </summary>
/// <param name="fileName">Full file pathname</param>
/// <returns>Record or null</returns>
public static FlowtubeTestHeRecord FromFile(string fileName)
{
try
{
string bareFileName = System.IO.Path.GetFileName(fileName).Replace(".csv", "");
using (TextReader reader = new StreamReader(fileName))
{
FlowtubeTestHeRecord record = new FlowtubeTestHeRecord();
string line2 = null;
string line1 = reader.ReadLine();
if (line1 != null) line2 = reader.ReadLine();
if (line2 != null)
{
string[] fields = line2.Split(new char[] { ';' });
if (fields.Length <= 4) return null; /// Not enough fields in the file
record.fileName = bareFileName;
record.timeStamp = DateTime.Now; /// TODO: Get it from file
record.sn = fields[3];
record.status = fields[4].ToLower().Equals("ok") ? Status.Passed : Status.Failed;
record.resultStr = (fields.Length > 17) ? string.Format("({0} {1})", fields[17], "mbar l/s") : string.Empty;
reader.Close();
return record;
}
return null;
}
}
catch (Exception exc)
{
log.ErrorFormat("Cannot open file {0}: {1}", fileName, exc.Message);
return null;
}
}
public bool CanSaveRecordToOracle() { return false; }
public bool SaveRecordToOracle(Oracle.DataAccess.Client.OracleConnection oraConn) { return false; }
public bool CanPrintRecord() { return false; }
public bool PrintRecord() { return false; }
}
}
@@ -0,0 +1,91 @@
///
/// Copyright (c) 2022 Sensus Slovensko a.s.
///
using System;
using System.Globalization;
using System.IO;
using System.Text;
using log4net;
namespace RecordProcessing.Records
{
public class LaserNanjingRecord : IRecord
{
static readonly ILog log = LogManager.GetLogger(typeof(LaserNanjingRecord));
public bool CanSaveRecordToOracle() { return false; }
public bool SaveRecordToOracle(Oracle.DataAccess.Client.OracleConnection oraConn) { return false; }
public bool CanPrintRecord() { return false; }
public bool PrintRecord() { return false; }
public static string Path;
public string FileName { get { return fileName; } }
public string SN { get { return sn; } set { sn = value; } }
public DateTime TimeStamp { get { return timeStamp; } }
public Status Status { get { return status; } }
public string Remark { get { return string.Empty; } }
public string ResultStr { get { return string.Empty; } }
string fileName;
string sn;
DateTime timeStamp;
Status status;
string remark;
public LaserNanjingRecord()
{
sn = null;
status = Status.Interrupted;
}
/// <summary>
/// Load a record from an xml-file
/// </summary>
/// <param name="fileName">xml-filename</param>
/// <returns>Record or null</returns>
public static LaserNanjingRecord FromFile(string fileName)
{
try
{
string bareFileName = System.IO.Path.GetFileName(fileName).Replace(".csv", "");
LaserNanjingRecord record = new LaserNanjingRecord();
record.fileName = bareFileName;
record.timeStamp = DateTime.Now;
using (StreamReader iStream = new StreamReader(fileName))
{
string firstLine = iStream.ReadLine();
while (true)
{
string nextLine = iStream.ReadLine();
if (nextLine == null) break;
string[] fields = nextLine.Split(',');
if (fields.Length >= 6)
{
record.sn = fields[1];
record.status = (fields[5] == "OK") ? Status.Passed : Status.Failed;
}
}
log.InfoFormat("Succesfully parsed: {0}", record);
return record;
}
}
catch (Exception exc)
{
log.ErrorFormat("Cannot open or parse file {0}: {1}", fileName, exc.Message);
return null;
}
}
public override string ToString()
{
return string.Format("File={0} Housing s/n={1}, Rslt={2}", fileName, sn, status);
}
}
}
@@ -0,0 +1,137 @@
///
/// Copyright (c) 2016-2019 Sensus Slovensko a.s.
///
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Printing;
using Gma.QrCodeNet.Encoding;
namespace RecordProcessing.Records
{
public class RFTestPrintDocument : PrintDocument
{
int printWidth;
int printHeight;
int leftMargin;
int topMargin;
RFTestRecord record;
QrCode qrCode;
/// <summary>
/// Constructor
/// </summary>
/// <param name="bitmap">Bitmap to be printed</param>
/// <param name="paperWidth">Label width</param>
/// <param name="paperHeight">Label height</param>
/// <param name="landscape">true = landscape</param>
public RFTestPrintDocument(RFTestRecord rcrd, QrCode qrCd, bool landscape)
{
this.record = rcrd;
this.qrCode = qrCd;
DefaultPageSettings.Landscape = landscape;
/// Set print area size and margins (in dots using 80 dpi)
if (landscape)
{
printWidth = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom;
printHeight = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right;
leftMargin = base.DefaultPageSettings.Margins.Top; /// X
topMargin = base.DefaultPageSettings.Margins.Left; /// Y
}
else
{
printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom;
printWidth = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right;
leftMargin = base.DefaultPageSettings.Margins.Left; /// X
topMargin = base.DefaultPageSettings.Margins.Top; /// Y
}
}
protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e)
{
base.OnBeginPrint(e); /// Run base code
}
protected override void OnPrintPage(System.Drawing.Printing.PrintPageEventArgs e)
{
base.OnPrintPage(e); /// Run base code
DrawLabel(e.Graphics, record, qrCode);
e.HasMorePages = false;
}
public static void DrawLabel(Graphics g, RFTestRecord record, QrCode qrCode)
{
/// Assuming 100 dpi (printer), drawing size: 2 inch (width) x 1 inch (height)
const int W = 200;
const int H = 100;
const int Left = 0;
const int Top = 0;
const int L1 = Left + 10;
const int L2 = Left + 58;
const int L3 = Left + 77;
const int L4 = Left + 151;
const int T0 = Top;
const int T1 = Top + 3;
const int T2 = Top + 22;
const int T25 = T2 + 17 / 2;
const int T3 = T2 + 1 * 17;
const int T4 = T2 + 2 * 17;
const int T5 = T2 + 3 * 17;
const int QRL = Left + 151;
const int QRT = Top + 48;
const int QrSize = 42;
string fontFamily = "Arial Narrow";
Font font1 = new Font(fontFamily, 11, FontStyle.Bold);
Font font2 = new Font(fontFamily, 9, FontStyle.Regular);
Font font3 = new Font(fontFamily, 20, FontStyle.Bold);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.Clear(Color.White);
if (record.Status == Status.Passed)
{
g.DrawString("RF test PASSED", font1, Brushes.Black, new Rectangle(L1, T1, L4 - L1, T2 - T1));
}
else
{
g.DrawString("RF test FAILED", font1, Brushes.Red, new Rectangle(L1, T1, L4 - L1, T2 - T1));
}
g.DrawString("PCB nr.:", font2, Brushes.Black, new Rectangle(L1, T2, L2 - L1, T3 - T2));
g.DrawString("Mat. nr.:", font2, Brushes.Black, new Rectangle(L1, T3, L2 - L1, T3 - T2));
g.DrawString("Cust. order:", font2, Brushes.Black, new Rectangle(L1, T4, L2 - L1, T3 - T2));
g.DrawString("TB failed:", font2, Brushes.Black, new Rectangle(L1, T5, L3 - L1, T3 - T2));
g.DrawString(record.SN, font2, Brushes.Black, new Rectangle(L2, T2, L4 - L2, T3 - T2));
g.DrawString("INV-HIPGO02", font2, Brushes.Black, new Rectangle(L2, T3, L4 - L2, T3 - T2));
g.DrawString("CCAATMXXXX", font2, Brushes.Black, new Rectangle(L2, T4, L4 - L2, T3 - T2));
g.DrawString(record.PrintedInfo, font3, Brushes.Black, new Rectangle(L4, T0, W - L4, QRT - T1));
g.DrawString(record.FrequencyInfo, font2, Brushes.Black, new Rectangle(L4, T25, W - L4, QRT - T1));
g.DrawRectangle(new Pen(Brushes.Black, 1), new Rectangle(L3, T5 + 2, 15, 15));
g.DrawRectangle(new Pen(Brushes.Black, 1), new Rectangle(L3 + 22, T5 + 2, 15, 15));
g.DrawRectangle(new Pen(Brushes.Black, 1), new Rectangle(L3 + 44, T5 + 2, 15, 15));
g.Flush();
int QrPixSize = QrSize / qrCode.Matrix.Width;
for (int i = 0; i < qrCode.Matrix.Height; i++)
{
for (int j = 0; j < qrCode.Matrix.Width; j++)
{
if (qrCode.Matrix[j, i])
{
g.FillRectangle(Brushes.Black, new Rectangle(QRL + QrPixSize * j, QRT + QrPixSize * i, QrPixSize, QrPixSize));
}
}
}
}
}
}
@@ -0,0 +1,137 @@
///
/// Copyright (c) 2019 Sensus Slovensko a.s.
///
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Printing;
using Gma.QrCodeNet.Encoding;
namespace RecordProcessing.Records
{
public class RFTestPrintDocument_400_900 : PrintDocument
{
int printWidth;
int printHeight;
int leftMargin;
int topMargin;
RFTestRecord_400_900 record;
QrCode qrCode;
/// <summary>
/// Constructor
/// </summary>
/// <param name="bitmap">Bitmap to be printed</param>
/// <param name="paperWidth">Label width</param>
/// <param name="paperHeight">Label height</param>
/// <param name="landscape">true = landscape</param>
public RFTestPrintDocument_400_900(RFTestRecord_400_900 rcrd, QrCode qrCd, bool landscape)
{
this.record = rcrd;
this.qrCode = qrCd;
DefaultPageSettings.Landscape = landscape;
/// Set print area size and margins (in dots using 80 dpi)
if (landscape)
{
printWidth = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom;
printHeight = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right;
leftMargin = base.DefaultPageSettings.Margins.Top; /// X
topMargin = base.DefaultPageSettings.Margins.Left; /// Y
}
else
{
printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom;
printWidth = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - base.DefaultPageSettings.Margins.Right;
leftMargin = base.DefaultPageSettings.Margins.Left; /// X
topMargin = base.DefaultPageSettings.Margins.Top; /// Y
}
}
protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e)
{
base.OnBeginPrint(e); /// Run base code
}
protected override void OnPrintPage(System.Drawing.Printing.PrintPageEventArgs e)
{
base.OnPrintPage(e); /// Run base code
DrawLabel(e.Graphics, record, qrCode);
e.HasMorePages = false;
}
public static void DrawLabel(Graphics g, RFTestRecord_400_900 record, QrCode qrCode)
{
/// Assuming 100 dpi (printer), drawing size: 2 inch (width) x 1 inch (height)
const int W = 200;
const int H = 100;
const int Left = 0;
const int Top = 0;
const int L1 = Left + 10;
const int L2 = Left + 58;
const int L3 = Left + 77;
const int L4 = Left + 151;
const int T0 = Top;
const int T1 = Top + 3;
const int T2 = Top + 22;
const int T25 = T2 + 17 / 2;
const int T3 = T2 + 1 * 17;
const int T4 = T2 + 2 * 17;
const int T5 = T2 + 3 * 17;
const int QRL = Left + 151;
const int QRT = Top + 48;
const int QrSize = 42;
string fontFamily = "Arial Narrow";
Font font1 = new Font(fontFamily, 11, FontStyle.Bold);
Font font2 = new Font(fontFamily, 9, FontStyle.Regular);
Font font3 = new Font(fontFamily, 20, FontStyle.Bold);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.Clear(Color.White);
if (record.Status == Status.Passed)
{
g.DrawString("RF test PASSED", font1, Brushes.Black, new Rectangle(L1, T1, L4 - L1, T2 - T1));
}
else
{
g.DrawString("RF test FAILED", font1, Brushes.Red, new Rectangle(L1, T1, L4 - L1, T2 - T1));
}
g.DrawString("PCB nr.:", font2, Brushes.Black, new Rectangle(L1, T2, L2 - L1, T3 - T2));
g.DrawString("Mat. nr.:", font2, Brushes.Black, new Rectangle(L1, T3, L2 - L1, T3 - T2));
g.DrawString("Cust. order:", font2, Brushes.Black, new Rectangle(L1, T4, L2 - L1, T3 - T2));
g.DrawString("TB failed:", font2, Brushes.Black, new Rectangle(L1, T5, L3 - L1, T3 - T2));
g.DrawString(record.SN, font2, Brushes.Black, new Rectangle(L2, T2, L4 - L2, T3 - T2));
g.DrawString("INV-HIPGO02", font2, Brushes.Black, new Rectangle(L2, T3, L4 - L2, T3 - T2));
g.DrawString("CCAATMXXXX", font2, Brushes.Black, new Rectangle(L2, T4, L4 - L2, T3 - T2));
g.DrawString(record.PrintedInfo, font3, Brushes.Black, new Rectangle(L4, T0, W - L4, QRT - T1));
g.DrawString(record.FrequencyInfo, font2, Brushes.Black, new Rectangle(L4, T25, W - L4, QRT - T1));
g.DrawRectangle(new Pen(Brushes.Black, 1), new Rectangle(L3, T5 + 2, 15, 15));
g.DrawRectangle(new Pen(Brushes.Black, 1), new Rectangle(L3 + 22, T5 + 2, 15, 15));
g.DrawRectangle(new Pen(Brushes.Black, 1), new Rectangle(L3 + 44, T5 + 2, 15, 15));
g.Flush();
int QrPixSize = QrSize / qrCode.Matrix.Width;
for (int i = 0; i < qrCode.Matrix.Height; i++)
{
for (int j = 0; j < qrCode.Matrix.Width; j++)
{
if (qrCode.Matrix[j, i])
{
g.FillRectangle(Brushes.Black, new Rectangle(QRL + QrPixSize * j, QRT + QrPixSize * i, QrPixSize, QrPixSize));
}
}
}
}
}
}
+293
View File
@@ -0,0 +1,293 @@
///
/// Copyright (c) 2019 Sensus Slovensko a.s.
///
using System;
using System.Globalization;
using System.IO;
using System.Xml;
using Gma.QrCodeNet.Encoding;
using log4net;
using Oracle.DataAccess.Client;
namespace RecordProcessing.Records
{
public class RFTestRecord : IRecord
{
static readonly ILog log = LogManager.GetLogger(typeof(RFTestRecord));
public const string RFTestStationName = "STAWL001";
public static string Path;
public string FileName { get { return fileName; } }
public string SN { get { return sn; } set { sn = value; } }
public DateTime TimeStamp { get { return timeStamp; } }
public Status Status { get { return status; } }
public string ResultStr { get { return string.Format("({0} {1})", string.IsNullOrEmpty(RFPower_Value) ? "" : RFPower_Value, string.IsNullOrEmpty(RFPower_Unit) ? "" : RFPower_Unit); } }
public string Remark { get { return string.IsNullOrEmpty(remark) ? string.Empty : remark; } }
string fileName;
string sn;
DateTime timeStamp;
Status status;
string remark;
public string BattSapPartNr; /// Battery SAP part number
public int BattBatchNr; /// Batch number (purchase order)
public string BattMMYY; /// Production date
public string BattSupplier; /// Supplier
public string FlowtubeSapPartNr; /// Flowtube SAP part number
public bool IsPorexFlowtube; ///
public string PrintedInfo; /// 'T', 'Vi', '-', 'T/P', 'Vi/P' or '-/P'
public string ProductName;
public double TestTime; /// [s]
public string RFPower_Value;
public string RFPower_LoLim;
public string RFPower_HiLim;
public string RFPower_Unit;
public int ReferenceRecordsCount;
public string FrequencyInfo;
bool complete { get { return (sn != null) && (BattSapPartNr != null) && (BattBatchNr != 0) && (BattMMYY != null) && (BattSupplier != null); } }
static QrEncoder encoder = new QrEncoder();
public RFTestRecord()
{
sn = null; /// Initially there is no PCB number
}
/// <summary>
/// Load a record from an xml-file
/// </summary>
/// <param name="fileName">xml-filename</param>
/// <returns>Record or null</returns>
public static RFTestRecord FromFile(string fileName)
{
try
{
string bareFileName = System.IO.Path.GetFileName(fileName).Replace(".xml", "");
using (Stream inputStream = File.OpenRead(fileName))
{
return FromFile(inputStream, bareFileName);
}
}
catch (Exception exc)
{
log.ErrorFormat("Cannot open file {0}: {1}", fileName, exc.Message);
return null;
}
}
/// <summary>
/// Load a record from a file stream (XML file format)
/// </summary>
/// <param name="inputStream">Input stream</param>
/// <param name="bareFileName">Filename for doc. purpose only</param>
/// <returns>Record</returns>
public static RFTestRecord FromFile(Stream inputStream, string bareFileName)
{
RFTestRecord record = new RFTestRecord();
record.fileName = bareFileName;
try
{
string[] fields = record.fileName.Split(new char[] { '_' });
string dateTimeEtc = fields[(fields.Length == 2) ? 1 : fields.Length - 2];
int yyyy = int.Parse(dateTimeEtc.Substring(0, 4));
int mo = int.Parse(dateTimeEtc.Substring(4, 2));
int dd = int.Parse(dateTimeEtc.Substring(6, 2));
int hh = int.Parse(dateTimeEtc.Substring(8, 2));
int mi = int.Parse(dateTimeEtc.Substring(10, 2));
int ss = int.Parse(dateTimeEtc.Substring(12, 2));
record.timeStamp = new DateTime(yyyy, mo, dd, hh, mi, ss);
XmlDocument xDoc = new XmlDocument();
xDoc.Load(inputStream);
bool testResultFound = false;
foreach (XmlNode node in xDoc.DocumentElement.ChildNodes)
{
if (node.Name == "PRODUCT")
{
record.ProductName = node.Attributes["NAME"].Value;
}
else if (node.Name == "REFS")
{
record.remark = node.Attributes["SEQ_REF"].Value;
}
else if (node.Name == "PANEL")
{
foreach (XmlNode sNode in node.ChildNodes)
{
if (sNode.Name != "DUT") continue;
record.sn = sNode.Attributes["ID"].Value;
string statusStr = sNode.Attributes["STATUS"].Value;
if (statusStr.ToLower().Equals("passed"))
{
record.status = Status.Passed;
}
else if (statusStr.ToLower().Equals("failed"))
{
record.status = Status.Failed;
}
else
{
record.status = Status.Interrupted;
}
record.TestTime = double.Parse(sNode.Attributes["TESTTIME"].Value, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture);
if (testResultFound) continue;
///
/// Search for RF_Power test result
///
foreach (XmlNode ssNode in sNode.ChildNodes)
{
if (ssNode.Name != "GROUP") continue;
foreach (XmlNode sssNode in ssNode.ChildNodes)
{
if (sssNode.Name != "GROUP" || !sssNode.HasChildNodes) continue;
foreach (XmlNode ssssNode in sssNode.ChildNodes)
{
if ((ssssNode.Name == "TEST") && (ssssNode.Attributes["NAME"].Value == "RF_Power") &&
!string.IsNullOrEmpty(ssssNode.Attributes["UNIT"].Value) &&
!string.IsNullOrEmpty(ssssNode.Attributes["VALUE"].Value) &&
!string.IsNullOrEmpty(ssssNode.Attributes["LOLIM"].Value) &&
!string.IsNullOrEmpty(ssssNode.Attributes["HILIM"].Value))
{
record.RFPower_Unit = ssssNode.Attributes["UNIT"].Value;
record.RFPower_Value = ssssNode.Attributes["VALUE"].Value;
record.RFPower_LoLim = ssssNode.Attributes["LOLIM"].Value;
record.RFPower_HiLim = ssssNode.Attributes["HILIM"].Value;
testResultFound = true;
break;
}
}
}
if (testResultFound) break;
}
}
}
}
}
catch (Exception exc)
{
log.ErrorFormat("Cannot parse file {0}: {1}", record.fileName, exc.Message);
return null;
}
return record;
}
public string GetFrequencyInfo()
{
if (!string.IsNullOrEmpty(ProductName))
{
string[] fields = ProductName.Split(new char[] { ' ', '_' });
foreach (var s in fields)
{
if (s.Contains("MHz")) return s;
}
}
return "---";
}
public bool CanSaveRecordToOracle() { return true; }
/// <summary>
/// Save RF_Power measurement result into Oracle DB
/// </summary>
/// <param name="oraConn">Oracle DB connection</param>
/// <returns>true = Record was successfully saved to DB</returns>
public bool SaveRecordToOracle(OracleConnection oraConn)
{
OracleTransaction transaction = null;
try
{
oraConn.Open();
transaction = oraConn.BeginTransaction();
bool exists = false; /// true = Record with the same PcbNumber already exist, use 'update' instead of 'insert'
OracleCommand cmd1 = new OracleCommand("select * from IP_ENDTEST_PD where PCBNUMBER = :1", oraConn);
OracleParameter param = new OracleParameter("PCBNUMBER", OracleDbType.Varchar2);
param.Value = SN;
cmd1.Parameters.Add(param);
OracleDataReader dr1 = cmd1.ExecuteReader();
if (dr1.Read()) { exists = true; }
dr1.Close();
OracleCommand cmd;
if (exists)
{
cmd = new OracleCommand("update IP_ENDTEST_PD set ET_RF_POWER_VALUE = :2, ET_RF_POWER_LOLIM = :3, ET_RF_POWER_HILIM = :4, ET_RF_POWER_UNIT = :5, DUT_TIMESTAMP = :6, TESTSTATIONNAME = :7 where PCBNUMBER = :1", oraConn);
}
else
{
cmd = new OracleCommand("insert into IP_ENDTEST_PD(PCBNUMBER, ET_RF_POWER_VALUE, ET_RF_POWER_LOLIM, ET_RF_POWER_HILIM, ET_RF_POWER_UNIT, DUT_TIMESTAMP, TESTSTATIONNAME) values (:1, :2, :3, :4, :5, :6, :7)", oraConn);
}
OracleParameter parm;
parm = new OracleParameter("PCBNUMBER", OracleDbType.Varchar2); parm.Value = SN; cmd.Parameters.Add(parm);
parm = new OracleParameter("ET_RF_POWER_VALUE", OracleDbType.Varchar2); parm.Value = RFPower_Value; cmd.Parameters.Add(parm);
parm = new OracleParameter("ET_RF_POWER_LOLIM", OracleDbType.Varchar2); parm.Value = RFPower_LoLim; cmd.Parameters.Add(parm);
parm = new OracleParameter("ET_RF_POWER_HILIM", OracleDbType.Varchar2); parm.Value = RFPower_HiLim; cmd.Parameters.Add(parm);
parm = new OracleParameter("ET_RF_POWER_UNIT", OracleDbType.Varchar2); parm.Value = RFPower_Unit; cmd.Parameters.Add(parm);
parm = new OracleParameter("DUT_TIMESTAMP", OracleDbType.TimeStamp); parm.Value = TimeStamp; cmd.Parameters.Add(parm);
parm = new OracleParameter("TESTSTATIONNAME", OracleDbType.Varchar2); parm.Value = RFTestStationName; cmd.Parameters.Add(parm);
cmd.ExecuteNonQuery();
transaction.Commit();
}
catch (Exception exc)
{
if (transaction != null) transaction.Rollback();
oraConn.Close();
log.ErrorFormat("RF_Power test result of PcbNumber={0} was not written into ORACLE database: {1}", SN, exc.Message);
return false;
}
oraConn.Close();
return true;
}
public bool CanPrintRecord() { return true; }
public bool PrintRecord()
{
try
{
new RFTestPrintDocument(this, encoder.Encode(SN), false).Print();
return true;
}
catch (Exception)
{
return false;
}
}
public override string ToString()
{
return string.Format("File={0} PcbNr={1}({2}), Rslt={3}, RF_Power={4} {5}",
fileName,
sn,
ReferenceRecordsCount,
status,
RFPower_Value,
RFPower_Unit);
}
}
}
@@ -0,0 +1,294 @@
///
/// Copyright (c) 2019 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Xml;
using Gma.QrCodeNet.Encoding;
using log4net;
using NHibernate;
using Oracle.DataAccess.Client;
using System.Drawing;
namespace RecordProcessing.Records
{
public class RFTestRecord_400_900 : IRecord
{
static readonly ILog log = LogManager.GetLogger(typeof(RFTestRecord));
public const string RFTestStationName = "STAWL001";
public static string Path;
public string FileName { get { return fileName; } }
public string SN { get { return sn; } set { sn = value; } }
public DateTime TimeStamp { get { return timeStamp; } }
public Status Status { get { return status; } }
public string ResultStr { get { return string.Format("({0} {1})", string.IsNullOrEmpty(RFPower_Value) ? "" : RFPower_Value, string.IsNullOrEmpty(RFPower_Unit) ? "" : RFPower_Unit); } }
public string Remark { get { return string.IsNullOrEmpty(remark) ? string.Empty : remark; } }
string fileName;
string sn;
DateTime timeStamp;
Status status;
string remark;
public string BattSapPartNr; /// Battery SAP part number
public int BattBatchNr; /// Batch number (purchase order)
public string BattMMYY; /// Production date
public string BattSupplier; /// Supplier
public string FlowtubeSapPartNr; /// Flowtube SAP part number
public bool IsPorexFlowtube; ///
public string PrintedInfo; /// 'T', 'Vi', '-', 'T/P', 'Vi/P' or '-/P'
public string ProductName;
public double TestTime; /// [s]
public string RFPower_Value;
public string RFPower_LoLim;
public string RFPower_HiLim;
public string RFPower_Unit;
public int ReferenceRecordsCount;
public string FrequencyInfo;
bool complete { get { return (sn != null) && (BattSapPartNr != null) && (BattBatchNr != 0) && (BattMMYY != null) && (BattSupplier != null); } }
static QrEncoder encoder = new QrEncoder();
public RFTestRecord_400_900()
{
sn = null; /// Initially there is no PCB number
}
/// <summary>
/// Load a record from an xml-file
/// </summary>
/// <param name="fileName">xml-filename</param>
/// <returns>Record or null</returns>
public static RFTestRecord_400_900 FromFile(string fileName)
{
try
{
string bareFileName = System.IO.Path.GetFileName(fileName).Replace(".xml", "");
using (Stream inputStream = File.OpenRead(fileName))
{
return FromFile(inputStream, bareFileName);
}
}
catch (Exception exc)
{
log.ErrorFormat("Cannot open file {0}: {1}", fileName, exc.Message);
return null;
}
}
/// <summary>
/// Load a record from a file stream (XML file format)
/// </summary>
/// <param name="inputStream">Input stream</param>
/// <param name="bareFileName">Filename for doc. purpose only</param>
/// <returns>Record</returns>
public static RFTestRecord_400_900 FromFile(Stream inputStream, string bareFileName)
{
RFTestRecord_400_900 record = new RFTestRecord_400_900();
record.fileName = bareFileName;
try
{
string[] fields = record.fileName.Split(new char[] { '_' });
if (fields.Length >= 2)
{
string dateTimeEtc = fields[1];
int yyyy = int.Parse(dateTimeEtc.Substring(0, 4));
int mo = int.Parse(dateTimeEtc.Substring(4, 2));
int dd = int.Parse(dateTimeEtc.Substring(6, 2));
int hh = int.Parse(dateTimeEtc.Substring(8, 2));
int mi = int.Parse(dateTimeEtc.Substring(10, 2));
int ss = int.Parse(dateTimeEtc.Substring(12, 2));
record.timeStamp = new DateTime(yyyy, mo, dd, hh, mi, ss);
}
else
{
record.timeStamp = DateTime.Now;
}
XmlDocument xDoc = new XmlDocument();
xDoc.Load(inputStream);
bool testResultFound = false;
foreach (XmlNode node in xDoc.DocumentElement.ChildNodes)
{
if (node.Name == "PRODUCT")
{
record.ProductName = node.Attributes["NAME"].Value;
}
else if (node.Name == "REFS")
{
record.remark = node.Attributes["SEQ_REF"].Value;
}
else if (node.Name == "PANEL")
{
foreach (XmlNode sNode in node.ChildNodes)
{
if (sNode.Name != "DUT") continue;
record.sn = sNode.Attributes["ID"].Value;
string statusStr = sNode.Attributes["STATUS"].Value;
if (statusStr.ToLower().Equals("passed"))
{
record.status = Status.Passed;
}
else if (statusStr.ToLower().Equals("failed"))
{
record.status = Status.Failed;
}
else
{
record.status = Status.Interrupted;
}
record.TestTime = double.Parse(sNode.Attributes["TESTTIME"].Value, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture);
if (testResultFound) continue;
///
/// Search for RF_Power test result
///
foreach (XmlNode ssNode in sNode.ChildNodes)
{
if (ssNode.Name != "GROUP") continue;
foreach (XmlNode sssNode in ssNode.ChildNodes)
{
if (sssNode.Name != "GROUP" || !sssNode.HasChildNodes) continue;
foreach (XmlNode ssssNode in sssNode.ChildNodes)
{
if ((ssssNode.Name == "TEST") && (ssssNode.Attributes["NAME"].Value == "RF_Power") &&
!string.IsNullOrEmpty(ssssNode.Attributes["UNIT"].Value) &&
!string.IsNullOrEmpty(ssssNode.Attributes["VALUE"].Value) &&
!string.IsNullOrEmpty(ssssNode.Attributes["LOLIM"].Value) &&
!string.IsNullOrEmpty(ssssNode.Attributes["HILIM"].Value))
{
record.RFPower_Unit = ssssNode.Attributes["UNIT"].Value;
record.RFPower_Value = ssssNode.Attributes["VALUE"].Value;
record.RFPower_LoLim = ssssNode.Attributes["LOLIM"].Value;
record.RFPower_HiLim = ssssNode.Attributes["HILIM"].Value;
testResultFound = true;
break;
}
}
}
if (testResultFound) break;
}
}
}
}
}
catch (Exception exc)
{
log.ErrorFormat("Cannot parse file {0}: {1}", record.fileName, exc.Message);
return null;
}
return record;
}
public string GetFrequencyInfo()
{
if (!string.IsNullOrEmpty(ProductName))
{
string[] fields = ProductName.Split(new char[] { ' ', '_' });
foreach (var s in fields)
{
if (s.Contains("MHz")) return s;
}
}
return "---";
}
public bool CanSaveRecordToOracle() { return true; }
/// <summary>
/// Save RF_Power measurement result into Oracle DB
/// </summary>
/// <param name="oraConn">Oracle DB connection</param>
/// <returns>true = Record was successfully saved to DB</returns>
public bool SaveRecordToOracle(OracleConnection oraConn)
{
OracleTransaction transaction = null;
try
{
oraConn.Open();
transaction = oraConn.BeginTransaction();
bool exists = false; /// true = Record with the same PcbNumber already exist, use 'update' instead of 'insert'
OracleCommand cmd1 = new OracleCommand("select * from IP_FLEXNET_RF_TEST_PD where FLEXNET_UID = :1", oraConn);
cmd1.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = SN });
OracleDataReader dr = cmd1.ExecuteReader();
if (dr.Read()) { exists = true; }
dr.Close();
OracleCommand cmd2 = exists
? new OracleCommand("update IP_FLEXNET_RF_TEST_PD set CHANGEDATE = :1, TESTSTATIONNAME = :3, TESTID = :4, JSON_DATA = :5 where FLEXNET_UID = :2", oraConn)
: new OracleCommand("insert into IP_FLEXNET_RF_TEST_PD(CHANGEDATE, FLEXNET_UID, TESTSTATIONNAME, TESTID, JSON_DATA) values (:1, :2, :3, :4, :5)", oraConn);
cmd2.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.TimeStamp, Value = TimeStamp });
cmd2.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = SN });
cmd2.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = RFTestStationName });
cmd2.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 1 });
cmd2.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Clob, Value = "hovno" });
cmd2.ExecuteNonQuery();
transaction.Commit();
}
catch (Exception exc)
{
if (transaction != null) transaction.Rollback();
oraConn.Close();
log.ErrorFormat("RF_Power test result of PcbNumber={0} was not written into ORACLE database: {1}", SN, exc.Message);
return false;
}
oraConn.Close();
return true;
}
public bool CanPrintRecord() { return true; }
public bool PrintRecord()
{
try
{
new RFTestPrintDocument_400_900(this, encoder.Encode(SN), false).Print();
return true;
}
catch (Exception)
{
return false;
}
}
public override string ToString()
{
return string.Format("File={0} PcbNr={1}({2}), Rslt={3}, RF_Power={4} {5}",
fileName,
sn,
ReferenceRecordsCount,
status,
RFPower_Value,
RFPower_Unit);
}
}
}
+16
View File
@@ -0,0 +1,16 @@
///
/// Copyright (c) 2019 Sensus Slovensko a.s.
///
using System;
namespace RecordProcessing
{
public class SubmitRecordEventArgs : EventArgs
{
public IRecord Record;
public SubmitRecordEventArgs(IRecord record)
{
Record = record;
}
}
}

Some files were not shown because too many files have changed in this diff Show More