using com.sun.tools.corba.se.idl.toJavaPortable; using InABox.Core; using InABox.DynamicGrid; using InABox.Wpf; using InABox.WPF; using PRS.Shared.Events; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Imaging; namespace PRS.Shared.Grids.EventEditor; public class PropertyInitializerEditItem : BaseObject { public PropertyInitializer PropertyInitializer { get; set; } } public class PropertyInitializerGrid : DynamicItemsListGrid { private string[] ColumnNames = null!; private Type? _entityType; public Type? EntityType { get => _entityType; set { if(value != _entityType) { Items.Clear(); _entityType = value; if(value is null) { ColumnNames = []; } else { var properties = DatabaseSchema.Properties(value) .Where(x => x.IsSerializable) .Select(x => x.Name) .ToArray(); Array.Sort(properties); ColumnNames = properties; } Reconfigure(); Refresh(true, true); } } } public IEventDataModelDefinition DataModelDefinition { get; set; } = null!; private BitmapImage _delete = InABox.Wpf.Resources.delete.AsBitmapImage(); protected override void Init() { base.Init(); ActionColumns.Add(new DynamicTemplateColumn(row => { var item = LoadItem(row); var button = new Button { Content = item.PropertyInitializer.Property.Name, VerticalAlignment = System.Windows.VerticalAlignment.Stretch, VerticalContentAlignment = System.Windows.VerticalAlignment.Center, HorizontalContentAlignment = System.Windows.HorizontalAlignment.Left, MinWidth = 100, Padding = new System.Windows.Thickness(5, 0, 5, 0), Background = new LinearGradientBrush(new GradientStopCollection() { new(Color.FromRgb(0xF0, 0xF0, 0xF0), 0.0), new(Color.FromRgb(0xE5, 0xE5, 0xE5), 1.0), }) { StartPoint = new(0, 0), EndPoint = new(0, 1), }, BorderBrush = Color.FromRgb(0xAC, 0xAC, 0xAC).ToBrush(), BorderThickness = new(0), Tag = row }; button.Click += PropertyNode_Click; return button; }) { HeaderText = "Property" }); ActionColumns.Add(new DynamicTemplateColumn(row => { var item = LoadItem(row); var panel = new DockPanel(); var textBox = new TextBox { Background = Colors.LightYellow.ToBrush(), IsEnabled = false, BorderThickness = new(0), VerticalContentAlignment = VerticalAlignment.Center, HorizontalContentAlignment = HorizontalAlignment.Left, Padding = new(2, 0, 0, 0), Text = item.PropertyInitializer.Value }; var button = new Button { Content = "Edit", Padding = new(5.0), MinWidth = 30, Tag = row }; button.BorderBrush = Colors.Silver.ToBrush(); button.BorderThickness = new Thickness(0.75, 0.0, 0.0, 0.0); button.Click += Value_Click; DockPanel.SetDock(button, Dock.Right); panel.Children.Add(button); DockPanel.SetDock(textBox, Dock.Left); panel.Children.Add(textBox); return panel; }) { HeaderText = "Value" }); ActionColumns.Add(new DynamicImageColumn(_delete, DeleteButton_Click)); } private bool DeleteButton_Click(CoreRow? row) { if (row is null) return false; if (CanDeleteItems([row])) if (MessageWindow.ShowYesNo("Are you sure you wish to delete the selected records?", "Confirm Delete")) { DeleteItems([row]); SelectedRows = Array.Empty(); DoChanged(); return true; } return false; } #region UI Component private class UIComponent : DynamicGridGridUIComponent { protected override Brush? GetCellSelectionBackgroundBrush() { return null; } } protected override IDynamicGridUIComponent CreateUIComponent() { return new UIComponent { Parent = this }; } #endregion protected override void DoReconfigure(DynamicGridOptions options) { base.DoReconfigure(options); options.Clear(); options.ReadOnly = EntityType is null; options.AddRows = true; } protected override void DoAdd(bool openEditorOnDirectEdit = false) { if (EntityType is null) return; if(DynamicGridColumnNameSelectorGrid.SelectColumnName(EntityType, ColumnNames, out var value)) { var property = DatabaseSchema.PropertyStrict(EntityType, value); CreateItems(() => { return [new() { PropertyInitializer = new(property, "") }]; }); } } private void Value_Click(object sender, RoutedEventArgs e) { if (sender is not FrameworkElement el || el.Tag is not CoreRow row) return; if (EntityType is null) return; var item = LoadItem(row); var window = new ExpressionEditorWindow(DataModelDefinition.GetVariables().Select(x => x.Name).ToArray()) { Expression = item.PropertyInitializer.Value }; if(window.ShowDialog() == true && item.PropertyInitializer.Value != window.Expression) { item.PropertyInitializer.Value = window.Expression; UpdateRow(row, item); DoChanged(); } } private void PropertyNode_Click(object sender, RoutedEventArgs e) { if (sender is not FrameworkElement el || el.Tag is not CoreRow row) return; if (EntityType is null) return; var item = LoadItem(row); if(DynamicGridColumnNameSelectorGrid.SelectColumnName(EntityType, ColumnNames, out var value) && value != item.PropertyInitializer.Property.Name) { item.PropertyInitializer.Property = DatabaseSchema.PropertyStrict(EntityType, value); UpdateRow(row, item); DoChanged(); } } }