using System.Collections.Generic;
using System.Windows.Forms;
using Lers.Core;
using Lers.Plugins;
using Lers.UI;
using Lers.UI.Tabs;
namespace Vkt5_RemoteConsole
{
public class Plugin : IPlugin
{
#region IPlugin Members
///
/// Инициализация плагина
///
///
public void Initialize(IPluginHost pluginHost)
{
Plugin.Host = pluginHost;
// Добавляем элементы управления для точек учёта
Plugin.Host.MainWindow.RegisterObjectAction(ObjectType.MeasurePoint, "ВКТ-5: Удалённый пульт", Properties.Resources.vkt5_icon, OnRemoteConsoleOpen);
}
#endregion
///
/// Экземпляр хост-интерфейса клиента
///
internal static IPluginHost Host
{
get;
private set;
}
///
/// Пользователь выбрал пункт меню или навигационного окна "Удалённый пульт"
///
///
///
private void OnRemoteConsoleOpen(int actionId, object sender)
{
MeasurePoint measurePoint = (MeasurePoint)sender;
// Запрашиваем требуемую для работы информацию
measurePoint.Refresh(MeasurePointInfoFlags.Equipment);
// Проверим, что у точки учёта есть устройство
if (measurePoint.Device == null)
{
MessageBox.Show("У выбранной точки учёта не задано устройство. Выберите точку учёта с поддерживаемым устройством.",
"Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
// Проверим, что мы работаем с ВКТ-5
if (!CheckDeviceModel(measurePoint.Device))
{
MessageBox.Show("Удалённый пульт ВКТ-5 не поддерживает работу с устройствами "
+ measurePoint.Device.Model.Title, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
// Проверим, открыто ли окно с опросом этого устройства
Vkt5RemoteConsoleForm currentForm = GetOpenedForm(measurePoint.Device);
if (currentForm == null)
{
// Такого окна нет, открываем
NewForm(measurePoint.Device);
}
else
{
// Окно уже есть, переводим фокус на него
currentForm.Show();
currentForm.Focus();
}
}
///
/// Проверяет, что в выбранной точке учёта указана модель,
/// которая поддерживается удалённым пультом
///
///
/// true если модель поддерживается, иначе false
private bool CheckDeviceModel(Equipment device)
{
return device.Model.Id == (int)DeviceModel.VKT_5;
}
///
/// Открывает новое окно для управления устройством
///
///
private void NewForm(Equipment device)
{
// Окно для этого устройства ещё не открыто
Vkt5RemoteConsoleForm mainForm = new Vkt5RemoteConsoleForm();
// Заголовок окна
mainForm.Text = "Удалённый пульт - " + device.ToString();
RemoteConsoleFormParams param = new RemoteConsoleFormParams();
// Параметры базовой формы опроса
param.PollConnections = device.PollSettings.Connections;
if (param.PollConnections != null && param.PollConnections.Length > 0)
{
param.SelectedConnection = param.PollConnections[0];
}
// Параметры формы удалённого пульта
param.Device = device;
// Инициализация
mainForm.Initialize(param, Plugin.Host.Server);
Plugin.Host.MainWindow.AddPage(mainForm);
mainForm.Show();
mainForm.FormClosed += new System.Windows.Forms.FormClosedEventHandler(currentForm_FormClosed);
lock (this.visibleForms)
{
this.visibleForms.Add(mainForm);
}
}
///
/// Возвращает открытую форму, работающую с указанным устройством, или null если формы нет
///
///
///
private Vkt5RemoteConsoleForm GetOpenedForm(Equipment device)
{
lock (this.visibleForms)
{
foreach (Vkt5RemoteConsoleForm form in this.visibleForms)
{
if (form.Parameters.Device == device)
{
return form;
}
}
}
return null;
}
///
/// Закрыто окно удалённого пульта. Удаляем его из списка открытых окон.
///
///
///
void currentForm_FormClosed(object sender, System.Windows.Forms.FormClosedEventArgs e)
{
lock (this.visibleForms)
{
this.visibleForms.Remove((Vkt5RemoteConsoleForm)sender);
}
}
private List visibleForms = new List();
}
}