From c132065cf0af55420d738c57adc4c62f67ec06fd Mon Sep 17 00:00:00 2001 From: sdoroff Date: Mon, 30 Oct 2017 12:11:32 -0400 Subject: [PATCH] Removed dependency on IsHandlerSuspended extensions Replaced the IsHandlerSuspended and SetValueNoCallback extension methods with a Validate function for the CalendarMode property and a _displayDateIsChanging flag for the various DisplayDate properties --- src/Avalonia.Controls/Calendar/Calendar.cs | 109 +++++++++--------- .../Calendar/CalendarExtensions.cs | 57 --------- 2 files changed, 56 insertions(+), 110 deletions(-) diff --git a/src/Avalonia.Controls/Calendar/Calendar.cs b/src/Avalonia.Controls/Calendar/Calendar.cs index 236ac48630..8c79e5dce5 100644 --- a/src/Avalonia.Controls/Calendar/Calendar.cs +++ b/src/Avalonia.Controls/Calendar/Calendar.cs @@ -239,6 +239,7 @@ namespace Avalonia.Controls private DateTime? _displayDateEnd = null; private bool _isShiftPressed; + private bool _displayDateIsChanging = false; internal CalendarDayButton FocusButton { get; set; } internal CalendarButton FocusCalendarButton { get; set; } @@ -350,7 +351,9 @@ namespace Avalonia.Controls } public static readonly StyledProperty DisplayModeProperty = - AvaloniaProperty.Register(nameof(DisplayMode)); + AvaloniaProperty.Register( + nameof(DisplayMode), + validate: ValidateDisplayMode); /// /// Gets or sets a value indicating whether the calendar is displayed in /// months, years, or decades. @@ -374,63 +377,58 @@ namespace Avalonia.Controls CalendarMode oldMode = (CalendarMode)e.OldValue; CalendarItem monthControl = MonthControl; - if (!this.IsHandlerSuspended(Calendar.DisplayModeProperty)) + if (monthControl != null) { - if (IsValidDisplayMode(mode)) + switch (oldMode) { - if (monthControl != null) - { - switch (oldMode) + case CalendarMode.Month: { - case CalendarMode.Month: - { - SelectedYear = DisplayDateInternal; - SelectedMonth = DisplayDateInternal; - break; - } - case CalendarMode.Year: - { - DisplayDate = SelectedMonth; - SelectedYear = SelectedMonth; - break; - } - case CalendarMode.Decade: - { - DisplayDate = SelectedYear; - SelectedMonth = SelectedYear; - break; - } + SelectedYear = DisplayDateInternal; + SelectedMonth = DisplayDateInternal; + break; } - - switch (mode) + case CalendarMode.Year: { - case CalendarMode.Month: - { - OnMonthClick(); - break; - } - case CalendarMode.Year: - case CalendarMode.Decade: - { - OnHeaderClick(); - break; - } + DisplayDate = SelectedMonth; + SelectedYear = SelectedMonth; + break; + } + case CalendarMode.Decade: + { + DisplayDate = SelectedYear; + SelectedMonth = SelectedYear; + break; } - } - OnDisplayModeChanged(new CalendarModeChangedEventArgs((CalendarMode)e.OldValue, mode)); } - else + + switch (mode) { - this.SetValueNoCallback(Calendar.DisplayModeProperty, (CalendarMode)e.OldValue); - throw new ArgumentOutOfRangeException("d", "Invalid DisplayMode"); + case CalendarMode.Month: + { + OnMonthClick(); + break; + } + case CalendarMode.Year: + case CalendarMode.Decade: + { + OnHeaderClick(); + break; + } } } + OnDisplayModeChanged(new CalendarModeChangedEventArgs((CalendarMode)e.OldValue, mode)); + } + private static CalendarMode ValidateDisplayMode(Calendar o, CalendarMode mode) + { + if(IsValidDisplayMode(mode)) + { + return mode; + } + else + { + throw new ArgumentOutOfRangeException(nameof(mode), "Invalid DisplayMode"); + } } - /// - /// Inherited code: Requires comment. - /// - /// Inherited code: Requires comment 1. - /// Inherited code: Requires comment 2. private static bool IsValidDisplayMode(CalendarMode mode) { return mode == CalendarMode.Month @@ -474,7 +472,9 @@ namespace Avalonia.Controls { if (IsValidSelectionMode(e.NewValue)) { - this.SetValueNoCallback(Calendar.SelectedDateProperty, null); + _displayDateIsChanging = true; + SelectedDate = null; + _displayDateIsChanging = false; SelectedDates.Clear(); } else @@ -533,7 +533,7 @@ namespace Avalonia.Controls } private void OnSelectedDateChanged(AvaloniaPropertyChangedEventArgs e) { - if (!this.IsHandlerSuspended(Calendar.SelectedDateProperty)) + if (!_displayDateIsChanging) { if (SelectionMode != CalendarSelectionMode.None) { @@ -817,7 +817,7 @@ namespace Avalonia.Controls } private void OnDisplayDateStartChanged(AvaloniaPropertyChangedEventArgs e) { - if (!this.IsHandlerSuspended(Calendar.DisplayDateStartProperty)) + if (!_displayDateIsChanging) { DateTime? newValue = e.NewValue as DateTime?; @@ -928,7 +928,7 @@ namespace Avalonia.Controls private void OnDisplayDateEndChanged(AvaloniaPropertyChangedEventArgs e) { - if (!this.IsHandlerSuspended(Calendar.DisplayDateEndProperty)) + if (!_displayDateIsChanging) { DateTime? newValue = e.NewValue as DateTime?; @@ -1147,14 +1147,17 @@ namespace Avalonia.Controls } else { + cal._displayDateIsChanging = true; if (DateTime.Compare(value.Value, cal.DisplayDateRangeStart) < 0) { - cal.SetValueNoCallback(Calendar.DisplayDateStartProperty, value); + cal.DisplayDateStart = value; } else if (DateTime.Compare(value.Value, cal.DisplayDateRangeEnd) > 0) { - cal.SetValueNoCallback(Calendar.DisplayDateEndProperty, value); + cal.DisplayDateEnd = value; } + cal._displayDateIsChanging = false; + return true; } } diff --git a/src/Avalonia.Controls/Calendar/CalendarExtensions.cs b/src/Avalonia.Controls/Calendar/CalendarExtensions.cs index 485f2dfc95..4fda02bff3 100644 --- a/src/Avalonia.Controls/Calendar/CalendarExtensions.cs +++ b/src/Avalonia.Controls/Calendar/CalendarExtensions.cs @@ -12,63 +12,6 @@ namespace Avalonia.Controls.Primitives { internal static class CalendarExtensions { - - private static Dictionary> _suspendedHandlers = new Dictionary>(); - - public static bool IsHandlerSuspended(this IAvaloniaObject obj, AvaloniaProperty dependencyProperty) - { - if (_suspendedHandlers.ContainsKey(obj)) - { - return _suspendedHandlers[obj].ContainsKey(dependencyProperty); - } - else - { - return false; - } - } - private static void SuspendHandler(this IAvaloniaObject obj, AvaloniaProperty dependencyProperty, bool suspend) - { - if (_suspendedHandlers.ContainsKey(obj)) - { - Dictionary suspensions = _suspendedHandlers[obj]; - - if (suspend) - { - Debug.Assert(!suspensions.ContainsKey(dependencyProperty), "Suspensions should not contain the property!"); - - // true = dummy value - suspensions[dependencyProperty] = true; - } - else - { - Debug.Assert(suspensions.ContainsKey(dependencyProperty), "Suspensions should contain the property!"); - suspensions.Remove(dependencyProperty); - if (suspensions.Count == 0) - { - _suspendedHandlers.Remove(obj); - } - } - } - else - { - Debug.Assert(suspend, "suspend should be true!"); - _suspendedHandlers[obj] = new Dictionary(); - _suspendedHandlers[obj][dependencyProperty] = true; - } - } - public static void SetValueNoCallback(this IAvaloniaObject obj, AvaloniaProperty property, T value) - { - obj.SuspendHandler(property, true); - try - { - obj.SetValue(property, value); - } - finally - { - obj.SuspendHandler(property, false); - } - } - public static void GetMetaKeyState(InputModifiers modifiers, out bool ctrl, out bool shift) { ctrl = (modifiers & InputModifiers.Control) == InputModifiers.Control;