using InABox.Configuration;
using InABox.Core;
using InABox.WPF;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
namespace InABox.DynamicGrid;
///
/// A component which loads a custom set of columns from the database.
///
public class DynamicGridCustomColumnsComponent
where T : BaseObject, new()
{
private readonly DynamicGrid Grid;
public string? Tag { get; set; }
public DynamicGridCustomColumnsComponent(DynamicGrid grid, string? tag)
{
Grid = grid;
Tag = tag;
}
public DynamicGridColumns LoadColumns()
{
var tag = GetTag(Grid.IsDirectEditMode());
var user = Task.Run(() => new UserConfiguration(tag).Load());
var global = Task.Run(() => new GlobalConfiguration(tag).Load());
Task.WaitAll(user, global);
var columns = user.Result.Any() ? user.Result : global.Result;
if (!columns.Any())
columns = Grid.GenerateColumns();
columns.RemoveAll(x =>
{
if (x.ColumnName.IsNullOrWhiteSpace()) return true;
var prop = DatabaseSchema.Property(typeof(T), x.ColumnName);
if (prop is null || prop.Editor is NullEditor) return true;
x.Editor = prop.Editor;
return false;
});
return columns;
}
public void SaveColumns(DynamicGridColumns columns)
{
var tag = GetTag(Grid.IsDirectEditMode());
new UserConfiguration(tag).Save(columns);
}
private string GetTag(bool directEdit)
{
var tag = Tag ?? typeof(T).Name;
if (directEdit)
tag += ":DirectEdit";
return tag;
}
public void LoadColumnsMenu(ContextMenu menu)
{
menu.AddSeparatorIfNeeded();
menu.AddItem("Reset Columns to Default", null, ResetColumnsClick);
if (Security.IsAllowed())
{
menu.AddItem("Reset Columns to System Default", null, ResetColumnsToSystemClick);
menu.AddSeparator();
menu.AddItem("Mark Columns as Default", null, UpdateDefaultColumnsClick);
}
}
private void ResetColumnsToSystemClick()
{
SaveColumns(Grid.GenerateColumns());
Grid.Refresh(true, true);
}
private void ResetColumnsClick()
{
Grid.VisibleColumns.Clear();
SaveColumns(Grid.VisibleColumns);
Grid.Refresh(true, true);
}
private void UpdateDefaultColumnsClick()
{
var tag = GetTag(Grid.IsDirectEditMode());
new GlobalConfiguration(tag).Save(Grid.VisibleColumns);
new UserConfiguration(tag).Delete();
Grid.Refresh(true, true);
}
}