/// /// Copyright (c) 2016-2022 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using System.Windows.Forms; using log4net; using Common.Forms; using SharedDatabase.Entities; using ProductionTracing.Resources; namespace ProductionTracing.Forms { public partial class TracingConfigDlg : Form { /// /// ListViewEx columns /// enum Column { Item, Caption, Format, Precision, Width, Count, } Control[] editors; public IList AvailableItems; public IList SelectedItems; public bool Compound; /// false = single meter items, true = combined meter items public TracingConfigDlg() { 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.Cancel; 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.Format }); selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Precision }); selectedResultsListViewEx.Columns.Add(new ColumnHeader { Text = Strings.Width }); editors = new Control[] { null, new TextBox(), new TextBox(), new TextBox(), new TextBox(), }; 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 > 0) && (e.SubItem < (int)Column.Count)) { selectedResultsListViewEx.StartEditing(editors[e.SubItem], e.Item, e.SubItem); } } void selectedResultsListViewEx_SubItemEndEditing(object sender, SubItemEndEditingEventArgs e) { ListViewItem lvi = e.Item; ItemSpec item = lvi.Tag as ItemSpec; switch ((Column)e.SubItem) { case Column.Caption: item.Caption = e.DisplayText; return; 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 } default: return; /// OK } e.DisplayText = e.Item.SubItems[e.SubItem].Text; e.Cancel = true; return; } /// /// Redraw selected items (right hand side) /// void RedrawAvailable() { availableResultsListBox.Items.Clear(); AvailableItems = new List(); foreach (var item in ItemSpec.AllItems) { AvailableItems.Add(item); availableResultsListBox.Items.Add(item.Name); } } /// /// Redraw selected items (right hand side) /// 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.Format); /// Format lvi.SubItems.Add(item.Precision); /// Precision lvi.SubItems.Add(item.Width.ToString()); /// Width 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]]; SelectedItems.Add(oriItem.Clone()); 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]]; SelectedItems.Add(oriItem.Clone()); } 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; } ItemSpec 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; } ItemSpec 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(); } } }