Files
tbf/TBF/Rig/Configs/ParamsProvider/ComponentCfgCtrl.cs
T
2022-01-07 12:23:22 +01:00

216 lines
6.5 KiB
C#

///
/// Copyright (c) 2018 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using log4net;
using Common;
using Common.Forms;
using Config.Entities;
using TBF.Rig.Generic;
using TBF.Resources;
namespace TBF.Rig.Configs.ParamsProvider
{
public partial class ComponentCfgCtrl : UserControl, IComponentCfgCtrl
{
static readonly ILog log = LogManager.GetLogger(typeof(ComponentCfgCtrl));
static readonly string AkaPwd = "········";
static readonly string AkaPwd1 = "·"; /// One character only
bool IsPassword(int i)
{
string lowerCaseName = paramsProvider.ParamName(i).ToLower();
return (lowerCaseName.Contains("password") || lowerCaseName.Contains("user id"));
}
public bool ShowMore { get { return false; } }
IParamsProvider paramsProvider;
///
public IComponentCfg Config
{
get
{
return paramsProvider as IComponentCfg;
}
set
{
paramsProvider = value as IParamsProvider;
Redraw();
}
}
Control[] editors;
CfgUpdateFlags flags;
public ComponentCfgCtrl()
{
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 ComponentCfgCtrl(IParamsProvider paramsProvider, IEnumerable<Component> parents)
: this()
{
this.paramsProvider = paramsProvider;
if (parents == null)
{
parentLabel.Visible = false;
parentComboBox.Visible = false;
}
else
{
foreach (var p in parents) parentComboBox.Items.Add(p.Name);
}
editors = new Control[paramsProvider.ParamsCount()];
for (int i = 0; i < paramsProvider.ParamsCount(); i++)
{
ICollection<string> values = paramsProvider.ParamValues(i);
if (values == null)
{
editors[i] = new TextBox();
if (IsPassword(i))
{
(editors[i] as TextBox).UseSystemPasswordChar = true;
}
}
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 SubItemEventHandler(paramsListViewEx_SubItemClicked);
paramsListViewEx.SubItemEndEditing += new SubItemEndEditingEventHandler(paramsListViewEx_SubItemEndEditing);
}
void Localize()
{
componentClassLabel.Text = Strings.Component_class;
nameLabel.Text = Strings.Name;
parentLabel.Text = Strings.Parent_name;
}
private void EntryFormCfgCtrl_Load(object sender, EventArgs e)
{
Localize();
paramsListViewEx.Columns.Add(Strings.Parameter, 210);
paramsListViewEx.Columns.Add(Strings.Value, 210);
Redraw();
}
public void Closing()
{
/// Close CmdResponse handlers here
}
void Redraw()
{
if (paramsProvider == null) return; /// Control was not loaded, settings were not changed
componentClassTextBox.Text = Config.Factory.ClassName;
nameTextBox.Text = Config.Name;
if (parentComboBox.Visible) parentComboBox.Text = Config.ParentName;
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()
{
nameTextBox.Enabled = true;
parentComboBox.Enabled = true; /// It still may be invisible
paramsListViewEx.Enabled = true;
}
public CfgUpdateFlags VerifyCfg(ref string message)
{
/// Verify the parent (if parent combo box is visible)
if (!parentComboBox.Visible || parentComboBox.Items.Contains(parentComboBox.Text))
{
return CfgUpdateFlags.None;
}
message += Environment.NewLine + string.Format(Strings.Invalid_0, parentLabel.Text);
return CfgUpdateFlags.Error;
}
public CfgUpdateFlags UpdateCfg()
{
if (paramsProvider == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed
CfgUpdateFlags f = this.flags;
if (Config.Name != nameTextBox.Text)
{
Config.Name = nameTextBox.Text;
f |= CfgUpdateFlags.RestartRqrd;
}
if (parentComboBox.Visible && Config.ParentName != parentComboBox.Text)
{
Config.ParentName = parentComboBox.Text;
f |= CfgUpdateFlags.RestartRqrd;
}
return f;
}
private void paramsListViewEx_SubItemClicked(object sender, 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, SubItemEndEditingEventArgs e)
{
if (e.SubItem != 1) return;
int itemNr = (int)e.Item.Tag;
string message;
if (paramsProvider.ValidateParam(itemNr, e.DisplayText, out message))
{
if (!IsPassword(itemNr))
{
flags |= paramsProvider.UpdateParam(itemNr, e.DisplayText);
}
else
{
if (!e.DisplayText.Contains(AkaPwd1)) flags |= paramsProvider.UpdateParam(itemNr, e.DisplayText);
e.DisplayText = AkaPwd;
}
}
else
{
MessageBox.Show(message);
e.DisplayText = e.Item.SubItems[e.SubItem].Text;
e.Cancel = true;
}
}
}
}