use crate::{
msaa::object::AccessibleObject,
uia::pattern::{PatternCreator, PatternError},
};
use std::fmt::{Debug, Formatter};
use windows::{
core::{Result, BSTR},
Win32::UI::Accessibility::{
IUIAutomationLegacyIAccessiblePattern, UIA_LegacyIAccessiblePatternId, UIA_PATTERN_ID,
},
};
pub struct UiAutomationIAccessiblePattern(IUIAutomationLegacyIAccessiblePattern);
impl TryFrom<IUIAutomationLegacyIAccessiblePattern> for UiAutomationIAccessiblePattern {
type Error = PatternError;
fn try_from(
value: IUIAutomationLegacyIAccessiblePattern,
) -> std::result::Result<Self, Self::Error> {
Ok(Self(value))
}
}
impl PatternCreator<IUIAutomationLegacyIAccessiblePattern> for UiAutomationIAccessiblePattern {
const PATTERN: UIA_PATTERN_ID = UIA_LegacyIAccessiblePatternId;
}
impl UiAutomationIAccessiblePattern {
pub fn get_name(&self) -> String {
unsafe { self.0.CurrentName() }
.unwrap_or(BSTR::default())
.to_string()
}
pub fn get_description(&self) -> String {
unsafe { self.0.CurrentDescription() }
.unwrap_or(BSTR::default())
.to_string()
}
pub fn get_help(&self) -> String {
unsafe { self.0.CurrentHelp() }
.unwrap_or(BSTR::default())
.to_string()
}
pub fn get_state(&self) -> u32 {
unsafe { self.0.CurrentState() }.unwrap_or(0)
}
pub fn get_role(&self) -> u32 {
unsafe { self.0.CurrentRole() }.unwrap_or(0)
}
pub fn get_object(&self) -> Result<AccessibleObject> {
match unsafe { self.0.GetIAccessible() } {
Ok(o) => Ok(AccessibleObject::from_raw(
o,
unsafe { self.0.CurrentChildId() }.unwrap_or(0),
)),
Err(e) => Err(e),
}
}
}
impl Debug for UiAutomationIAccessiblePattern {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(
f,
"UiAutomationIAccessiblePattern(name:{}, description:{}, role:{})",
self.get_name(),
self.get_description(),
self.get_role()
)
}
}