using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using Dinah.Core;
using FileManager;
namespace LibationWinForms.Dialogs
{
public partial class DirectorySelectControl : UserControl
{
private class DirectoryComboBoxItem
{
public string Description { get; }
public Configuration.KnownDirectories Value { get; }
public string FullPath => Configuration.GetKnownDirectoryPath(Value);
/// Displaying relative paths is confusing. UI should display absolute equivalent
public string UiDisplayPath => Value == Configuration.KnownDirectories.AppDir ? Configuration.AppDir_Absolute : FullPath;
public DirectoryComboBoxItem(Configuration.KnownDirectories knownDirectory)
{
Value = knownDirectory;
Description = Value.GetDescription();
}
public override string ToString() => Description;
}
private DirectoryComboBoxItem selectedItem => (DirectoryComboBoxItem)this.directoryComboBox.SelectedItem;
public string SelectedDirectory => selectedItem?.FullPath;
public DirectorySelectControl() => InitializeComponent();
/// Set items for combobox
/// List rather than IEnumerable so that client can determine display order
/// Optional default item to select
public void SetDirectoryItems(List knownDirectories, Configuration.KnownDirectories? defaultDirectory = Configuration.KnownDirectories.UserProfile)
{
this.directoryComboBox.Items.Clear();
foreach (var dir in knownDirectories.Where(d => d != Configuration.KnownDirectories.None).Distinct())
this.directoryComboBox.Items.Add(new DirectoryComboBoxItem(dir));
SelectDirectory(defaultDirectory);
}
/// select, set default, or rehydrate
///
/// True is there was a matching entry
public bool SelectDirectory(string directory) => SelectDirectory(Configuration.GetKnownDirectory(directory));
/// select, set default, or rehydrate
///
/// True is there was a matching entry
public bool SelectDirectory(Configuration.KnownDirectories? directory)
{
if (directory is null || directory == Configuration.KnownDirectories.None)
{
this.directoryComboBox.SelectedIndex = 0;
return false;
}
// set default
var item = this.directoryComboBox.Items.Cast().SingleOrDefault(item => item.Value == directory.Value);
if (item is null)
{
this.directoryComboBox.SelectedIndex = 0;
return false;
}
this.directoryComboBox.SelectedItem = item;
return true;
}
private void DirectorySelectControl_Load(object sender, EventArgs e)
{
if (this.DesignMode)
return;
}
private void directoryComboBox_SelectedIndexChanged(object sender, EventArgs e) => this.label1.Text = selectedItem.UiDisplayPath;
}
}