using InABox.Core;
using InABox.DynamicGrid;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace InABox.Wpf.Dashboard.Editor;
///
/// Interaction logic for DynamicDashboardEditor.xaml
///
public partial class DynamicDashboardEditor : UserControl, INotifyPropertyChanged
{
private string _dashboardName = "";
public string DashboardName
{
get => _dashboardName;
set
{
_dashboardName = value;
OnPropertyChanged();
}
}
private string _dashboardGroup = "";
public string DashboardGroup
{
get => _dashboardGroup;
set
{
_dashboardGroup = value;
OnPropertyChanged();
}
}
private Tuple[] _presentationTypes;
public Tuple[] PresentationTypes
{
get => _presentationTypes;
[MemberNotNull(nameof(_presentationTypes))]
set
{
_presentationTypes = value;
OnPropertyChanged();
}
}
private Type? _selectedPresentationType;
public Type? SelectedPresentationType
{
get => _selectedPresentationType;
set
{
_selectedPresentationType = value;
OnPropertyChanged();
if(value is not null && value.GetInterfaceDefinition(typeof(IDynamicDashboardDataPresenter<>)) is Type presentationInterface)
{
var propertiesType = presentationInterface.GenericTypeArguments[0];
SetProperties(Activator.CreateInstance(propertiesType)!, value);
}
}
}
private DynamicDashboardDataComponent DataComponent;
private object? _presenterProperties;
private IDynamicDashboardDataPresenter? _presenter;
public DynamicDashboardEditor(DynamicDashboard dashboard)
{
DataComponent = dashboard.DataComponent;
if(dashboard.DataPresenter is not null)
{
_selectedPresentationType = dashboard.DataPresenter.GetType();
}
InitializeComponent();
if(dashboard.DataPresenter is not null)
{
SetProperties(dashboard.DataPresenter.Properties, _selectedPresentationType!);
}
PresentationTypes = DynamicDashboardUtils.GetPresenterTypes()
.Select(x => new Tuple(x.GetCaption(), x))
.ToArray();
}
private void SetProperties(object properties, Type presentationType)
{
_presenterProperties = properties;
_presenter = (Activator.CreateInstance(presentationType) as IDynamicDashboardDataPresenter)!;
_presenter.Properties = _presenterProperties;
_presenter.IsPreview = true;
_presenter.DataComponent = DataComponent;
PresentationEditorControl.Content = _presenter.Setup();
PresentationEditorControl.Height = _presenter.PreviewHeight;
RefreshData();
}
private void SelectData_Click(object sender, RoutedEventArgs e)
{
if (DynamicDashboardDataEditor.Execute(DataComponent))
{
RefreshData();
}
}
private void SelectScripts_Click(object sender, RoutedEventArgs e)
{
var grid = new DynamicDashboardAdditionalTableGrid();
grid.Items = DataComponent.AdditionalTables.ToList(x => new DynamicDashboardAdditionalTableEditItem(x));
grid.Refresh(true, true);
var dlg = new DynamicContentDialog(grid)
{
WindowStartupLocation = WindowStartupLocation.CenterScreen,
Title = "Edit Additional Scripted Tables",
CanSave = true
};
if(dlg.ShowDialog() == true)
{
DataComponent.AdditionalTables = grid.Items.Select(x => x.ToTable()).ToList();
RefreshData();
}
}
private void RefreshData()
{
if(_presenter is not null)
{
_presenter.DataComponent = DataComponent;
DataComponent.RunQueryAsync(100).ContinueWith(data =>
{
if(data.Exception is not null)
{
MessageWindow.ShowError("Error loading data.", data.Exception);
}
else
{
_presenter.Refresh(data.Result);
}
}, TaskScheduler.FromCurrentSynchronizationContext());
}
}
public DynamicDashboard GetDashboard()
{
var dashboard = new DynamicDashboard();
dashboard.DataComponent = DataComponent;
if(SelectedPresentationType is not null)
{
dashboard.DataPresenter = (Activator.CreateInstance(SelectedPresentationType) as IDynamicDashboardDataPresenter)!;
dashboard.DataPresenter.Properties = _presenterProperties!;
}
else
{
dashboard.DataPresenter = null;
}
return dashboard;
}
}