using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; 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.Navigation; using System.Windows.Shapes; namespace ProximaAnalizer.Controls { /// /// Interaction logic for AlarmPicker.xaml /// public partial class AlarmPicker : UserControl { public AlarmPicker() { InitializeComponent(); this._keyboardHook = new(); this._keyboardHook.SetHook(); this._keyboardHook.SetOnKeyUpEvent(Win32_Keydown); } private KeyboardHook _keyboardHook; private void Win32_Keydown(Key key) { switch (key) { case Key.Enter: if (this.SelectedPage > this.TotalPage || this.SelectedPage <= 0) return; this.Display = this.AlarmSource.Skip((int)(this.SelectedPage - 1) * (int)this.ItemsPerPage).Take((int)this.ItemsPerPage).ToDictionary(); break; case Key.Right: this.Next_Click(this, default); break; case Key.Left: this.Prev_Click(this, default); break; case Key.Home: this.Home_Click(this, default); break; case Key.End: this.End_Click(this, default); break; case Key.Escape: this.IsPopOpen = false; break; default: break; } } public object SelectedAlarm { get { return (object)GetValue(SelectedAlarmProperty); } set { SetValue(SelectedAlarmProperty, value); } } // Using a DependencyProperty as the backing store for SelectedAlarm. This enables animation, styling, binding, etc... public static readonly DependencyProperty SelectedAlarmProperty = DependencyProperty.Register("SelectedAlarm", typeof(object), typeof(AlarmPicker), new System.Windows.PropertyMetadata(default)); private IDictionary Display { get { return (IDictionary)GetValue(DisplayProperty); } set { SetValue(DisplayProperty, value); } } public static readonly DependencyProperty DisplayProperty = DependencyProperty.Register("Display", typeof(IDictionary), typeof(AlarmPicker), new System.Windows.PropertyMetadata(default)); public IDictionary AlarmSource { get { return (IDictionary)GetValue(AlarmSourceProperty); } set { SetValue(AlarmSourceProperty, value); } } public static readonly DependencyProperty AlarmSourceProperty = DependencyProperty.Register("AlarmSource", typeof(IDictionary), typeof(AlarmPicker), new System.Windows.PropertyMetadata(default, AlarmChangedCallback)); private static void AlarmChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is not AlarmPicker alarmPicker) return; if (e.NewValue is not IDictionary alarms) return; if (alarmPicker.ItemsPerPage == 0) alarmPicker.ItemsPerPage = 10; alarmPicker.Display = alarms.Take(10).ToDictionary(); alarmPicker.SelectedPage = 1; alarmPicker.TotalPage = (uint)(alarms.Count / alarmPicker.ItemsPerPage); if ((alarms.Count % alarmPicker.ItemsPerPage) != 0) alarmPicker.TotalPage += 1; } public uint ItemsPerPage { get { return (uint)GetValue(ItemsPerPageProperty); } set { SetValue(ItemsPerPageProperty, value); } } // Using a DependencyProperty as the backing store for ItemsPerPage. This enables animation, styling, binding, etc... public static readonly DependencyProperty ItemsPerPageProperty = DependencyProperty.Register("ItemsPerPage", typeof(uint), typeof(AlarmPicker), new System.Windows.PropertyMetadata((uint)10)); public uint SelectedPage { get { return (uint)GetValue(SelectedPageProperty); } set { SetValue(SelectedPageProperty, value); } } // Using a DependencyProperty as the backing store for SelectedPage. This enables animation, styling, binding, etc... public static readonly DependencyProperty SelectedPageProperty = DependencyProperty.Register("SelectedPage", typeof(uint), typeof(AlarmPicker), new System.Windows.PropertyMetadata(default)); public uint TotalPage { get { return (uint)GetValue(TotalPageProperty); } set { SetValue(TotalPageProperty, value); } } // Using a DependencyProperty as the backing store for TotalPage. This enables animation, styling, binding, etc... public static readonly DependencyProperty TotalPageProperty = DependencyProperty.Register("TotalPage", typeof(uint), typeof(AlarmPicker), new System.Windows.PropertyMetadata(default)); public bool IsPopOpen { get { return (bool)GetValue(IsPopOpenProperty); } set { SetValue(IsPopOpenProperty, value); } } // Using a DependencyProperty as the backing store for IsPopOpen. This enables animation, styling, binding, etc... public static readonly DependencyProperty IsPopOpenProperty = DependencyProperty.Register("IsPopOpen", typeof(bool), typeof(AlarmPicker), new System.Windows.PropertyMetadata(false, PopChangedCallback)); private static void PopChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is not AlarmPicker alarmPicker) return; if (e.NewValue is not bool isPop) return; switch (isPop) { case true: alarmPicker._keyboardHook?.UnHook(); alarmPicker._keyboardHook = new(); alarmPicker._keyboardHook.SetHook(); alarmPicker._keyboardHook.SetOnKeyUpEvent(alarmPicker.Win32_Keydown); break; case false: alarmPicker._keyboardHook.UnHook(); break; } } private void Button_Click(object sender, RoutedEventArgs e) { if (sender is not Button button) return; this.SelectedAlarm = button.CommandParameter; this.IsPopOpen = false; } private void Next_Click(object sender, RoutedEventArgs? e) { if (this.SelectedPage == this.TotalPage) return; this.SelectedPage++; this.Display = this.AlarmSource.Skip((int)(this.SelectedPage - 1) * (int)this.ItemsPerPage).Take((int)this.ItemsPerPage).ToDictionary(); } private void Prev_Click(object sender, RoutedEventArgs? e) { if (this.SelectedPage == 1) return; this.SelectedPage--; this.Display = this.AlarmSource.Skip((int)(this.SelectedPage - 1) * (int)this.ItemsPerPage).Take((int)this.ItemsPerPage).ToDictionary(); } private void Home_Click(object sender, RoutedEventArgs? e) { this.SelectedPage = 1; this.Display = this.AlarmSource.Take((int)this.ItemsPerPage).ToDictionary(); } private void End_Click(object sender, RoutedEventArgs? e) { this.SelectedPage = this.TotalPage; this.Display = this.AlarmSource.TakeLast((int)this.ItemsPerPage).ToDictionary(); } private void Pop_Click(object sender, RoutedEventArgs? e) { this.IsPopOpen = true; } } }