From f3091ccbc53be7043e3b92d7a31f768169ec8146 Mon Sep 17 00:00:00 2001 From: brianlagunas_cp Date: Mon, 21 Mar 2011 21:39:26 +0000 Subject: [PATCH] check-in initial TimePicker control. Not ready to be used, still trying to decide what approach to take to develop it. --- .../TimeFormatToDateTimeFormatConverter.cs | 33 +++ .../WPFToolkit.Extended/Themes/Generic.xaml | 1 + .../TimePicker/Implementation/TimeFormat.cs | 10 + .../TimePicker/Implementation/TimePicker.cs | 262 ++++++++++++++++++ .../TimePicker/Themes/Generic.xaml | 93 +++++++ .../WPFToolkit.Extended.csproj | 7 + 6 files changed, 406 insertions(+) create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Converters/TimeFormatToDateTimeFormatConverter.cs create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/TimePicker/Implementation/TimeFormat.cs create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/TimePicker/Implementation/TimePicker.cs create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/TimePicker/Themes/Generic.xaml diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Converters/TimeFormatToDateTimeFormatConverter.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Converters/TimeFormatToDateTimeFormatConverter.cs new file mode 100644 index 00000000..6eda8ab7 --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Converters/TimeFormatToDateTimeFormatConverter.cs @@ -0,0 +1,33 @@ +using System; +using System.Windows.Data; + +namespace Microsoft.Windows.Controls.Core.Converters +{ + public class TimeFormatToDateTimeFormatConverter : IValueConverter + { + #region IValueConverter Members + + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + TimeFormat timeFormat = (TimeFormat)value; + switch (timeFormat) + { + case TimeFormat.Custom: + return DateTimeFormat.Custom; + case TimeFormat.ShortTime: + return DateTimeFormat.ShortTime; + case TimeFormat.LongTime: + return DateTimeFormat.LongTime; + default: + return DateTimeFormat.ShortTime; + } + } + + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + throw new NotImplementedException(); + } + + #endregion + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Themes/Generic.xaml b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Themes/Generic.xaml index d6016e48..202637a4 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Themes/Generic.xaml +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Themes/Generic.xaml @@ -15,6 +15,7 @@ + diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/TimePicker/Implementation/TimeFormat.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/TimePicker/Implementation/TimeFormat.cs new file mode 100644 index 00000000..0e0714ed --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/TimePicker/Implementation/TimeFormat.cs @@ -0,0 +1,10 @@ + +namespace Microsoft.Windows.Controls +{ + public enum TimeFormat + { + Custom, + ShortTime, + LongTime + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/TimePicker/Implementation/TimePicker.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/TimePicker/Implementation/TimePicker.cs new file mode 100644 index 00000000..39d18e0f --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/TimePicker/Implementation/TimePicker.cs @@ -0,0 +1,262 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +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; +using System.Collections; + +namespace Microsoft.Windows.Controls +{ + public class TimePicker : Control + { + internal static readonly TimeSpan EndTimeDefaultValue = new TimeSpan(23, 59, 0); + internal static readonly TimeSpan StartTimeDefaultValue = new TimeSpan(0, 0, 0); + internal static readonly TimeSpan TimeIntervalDefaultValue = new TimeSpan(1, 0, 0); + + #region Members + + ListBox _timeListBox; + + #endregion //Members + + #region Properties + + #region Format + + public static readonly DependencyProperty FormatProperty = DependencyProperty.Register("Format", typeof(TimeFormat), typeof(TimePicker), new UIPropertyMetadata(TimeFormat.ShortTime, OnFormatChanged)); + public TimeFormat Format + { + get { return (TimeFormat)GetValue(FormatProperty); } + set { SetValue(FormatProperty, value); } + } + + private static void OnFormatChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) + { + TimePicker timePicker = o as TimePicker; + if (timePicker != null) + timePicker.OnFormatChanged((TimeFormat)e.OldValue, (TimeFormat)e.NewValue); + } + + protected virtual void OnFormatChanged(TimeFormat oldValue, TimeFormat newValue) + { + + } + + #endregion //Format + + #region FormatString + + public static readonly DependencyProperty FormatStringProperty = DependencyProperty.Register("FormatString", typeof(string), typeof(TimePicker), new UIPropertyMetadata(default(String), OnFormatStringChanged)); + public string FormatString + { + get { return (string)GetValue(FormatStringProperty); } + set { SetValue(FormatStringProperty, value); } + } + + private static void OnFormatStringChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) + { + TimePicker timePicker = o as TimePicker; + if (timePicker != null) + timePicker.OnFormatStringChanged((string)e.OldValue, (string)e.NewValue); + } + + protected virtual void OnFormatStringChanged(string oldValue, string newValue) + { + if (string.IsNullOrEmpty(newValue)) + throw new ArgumentException("CustomFormat should be specified.", FormatString); + } + + #endregion //FormatString + + #region IsOpen + + public static readonly DependencyProperty IsOpenProperty = DependencyProperty.Register("IsOpen", typeof(bool), typeof(TimePicker), new UIPropertyMetadata(false)); + public bool IsOpen + { + get { return (bool)GetValue(IsOpenProperty); } + set { SetValue(IsOpenProperty, value); } + } + + #endregion //IsOpen + + #region Maximum + + + + #endregion //Maximum + + #region Minimum + + + + #endregion //Minimum + + #region SelectedDate + + public static readonly DependencyProperty SelectedDateProperty = DependencyProperty.Register("SelectedDate", typeof(DateTime?), typeof(TimePicker), new UIPropertyMetadata(DateTime.Now, OnSelectedDateChanged)); + public DateTime? SelectedDate + { + get { return (DateTime?)GetValue(SelectedDateProperty); } + set { SetValue(SelectedDateProperty, value); } + } + + private static void OnSelectedDateChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) + { + TimePicker timePicker = o as TimePicker; + if (timePicker != null) + timePicker.OnSelectedDateChanged((DateTime?)e.OldValue, (DateTime?)e.NewValue); + } + + protected virtual void OnSelectedDateChanged(DateTime? oldValue, DateTime? newValue) + { + + } + + #endregion //SelectedDate + + #region SelectedTime + + public static readonly DependencyProperty SelectedTimeProperty = DependencyProperty.Register("SelectedTime", typeof(TimeSpan?), typeof(TimePicker), new UIPropertyMetadata(null, OnSelectedTimeChanged)); + public TimeSpan? SelectedTime + { + get { return (TimeSpan?)GetValue(SelectedTimeProperty); } + set { SetValue(SelectedTimeProperty, value); } + } + + private static void OnSelectedTimeChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) + { + TimePicker timePicker = o as TimePicker; + if (timePicker != null) + timePicker.OnSelectedTimeChanged((TimeSpan?)e.OldValue, (TimeSpan?)e.NewValue); + } + + protected virtual void OnSelectedTimeChanged(TimeSpan? oldValue, TimeSpan? newValue) + { + var current = DateTime.Now; + + var date = SelectedDate ?? current; + var time = SelectedTime ?? current.TimeOfDay; + + SelectedDate = new DateTime(date.Year, date.Month, date.Day, time.Hours, time.Minutes, time.Seconds, time.Milliseconds); + } + + #endregion //SelectedTime + + #endregion //Properties + + #region Constructors + + static TimePicker() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(TimePicker), new FrameworkPropertyMetadata(typeof(TimePicker))); + } + + public TimePicker() + { + Keyboard.AddKeyDownHandler(this, OnKeyDown); + Mouse.AddPreviewMouseDownOutsideCapturedElementHandler(this, OnMouseDownOutsideCapturedElement); + } + + #endregion //Constructors + + #region Base Class Overrides + + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + _timeListBox = (ListBox)GetTemplateChild("PART_TimeListItems"); + _timeListBox.ItemsSource = GenerateItemsSource(); + _timeListBox.SelectionChanged += new SelectionChangedEventHandler(_timeListBox_SelectionChanged); + } + + void _timeListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + //if (e.AddedItems.Count > 0) + //{ + // TimeSpan newTime = (TimeSpan)e.AddedItems[0]; + + // var current = DateTime.Now; + + // var date = this.SelectedDate.HasValue ? this.SelectedDate.Value : current; + // var time = this.SelectedTime.HasValue ? this.SelectedTime.Value : current.TimeOfDay; + + // SelectedDate = new DateTime(date.Year, date.Month, date.Day, time.Hours, time.Minutes, time.Seconds, time.Milliseconds); + //} + + CloseTimePicker(); + } + + #endregion //Base Class Overrides + + #region Event Handlers + + private void OnKeyDown(object sender, KeyEventArgs e) + { + switch (e.Key) + { + case Key.Escape: + case Key.Tab: + { + CloseTimePicker(); + break; + } + } + } + + private void OnMouseDownOutsideCapturedElement(object sender, MouseButtonEventArgs e) + { + CloseTimePicker(); + } + + #endregion //Event Handlers + + #region Methods + + private void CloseTimePicker() + { + if (IsOpen) + IsOpen = false; + ReleaseMouseCapture(); + } + + private static IEnumerable GenerateItemsSource() + { + //TimeSpan time = this.StartTime; + //TimeSpan endTime = this.EndTime; + + TimeSpan time = StartTimeDefaultValue; + TimeSpan endTime = EndTimeDefaultValue; + + if (endTime <= time) + { + endTime = EndTimeDefaultValue; + time = StartTimeDefaultValue; + } + + //TimeSpan timeInterval = this.TimeInterval; + TimeSpan timeInterval = TimeIntervalDefaultValue; + + if (time != null && endTime != null && timeInterval != null && timeInterval.Ticks > 0) + { + while (time <= endTime) + { + yield return time; + time = time.Add(timeInterval); + } + yield break; + } + + } + + #endregion //Methods + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/TimePicker/Themes/Generic.xaml b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/TimePicker/Themes/Generic.xaml new file mode 100644 index 00000000..39f9d77e --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/TimePicker/Themes/Generic.xaml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj index 802d9e05..71501abb 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj @@ -127,6 +127,10 @@ MSBuild:Compile Designer + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -145,6 +149,7 @@ + @@ -217,6 +222,8 @@ + +