Browse Source

Missing changes from previous commit

frankvandenbos 6 months ago
parent
commit
1fd03a0807

+ 6 - 2
inabox.wpf/DynamicGrid/DynamicGrid.cs

@@ -929,9 +929,13 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
         var cols = IsDirectEditMode()
             ? new Columns<T>(ColumnTypeFlags.IncludeVisible | ColumnTypeFlags.IncludeForeignKeys)
             : new Columns<T>(ColumnTypeFlags.IncludeVisible | ColumnTypeFlags.IncludeLinked);
-
-        return ExtractColumns(cols);
+        
+        var columns = ExtractColumns(cols);
+        OnGenerateColumns?.Invoke(this, new GenerateColumnsEventArgs(columns));
+        return columns;
     }
+    
+    public event GenerateColumnsEvent OnGenerateColumns;
 
     protected virtual void SaveColumns(DynamicGridColumns columns)
     {

+ 12 - 1
inabox.wpf/DynamicGrid/DynamicGridCommon.cs

@@ -490,4 +490,15 @@ public class BeforeRefreshEventArgs : CancelEventArgs { }
 public delegate void BeforeRefreshEventHandler(object sender, BeforeRefreshEventArgs args);
 
 public class AfterRefreshEventArgs : EventArgs { }
-public delegate void AfterRefreshEventHandler(object sender, AfterRefreshEventArgs args);
+public delegate void AfterRefreshEventHandler(object sender, AfterRefreshEventArgs args);
+
+public class GenerateColumnsEventArgs
+{
+	public DynamicGridColumns Columns { get; private set; }
+
+	public GenerateColumnsEventArgs(DynamicGridColumns columns)
+	{
+		Columns = columns;
+	}
+}
+public delegate void GenerateColumnsEvent(object sender, GenerateColumnsEventArgs args);

+ 59 - 10
inabox.wpf/DynamicGrid/DynamicGridUtils.cs

@@ -15,6 +15,8 @@ using Syncfusion.Data.Extensions;
 using System.Diagnostics.CodeAnalysis;
 using System.Data;
 using System.Windows.Media;
+using AutoProperties;
+using InABox.WPF;
 
 namespace InABox.DynamicGrid;
 
@@ -466,33 +468,80 @@ public static class DynamicGridUtils
         }
         return gridType.MakeGenericType(entityType);
     }
-
-    public static Window CreateGridWindow(string title, IDynamicGrid dynamicGrid)
+    
+    public static Window CreateGridWindow(string title, IDynamicGrid dynamicGrid, bool showbuttons = false, Func<bool>? okclicked = null)
     {
         dynamicGrid.Margin = new Thickness(5);
+        
+        var window = new ThemableWindow { Title = title };
+        window.SetValue(WindowBehavior.HideCloseButtonProperty, showbuttons);
+
+        var grid = new Grid();
+        grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) });
+        grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Auto) });
+        grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Auto) });
+        grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });
+        grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) });
+        
+        var fe = dynamicGrid as FrameworkElement;
+        fe.SetValue(Grid.RowProperty,0);
+        fe.SetValue(Grid.ColumnProperty, 0);
+        fe.SetValue(Grid.ColumnSpanProperty, 3);
+        grid.Children.Add(fe);
 
-        var window = new ThemableWindow { Title = title, Content = dynamicGrid };
-
+        if (showbuttons)
+        {
+            var ok = new Button();
+            ok.Content = "OK";
+            ok.SetValue(Grid.RowProperty,1);
+            ok.SetValue(Grid.ColumnProperty,1);
+            ok.Margin = new Thickness(0,0,5,5);
+            ok.Width = 80;
+            ok.Height = 35;
+            ok.Click += (sender, args) =>
+            {
+                if (okclicked?.Invoke() ?? true)
+                    window.DialogResult = true;
+            };
+            grid.Children.Add(ok);
+            
+            var cancel = new Button();
+            cancel.Content = "Cancel";
+            cancel.SetValue(Grid.RowProperty,1);
+            cancel.SetValue(Grid.ColumnProperty,2);
+            cancel.Margin = new Thickness(0,0,5,5);
+            cancel.Width = 80;
+            cancel.Height = 35;
+            cancel.Click += (sender, args) =>
+            {
+                window.DialogResult = false;
+            };
+            grid.Children.Add(cancel);
+        }
+        
+        window.Content = grid;
+        
         dynamicGrid.Refresh(true, true);
 
         return window;
     }
-    public static Window CreateGridWindow(string title, Type entityType, Type? gridType = null)
+    
+    public static Window CreateGridWindow(string title, Type entityType, Type? gridType = null, bool showbuttons = false)
     {
         gridType ??= typeof(DynamicGrid<>);
         var grid = CreateDynamicGrid(gridType, entityType);
-        return CreateGridWindow(title, grid);
+        return CreateGridWindow(title, grid, showbuttons);
     }
-    public static Window CreateGridWindow<TGrid, TEntity>(string title)
+    public static Window CreateGridWindow<TGrid, TEntity>(string title, bool showbuttons = false)
         where TEntity : BaseObject
         where TGrid : IDynamicGrid
     {
-        return CreateGridWindow(title, typeof(TEntity), typeof(TGrid));
+        return CreateGridWindow(title, typeof(TEntity), typeof(TGrid), showbuttons);
     }
-    public static Window CreateGridWindow<TEntity>(string title)
+    public static Window CreateGridWindow<TEntity>(string title, bool showbuttons = false)
         where TEntity : BaseObject
     {
-        return CreateGridWindow(title, typeof(TEntity));
+        return CreateGridWindow(title, typeof(TEntity), null, showbuttons);
     }
 
     #endregion

+ 117 - 0
inabox.wpf/WindowBehavior.cs

@@ -0,0 +1,117 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Windows;
+using System.Windows.Interop;
+
+namespace InABox.WPF;
+
+public class WindowBehavior
+{
+    private static readonly Type OwnerType = typeof (WindowBehavior);
+
+    #region HideCloseButton (attached property)
+
+    public static readonly DependencyProperty HideCloseButtonProperty =
+        DependencyProperty.RegisterAttached(
+            "HideCloseButton",
+            typeof (bool),
+            OwnerType,
+            new FrameworkPropertyMetadata(false, new PropertyChangedCallback(HideCloseButtonChangedCallback)));
+
+    [AttachedPropertyBrowsableForType(typeof(Window))]
+    public static bool GetHideCloseButton(Window obj) {
+        return (bool)obj.GetValue(HideCloseButtonProperty);
+    }
+
+    [AttachedPropertyBrowsableForType(typeof(Window))]
+    public static void SetHideCloseButton(Window obj, bool value) {
+        obj.SetValue(HideCloseButtonProperty, value);
+    }
+
+    private static void HideCloseButtonChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
+    {
+        var window = d as Window;
+        if (window == null) return;
+
+        var hideCloseButton = (bool)e.NewValue;
+        if (hideCloseButton && !GetIsHiddenCloseButton(window)) {
+            if (!window.IsLoaded) {
+                window.Loaded += HideWhenLoadedDelegate;
+            }
+            else {
+                HideCloseButton(window);
+            }
+            SetIsHiddenCloseButton(window, true);
+        }
+        else if (!hideCloseButton && GetIsHiddenCloseButton(window)) {
+            if (!window.IsLoaded) {
+                window.Loaded -= ShowWhenLoadedDelegate;
+            }
+            else {
+                ShowCloseButton(window);
+            }
+            SetIsHiddenCloseButton(window, false);
+        }
+    }
+
+    #region Win32 imports
+
+    private const int GWL_STYLE = -16;
+    private const int WS_SYSMENU = 0x80000;
+    [DllImport("user32.dll", SetLastError = true)]
+    private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
+    [DllImport("user32.dll")]
+    private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
+
+    #endregion
+
+    private static readonly RoutedEventHandler HideWhenLoadedDelegate = (sender, args) => {
+        if (sender is Window == false) return;
+        var w = (Window)sender;
+        HideCloseButton(w);
+        w.Loaded -= HideWhenLoadedDelegate;
+    };
+
+    private static readonly RoutedEventHandler ShowWhenLoadedDelegate = (sender, args) => {
+        if (sender is Window == false) return;
+        var w = (Window)sender;
+        ShowCloseButton(w);
+        w.Loaded -= ShowWhenLoadedDelegate;
+    };
+
+    private static void HideCloseButton(Window w) {
+        var hwnd = new WindowInteropHelper(w).Handle;
+        SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);
+    }
+
+    private static void ShowCloseButton(Window w) {
+        var hwnd = new WindowInteropHelper(w).Handle;
+        SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) | WS_SYSMENU);
+    }
+
+    #endregion
+
+    #region IsHiddenCloseButton (readonly attached property)
+
+    private static readonly DependencyPropertyKey IsHiddenCloseButtonKey =
+        DependencyProperty.RegisterAttachedReadOnly(
+            "IsHiddenCloseButton",
+            typeof (bool),
+            OwnerType,
+            new FrameworkPropertyMetadata(false));
+
+    public static readonly DependencyProperty IsHiddenCloseButtonProperty =
+        IsHiddenCloseButtonKey.DependencyProperty;
+
+    [AttachedPropertyBrowsableForType(typeof(Window))]
+    public static bool GetIsHiddenCloseButton(Window obj) {
+        return (bool)obj.GetValue(IsHiddenCloseButtonProperty);
+    }
+
+    private static void SetIsHiddenCloseButton(Window obj, bool value) {
+        obj.SetValue(IsHiddenCloseButtonKey, value);
+    }
+
+    #endregion
+
+}