tbf/EventViewer/EventViewerWnd.cs

366 lines
14 KiB
C#
Raw Permalink Normal View History

///
/// Copyright (c) 2020 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using NHibernate;
using Common;
2022-01-06 18:25:56 +00:00
using Common.Forms;
using SharedDatabase;
using SharedDatabase.Entities;
using EventViewer.Resources;
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<Subscriber> subscribers;
IList<Event> events;
MySortOrder sortOrder = MySortOrder.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
{
EventsDB.DbType = DBType.MySql;
EventsDB.ConnectionString = Program.LocalSettings.ConnectionString;
session = EventsDB.CreateSession();
subscribers = session.QueryOver<Subscriber>().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();
}
/// <summary>
/// Redraw events
/// </summary>
/// <param name="allEvents">true = Display all events (also confirmed read)</param>
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<Event>().List();
}
else if (eViewerOption == EViewerOption.RecentEvents)
{
/// Read events from tha last 'recentTimePeriodInDays' days
events = session.QueryOver<Event>()
.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<Event>()
.JoinQueryOver<Subscriber>(e => e.Subscribers)
.Where(s => (s.Name == string.Format("User_{0}", loginUserName)))
.List<Event>();
}
else
{
/// Read unread events of all users
events = session.QueryOver<Event>()
.JoinQueryOver<Subscriber>(e => e.Subscribers)
.List<Event>();
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 = SharedDatabase.Utils.GetSeverityColor(evnt.Severity);
lvi.SubItems[lvi.SubItems.Count - 1].ForeColor = SharedDatabase.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 == MySortOrder.Ascending) ? MySortOrder.Descending : MySortOrder.Ascending;
}
else
{
/// Clicked on another column header => set sortOrder to SortOrder.Ascending
sortColumn = e.Column;
sortOrder = MySortOrder.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 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)
{
//Common.GID[] groupsWithAccess = new Common.GID[] { Common.GID.Administrators };
SharedDatabase.Forms.LoginDlg dlg = new SharedDatabase.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
{
CurrentUser.RemoteUsersDB = new DBSettings(DBType.MySql, Program.LocalSettings.UsersDBConnString);
SharedDatabase.Forms.LoginDlg dlg = new SharedDatabase.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();
}
}
}
}