private void btnAdd_Click(object sender, EventArgs e)
        {
            ScriptInfoProxy script = _scripts.AddNew();

            script.HotkeyCommandIdentifier = Math.Max(ScriptManager.MinimumUserScriptID, _scripts.Max(s => s.HotkeyCommandIdentifier)) + 1;
            script.Name = "<New Script>";

            BindScripts(_scripts, script);
        }
        private void btnMoveUp_Click(object sender, EventArgs e)
        {
            if (SelectedScript is null)
            {
                return;
            }

            ScriptInfoProxy script = SelectedScript;

            int index = _scripts.IndexOf(script);

            _scripts.Remove(script);
            _scripts.Insert(Math.Max(index - 1, 0), script);

            BindScripts(_scripts, script);
        }
        private void lvScripts_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lvScripts.SelectedItems.Count < 1 || !(lvScripts.SelectedItems[0].Tag is ScriptInfoProxy script))
            {
                propertyGrid1.SelectedObject = null;
                return;
            }

            SelectedScript = script;
            script.SetImages(EmbeddedIcons);

            propertyGrid1.SelectedObject = script;

            int index = _scripts.IndexOf(script);

            btnMoveUp.Enabled   = index > 0;
            btnMoveDown.Enabled = index < _scripts.Count - 1;
        }
        private void BindScripts(IList <ScriptInfoProxy> scripts, ScriptInfoProxy selectedScript)
        {
            try
            {
                lvScripts.BeginUpdate();
                lvScripts.SelectedIndexChanged -= lvScripts_SelectedIndexChanged;
                lvScripts.ItemChecked          -= lvScripts_ItemChecked;
                lvScripts.Items.Clear();

                if (scripts.Count < 1)
                {
                    btnAdd.Focus();
                    return;
                }

                foreach (ScriptInfoProxy script in scripts)
                {
                    var color = !script.Enabled ? SystemColors.GrayText : SystemColors.WindowText;

                    ListViewItem lvitem = new ListViewItem(script.Name)
                    {
                        ToolTipText = $"{script.Command} {script.Arguments}",
                        Tag         = script,
                        ForeColor   = color,
                        ImageKey    = script.Icon,
                        Checked     = script.Enabled
                    };
                    lvScripts.Items.Add(lvitem);

                    lvitem.SubItems.Add(script.OnEvent.ToString());
                    lvitem.SubItems.Add(string.Concat(script.Command, " ", script.Arguments));
                }

                lvScripts.SelectedIndexChanged += lvScripts_SelectedIndexChanged;
                lvScripts.ItemChecked          += lvScripts_ItemChecked;
                lvScripts.SelectedIndices.Clear();

                SelectedScript = selectedScript;

                if (selectedScript is object)
                {
                    ListViewItem lvi = lvScripts.Items.Cast <ListViewItem>().FirstOrDefault(x => x.Tag == selectedScript);
                    if (lvi != null)
                    {
                        lvi.Selected          = true;
                        lvScripts.FocusedItem = lvi;
                    }
                }

                if (lvScripts.FocusedItem is null)
                {
                    lvScripts.Items[0].Selected = true;
                    lvScripts.FocusedItem       = lvScripts.Items[0];
                }

                lvScripts.Select();
            }
            finally
            {
                lvScripts.EndUpdate();
            }
        }