tbf/Users/Forms/UserManagementDlg.cs

317 lines
12 KiB
C#

///
/// Copyright (c) 2017-2018 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using NHibernate;
using Users.Entities;
using Users.Resources;
namespace Users.Forms
{
public enum MySortOrder
{
None,
Ascending, /// Th esame like SortOrder.Ascending
Descending, /// The same like SortOrder.Descending
Ascending2, /// Sorts by a surname in ascending order in case or 'Name Surname' column
Descending2, /// Sorts by a surname in descending order in case or 'Name Surname' column
}
public partial class UserManagementDlg: Form
{
const int UserNumberColumn = 1;
const int NameSurnameColumn = 2;
public string TitleExtension;
NHibernate.ISession session;
bool showExtensions;
IList<User> listOfUsers;
int lastSelectedIndex;
MySortOrder sortOrder = MySortOrder.Ascending;
int sortColumn = -1; /// 0-based index of column to be used for sorting
public UserManagementDlg(NHibernate.ISession session, bool showLocalExtensions)
{
InitializeComponent();
this.session = session;
this.showExtensions = showLocalExtensions;
if (showLocalExtensions) copyFromRemoteButton.Visible = true;
}
private void UserManagementDlg_Load(object sender, EventArgs e)
{
/// Program version string
Version ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
string version = string.Format("{0}.{1}.{2}", ver.Major, ver.Minor, ver.Build);
Text = string.Format(string.IsNullOrEmpty(TitleExtension) ? "{0} ver.{1}" : "{0} ver.{1} : {2}", Strings.User_Management, version, TitleExtension);
addButton.Text = Strings.AddBtnText;
editButton.Text = Strings.EditBtnText;
deleteButton.Text = Strings.RemoveBtnText;
closeButton.Text = Strings.CloseBtnText;
listViewUsers.Columns.Add(Strings.User_name, 100); /// column 0
listViewUsers.Columns.Add(Strings.User_code, 70); /// column 1: UserNumberColumn
listViewUsers.Columns.Add(Strings.Full_name, 150); /// column 2: NameSurnameColumn
#if TURA_IPERL || TURA_IPERL_NEW || TURA_SPECIAL
listViewUsers.Columns.Add(Strings.Tag, 110);
#endif
listViewUsers.Columns.Add(Strings.Groups, 370);
try
{
listOfUsers = session.QueryOver<User>().List();
}
catch (Exception exc)
{
string msg = exc.Message;
}
ListUsers();
}
public void ListUsers()
{
Cursor.Current = Cursors.WaitCursor;
listViewUsers.Items.Clear();
foreach (User u in listOfUsers)
{
string grps = string.Empty;
///
#if TURA_IPERL || TURA_IPERL_NEW
foreach (var gid in new Grp.GID[] { Grp.GID.TraceabilityManagement,
Grp.GID.Administrators,
Grp.GID.HeadOfLab,
Grp.GID.Metrologists,
Grp.GID.CalibrationSpecialists,
Grp.GID.TestingSpecialists,
Grp.GID.MaintenanceSpecialists,
Grp.GID.Testers })
#else
foreach (var gid in new Grp.GID[] { Grp.GID.Administrators,
Grp.GID.HeadOfLab,
Grp.GID.Metrologists,
Grp.GID.CalibrationSpecialists,
Grp.GID.TestingSpecialists,
Grp.GID.MaintenanceSpecialists,
Grp.GID.Testers })
#endif
{
if (u.IsMemberOf(gid))
{
if (!string.IsNullOrEmpty(grps)) grps += ", ";
grps += Grp.Gid2Str(gid);
}
}
ListViewItem item = new ListViewItem(u.UserName);
item.SubItems.Add(u.Number.ToString());
item.SubItems.Add(u.FullName);
#if TURA_IPERL || TURA_IPERL_NEW || TURA_SPECIAL
item.SubItems.Add(string.IsNullOrEmpty(u.Tag) ? string.Empty : u.Tag);
#endif
item.SubItems.Add(grps);
item.Tag = u;
this.listViewUsers.Items.Add(item);
}
this.listViewUsers.Refresh();
Cursor.Current = Cursors.Default;
}
private void closeButton_Click(object sender, EventArgs e)
{
this.Close();
}
private void RefreshButtonStates()
{
editButton.Enabled = (listViewUsers.SelectedItems.Count > 0);
deleteButton.Enabled = (listViewUsers.SelectedItems.Count > 0);
}
private void listViewUsers_SelectedIndexChanged(object sender, EventArgs e)
{
RefreshButtonStates();
if (listViewUsers.SelectedItems.Count > 0)
{
lastSelectedIndex = listViewUsers.SelectedItems[0].Index;
}
else
{
lastSelectedIndex = -1;
}
}
private void listViewUsers_ColumnClick(object sender, ColumnClickEventArgs e)
{
if (e.Column == sortColumn)
{
/// Clicked on the same column header => increment to the next applicable MySortOrder
if (e.Column == NameSurnameColumn)
{
sortOrder++;
if (sortOrder > MySortOrder.Descending2) sortOrder = MySortOrder.Ascending;
}
else
{
sortOrder = (sortOrder == MySortOrder.Ascending) ? MySortOrder.Descending : MySortOrder.Ascending;
}
}
else
{
/// Clicked on another column header => set sortOrder to MySortOrder.Ascending
sortColumn = e.Column;
sortOrder = MySortOrder.Ascending;
}
if (sortColumn == UserNumberColumn)
{
listViewUsers.ListViewItemSorter = new LviIntColumnComparer(sortColumn, sortOrder);
}
else if (sortColumn == NameSurnameColumn)
{
listViewUsers.ListViewItemSorter = new LviNameSurnameColumnComparer(sortColumn, sortOrder);
}
else
{
listViewUsers.ListViewItemSorter = new LviTextColumnComparer(sortColumn, sortOrder);
}
listViewUsers.SetSortIcon(sortColumn, sortOrder);
listViewUsers.Sort();
}
private void editButton_Click(object sender, EventArgs e)
{
if (listViewUsers.SelectedItems.Count == 1 && listViewUsers.SelectedItems[0].Tag is User)
{
new Forms.EditSelectedUser(session, (User)listViewUsers.SelectedItems[0].Tag).ShowDialog();
ListUsers();
}
}
private void listViewUsers_DoubleClick(object sender, EventArgs e)
{
editButton_Click (sender, e);
}
private void addButton_Click(object sender, EventArgs e)
{
User newUser = new User();
if (new Forms.EditSelectedUser(session, newUser).ShowDialog() == DialogResult.OK)
{
listOfUsers.Add(newUser);
}
ListUsers();
}
private void deleteButton_Click(object sender, EventArgs e)
{
if (listViewUsers.SelectedItems.Count == 1 && listViewUsers.SelectedItems[0].Tag is User)
{
User Selecteduser = listViewUsers.SelectedItems[0].Tag as User;
session.Delete(Selecteduser);
session.Flush();
listOfUsers.Remove(Selecteduser);
ListUsers();
}
}
private void copyFromRemoteButton_Click(object sender, EventArgs e)
{
if (GlobalData.RemoteUsersDB == null || string.IsNullOrEmpty(GlobalData.RemoteUsersDB.ConnectionString) ||
GlobalData.LocalUsersDB == null || string.IsNullOrEmpty(GlobalData.LocalUsersDB.ConnectionString))
{
MessageBox.Show(Strings.No_remote_database_of_users, Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (MessageBox.Show(Strings.Are_you_sure, Strings.Warning, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) != DialogResult.Yes)
{
return;
}
IList<User> remoteUsers;
IList<Group> remoteGroups;
ITransaction transaction = null;
try
{
///
/// Create remote DB session and read remote users
///
DB.DbType = GlobalData.RemoteUsersDB.DbType;
DB.ConnectionString = GlobalData.RemoteUsersDB.ConnectionString;
ISession remoteSession = DB.CreateSession();
remoteUsers = remoteSession.QueryOver<User>().List();
remoteGroups = remoteSession.QueryOver<Group>().List();
///
/// Prepare local DB session
///
DB.DbType = GlobalData.LocalUsersDB.DbType;
DB.ConnectionString = GlobalData.LocalUsersDB.ConnectionString;
ISession localSession = DB.CreateSession();
transaction = localSession.BeginTransaction();
///
/// Delete all local users
///
IList<User> users = localSession.QueryOver<User>().List();
foreach (var user in users) localSession.Delete(user);
IList<Group> groups = localSession.QueryOver<Group>().List();
foreach (var group in groups) localSession.Delete(group);
///
/// Save all remote users to the local DB
///
IList<User> newUsers = new List<User>();
IList<Group> newGroups = new List<Group>();
foreach (var user in remoteUsers)
{
User newUser = (User)user.Clone();
newUsers.Add(newUser);
foreach (var group in user.Groups)
{
Group newGroup = new Group(group.Gid, group.Name);
newUser.AddGroup(newGroup);
}
localSession.SaveOrUpdate(newUser);
}
transaction.Commit();
localSession.Flush();
listOfUsers = newUsers;
ListUsers();
MessageBox.Show(string.Format(Strings.N_users_copied, remoteUsers.Count),
Strings.Confirmation,
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
catch (Exception)
{
if (transaction != null) transaction.Rollback();
MessageBox.Show(Strings.Copying_remote_users_failed,
Strings.Confirmation,
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
}
}
}