/// /// Copyright (c) 2013-2015 Sensus Metering Systems /// using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using log4net; using NHibernate; using Config.Entities; using TBF.BenchControl.Generic; using TBF.BenchControl.GenericDevices; using TBF.Resources; using TBF.UiControls; namespace TBF { public partial class TransitionsDlg : Form, IParentOfListViewEx { static readonly ILog log = LogManager.GetLogger(typeof(TransitionsDlg)); /// Used when re-scaling the dialog: 100% = 96dpi, 125% = 120dpi, 150% = 144dpi public readonly int Dpi; public const int Dpi100pct = 96; /// /// Fluent-NHibernate database session /// public ISession Session; /// /// Transition sequences to be updated by this dialog. /// Set by the constructor or updated by the parent after creation and before loading. /// public IList TransitionSequences; /// /// Virtual bench sequences to be updated by this dialog. /// Set by the constructor or updated by the parent after creation and before loading. /// public IList VirtualBenchSequences; /// Auxiliary public lists used also by user controls in tab pages public IList TbfComponents; public IList Valves; public IList RegulValves; IList seqStepsCtrls; public TransitionsDlg() { /// Detect display setting: 100% = 96dpi, 125% = 120dpi, 150% = 144dpi. Dpi = (int)this.CreateGraphics().DpiX; InitializeComponent(); /// SharedDlgButtons configuration sharedButtons.RequiredGroupMembership = Config.Grp.GID.Metrologists; sharedButtons.OptionalButtons = SharedButtons.Buttons.Add | SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down | SharedButtons.Buttons.NewTab | SharedButtons.Buttons.RenameTab | SharedButtons.Buttons.RemoveTab; sharedButtons.Unlocked += Unlocked; sharedButtons.OKClicked += okButton_Click; sharedButtons.CancelClicked += cancelButton_Click; sharedButtons.AddClicked += addButton_Click; sharedButtons.RemoveClicked += removeButton_Click; sharedButtons.UpClicked += upButton_Click; sharedButtons.DownClicked += downButton_Click; sharedButtons.NewTabClicked += newTabButton_Click; sharedButtons.RenameTabClicked += renameTabButton_Click; sharedButtons.RemoveTabClicked += removeTabButton_Click; seqStepsCtrls = new List(); TransitionSequences = new List(); VirtualBenchSequences = new List(); } void Localize() { Text = Strings.Transitions; } private void TransitionsDlg_Load(object sender, EventArgs e) { TBF.LocalSettings ls = Program.LocalSettings; Width = (ls.TransitionsDlgWidth > 0) ? ls.TransitionsDlgWidth : 1050; Height = (ls.TransitionsDlgHeight > 0) ? ls.TransitionsDlgHeight : 360; Left = (ls.TransitionsDlgLeft != 0) ? ls.TransitionsDlgLeft : 150; Top = (ls.TransitionsDlgTop != 0) ? ls.TransitionsDlgTop : 150; /// Open the database Session = Config.FluentCommon.CreateSession(Config.Entities.DBKind.Config); /// Prepare a list of components and a list of all valves in the test bench TbfComponents = BenchControl.TbfComponents.LoadComponentsFromDB(Session); Valves = BenchControl.GenericDevices.ValveBase.MasterValves(TbfComponents); RegulValves = new List(); foreach (var cmpnt in TbfComponents) { if ((cmpnt is IRegulValve) && !(cmpnt is BenchControl.Elde.RegulValveTandem.RegulValveTandem)) { RegulValves.Add(cmpnt as IRegulValve); } } /// Load the sequences TransitionSequences = Session.CreateQuery("FROM TransitionSequence ORDER BY ItemNr") .List(); VirtualBenchSequences = Session.CreateQuery("FROM VirtualBenchSequence ORDER BY ItemNr") .List(); /// Create a tab with sequence steps for each sequence ordered by ItemNr. /// Note: Each sequence (in both sequences together) has a unique ItemNr (0 .. N-1) for (int i = 0; i < TransitionSequences.Count + VirtualBenchSequences.Count; i++) { bool skip = false; foreach (var transSeq in TransitionSequences) { if (transSeq.ItemNr == i) { AddTransitionSeqTab(transSeq); skip = true; continue; } } if (skip) continue; foreach (var vBenchSeq in VirtualBenchSequences) { if (vBenchSeq.ItemNr == i) { AddVirtualBenchSeqTab(vBenchSeq); continue; } } } /// Now refresh the content of the dialog RefreshAllTabs(); } void AddTransitionSeqTab(TransitionSequence sequence) { TabPage nwTab = new TabPage(sequence.Name); TransitionStepsCtrl newCtrl = new TransitionStepsCtrl(); seqStepsCtrls.Add(newCtrl); nwTab.Controls.Add(newCtrl); this.tabControl.TabPages.Add(nwTab); newCtrl.Initialize(sequence, this, this.tabControl.TabPages[this.tabControl.TabPages.Count - 1]); newCtrl.SelectedIndexChanged += new System.EventHandler(this.SelectedIndexChanged); } void AddVirtualBenchSeqTab(VirtualBenchSequence sequence) { TabPage nwTab = new TabPage(sequence.Name); VirtualBenchStepsCtrl newCtrl = new VirtualBenchStepsCtrl(); seqStepsCtrls.Add(newCtrl); nwTab.Controls.Add(newCtrl); this.tabControl.TabPages.Add(nwTab); newCtrl.Initialize(sequence, this, this.tabControl.TabPages[this.tabControl.TabPages.Count - 1]); newCtrl.SelectedIndexChanged += new System.EventHandler(this.SelectedIndexChanged); } void RefreshAllTabs() { foreach (var ctrl in seqStepsCtrls) (ctrl as ListViewEx).Refresh(); } private void Unlocked(object sender, EventArgs e) { foreach (var ctrl in seqStepsCtrls) ctrl.Unlock(); } private void newTabButton_Click(object sender, EventArgs e) { Forms.TabNameDlg dlg; bool nameUsed; int tabId = TransitionSequences.Count + VirtualBenchSequences.Count; do { /// Find an unused procedure name string newName; for (int nameId = 1; true; nameId++) { newName = "Tr" + nameId.ToString(); nameUsed = false; foreach (var seq in TransitionSequences) if (seq.Name.Equals(newName)) nameUsed = true; if (!nameUsed) break; } dlg = new Forms.TabNameDlg(); dlg.TabNameLabel = Strings.New_transition_name; dlg.TabName = newName; if (DialogResult.OK != dlg.ShowDialog()) return; foreach (var seq in TransitionSequences) if (seq.Name.Equals(dlg.TabName)) nameUsed = true; if (nameUsed) MessageBox.Show("Please choose another transition sequence name", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Information); } while (nameUsed); if (dlg.IsVirtualBenchSeq) { VirtualBenchSequence sequence = new VirtualBenchSequence(dlg.TabName, tabId); VirtualBenchSequences.Add(sequence); AddVirtualBenchSeqTab(sequence); seqStepsCtrls[tabId].Unlock(); } else { TransitionSequence sequence = new TransitionSequence(dlg.TabName, tabId); TransitionSequences.Add(sequence); AddTransitionSeqTab(sequence); seqStepsCtrls[tabId].Unlock(); } tabControl.SelectTab(tabId); } private void renameTabButton_Click(object sender, EventArgs e) { } private void removeTabButton_Click(object sender, EventArgs e) { } private void okButton_Click(object sender, EventArgs e) { if (seqStepsCtrls.Count > slctdTab) seqStepsCtrls[slctdTab].OkBtnClicked(); using (var transaction = Session.BeginTransaction()) { try { foreach (var transSeq in TransitionSequences) Session.SaveOrUpdate(transSeq); foreach (var vBnchSeq in VirtualBenchSequences) Session.SaveOrUpdate(vBnchSeq); transaction.Commit(); } catch (Exception e2) { MessageBox.Show("Cannot save changes", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); log.ErrorFormat("Update of sequences in the database failed: {0}", e2.Message); } } Program.LocalSettings.TransitionsDlgLeft = Location.X; Program.LocalSettings.TransitionsDlgTop = Location.Y; Program.LocalSettings.TransitionsDlgWidth = Size.Width; Program.LocalSettings.TransitionsDlgHeight = Size.Height; Program.LocalSettings.Save(); DialogResult = DialogResult.OK; Close(); return; } private void cancelButton_Click(object sender, EventArgs e) { Program.LocalSettings.TransitionsDlgLeft = Location.X; Program.LocalSettings.TransitionsDlgTop = Location.Y; Program.LocalSettings.TransitionsDlgWidth = Size.Width; Program.LocalSettings.TransitionsDlgHeight = Size.Height; Program.LocalSettings.Save(); DialogResult = DialogResult.Cancel; Close(); return; } int slctdTab; private void tabControl_SelectedIndexChanged(object sender, EventArgs e) { if (seqStepsCtrls.Count > slctdTab) { seqStepsCtrls[slctdTab].OkBtnClicked(); } slctdTab = tabControl.SelectedIndex; sharedButtons.SetEnabled(SharedButtons.Buttons.Add, true); sharedButtons.DisableButtons(SharedButtons.Buttons.Remove); RefreshAllTabs(); } private void addButton_Click(object sender, EventArgs e) { if (seqStepsCtrls.Count > slctdTab) seqStepsCtrls[slctdTab].AddOne(); } private void removeButton_Click(object sender, EventArgs e) { if (seqStepsCtrls.Count > slctdTab) seqStepsCtrls[slctdTab].RemoveSelected(); } private void upButton_Click(object sender, EventArgs e) { if (seqStepsCtrls.Count > slctdTab) seqStepsCtrls[slctdTab].MoveUpSelected(); } private void downButton_Click(object sender, EventArgs e) { if (seqStepsCtrls.Count > slctdTab) seqStepsCtrls[slctdTab].MoveDownSelected(); } public void UpdateButtonStates(SharedButtons.SelectedItemPos selectedItemPos) { if (selectedItemPos == SharedButtons.SelectedItemPos.None) { sharedButtons.DisableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); } else if (selectedItemPos == SharedButtons.SelectedItemPos.First) { sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Down); sharedButtons.DisableButtons(SharedButtons.Buttons.Up); } else if (selectedItemPos == SharedButtons.SelectedItemPos.Last) { sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up); sharedButtons.DisableButtons(SharedButtons.Buttons.Down); } else if (selectedItemPos == SharedButtons.SelectedItemPos.FirstAndLast) { sharedButtons.EnableButtons(SharedButtons.Buttons.Remove); sharedButtons.DisableButtons(SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); } else { sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); } } private void purgeStartCtrl_SelectedIndexChanged(object sender, EventArgs e) { SelectedIndexChanged(sender, e); } private void purgeEndCtrl_SelectedIndexChanged(object sender, EventArgs e) { SelectedIndexChanged(sender, e); } /// /// Common part for three xxxListViewEx_SelectedIndexChanged event handlers /// /// void SelectedIndexChanged(object sender, EventArgs e) { ListViewEx listViewEx = sender as ListViewEx; if (listViewEx.SelectedItems.Count != 1) { UpdateButtonStates(SharedButtons.SelectedItemPos.None); } else if (listViewEx.Items.Count == 1) { UpdateButtonStates(SharedButtons.SelectedItemPos.FirstAndLast); } else if (listViewEx.SelectedIndices[0] == 0) { UpdateButtonStates(SharedButtons.SelectedItemPos.First); } else if (listViewEx.SelectedIndices[0] == (listViewEx.Items.Count - 1)) { UpdateButtonStates(SharedButtons.SelectedItemPos.Last); } else { UpdateButtonStates(SharedButtons.SelectedItemPos.Middle); } } } }