tbf/TestBenchFramework/UiControls/ProceduresCtrl.cs
2015-12-31 22:48:22 +01:00

278 lines
7.4 KiB
C#

///
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows.Forms;
using NHibernate;
using log4net;
using Config.Entities;
using TBF.BenchControl;
using TBF.BenchControl.GenericDevices;
using TBF.Resources;
namespace TBF.UiControls
{
public class ProceduresCtrl : BaseWithListViewEx<Procedure>, ITabWithListViewEx
{
static readonly ILog log = LogManager.GetLogger(typeof(ProceduresCtrl));
/// <summary>
/// ListViewEx columns
/// </summary>
enum Column
{
Name,
Description,
ColumnsCount,
}
readonly int columnsCount = (int)Column.ColumnsCount;
ProceduresDlg parent;
Control parentControl;
Control[] editors;
ISession session;
public ProceduresCtrl()
: base()
{
Name = "ProceduresCtrl";
}
public void Initialize(ProceduresDlg parent, Control parentControl)
{
this.parent = parent;
this.parentControl = parentControl;
SubItemClicked += new SubItemEventHandler(listViewEx_SubItemClicked);
SubItemEndEditing += new SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing);
/// ListViewEx columns
TBF.LocalSettings ls = Program.LocalSettings;
Columns.Add(Strings.Name, (ls.ProceduresColumnCount > 0) ? ls.ProceduresColumnWidths[0] : (100 * parent.Dpi / PathsDlg.Dpi100pct));
Columns.Add(Strings.DescriptionColHdr, (ls.ProceduresColumnCount > 1) ? ls.ProceduresColumnWidths[1] : (300 * parent.Dpi / PathsDlg.Dpi100pct));
editors = new Control[columnsCount];
///
editors[(int)Column.Name] = new TextBox(); /// Name
editors[(int)Column.Description] = new TextBox(); /// Description
///
for (int i = 0; i < editors.Length; i++) parent.Controls.Add(editors[i]);
ReloadAndRedrawAll();
}
void ReloadAndRedrawAll()
{
/// Load the procedures
session = Config.FluentCommon.CreateSession(Config.Entities.DBKind.Config);
MyItems = session.CreateQuery("FROM Procedure WHERE ProcedureState = 'Active' ORDER BY ItemNr")
.List<Procedure>();
base.RedrawAll();
}
void listViewEx_SubItemClicked(object sender, SubItemEventArgs e)
{
}
void listViewEx_SubItemEndEditing(object sender, SubItemEndEditingEventArgs e)
{
}
public override void DrawOne(object myItem)
{
Procedure entity = (Procedure)myItem;
ListViewItem lvi = new ListViewItem(entity.Name);
lvi.SubItems.Add(entity.Description);
lvi.Tag = entity;
Items.Add(lvi);
}
public override void UpdateOne(ListViewItem lvi, object myItem)
{
Procedure entity = (Procedure)myItem;
entity.Name = lvi.Text;
entity.Description = lvi.SubItems[(int)Column.Description].Text;
}
/// <summary>
/// Update the entities and save them to the database
/// </summary>
public new void OkBtnClicked()
{
base.OkBtnClicked();
foreach (var entity in ToBeRemovedItems)
{
Config.FluentCommon.DeleteFromDb(session, entity);
}
int itemNr = 0;
foreach (var entity in MyItems)
{
(entity as Procedure).ItemNr = itemNr++;
Config.FluentCommon.SaveToDb(session, entity);
}
/// Update the column widths
Program.LocalSettings.ProceduresColumnWidths = new int[Columns.Count];
for (int i = 0; i < Columns.Count; i++)
{
Program.LocalSettings.ProceduresColumnWidths[i] = Columns[i].Width;
}
Program.LocalSettings.Save();
Program.MainWnd.ReloadProcedures();
}
public void AddOne()
{
/// Find an unused procedure name
string newName;
for (int nameId = 1; true; nameId++)
{
newName = Strings.New_procedure_name + nameId.ToString();
bool notUsed = true;
foreach (var t in MyItems) if (t.Name.Equals(newName)) notUsed = false;
if (notUsed) break;
}
Procedure newProcedure = new Procedure(newName, MyItems.Count);
newProcedure.ProcedureState = ProcedureState.Active;
newProcedure.Revision = 1;
newProcedure.PredecessorId = 0;
newProcedure.ObtainedByCopy = false;
newProcedure.CreationUser = User.CurrentUser.Name;
newProcedure.CreationTime = DateTime.Now;
if (new ProcedureDlg(newProcedure).ShowDialog() == DialogResult.OK)
{
/// TODO: Make name uniqueness test
parent.Unlock();
using(var transaction = session.BeginTransaction())
{
try
{
newProcedure.LastChgUser = User.CurrentUser.Name;
newProcedure.LastChgTime = DateTime.Now;
base.AddOne(newProcedure);
session.SaveOrUpdate(newProcedure);
transaction.Commit();
MessageBox.Show(string.Format(Strings.Procedure_0_added, newProcedure.Name),
Strings.Confirmation,
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
catch (Exception exc)
{
transaction.Rollback();
}
}
session.Flush();
}
}
public new void RemoveSelected()
{
bool lastOneRemoved = base.RemoveSelected();
if (lastOneRemoved && parent != null)
{
parent.UpdateButtonStates(SharedButtons.SelectedItemPos.None);
}
}
public void editButton_Click(object sender, EventArgs e)
{
if (SelectedItems.Count != 1) return;
Procedure originalProcedure = SelectedItems[0].Tag as Procedure;
Procedure modifiedProcedure = originalProcedure.Clone();
modifiedProcedure.ItemNr = originalProcedure.ItemNr;
modifiedProcedure.Revision = originalProcedure.Revision + 1;
modifiedProcedure.ObtainedByCopy = false;
if (new ProcedureDlg(modifiedProcedure).ShowDialog() == DialogResult.OK)
{
/// TODO: Make name uniqueness test
parent.Unlock();
using (var transaction = session.BeginTransaction())
{
try
{
originalProcedure.ProcedureState = ProcedureState.History;
modifiedProcedure.LastChgUser = User.CurrentUser.Name;
modifiedProcedure.LastChgTime = DateTime.Now;
session.SaveOrUpdate(originalProcedure);
session.SaveOrUpdate(modifiedProcedure);
transaction.Commit();
SelectedItems[0].Tag = modifiedProcedure;
MessageBox.Show(string.Format(Strings.Procedure_0_modified, modifiedProcedure.Name),
Strings.Confirmation,
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
catch (Exception exc)
{
transaction.Rollback();
}
}
session.Flush();
}
ReloadAndRedrawAll();
}
public void copyButton_Click(object sender, EventArgs e)
{
if (SelectedItems.Count != 1) return;
Procedure selectedProcedure = (Procedure)SelectedItems[0].Tag;
/// Make a copy of the selected procedure
Procedure newProcedure = selectedProcedure.Clone();
newProcedure.Name = selectedProcedure.Name + Strings.New_name_copy;
newProcedure.ItemNr = MyItems.Count;
newProcedure.ProcedureState = ProcedureState.Active;
newProcedure.Revision = 1;
newProcedure.PredecessorId = selectedProcedure.Id;
newProcedure.ObtainedByCopy = true;
newProcedure.CreationUser = User.CurrentUser.Name;
newProcedure.CreationTime = DateTime.Now;
if ((new ProcedureDlg(newProcedure)).ShowDialog() == DialogResult.OK)
{
/// TODO: Make name uniqueness test
parent.Unlock();
using (var transaction = session.BeginTransaction())
{
newProcedure.LastChgUser = User.CurrentUser.Name;
newProcedure.LastChgTime = DateTime.Now;
base.AddOne(newProcedure);
session.SaveOrUpdate(newProcedure);
transaction.Commit();
MessageBox.Show(string.Format(Strings.Procedure_0_added, newProcedure.Name),
Strings.Confirmation,
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
base.AddOne(newProcedure);
}
}
}
}