316 lines
11 KiB
C#
316 lines
11 KiB
C#
///
|
|
/// Copyright (c) 2017-2018 Sensus Slovensko a.s.
|
|
///
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Windows.Forms;
|
|
using NHibernate;
|
|
using Common;
|
|
using Common.Forms;
|
|
using Users.Entities;
|
|
using Users.Resources;
|
|
|
|
|
|
namespace Users.Forms
|
|
{
|
|
public partial class UserManagementDlg: Form
|
|
{
|
|
const int UserNumberColumn = 1;
|
|
const int NameSurnameColumn = 2;
|
|
|
|
|
|
IList<Group> displayedGroups;
|
|
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;
|
|
|
|
try
|
|
{
|
|
IList<Group> allGroups = session.QueryOver<Group>().List();
|
|
|
|
///
|
|
/// Selects groups to be displayed (so that each GID is present only once)
|
|
///
|
|
Group[] dspGroups = new Group[(int)Common.GID.NrOfGroups];
|
|
foreach (var group in allGroups)
|
|
{
|
|
if ((group.GID >= 0) && (group.GID < Common.GID.NrOfGroups) && (dspGroups[(int)group.GID] == null))
|
|
{
|
|
dspGroups[(int)group.GID] = group;
|
|
}
|
|
}
|
|
displayedGroups = new List<Group>();
|
|
foreach (var group in dspGroups)
|
|
{
|
|
if (group != null) displayedGroups.Add(group);
|
|
}
|
|
|
|
listOfUsers = session.QueryOver<User>().List();
|
|
}
|
|
catch (Exception)
|
|
{
|
|
if (displayedGroups == null) displayedGroups = new List<Group>();
|
|
if (listOfUsers == null) listOfUsers = new List<User>();
|
|
}
|
|
|
|
|
|
}
|
|
|
|
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
|
|
listViewUsers.Columns.Add(Strings.Tag, 110);
|
|
listViewUsers.Columns.Add(Strings.Groups, 370);
|
|
|
|
ListUsers();
|
|
}
|
|
|
|
public void ListUsers()
|
|
{
|
|
listViewUsers.Items.Clear();
|
|
foreach (User u in listOfUsers)
|
|
{
|
|
ListViewItem item = new ListViewItem(u.UserName);
|
|
item.Tag = u;
|
|
item.SubItems.Add(u.Number.ToString());
|
|
item.SubItems.Add(u.FullName);
|
|
item.SubItems.Add(string.IsNullOrEmpty(u.Tag) ? string.Empty : u.Tag);
|
|
|
|
/// Show groups of this user
|
|
string grps = string.Empty;
|
|
foreach (var group in displayedGroups)
|
|
{
|
|
if (u.IsMemberOf(group.GID))
|
|
{
|
|
if (!string.IsNullOrEmpty(grps)) grps += ", ";
|
|
grps += group.Gid2Str();
|
|
}
|
|
}
|
|
item.SubItems.Add(grps);
|
|
|
|
this.listViewUsers.Items.Add(item);
|
|
}
|
|
this.listViewUsers.Refresh();
|
|
}
|
|
|
|
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, displayedGroups).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, displayedGroups).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 = session.Get<User>((listViewUsers.SelectedItems[0].Tag as User).Id);
|
|
session.Delete(selecteduser);
|
|
session.Flush();
|
|
listOfUsers.RemoveAt(listViewUsers.SelectedIndices[0]);
|
|
ListUsers();
|
|
}
|
|
}
|
|
|
|
private void copyFromRemoteButton_Click(object sender, EventArgs e)
|
|
{
|
|
if (CurrentUser.RemoteUsersDB == null || string.IsNullOrEmpty(CurrentUser.RemoteUsersDB.ConnectionString) ||
|
|
CurrentUser.LocalUsersDB == null || string.IsNullOrEmpty(CurrentUser.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;
|
|
ISession remoteSession = null;
|
|
ISession localSession = null;
|
|
|
|
try
|
|
{
|
|
///
|
|
/// Create remote DB session and read remote users
|
|
///
|
|
DB.DbType = CurrentUser.RemoteUsersDB.DbType;
|
|
DB.ConnectionString = CurrentUser.RemoteUsersDB.ConnectionString;
|
|
remoteSession = DB.CreateSession();
|
|
remoteUsers = remoteSession.QueryOver<User>().List();
|
|
remoteGroups = remoteSession.QueryOver<Group>().List();
|
|
|
|
///
|
|
/// Prepare local DB session
|
|
///
|
|
DB.DbType = CurrentUser.LocalUsersDB.DbType;
|
|
DB.ConnectionString = CurrentUser.LocalUsersDB.ConnectionString;
|
|
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);
|
|
newUser.AddGroup(newGroup);
|
|
}
|
|
|
|
localSession.SaveOrUpdate(newUser);
|
|
}
|
|
transaction.Commit();
|
|
localSession.Flush();
|
|
localSession.Close();
|
|
remoteSession.Close();
|
|
|
|
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();
|
|
|
|
if (localSession != null && localSession.IsOpen) localSession.Close();
|
|
if (remoteSession != null && remoteSession.IsOpen) remoteSession.Close();
|
|
|
|
MessageBox.Show(Strings.Copying_remote_users_failed,
|
|
Strings.Confirmation,
|
|
MessageBoxButtons.OK,
|
|
MessageBoxIcon.Information);
|
|
}
|
|
}
|
|
}
|
|
}
|