/// /// 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 displayedGroups; public string TitleExtension; NHibernate.ISession session; bool showExtensions; IList 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 allGroups = session.QueryOver().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(); foreach (var group in dspGroups) { if (group != null) displayedGroups.Add(group); } listOfUsers = session.QueryOver().List(); } catch (Exception) { if (displayedGroups == null) displayedGroups = new List(); if (listOfUsers == null) listOfUsers = new List(); } } 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((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 remoteUsers; IList 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().List(); remoteGroups = remoteSession.QueryOver().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 users = localSession.QueryOver().List(); foreach (var user in users) localSession.Delete(user); IList groups = localSession.QueryOver().List(); foreach (var group in groups) localSession.Delete(group); /// /// Save all remote users to the local DB /// IList newUsers = new List(); IList newGroups = new List(); 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); } } } }