379 lines
12 KiB
C#
379 lines
12 KiB
C#
///
|
|
/// Copyright (c) 2016 Sensus Metering Systems
|
|
///
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Windows.Forms;
|
|
using log4net;
|
|
using Config.Entities;
|
|
using Results;
|
|
using Results.Resources;
|
|
|
|
namespace Results.Forms
|
|
{
|
|
public partial class ResultsConfigDlg : Form
|
|
{
|
|
/// <summary>
|
|
/// ListViewEx columns
|
|
/// </summary>
|
|
enum Column
|
|
{
|
|
Item,
|
|
Caption,
|
|
Units,
|
|
Format,
|
|
Precision,
|
|
Width,
|
|
Alignment,
|
|
TestID,
|
|
Count,
|
|
}
|
|
|
|
Control[] editors; /// all editors except of units
|
|
ComboBox unitsCB; /// units combo box
|
|
|
|
|
|
public IList<WMeterRsltItemSpec> AvailableItems;
|
|
public IList<WMeterRsltItemSpec> SelectedItems;
|
|
|
|
public MetersKind MetersKind;
|
|
|
|
|
|
bool supressTestIDColumn;
|
|
|
|
|
|
public ResultsConfigDlg(bool supressTestIDColumn)
|
|
: this()
|
|
{
|
|
this.supressTestIDColumn = supressTestIDColumn;
|
|
}
|
|
|
|
public ResultsConfigDlg()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
|
|
void Localize()
|
|
{
|
|
Text = Strings.Configuration;
|
|
availableResultsLabel.Text = Strings.Available_results;
|
|
selectedResultsLabel.Text = Strings.Selected_results;
|
|
addButton.Text = Strings.Add;
|
|
removeButton.Text = Strings.Remove;
|
|
removeAllButton.Text = Strings.Remove_all;
|
|
okButton.Text = Strings.OkBtnText;
|
|
cancelButton.Text = Strings.CancelBtnText;
|
|
upButton.Text = Strings.UpBtnText;
|
|
downButton.Text = Strings.DownBtnText;
|
|
}
|
|
|
|
void ResultsConfig_Load(object sender, EventArgs e)
|
|
{
|
|
Localize();
|
|
|
|
/// Add columns to ListViewEx
|
|
selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Item, Width = 120 });
|
|
selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Caption });
|
|
selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Units });
|
|
selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Format });
|
|
selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Precision });
|
|
selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Width });
|
|
selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Alignment });
|
|
if (!supressTestIDColumn)
|
|
{
|
|
selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Test_ID });
|
|
}
|
|
|
|
/// Create controls used by ListViewEx to edit items
|
|
unitsCB = new ComboBox();
|
|
|
|
ComboBox alignmentCB = new ComboBox();
|
|
for (Config.Entities.Alignment a = 0; a < Config.Entities.Alignment.Count; a++)
|
|
{
|
|
alignmentCB.Items.Add(a.ToDescription());
|
|
}
|
|
|
|
editors = new Control[]
|
|
{
|
|
null,
|
|
new TextBox(), /// caption
|
|
unitsCB,
|
|
new TextBox(), /// format
|
|
new TextBox(), /// precision
|
|
new TextBox(), /// width
|
|
alignmentCB,
|
|
new TextBox(), /// testID
|
|
};
|
|
foreach (var edi in editors)
|
|
{
|
|
if (edi != null)
|
|
{
|
|
edi.Visible = false;
|
|
Controls.Add(edi);
|
|
}
|
|
}
|
|
|
|
selectedResultsListViewEx.SubItemClicked += new SubItemEventHandler(selectedResultsListViewEx_SubItemClicked);
|
|
selectedResultsListViewEx.SubItemEndEditing += new SubItemEndEditingEventHandler(selectedResultsListViewEx_SubItemEndEditing);
|
|
|
|
RedrawAvailable();
|
|
RedrawSelected();
|
|
}
|
|
|
|
void selectedResultsListViewEx_SubItemClicked(object sender, SubItemEventArgs e)
|
|
{
|
|
if (e.SubItem == (int)Column.Units)
|
|
{
|
|
Config.Quantity quantity = (e.Item.Tag as WMeterRsltItemSpec).Quantity;
|
|
unitsCB.Items.Clear();
|
|
unitsCB.Items.Add(Config.Unit.None.ToDescription()); /// "---"
|
|
for (Config.Unit u = (Config.Unit)1; u < Config.Unit.Count; u++)
|
|
{
|
|
if (Config.Units.IsQuantity(u, quantity)) unitsCB.Items.Add(u.ToDescription());
|
|
}
|
|
selectedResultsListViewEx.StartEditing(unitsCB, e.Item, e.SubItem);
|
|
}
|
|
else if ((e.SubItem > 0) && (e.SubItem < (int)(supressTestIDColumn ? Column.TestID : Column.Count)))
|
|
{
|
|
selectedResultsListViewEx.StartEditing(editors[e.SubItem], e.Item, e.SubItem);
|
|
}
|
|
}
|
|
|
|
void selectedResultsListViewEx_SubItemEndEditing(object sender, SubItemEndEditingEventArgs e)
|
|
{
|
|
ListViewItem lvi = e.Item;
|
|
WMeterRsltItemSpec item = lvi.Tag as WMeterRsltItemSpec;
|
|
|
|
switch ((Column)e.SubItem)
|
|
{
|
|
case Column.Caption: item.Caption = e.DisplayText; return;
|
|
case Column.Units:
|
|
for (Config.Unit u = 0; u < Config.Unit.Count; u++)
|
|
{
|
|
if (u.ToDescription().Equals(unitsCB.Text))
|
|
{
|
|
item.Units = u;
|
|
return; /// OK
|
|
}
|
|
}
|
|
break; /// Error
|
|
|
|
case Column.Format: item.Format = e.DisplayText; return;
|
|
case Column.Precision: item.Precision = e.DisplayText; return;
|
|
case Column.Width:
|
|
{
|
|
int width;
|
|
if (Int32.TryParse(editors[e.SubItem].Text, out width) && width >= 0)
|
|
{
|
|
item.Width = width;
|
|
return; /// OK
|
|
}
|
|
break; /// Error
|
|
}
|
|
|
|
case Column.Alignment:
|
|
for (Config.Entities.Alignment a = 0; a < Config.Entities.Alignment.Count; a++)
|
|
{
|
|
if (a.ToDescription().Equals(editors[e.SubItem].Text))
|
|
{
|
|
item.Alignment = a;
|
|
return;
|
|
}
|
|
}
|
|
break; /// Error
|
|
|
|
case Column.TestID: item.TestID = e.DisplayText; return;
|
|
|
|
default:
|
|
return; /// OK
|
|
}
|
|
|
|
e.DisplayText = e.Item.SubItems[e.SubItem].Text;
|
|
e.Cancel = true;
|
|
return;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Redraw selected items (right hand side)
|
|
/// </summary>
|
|
void RedrawAvailable()
|
|
{
|
|
availableResultsListBox.Items.Clear();
|
|
AvailableItems = new List<WMeterRsltItemSpec>();
|
|
foreach (var item in WMeterRsltItemSpec.AllItems)
|
|
{
|
|
AvailableItems.Add(item);
|
|
availableResultsListBox.Items.Add(item.Name);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Redraw selected items (right hand side)
|
|
/// </summary>
|
|
void RedrawSelected()
|
|
{
|
|
selectedResultsListViewEx.Items.Clear();
|
|
foreach (var item in SelectedItems)
|
|
{
|
|
ListViewItem lvi = new ListViewItem(item.Name); /// Item
|
|
lvi.Tag = item;
|
|
lvi.SubItems.Add(item.Caption); /// Header
|
|
lvi.SubItems.Add(item.Units.ToDescription()); /// Units
|
|
lvi.SubItems.Add(item.Format); /// Format
|
|
lvi.SubItems.Add(item.Precision); /// Precision
|
|
lvi.SubItems.Add(item.Width.ToString()); /// Width
|
|
lvi.SubItems.Add(item.Alignment.ToDescription()); /// Alignment
|
|
if (!supressTestIDColumn)
|
|
{
|
|
lvi.SubItems.Add(item.TestID); /// TestID
|
|
}
|
|
|
|
selectedResultsListViewEx.Items.Add(lvi);
|
|
}
|
|
}
|
|
|
|
void UpdateSelectedFromView()
|
|
{
|
|
}
|
|
|
|
void availableResultsListBox_DoubleClick(object sender, EventArgs e)
|
|
{
|
|
/// Double click works when just one item is selected
|
|
if (availableResultsListBox.SelectedIndices.Count == 1)
|
|
{
|
|
var oriItem = AvailableItems[availableResultsListBox.SelectedIndices[0]];
|
|
WMeterRsltItemSpec newItem = oriItem.Clone();
|
|
newItem.Caption = newItem.Name;
|
|
SelectedItems.Add(newItem);
|
|
RedrawAvailable();
|
|
RedrawSelected();
|
|
|
|
/// Select the last item
|
|
selectedResultsListViewEx.Focus();
|
|
selectedResultsListViewEx.Items[SelectedItems.Count - 1].Selected = true;
|
|
selectedResultsListViewEx.Items[SelectedItems.Count - 1].EnsureVisible();
|
|
}
|
|
}
|
|
|
|
void addButton_Click(object sender, EventArgs e)
|
|
{
|
|
/// Append at the end, this code supports multiple selected items,
|
|
/// although ListBox control settings may limit the max.number of selected items to one.
|
|
|
|
for (int i = availableResultsListBox.SelectedIndices.Count - 1; i >= 0; i--)
|
|
{
|
|
var oriItem = AvailableItems[availableResultsListBox.SelectedIndices[i]];
|
|
WMeterRsltItemSpec newItem = oriItem.Clone();
|
|
newItem.Caption = newItem.Name;
|
|
SelectedItems.Add(newItem);
|
|
}
|
|
RedrawAvailable();
|
|
RedrawSelected();
|
|
|
|
/// Select the last item
|
|
selectedResultsListViewEx.Focus();
|
|
selectedResultsListViewEx.Items[SelectedItems.Count - 1].Selected = true;
|
|
selectedResultsListViewEx.Items[SelectedItems.Count - 1].EnsureVisible();
|
|
}
|
|
|
|
private void selectedResultsListBox_DoubleClick(object sender, EventArgs e)
|
|
{
|
|
/// Double click works when just one item is selected
|
|
|
|
if (selectedResultsListViewEx.SelectedIndices.Count == 1)
|
|
{
|
|
SelectedItems.RemoveAt(selectedResultsListViewEx.SelectedIndices[0]);
|
|
RedrawAvailable();
|
|
RedrawSelected();
|
|
}
|
|
}
|
|
|
|
void removeButton_Click(object sender, EventArgs e)
|
|
{
|
|
/// Remove from the list (the last selected item first so that the indexes are not affected)
|
|
|
|
for (int i = selectedResultsListViewEx.SelectedIndices.Count - 1; i >= 0; i--)
|
|
{
|
|
SelectedItems.RemoveAt(selectedResultsListViewEx.SelectedIndices[i]);
|
|
}
|
|
RedrawAvailable();
|
|
RedrawSelected();
|
|
}
|
|
|
|
void removeAllButton_Click(object sender, EventArgs e)
|
|
{
|
|
/// Remove all items from 'Selected' list
|
|
|
|
SelectedItems.Clear();
|
|
RedrawAvailable();
|
|
RedrawSelected();
|
|
}
|
|
|
|
void okButton_Click(object sender, EventArgs e)
|
|
{
|
|
DialogResult = DialogResult.OK;
|
|
Close();
|
|
}
|
|
|
|
private void ResultsConfigDlg_KeyPress(object sender, KeyPressEventArgs e)
|
|
{
|
|
e.Handled = true;
|
|
}
|
|
|
|
private void upButton_Click(object sender, EventArgs e)
|
|
{
|
|
if (selectedResultsListViewEx.SelectedIndices.Count != 1) return;
|
|
|
|
int selIdx = selectedResultsListViewEx.SelectedIndices[0];
|
|
if (selIdx == 0)
|
|
{
|
|
/// Cannot move up
|
|
selectedResultsListViewEx.Focus();
|
|
selectedResultsListViewEx.Items[0].Selected = true;
|
|
return;
|
|
}
|
|
|
|
WMeterRsltItemSpec tmp = SelectedItems[selIdx - 1];
|
|
SelectedItems[selIdx - 1] = SelectedItems[selIdx];
|
|
SelectedItems[selIdx] = tmp;
|
|
|
|
RedrawSelected();
|
|
|
|
selectedResultsListViewEx.Focus();
|
|
selectedResultsListViewEx.Items[selIdx - 1].Selected = true;
|
|
selectedResultsListViewEx.Items[selIdx - 1].EnsureVisible();
|
|
}
|
|
|
|
private void downButton_Click(object sender, EventArgs e)
|
|
{
|
|
if (selectedResultsListViewEx.SelectedIndices.Count != 1) return;
|
|
|
|
int selIdx = selectedResultsListViewEx.SelectedIndices[0];
|
|
if (selIdx == SelectedItems.Count - 1)
|
|
{
|
|
/// Cannot move down
|
|
selectedResultsListViewEx.Focus();
|
|
selectedResultsListViewEx.Items[SelectedItems.Count - 1].Selected = true;
|
|
return;
|
|
}
|
|
|
|
WMeterRsltItemSpec tmp = SelectedItems[selIdx + 1];
|
|
SelectedItems[selIdx + 1] = SelectedItems[selIdx];
|
|
SelectedItems[selIdx] = tmp;
|
|
|
|
RedrawSelected();
|
|
|
|
selectedResultsListViewEx.Focus();
|
|
selectedResultsListViewEx.Items[selIdx + 1].Selected = true;
|
|
selectedResultsListViewEx.Items[selIdx + 1].EnsureVisible();
|
|
}
|
|
|
|
private void cancelButton_Click(object sender, EventArgs e)
|
|
{
|
|
DialogResult = DialogResult.Cancel;
|
|
Close();
|
|
}
|
|
}
|
|
}
|