File: Handlers\DatePicker\DatePickerHandler.MacCatalyst.cs
Web Access
Project: src\src\Core\src\Core.csproj (Microsoft.Maui)
using System;
using Foundation;
using UIKit;
using RectangleF = CoreGraphics.CGRect;
 
namespace Microsoft.Maui.Handlers
{
	public partial class DatePickerHandler : ViewHandler<IDatePicker, UIDatePicker>
	{
		readonly UIDatePickerProxy _proxy = new();
 
		protected override UIDatePicker CreatePlatformView()
		{
			return new UIDatePicker { Mode = UIDatePickerMode.Date, TimeZone = new NSTimeZone("UTC") };
		}
 
		internal bool UpdateImmediately { get; set; } = true;
 
		protected override void ConnectHandler(UIDatePicker platformView)
		{
			_proxy.Connect(this, VirtualView, platformView);
 
			var date = VirtualView?.Date;
			if (date is DateTime dt)
			{
				platformView.Date = dt.ToNSDate();
			}
 
			base.ConnectHandler(platformView);
		}
 
		protected override void DisconnectHandler(UIDatePicker platformView)
		{
			_proxy.Disconnect(platformView);
 
			base.DisconnectHandler(platformView);
		}
 
		public static partial void MapFormat(IDatePickerHandler handler, IDatePicker datePicker)
		{
			handler.PlatformView?.UpdateFormat(datePicker);
		}
 
		public static partial void MapDate(IDatePickerHandler handler, IDatePicker datePicker)
		{
			handler.PlatformView?.UpdateDate(datePicker);
		}
 
		public static partial void MapMinimumDate(IDatePickerHandler handler, IDatePicker datePicker)
		{
			handler.PlatformView?.UpdateMinimumDate(datePicker);
		}
 
		public static partial void MapMaximumDate(IDatePickerHandler handler, IDatePicker datePicker)
		{
			handler.PlatformView?.UpdateMaximumDate(datePicker);
		}
 
		public static partial void MapCharacterSpacing(IDatePickerHandler handler, IDatePicker datePicker)
		{
		}
 
		public static partial void MapFont(IDatePickerHandler handler, IDatePicker datePicker)
		{
 
		}
 
		public static partial void MapTextColor(IDatePickerHandler handler, IDatePicker datePicker)
		{
 
		}
 
		public static partial void MapFlowDirection(DatePickerHandler handler, IDatePicker datePicker)
		{
 
		}
 
		void SetVirtualViewDate()
		{
			if (VirtualView == null)
				return;
 
			VirtualView.Date = PlatformView.Date.ToDateTime().Date;
		}
 
		class UIDatePickerProxy
		{
			WeakReference<DatePickerHandler>? _handler;
			WeakReference<IDatePicker>? _virtualView;
 
			IDatePicker? VirtualView => _virtualView is not null && _virtualView.TryGetTarget(out var v) ? v : null;
 
			public void Connect(DatePickerHandler handler, IDatePicker virtualView, UIDatePicker platformView)
			{
				_handler = new(handler);
				_virtualView = new(virtualView);
 
				platformView.EditingDidBegin += OnStarted;
				platformView.EditingDidEnd += OnEnded;
				platformView.ValueChanged += OnValueChanged;
			}
 
			public void Disconnect(UIDatePicker platformView)
			{
				platformView.EditingDidBegin -= OnStarted;
				platformView.EditingDidEnd -= OnEnded;
				platformView.ValueChanged -= OnValueChanged;
			}
 
			void OnValueChanged(object? sender, EventArgs? e)
			{
				if (_handler is not null && _handler.TryGetTarget(out var handler) && handler.UpdateImmediately)
					handler.SetVirtualViewDate();
 
				if (VirtualView is IDatePicker virtualView)
					virtualView.IsFocused = true;
			}
 
			void OnStarted(object? sender, EventArgs eventArgs)
			{
				if (VirtualView is IDatePicker virtualView)
					virtualView.IsFocused = true;
			}
 
			void OnEnded(object? sender, EventArgs eventArgs)
			{
				if (VirtualView is IDatePicker virtualView)
					virtualView.IsFocused = false;
			}
		}
	}
}