protected virtual void PropertyFieldOpen(object sender, EventArgs e)
        {
            if (sender is DropdownInputField && AvailableProperties != null)
            {
                DropdownInputField dropdown   = sender as DropdownInputField;
                List <string>      properties = AvailableProperties?.Invoke();

                if (properties == null)
                {
                    return;
                }

                dropdown.Items.Clear();
                dropdown.Items.AddRange(properties);
            }
        }
        protected virtual void InitializeHandles()
        {
            StartServerButton.Click += (object sender, EventArgs e) =>
            {
                if (Server.ServerState == Servers.ServerState.Stop)
                {
                    Server?.Begin();
                }
                else
                {
                    Server?.Stop();
                }
            };

            TargetPortField.DropDown += (object sender, EventArgs e) =>
            {
                if (sender is DropdownInputField)
                {
                    DropdownInputField dropdown       = sender as DropdownInputField;
                    List <string>      availablePorts = Server.GetAvailablePorts();

                    if (availablePorts == null)
                    {
                        return;
                    }

                    dropdown.Items.Clear();
                    dropdown.Items.AddRange(availablePorts);
                }
            };

            TargetPortField.ItemSelected += (object sender, ItemEventArgs e) =>
            {
                string port = TargetPortField.Text;

                Server.TargetPort = port;
                Properties.Settings.Default.SerialPort_LastPort = port;
                Properties.Settings.Default.Save();
            };

            TargetPortField.Leave += (object sender, EventArgs e) =>
            {
                string port = TargetPortField.Text;

                Server.TargetPort = port;
                Properties.Settings.Default.SerialPort_LastPort = port;
                Properties.Settings.Default.Save();
            };

            SaveServerSettingsButton.Click += (object sender, EventArgs e) =>
            {
                string projectPath = ProjectsUtils.ShowSaveProjectDialog(Server.Settings);

                if (projectPath != null)
                {
                    Properties.Settings.Default.SerialPort_LastProject = projectPath;
                    Properties.Settings.Default.Save();
                }
            };

            LoadServerSettingsButton.Click += (object sender, EventArgs e) =>
            {
                SerialPortProject newProject  = Server.Settings;
                string            projectPath = ProjectsUtils.ShowOpenProjectDialog(ref newProject);

                if (projectPath != null)
                {
                    Properties.Settings.Default.SerialPort_LastProject = projectPath;
                    Properties.Settings.Default.Save();
                }

                if (Server.Settings != newProject)
                {
                    Server.Settings = newProject;
                }
            };

            EditDataButton.Click += (object sender, EventArgs e) =>
            {
                MainForm.ShowControl(CreateLogDataEditor());
            };

            PortSpeedField.ItemSelected += (object sender, ItemEventArgs e) =>
            {
                Server.Settings.PortSpeed = PortSpeedField.ToEnum(Server.Settings.PortSpeed);
                UpdateValues();
            };

            AutoConnectToggle.Click += (object sender, EventArgs e) =>
            {
                Server.Settings.AutoConnect = AutoConnectToggle.Checked;
                UpdateValues();
            };

            AutoConnectRequestField.Leave += (object sender, EventArgs e) =>
            {
                Server.Settings.AutoConnectRequest = AutoConnectRequestField.Text;
                UpdateValues();
            };

            AutoConnectResponseField.Leave += (object sender, EventArgs e) =>
            {
                Server.Settings.AutoConnectResponse = AutoConnectResponseField.Text;
                UpdateValues();
            };

            EventHandler autoConnectResponseTimeoutHandler = (object sender, EventArgs e) =>
            {
                Server.Settings.AutoConnectResponseTimeout = (int)AutoConnectResponseTimeoutField.Value;
                UpdateValues();
            };

            AutoConnectResponseTimeoutField.Leave                += autoConnectResponseTimeoutHandler;
            AutoConnectResponseTimeoutField.AddButton.Click      += autoConnectResponseTimeoutHandler;
            AutoConnectResponseTimeoutField.SubtractButton.Click += autoConnectResponseTimeoutHandler;

            EventHandler connectionIntervalHandler = (object sender, EventArgs e) =>
            {
                Server.Settings.ConnectionInterval = (int)ConnectionIntervalField.Value;
                UpdateValues();
            };

            ConnectionIntervalField.Leave                += connectionIntervalHandler;
            ConnectionIntervalField.AddButton.Click      += connectionIntervalHandler;
            ConnectionIntervalField.SubtractButton.Click += connectionIntervalHandler;

            SendModeField.ItemSelected += (object sender, ItemEventArgs e) =>
            {
                Server.Settings.SendMode = SendModeField.ToEnum(Server.Settings.SendMode);
                UpdateValues();
            };

            EventHandler connectionCheckHandler = (object sender, EventArgs e) =>
            {
                Server.Settings.ConnectionCheckInterval = (int)ConnectionCheckField.Value;
                UpdateValues();
            };

            ConnectionCheckField.Leave                += connectionCheckHandler;
            ConnectionCheckField.AddButton.Click      += connectionCheckHandler;
            ConnectionCheckField.SubtractButton.Click += connectionCheckHandler;

            EventHandler messageIntervalHandler = (object sender, EventArgs e) =>
            {
                Server.Settings.MessageInterval = (int)MessageIntervalField.Value;
                UpdateValues();
            };

            MessageIntervalField.Leave                += messageIntervalHandler;
            MessageIntervalField.AddButton.Click      += messageIntervalHandler;
            MessageIntervalField.SubtractButton.Click += messageIntervalHandler;

            DataRequestField.Leave += (object sender, EventArgs e) =>
            {
                Server.Settings.DataRequest = DataRequestField.Text;
                UpdateValues();
            };

            Properties.Settings.Default.PropertyChanged += (object sender, PropertyChangedEventArgs e) =>
            {
                switch (e.PropertyName)
                {
                case "SerialPort_PortsWhitelist":
                    Server.PortWhitelist.Clear();
                    Server.PortWhitelist.AddRange(SlicePortList(Properties.Settings.Default.SerialPort_PortWhitelist));
                    break;

                case "SerialPort_PortsBlacklist":
                    Server.PortBlacklist.Clear();
                    Server.PortBlacklist.AddRange(SlicePortList(Properties.Settings.Default.SerialPort_PortBlacklist));
                    break;
                }
            };
        }