2020-03-05 12:59:43 +00:00
|
|
|
|
///
|
|
|
|
|
|
/// Copyright (c) 2020 Sensus Slovensko a.s.
|
|
|
|
|
|
///
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
|
using NHibernate;
|
2021-09-23 09:46:40 +00:00
|
|
|
|
using Common;
|
2022-01-23 12:58:54 +00:00
|
|
|
|
using Common.Forms;
|
2020-03-05 12:59:43 +00:00
|
|
|
|
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<Subscriber> subscribers;
|
|
|
|
|
|
IList<Event> events;
|
2022-01-23 12:58:54 +00:00
|
|
|
|
MySortOrder sortOrder = MySortOrder.Ascending;
|
2020-03-05 12:59:43 +00:00
|
|
|
|
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
|
|
|
|
|
|
{
|
2023-04-18 12:01:23 +00:00
|
|
|
|
EViewerDB.DbType = DBType.MySql;
|
|
|
|
|
|
EViewerDB.ConnectionString = Program.LocalSettings.ConnectionString;
|
|
|
|
|
|
session = EViewerDB.CreateSession();
|
2020-03-05 12:59:43 +00:00
|
|
|
|
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());
|
2021-09-23 09:46:40 +00:00
|
|
|
|
lvi.SubItems[lvi.SubItems.Count - 1].BackColor = global::Events.Utils.GetSeverityColor(evnt.Severity);
|
|
|
|
|
|
lvi.SubItems[lvi.SubItems.Count - 1].ForeColor = global::Events.Utils.GetSeverityColor(evnt.Severity, true);
|
2020-03-05 12:59:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
lvi.SubItems.Add(evnt.Message);
|
|
|
|
|
|
eventsListView.Items.Add(lvi);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void eventsListView_ColumnClick(object sender, ColumnClickEventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (e.Column == sortColumn)
|
|
|
|
|
|
{
|
2022-01-23 12:58:54 +00:00
|
|
|
|
sortOrder = (sortOrder == MySortOrder.Ascending) ? MySortOrder.Descending : MySortOrder.Ascending;
|
2020-03-05 12:59:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
/// Clicked on another column header => set sortOrder to SortOrder.Ascending
|
|
|
|
|
|
sortColumn = e.Column;
|
2022-01-23 12:58:54 +00:00
|
|
|
|
sortOrder = MySortOrder.Ascending;
|
2020-03-05 12:59:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
{
|
2021-09-23 09:46:40 +00:00
|
|
|
|
//Common.GID[] groupsWithAccess = new Common.GID[] { Common.GID.Administrators };
|
2023-03-28 11:03:38 +00:00
|
|
|
|
Users.Forms.LoginDlg dlg = new Users.Forms.LoginDlg();
|
2020-03-05 12:59:43 +00:00
|
|
|
|
if (dlg.ShowDialog() == DialogResult.OK)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((new Forms.SettingsDlg()).ShowDialog() == DialogResult.OK)
|
|
|
|
|
|
{
|
|
|
|
|
|
Close();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void userLoginButton_Click(object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
2022-05-23 08:38:14 +00:00
|
|
|
|
Users.CurrentUser.RemoteUsersDB = new Common.DBSettings(Common.DBType.MySql, Program.LocalSettings.UsersDBConnString);
|
2020-03-05 12:59:43 +00:00
|
|
|
|
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();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|