Ctrl K
ComunidadGuías…

src/SecretsForm.cs

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace Clipman
{
    internal sealed class SecretsForm : Form
    {
        private readonly SecretStore store;
        private readonly Action registerHotkeys;
        private readonly Action<SecretEntry> quickPaste;
        private readonly ListBox list;

        public SecretsForm(SecretStore store, Action registerHotkeys, Action<SecretEntry> quickPaste)
        {
            this.store = store;
            this.registerHotkeys = registerHotkeys;
            this.quickPaste = quickPaste;

            Text = "Clipman Secrets";
            StartPosition = FormStartPosition.CenterParent;
            Width = 680;
            Height = 520;
            KeyPreview = true;
            ShowInTaskbar = false;

            list = new ListBox
            {
                Dock = DockStyle.Fill,
                AccessibleName = "Secrets",
                AccessibleDescription = "Saved secret names. Values are hidden. Press Enter to quick paste, F2 or Alt Enter for properties, Insert to add, and Delete to remove."
            };
            list.DoubleClick += (s, e) => PasteSelected();
            list.KeyDown += ListKeyDown;
            Controls.Add(list);

            var buttons = new FlowLayoutPanel
            {
                Dock = DockStyle.Bottom,
                Height = 44,
                FlowDirection = FlowDirection.RightToLeft
            };
            var close = new ShortcutButton { Text = "Close", ShortcutText = "Esc", Width = 90 };
            close.Click += (s, e) => Close();
            buttons.Controls.Add(close);
            var delete = new ShortcutButton { Text = "Delete", ShortcutText = "Del", Width = 90 };
            delete.Click += (s, e) => DeleteSelected();
            buttons.Controls.Add(delete);
            var edit = new ShortcutButton { Text = "Properties", ShortcutText = "F2", Width = 100 };
            edit.Click += (s, e) => EditSelected();
            buttons.Controls.Add(edit);
            var add = new ShortcutButton { Text = "Add", ShortcutText = "Insert", Width = 90 };
            add.Click += (s, e) => AddSecret();
            buttons.Controls.Add(add);
            var paste = new ShortcutButton { Text = "Quick Paste", ShortcutText = "Enter", Width = 110 };
            paste.Click += (s, e) => PasteSelected();
            buttons.Controls.Add(paste);
            Controls.Add(buttons);

            Load += (s, e) => RefreshList(null);
            ContextHelp.Prepare(this, true);
        }

        protected override void OnKeyDown(KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
            {
                Close();
                e.Handled = true;
                return;
            }
            base.OnKeyDown(e);
        }

        private void ListKeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter && !e.Alt)
            {
                PasteSelected();
                e.Handled = true;
            }
            else if (e.KeyCode == Keys.Insert)
            {
                AddSecret();
                e.Handled = true;
            }
            else if (e.KeyCode == Keys.F2 || (e.Alt && e.KeyCode == Keys.Enter))
            {
                EditSelected();
                e.Handled = true;
            }
            else if (e.KeyCode == Keys.Delete)
            {
                DeleteSelected();
                e.Handled = true;
            }
        }

        private void RefreshList(string selectId)
        {
            var entries = store.GetEntries();
            list.BeginUpdate();
            list.Items.Clear();
            foreach (var entry in entries)
            {
                list.Items.Add(new SecretListItem(entry));
            }
            list.EndUpdate();

            var index = -1;
            if (!string.IsNullOrWhiteSpace(selectId))
            {
                for (var i = 0; i < list.Items.Count; i++)
                {
                    var item = list.Items[i] as SecretListItem;
                    if (item != null && string.Equals(item.Entry.Id, selectId, StringComparison.Ordinal))
                    {
                        index = i;
                        break;
                    }
                }
            }
            if (index < 0 && list.Items.Count > 0) index = 0;
            if (index >= 0) list.SelectedIndex = index;
        }

        private SecretEntry SelectedEntry()
        {
            var item = list.SelectedItem as SecretListItem;
            return item == null ? null : item.Entry;
        }

        private void AddSecret()
        {
            using (var form = new SecretEditorForm(new SecretEntry(), true))
            {
                if (form.ShowDialog(this) == DialogResult.OK)
                {
                    if (!TrySaveEntry(form.Secret)) return;
                    registerHotkeys();
                    RefreshList(form.Secret.Id);
                }
            }
        }

        private void EditSelected()
        {
            var entry = SelectedEntry();
            if (entry == null) return;
            using (var form = new SecretEditorForm(entry))
            {
                if (form.ShowDialog(this) == DialogResult.OK)
                {
                    if (!TrySaveEntry(form.Secret)) return;
                    registerHotkeys();
                    RefreshList(form.Secret.Id);
                }
            }
        }

        private void DeleteSelected()
        {
            var entry = SelectedEntry();
            if (entry == null) return;
            var result = MessageBox.Show(this, "Delete the selected secret?", "Clipman Secrets", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (result != DialogResult.Yes) return;
            try
            {
                store.DeleteEntry(entry.Id);
            }
            catch (Exception ex)
            {
                ShowStoreError("Could not delete the selected secret.", ex);
                return;
            }
            registerHotkeys();
            RefreshList(null);
        }

        private bool TrySaveEntry(SecretEntry entry)
        {
            try
            {
                store.SaveEntry(entry);
                return true;
            }
            catch (Exception ex)
            {
                ShowStoreError("Could not save the secret.", ex);
                return false;
            }
        }

        private void ShowStoreError(string message, Exception ex)
        {
            MessageBox.Show(this, message + "\r\n\r\n" + ex.Message, "Clipman Secrets", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }

        private void PasteSelected()
        {
            var entry = SelectedEntry();
            if (entry == null) return;
            quickPaste(entry);
            Close();
        }

        private sealed class SecretListItem
        {
            public SecretEntry Entry { get; private set; }

            public SecretListItem(SecretEntry entry)
            {
                Entry = entry;
            }

            public override string ToString()
            {
                var hotkey = string.IsNullOrWhiteSpace(Entry.Hotkey) ? "" : "; Quick Paste: " + Entry.Hotkey;
                return (string.IsNullOrWhiteSpace(Entry.Name) ? "Unnamed secret" : Entry.Name) + hotkey;
            }
        }
    }
}