AlarmPicker.xaml.cs 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.CompilerServices;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Windows;
  8. using System.Windows.Controls;
  9. using System.Windows.Data;
  10. using System.Windows.Documents;
  11. using System.Windows.Input;
  12. using System.Windows.Media;
  13. using System.Windows.Media.Imaging;
  14. using System.Windows.Navigation;
  15. using System.Windows.Shapes;
  16. namespace ProximaAnalizer.Controls
  17. {
  18. /// <summary>
  19. /// Interaction logic for AlarmPicker.xaml
  20. /// </summary>
  21. public partial class AlarmPicker : UserControl
  22. {
  23. public AlarmPicker()
  24. {
  25. InitializeComponent();
  26. this._keyboardHook = new();
  27. this._keyboardHook.SetHook();
  28. this._keyboardHook.SetOnKeyUpEvent(Win32_Keydown);
  29. }
  30. private KeyboardHook _keyboardHook;
  31. private void Win32_Keydown(Key key)
  32. {
  33. switch (key)
  34. {
  35. case Key.Enter:
  36. if (this.SelectedPage > this.TotalPage || this.SelectedPage <= 0)
  37. return;
  38. this.Display = this.AlarmSource.Skip((int)(this.SelectedPage - 1) * (int)this.ItemsPerPage).Take((int)this.ItemsPerPage).ToDictionary();
  39. break;
  40. case Key.Right:
  41. this.Next_Click(this, default);
  42. break;
  43. case Key.Left:
  44. this.Prev_Click(this, default);
  45. break;
  46. case Key.Home:
  47. this.Home_Click(this, default);
  48. break;
  49. case Key.End:
  50. this.End_Click(this, default);
  51. break;
  52. case Key.Escape:
  53. this.IsPopOpen = false;
  54. break;
  55. default:
  56. break;
  57. }
  58. }
  59. public object SelectedAlarm
  60. {
  61. get { return (object)GetValue(SelectedAlarmProperty); }
  62. set { SetValue(SelectedAlarmProperty, value); }
  63. }
  64. // Using a DependencyProperty as the backing store for SelectedAlarm. This enables animation, styling, binding, etc...
  65. public static readonly DependencyProperty SelectedAlarmProperty =
  66. DependencyProperty.Register("SelectedAlarm", typeof(object), typeof(AlarmPicker), new System.Windows.PropertyMetadata(default));
  67. private IDictionary<DateTime, StringBuilder> Display
  68. {
  69. get { return (IDictionary<DateTime, StringBuilder>)GetValue(DisplayProperty); }
  70. set { SetValue(DisplayProperty, value); }
  71. }
  72. public static readonly DependencyProperty DisplayProperty =
  73. DependencyProperty.Register("Display", typeof(IDictionary<DateTime, StringBuilder>), typeof(AlarmPicker), new System.Windows.PropertyMetadata(default));
  74. public IDictionary<DateTime, StringBuilder> AlarmSource
  75. {
  76. get { return (IDictionary<DateTime, StringBuilder>)GetValue(AlarmSourceProperty); }
  77. set { SetValue(AlarmSourceProperty, value); }
  78. }
  79. public static readonly DependencyProperty AlarmSourceProperty =
  80. DependencyProperty.Register("AlarmSource", typeof(IDictionary<DateTime, StringBuilder>), typeof(AlarmPicker), new System.Windows.PropertyMetadata(default, AlarmChangedCallback));
  81. private static void AlarmChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
  82. {
  83. if (d is not AlarmPicker alarmPicker)
  84. return;
  85. if (e.NewValue is not IDictionary<DateTime, StringBuilder> alarms)
  86. return;
  87. if (alarmPicker.ItemsPerPage == 0)
  88. alarmPicker.ItemsPerPage = 10;
  89. alarmPicker.Display = alarms.Take(10).ToDictionary();
  90. alarmPicker.SelectedPage = 1;
  91. alarmPicker.TotalPage = (uint)(alarms.Count / alarmPicker.ItemsPerPage);
  92. if ((alarms.Count % alarmPicker.ItemsPerPage) != 0)
  93. alarmPicker.TotalPage += 1;
  94. }
  95. public uint ItemsPerPage
  96. {
  97. get { return (uint)GetValue(ItemsPerPageProperty); }
  98. set { SetValue(ItemsPerPageProperty, value); }
  99. }
  100. // Using a DependencyProperty as the backing store for ItemsPerPage. This enables animation, styling, binding, etc...
  101. public static readonly DependencyProperty ItemsPerPageProperty =
  102. DependencyProperty.Register("ItemsPerPage", typeof(uint), typeof(AlarmPicker), new System.Windows.PropertyMetadata((uint)10));
  103. public uint SelectedPage
  104. {
  105. get { return (uint)GetValue(SelectedPageProperty); }
  106. set { SetValue(SelectedPageProperty, value); }
  107. }
  108. // Using a DependencyProperty as the backing store for SelectedPage. This enables animation, styling, binding, etc...
  109. public static readonly DependencyProperty SelectedPageProperty =
  110. DependencyProperty.Register("SelectedPage", typeof(uint), typeof(AlarmPicker), new System.Windows.PropertyMetadata(default));
  111. public uint TotalPage
  112. {
  113. get { return (uint)GetValue(TotalPageProperty); }
  114. set { SetValue(TotalPageProperty, value); }
  115. }
  116. // Using a DependencyProperty as the backing store for TotalPage. This enables animation, styling, binding, etc...
  117. public static readonly DependencyProperty TotalPageProperty =
  118. DependencyProperty.Register("TotalPage", typeof(uint), typeof(AlarmPicker), new System.Windows.PropertyMetadata(default));
  119. public bool IsPopOpen
  120. {
  121. get { return (bool)GetValue(IsPopOpenProperty); }
  122. set { SetValue(IsPopOpenProperty, value); }
  123. }
  124. // Using a DependencyProperty as the backing store for IsPopOpen. This enables animation, styling, binding, etc...
  125. public static readonly DependencyProperty IsPopOpenProperty =
  126. DependencyProperty.Register("IsPopOpen", typeof(bool), typeof(AlarmPicker), new System.Windows.PropertyMetadata(false, PopChangedCallback));
  127. private static void PopChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
  128. {
  129. if (d is not AlarmPicker alarmPicker)
  130. return;
  131. if (e.NewValue is not bool isPop)
  132. return;
  133. switch (isPop)
  134. {
  135. case true:
  136. alarmPicker._keyboardHook?.UnHook();
  137. alarmPicker._keyboardHook = new();
  138. alarmPicker._keyboardHook.SetHook();
  139. alarmPicker._keyboardHook.SetOnKeyUpEvent(alarmPicker.Win32_Keydown);
  140. break;
  141. case false:
  142. alarmPicker._keyboardHook.UnHook();
  143. break;
  144. }
  145. }
  146. private void Button_Click(object sender, RoutedEventArgs e)
  147. {
  148. if (sender is not Button button)
  149. return;
  150. this.SelectedAlarm = button.CommandParameter;
  151. this.IsPopOpen = false;
  152. }
  153. private void Next_Click(object sender, RoutedEventArgs? e)
  154. {
  155. if (this.SelectedPage == this.TotalPage)
  156. return;
  157. this.SelectedPage++;
  158. this.Display = this.AlarmSource.Skip((int)(this.SelectedPage - 1) * (int)this.ItemsPerPage).Take((int)this.ItemsPerPage).ToDictionary();
  159. }
  160. private void Prev_Click(object sender, RoutedEventArgs? e)
  161. {
  162. if (this.SelectedPage == 1)
  163. return;
  164. this.SelectedPage--;
  165. this.Display = this.AlarmSource.Skip((int)(this.SelectedPage - 1) * (int)this.ItemsPerPage).Take((int)this.ItemsPerPage).ToDictionary();
  166. }
  167. private void Home_Click(object sender, RoutedEventArgs? e)
  168. {
  169. this.SelectedPage = 1;
  170. this.Display = this.AlarmSource.Take((int)this.ItemsPerPage).ToDictionary();
  171. }
  172. private void End_Click(object sender, RoutedEventArgs? e)
  173. {
  174. this.SelectedPage = this.TotalPage;
  175. this.Display = this.AlarmSource.TakeLast((int)this.ItemsPerPage).ToDictionary();
  176. }
  177. private void Pop_Click(object sender, RoutedEventArgs? e)
  178. {
  179. this.IsPopOpen = true;
  180. }
  181. }
  182. }