/// /// Copyright (c) 2020 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using System.Windows.Forms; using NHibernate; using Common.UIControls; using Events; using Events.Entities; using EventViewer.Resources; using System.Drawing; namespace EventViewer { public partial class EventViewerWnd : Form { public const int Dpi100pct = 96; int currentDpi; enum Column { DateTime, Bench, Source, Class, Severity, Message, Count } ISession session; IList subscribers; IList events; SortOrder sortOrder = SortOrder.Ascending; int sortColumn = -1; /// 0-based index of column to be used for sorting EViewerOption eViewerOption; string loginUserName; string currentUser { get { if (!string.IsNullOrEmpty(loginUserName)) { return loginUserName; } else if (Program.LocalSettings != null && Program.LocalSettings.NonAnonymousAccess && !string.IsNullOrEmpty(Program.LocalSettings.UserName)) { return Program.LocalSettings.UserName; } else { return null; } } } /// The following 3 private variables determine whether list of events is redrawn EViewerOption lastEViewerOption; string lastUser; int lastRecentTimePeriodInDays; public EventViewerWnd() { InitializeComponent(); loginUserName = null; eViewerOption = string.IsNullOrEmpty(currentUser) ? EViewerOption.RecentEvents : EViewerOption.UnreadEvents; lastEViewerOption = EViewerOption.Undefined; lastRecentTimePeriodInDays = 0; Localize(); currentDpi = (int)this.CreateGraphics().DpiX; LocalSettings ls = Program.LocalSettings; eventsListView.Columns.Add(Strings.Date_time, (ls.ColWid1 > 0) ? ls.ColWid1 : 80 * currentDpi / Dpi100pct); eventsListView.Columns.Add(Strings.Bench, (ls.ColWid2 > 0) ? ls.ColWid2 : 50 * currentDpi / Dpi100pct); eventsListView.Columns.Add(Strings.Source, (ls.ColWid3 > 0) ? ls.ColWid3 : 100 * currentDpi / Dpi100pct); eventsListView.Columns.Add(Strings.Class, (ls.ColWid4 > 0) ? ls.ColWid4 : 60 * currentDpi / Dpi100pct); eventsListView.Columns.Add(Strings.Severity, (ls.ColWid5 > 0) ? ls.ColWid5 : 70 * currentDpi / Dpi100pct); eventsListView.Columns.Add(Strings.Message, (ls.ColWid6 > 0) ? ls.ColWid6 : 500 * currentDpi / Dpi100pct); LoadUISettings(); } void Localize() { RedrawTitle(); eventsSelectionGroupBox.Text = Strings.Event_selection; unreadEventsRadioButton.Text = Strings.Unread_events; recentEventsRadioButton.Text = Strings.Recent_events; allEventsRadioButton.Text = Strings.All_events; settingsButton.Text = Strings.Settings; userLoginButton.Text = Strings.User_login; } void RedrawTitle() { Text = string.Format("{0} {1} {2}", Strings.Event_viewer, Program.Version, !string.IsNullOrEmpty(currentUser) ? string.Format("({0})", currentUser) : string.Empty); } private void EventViewerWnd_Load(object sender, EventArgs e) { try { DB.DbType = DBType.MySql; DB.ConnectionString = Program.LocalSettings.ConnectionString; session = DB.CreateSession(); subscribers = session.QueryOver().List(); unreadEventsRadioButton.Checked = true; } catch (Exception exc) { MessageBox.Show(string.Format("{0}{1}{2}", Strings.Cannot_connect_to_the_database, Environment.NewLine, exc.Message), Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } private void unreadEventsRadioButton_CheckedChanged(object sender, EventArgs e) { if (unreadEventsRadioButton.Checked) eViewerOption = EViewerOption.UnreadEvents; Redraw(); } private void recentEventsRadioButton_CheckedChanged(object sender, EventArgs e) { if (recentEventsRadioButton.Checked) eViewerOption = EViewerOption.RecentEvents; Redraw(); } private void allEventsRadioButton_CheckedChanged(object sender, EventArgs e) { if (allEventsRadioButton.Checked) eViewerOption = EViewerOption.AllEvents; Redraw(); } /// /// Redraw events /// /// true = Display all events (also confirmed read) void Redraw(bool redrawAlways = false) { int days = Program.LocalSettings.RecentTimeDays; if (!redrawAlways && lastEViewerOption == eViewerOption && lastUser == currentUser && lastRecentTimePeriodInDays == days) { return; /// Do not redraw the list of events } try { if (eViewerOption == EViewerOption.AllEvents) { /// Read all events events = session.QueryOver().List(); } else if (eViewerOption == EViewerOption.RecentEvents) { /// Read events from tha last 'recentTimePeriodInDays' days events = session.QueryOver() .Where(e => (e.TimeStamp >= DateTime.Now - new TimeSpan(days, 0, 0, 0))) .List(); } else if (!string.IsNullOrEmpty(loginUserName)) { /// Read unread events of the specified user events = session.QueryOver() .JoinQueryOver(e => e.Subscribers) .Where(s => (s.Name == string.Format("User_{0}", loginUserName))) .List(); } else { /// Read unread events of all users events = session.QueryOver() .JoinQueryOver(e => e.Subscribers) .List(); for (int i = 0; i < events.Count; i++) { for (int j = events.Count - 1; j > i; j--) { if (events[i].Id == events[j].Id) events.RemoveAt(j); } } } eventsListView.Items.Clear(); foreach (var e in events) AddOne(e); lastEViewerOption = eViewerOption; lastUser = currentUser; lastRecentTimePeriodInDays = days; } catch (Exception exc) { MessageBox.Show(string.Format("{0}{1}{2}", Strings.Cannot_connect_to_the_database, Environment.NewLine, exc.Message), Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } void AddOne(Event evnt) { ListViewItem lvi = new ListViewItem(evnt.TimeStamp.ToString("dd.MM.yyyy HH:mm")); lvi.Tag = evnt; lvi.SubItems.Add(evnt.Bench); lvi.SubItems.Add(evnt.Source); lvi.SubItems.Add(evnt.EventClass.ToString()); { lvi.UseItemStyleForSubItems = false; lvi.SubItems.Add(evnt.Severity.ToString()); lvi.SubItems[lvi.SubItems.Count - 1].BackColor = Utils.GetSeverityColor(evnt.Severity); lvi.SubItems[lvi.SubItems.Count - 1].ForeColor = Utils.GetSeverityColor(evnt.Severity, true); } lvi.SubItems.Add(evnt.Message); eventsListView.Items.Add(lvi); } private void eventsListView_ColumnClick(object sender, ColumnClickEventArgs e) { if (e.Column == sortColumn) { sortOrder = (sortOrder == SortOrder.Ascending) ? SortOrder.Descending : SortOrder.Ascending; } else { /// Clicked on another column header => set sortOrder to SortOrder.Ascending sortColumn = e.Column; sortOrder = SortOrder.Ascending; } switch ((Column)sortColumn) { default: case Column.DateTime: eventsListView.ListViewItemSorter = new LviDateTimeColumnComparer(sortColumn, sortOrder); break; case Column.Bench: case Column.Source: case Column.Class: case Column.Severity: case Column.Message: eventsListView.ListViewItemSorter = new LviTextColumnComparer(sortColumn, sortOrder); break; } eventsListView.SetSortIcon(sortColumn, sortOrder); eventsListView.Sort(); } private void eventsListView_MouseDoubleClick(object sender, MouseEventArgs e) { if (eventsListView.SelectedIndices.Count != 1) return; Event evnt = eventsListView.SelectedItems[0].Tag as Events.Entities.Event; if (evnt == null) return; bool enableConfirmReadButton = (session != null) && (eViewerOption == EViewerOption.UnreadEvents) && !string.IsNullOrEmpty(currentUser); if ((new Forms.EventDetailsDlg(evnt, enableConfirmReadButton)).ShowDialog() == DialogResult.OK) { /// Reading selected event was confirmed => delete subscriber from this event.Subscribers foreach (var s in subscribers) { if (s.Name == string.Format("User_{0}", currentUser)) { session.CreateSQLQuery(string.Format("DELETE FROM `eventsubscriber` WHERE Event_id = {0} AND Subscriber_id = {1};", evnt.Id, s.Id)) .ExecuteUpdate(); session.Flush(); Redraw(true); break; } } } } private void settingsButton_Click(object sender, EventArgs e) { //Users.Entities.GID[] groupsWithAccess = new Users.Entities.GID[] { Users.Entities.GID.Administrators }; Users.Forms.LoginDlg dlg = new Users.Forms.LoginDlg(true); if (dlg.ShowDialog() == DialogResult.OK) { if ((new Forms.SettingsDlg()).ShowDialog() == DialogResult.OK) { Close(); } } } private void userLoginButton_Click(object sender, EventArgs e) { try { Users.GlobalData.RemoteUsersDB = new Users.DBSettings(Users.Entities.DBType.MySql, Program.LocalSettings.UsersDBConnString); Users.Forms.LoginDlg dlg = new Users.Forms.LoginDlg(); if (dlg.ShowDialog() == DialogResult.OK) { loginUserName = dlg.UserName; RedrawTitle(); Redraw(); } } catch (Exception) { } } private void EventViewerWnd_FormClosing(object sender, FormClosingEventArgs e) { SaveUISettings(); } private void LoadUISettings() { LocalSettings ls = Program.LocalSettings; if (ls != null) { WindowState = (ls.WndMaximized ? FormWindowState.Maximized : FormWindowState.Normal); Width = (ls.WndWidth > 0) ? ls.WndWidth : 800; Height = (ls.WndHeight > 0) ? ls.WndHeight : 420; Left = (ls.WndLeft != 0) ? ls.WndLeft : 150; Top = (ls.WndTop != 0) ? ls.WndTop : 150; } } private void SaveUISettings() { /// Obtain ProcedureDlg dimensions, etc. bool isMaximized = (WindowState == FormWindowState.Maximized); int left = (WindowState == FormWindowState.Normal) ? Location.X : RestoreBounds.Left; int top = (WindowState == FormWindowState.Normal) ? Location.Y : RestoreBounds.Top; int width = (WindowState == FormWindowState.Normal) ? Size.Width : RestoreBounds.Width; int height = (WindowState == FormWindowState.Normal) ? Size.Height : RestoreBounds.Height; LocalSettings ls = Program.LocalSettings; if (ls != null && (ls.WndMaximized != isMaximized || ls.WndLeft != left || ls.WndTop != top || ls.WndWidth != width || ls.WndHeight != height || ls.ColWid1 != eventsListView.Columns[0].Width || ls.ColWid2 != eventsListView.Columns[1].Width || ls.ColWid3 != eventsListView.Columns[2].Width || ls.ColWid4 != eventsListView.Columns[3].Width || ls.ColWid5 != eventsListView.Columns[4].Width || ls.ColWid6 != eventsListView.Columns[5].Width)) { /// At least one ProcedureDlg dimension differs => Update local settings and save them ls.WndMaximized = isMaximized; ls.WndLeft = left; ls.WndTop = top; ls.WndWidth = width; ls.WndHeight = height; ls.ColWid1 = eventsListView.Columns[0].Width; ls.ColWid2 = eventsListView.Columns[1].Width; ls.ColWid3 = eventsListView.Columns[2].Width; ls.ColWid4 = eventsListView.Columns[3].Width; ls.ColWid5 = eventsListView.Columns[4].Width; ls.ColWid6 = eventsListView.Columns[5].Width; ls.Save(); } } } }