|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Windows.Win32.System.Variant;
using Windows.Win32.UI.Accessibility;
namespace System.Windows.Forms;
public partial class DateTimePicker
{
public class DateTimePickerAccessibleObject : ControlAccessibleObject
{
public DateTimePickerAccessibleObject(DateTimePicker owner) : base(owner)
{
}
public override string? KeyboardShortcut
{
get
{
// APP COMPAT. When computing DateTimePickerAccessibleObject::get_KeyboardShortcut the previous label
// takes precedence over DTP::Text.
// This code was copied from the Everett sources.
Label? previousLabel = PreviousLabel;
if (previousLabel is not null)
{
char previousLabelMnemonic = WindowsFormsUtils.GetMnemonic(previousLabel.Text, convertToUpperCase: false);
if (previousLabelMnemonic != '\0')
{
return $"Alt+{previousLabelMnemonic}";
}
}
// Win32 DTP does not interpret ampersand in its Text as an escape character for a mnemonic.
return null;
}
}
// Note: returns empty string instead of null, because the date value replaces null,
// so name is not empty in this case even if AccessibleName is not set.
public override string Name => this.GetOwnerAccessibleName(string.Empty);
internal override bool CanGetNameInternal => false;
public override string Value
{
get
{
string? baseValue = base.Value;
return !string.IsNullOrEmpty(baseValue) ? baseValue : this.GetOwnerText();
}
}
internal override bool CanGetValueInternal => false;
public override AccessibleStates State
{
get
{
AccessibleStates state = base.State;
if (this.TryGetOwnerAs(out DateTimePicker? owner) && owner.ShowCheckBox && owner.Checked)
{
state |= AccessibleStates.Checked;
}
return state;
}
}
public override AccessibleRole Role => this.GetOwnerAccessibleRole(AccessibleRole.ComboBox);
internal override bool IsIAccessibleExSupported() => true;
internal override VARIANT GetPropertyValue(UIA_PROPERTY_ID propertyID)
=> propertyID switch
{
UIA_PROPERTY_ID.UIA_LocalizedControlTypePropertyId when this.GetOwnerAccessibleRole() == AccessibleRole.Default
// We define a custom "LocalizedControlType" by default.
// If DateTimePicker.AccessibleRole value is customized by a user
// then "LocalizedControlType" value will be based on "ControlType"
// which depends on DateTimePicker.AccessibleRole.
=> (VARIANT)s_dateTimePickerLocalizedControlTypeString,
_ => base.GetPropertyValue(propertyID)
};
internal override bool IsPatternSupported(UIA_PATTERN_ID patternId)
=> patternId switch
{
UIA_PATTERN_ID.UIA_TogglePatternId when this.TryGetOwnerAs(out DateTimePicker? owner) && owner.ShowCheckBox => true,
UIA_PATTERN_ID.UIA_ExpandCollapsePatternId => true,
UIA_PATTERN_ID.UIA_ValuePatternId => true,
_ => base.IsPatternSupported(patternId)
};
public override string DefaultAction
=> ExpandCollapseState switch
{
ExpandCollapseState.ExpandCollapseState_Collapsed => SR.AccessibleActionExpand,
ExpandCollapseState.ExpandCollapseState_Expanded => SR.AccessibleActionCollapse,
_ => string.Empty
};
internal override bool CanGetDefaultActionInternal => false;
public override void DoDefaultAction()
{
switch (ExpandCollapseState)
{
case ExpandCollapseState.ExpandCollapseState_Collapsed:
Expand();
break;
case ExpandCollapseState.ExpandCollapseState_Expanded:
Collapse();
break;
}
}
internal override ToggleState ToggleState
=> this.TryGetOwnerAs(out DateTimePicker? owner) && owner.Checked ? ToggleState.ToggleState_On : ToggleState.ToggleState_Off;
internal override void Toggle()
{
if (this.IsOwnerHandleCreated(out DateTimePicker? owner))
{
owner.Checked = !owner.Checked;
}
}
internal override void Expand()
{
if (this.IsOwnerHandleCreated(out DateTimePicker? owner)
&& ExpandCollapseState == ExpandCollapseState.ExpandCollapseState_Collapsed)
{
PInvokeCore.SendMessage(owner, PInvokeCore.WM_SYSKEYDOWN, (WPARAM)(int)Keys.Down);
}
}
internal override void Collapse()
{
if (this.IsOwnerHandleCreated(out DateTimePicker? owner)
&& ExpandCollapseState == ExpandCollapseState.ExpandCollapseState_Expanded)
{
PInvokeCore.SendMessage(owner, PInvoke.DTM_CLOSEMONTHCAL);
}
}
internal override ExpandCollapseState ExpandCollapseState
=> this.TryGetOwnerAs(out DateTimePicker? owner)
? owner._expandCollapseState
: ExpandCollapseState.ExpandCollapseState_Collapsed;
}
}
|