laatzen/Common/Ui/LegacyGenesisControl/MeterTable.cs
2023-08-25 15:46:44 +02:00

135 lines
4.0 KiB
C#

namespace XylemCommonUiLegacyGenCtl
{
using System;
using System.Collections.Concurrent;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
[ComVisible(true)]
[Guid("D4615BA6-BB83-4C87-BBBB-E5A080BB28EE")]
public class MeterTable : TableLayoutPanel, IDisposable
{
private readonly ConcurrentDictionary<int, Meter> meters;
public MeterTable()
{
this.InitializeComponent();
this.meters = new ConcurrentDictionary<int, Meter>();
}
public void AddMeter(int slotNr, uint address, string serialNr)
{
var eregister = new Meter(slotNr, address, serialNr);
this.meters.AddOrUpdate(slotNr, eregister, (slot, meter) => eregister);
this.UpdateComponent();
}
public void ClearComponent()
{
this.BeginInvoke(new Action(() =>
{
for (int row = this.RowCount - 1; row > 0; row--)
{
this.Controls.RemoveAt(row);
}
}));
}
private void AddCell(string text, int col, int row)
{
var cell = new Label
{
Text = text,
Dock = DockStyle.Fill,
FlatStyle = FlatStyle.Flat,
TextAlign = ContentAlignment.MiddleLeft
};
this.Controls.Add(cell, col, row);
}
private void AddColumnHeader(string text, int col, int row)
{
var header = new Label
{
Text = text,
Dock = DockStyle.Fill,
FlatStyle = FlatStyle.Flat,
TextAlign = ContentAlignment.MiddleLeft
};
header.Font = new Font(header.Font, FontStyle.Bold);
this.Controls.Add(header, col, row);
}
private void InitializeComponent()
{
this.Dock = DockStyle.Top;
this.BackColor = Color.White;
this.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;
this.AutoSize = true;
this.AutoSizeMode = AutoSizeMode.GrowAndShrink;
this.ColumnCount = 4;
this.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 80F));
this.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 100F));
this.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 100F));
this.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
this.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));
this.AddColumnHeader("Einbauplatz", 0, 0);
this.AddColumnHeader("Radio Address", 1, 0);
this.AddColumnHeader("Serial Nr.", 2, 0);
this.AddColumnHeader("Ablauf", 3, 0);
}
private void UpdateComponent()
{
this.BeginInvoke(new Action(() =>
{
foreach (var meterKVP in this.meters)
{
var meter = meterKVP.Value;
meter.Row = this.RowStyles.Add(new RowStyle(SizeType.AutoSize));
this.AddCell($"{meter.SlotNr}", meter.Col++, meter.Row);
this.AddCell($"{meter.AddressI}", meter.Col++, meter.Row);
this.AddCell(meter.SerialNr, meter.Col++, meter.Row);
}
}));
}
}
public class Meter
{
public Meter(int slotNr, uint address, string serialNr)
{
this.SlotNr = slotNr;
this.AddressI = address;
this.SerialNr = serialNr;
}
public int SlotNr { get; set; }
public uint AddressI { get; set; }
public uint AddressII { get; set; }
public string SerialNr { get; set; }
public bool Connected { get; set; }
public bool Parameterized { get; set; }
public bool Closed { get; set; }
public int Row { get; set; }
public int Col { get; set; }
}
}