using Quasar.Common.Enums;
using Quasar.Common.Messages;
using Quasar.Common.Models;
using Quasar.Server.Controls;
using Quasar.Server.Helper;
using Quasar.Server.Messages;
using Quasar.Server.Networking;
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace Quasar.Server.Forms
{
public partial class FrmTaskManager : Form
{
///
/// The client which can be used for the task manager.
///
private readonly Client _connectClient;
///
/// The message handler for handling the communication with the client.
///
private readonly TaskManagerHandler _taskManagerHandler;
///
/// Holds the opened task manager form for each client.
///
private static readonly Dictionary OpenedForms = new Dictionary();
///
/// Creates a new task manager form for the client or gets the current open form, if there exists one already.
///
/// The client used for the task manager form.
///
/// Returns a new task manager form for the client if there is none currently open, otherwise creates a new one.
///
public static FrmTaskManager CreateNewOrGetExisting(Client client)
{
if (OpenedForms.ContainsKey(client))
{
return OpenedForms[client];
}
FrmTaskManager f = new FrmTaskManager(client);
f.Disposed += (sender, args) => OpenedForms.Remove(client);
OpenedForms.Add(client, f);
return f;
}
///
/// Initializes a new instance of the class using the given client.
///
/// The client used for the task manager form.
public FrmTaskManager(Client client)
{
_connectClient = client;
_taskManagerHandler = new TaskManagerHandler(client);
RegisterMessageHandler();
InitializeComponent();
}
///
/// Registers the task manager message handler for client communication.
///
private void RegisterMessageHandler()
{
_connectClient.ClientState += ClientDisconnected;
_taskManagerHandler.ProgressChanged += TasksChanged;
_taskManagerHandler.ProcessActionPerformed += ProcessActionPerformed;
MessageHandler.Register(_taskManagerHandler);
}
///
/// Unregisters the task manager message handler.
///
private void UnregisterMessageHandler()
{
MessageHandler.Unregister(_taskManagerHandler);
_taskManagerHandler.ProcessActionPerformed -= ProcessActionPerformed;
_taskManagerHandler.ProgressChanged -= TasksChanged;
_connectClient.ClientState -= ClientDisconnected;
}
///
/// Called whenever a client disconnects.
///
/// The client which disconnected.
/// True if the client connected, false if disconnected
private void ClientDisconnected(Client client, bool connected)
{
if (!connected)
{
this.Invoke((MethodInvoker)this.Close);
}
}
private void TasksChanged(object sender, Process[] processes)
{
lstTasks.Items.Clear();
foreach (var process in processes)
{
ListViewItem lvi =
new ListViewItem(new[] {process.Name, process.Id.ToString(), process.MainWindowTitle});
lstTasks.Items.Add(lvi);
}
processesToolStripStatusLabel.Text = $"Processes: {processes.Length}";
}
private void ProcessActionPerformed(object sender, ProcessAction action, bool result)
{
string text = string.Empty;
switch (action)
{
case ProcessAction.Start:
text = result ? "Process started successfully" : "Failed to start process";
break;
case ProcessAction.End:
text = result ? "Process ended successfully" : "Failed to end process";
break;
}
processesToolStripStatusLabel.Text = text;
}
private void FrmTaskManager_Load(object sender, EventArgs e)
{
this.Text = WindowHelper.GetWindowTitle("Task Manager", _connectClient);
_taskManagerHandler.RefreshProcesses();
}
private void FrmTaskManager_FormClosing(object sender, FormClosingEventArgs e)
{
UnregisterMessageHandler();
}
private void killProcessToolStripMenuItem_Click(object sender, EventArgs e)
{
foreach (ListViewItem lvi in lstTasks.SelectedItems)
{
_taskManagerHandler.EndProcess(int.Parse(lvi.SubItems[1].Text));
}
}
private void startProcessToolStripMenuItem_Click(object sender, EventArgs e)
{
string processName = string.Empty;
if (InputBox.Show("Process name", "Enter Process name:", ref processName) == DialogResult.OK)
{
_taskManagerHandler.StartProcess(processName);
}
}
private void refreshToolStripMenuItem_Click(object sender, EventArgs e)
{
_taskManagerHandler.RefreshProcesses();
}
}
}