using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Windows;
using Kniip.Editor;
using Kniip.Infrastructure;
namespace Kniip.History;
/// Teken uit Segoe Fluent Icons.
public sealed record HistoryCommand(string Label, string Glyph, bool Enabled, Action Run);
/// Wat je met een item uit de geschiedenis kunt doen, gedeeld door het systeemvakmenu en het geschiedenisvenster.
public static class HistoryActions
{
/// De acties voor een item; null staat voor een scheidingslijn.
public static IReadOnlyList CommandsFor(HistoryEntry entry)
{
bool file = entry.FileExists;
bool url = entry.Url is { Length: > 0 };
bool image = file && entry.Kind == HistoryKind.Snip;
return new HistoryCommand?[]
{
new("Openen", "\uE8E5", file || url, () => Open(entry)),
new("Openen in de editor", "\uE70F", image, () => App.Instance.OpenFile(entry.FilePath!)),
new("Link openen", "\uE774", url, () => Launch(entry.Url!)),
null,
new("Link kopiëren", "\uE71B", url, () => Copy(entry.Url!)),
new("Afbeelding kopiëren", "\uE8C8", image, () => CopyImage(entry.FilePath!)),
new("Pad kopiëren", "\uE8C8", file, () => Copy(entry.FilePath!)),
new("Tonen in map", "\uE838", file, () => ShowInFolder(entry.FilePath!))
};
}
/// Bestand in het standaardprogramma, anders de link in de browser.
public static void Open(HistoryEntry entry)
{
if (entry.FileExists)
{
Launch(entry.FilePath!);
}
else if (entry.Url is { Length: > 0 } url)
{
Launch(url);
}
else
{
MessageBox.Show($"Het bestand bestaat niet meer:\n{entry.FilePath}", "kniip", MessageBoxButton.OK, MessageBoxImage.Information);
}
}
public static void OpenFolder(string folder)
{
Directory.CreateDirectory(folder);
Launch(folder);
}
private static void ShowInFolder(string path) =>
Run(() => Process.Start("explorer.exe", $"/select,\"{path}\""));
private static void Launch(string target) =>
Run(() => Process.Start(new ProcessStartInfo(target) { UseShellExecute = true }));
private static void Copy(string text)
{
if (!ClipboardWriter.SetText(text))
{
ClipboardBusy();
}
}
private static void CopyImage(string path)
{
try
{
if (!ClipboardWriter.SetImage(PixelUtil.LoadFile(path), path))
{
ClipboardBusy();
}
}
catch (Exception ex)
{
MessageBox.Show($"Kan '{Path.GetFileName(path)}' niet kopiëren.\n\n{ex.Message}", "kniip", MessageBoxButton.OK, MessageBoxImage.Warning);
}
}
private static void ClipboardBusy() =>
MessageBox.Show("Kopiëren is mislukt: het klembord is bezet. Probeer het opnieuw.", "kniip", MessageBoxButton.OK, MessageBoxImage.Warning);
private static void Run(Action action)
{
try
{
action();
}
catch (Exception ex)
{
MessageBox.Show($"Openen is mislukt.\n\n{ex.Message}", "kniip", MessageBoxButton.OK, MessageBoxImage.Warning);
}
}
}