| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 | using System;using System.Configuration;using System.Windows;using System.Windows.Controls;using System.Windows.Media;using System.Windows.Media.Imaging;using InABox.Core;using InABox.DynamicGrid.Properties;using InABox.WPF;using static System.Windows.Forms.VisualStyles.VisualStyleElement;namespace InABox.DynamicGrid{    public enum DynamicMenuStatus    {        Enabled,        Disabled,        Hidden    }        public class DynamicMenuColumn : DynamicActionColumn    {        private readonly Action<DynamicMenuColumn, CoreRow?> _build;        private readonly ContextMenu _menu;                private readonly Func<CoreRow, DynamicMenuStatus>? _status;                private readonly BitmapImage _enabled = Resources.menu.AsBitmapImage();        private readonly BitmapImage _disabled = Resources.menu.Fade(0.25F).AsBitmapImage();        public DynamicMenuColumn(Action<DynamicMenuColumn, CoreRow?> build, Func<CoreRow, DynamicMenuStatus>? status = null) : base(r => null)        {            _menu = new ContextMenu();            AllowHeaderClick = false;            _build = build;            _status = status;            Image = row =>            {                if (row == null)                    return null;                var status = _status?.Invoke(row);                if (status == null)                    return _enabled;                if (status == DynamicMenuStatus.Enabled)                    return _enabled;                if (status == DynamicMenuStatus.Disabled)                    return _disabled;                return null;            };                            Action = r =>            {                _menu.Tag = r;                _menu.Items.Clear();                _build?.Invoke(this, r);                if (_menu.HasItems)                    _menu.IsOpen = true;                return false;            };        }                public MenuItem AddItem(string text, System.Drawing.Bitmap? image, Action<CoreRow>? action, object? parent = null, bool enabled = true)        {            var item = new MenuItem();            if (image != null)                item.Icon = new Image() { Source = enabled ? image.AsBitmapImage(24,24) : image.AsGrayScale().AsBitmapImage(24,24)  };            item.Header = text;            item.Tag = action;            item.IsEnabled = enabled;            item.IsCheckable = false;            item.Click += (o, e) =>            {                var r = GetRow((MenuItem)o);                action?.Invoke(r);            };            if (parent == null)                _menu.Items.Add(item);            else                ((MenuItem)parent).Items.Add(item);            return item;        }                public MenuItem AddCalendar(string text, DateTime startDate, System.Drawing.Bitmap? image, Action<CoreRow, DateTime?>? action, object? parent = null, bool enabled = true)        {            var item = new MenuItem();            if (image != null)                item.Icon = new Image() { Source = enabled ? image.AsBitmapImage(24,24) : image.AsGrayScale().AsBitmapImage(24,24)  };            var calendarItem = new MenuItem();            var calendar = new Calendar { DisplayDate = startDate, SelectedDate = null };            calendar.SelectedDatesChanged += (o, e) =>            {                var r = GetRow(calendarItem);                action?.Invoke(r, calendar.SelectedDate);                _menu.IsOpen = false;            };            calendarItem.Header = calendar;            calendarItem.Style = DynamicGridUtils.Resources["NonHighlightMenuItem"] as Style;            item.Header = text;            item.Items.Add(calendarItem);            item.IsEnabled = enabled;            item.IsCheckable = false;            if (parent == null)                _menu.Items.Add(item);            else                ((MenuItem)parent).Items.Add(item);            return item;        }        public void AddSeparator(object parent = null)        {            var item = new Separator();            if (parent == null)                _menu.Items.Add(item);            else                ((MenuItem)parent).Items.Add(item);        }        private CoreRow GetRow(MenuItem item)        {            if (item == null)                return null;            if (item.Parent is ContextMenu)                return (item.Parent as ContextMenu).Tag as CoreRow;            return GetRow(item.Parent as MenuItem);        }    }}
 |