use std::{
fmt::{Debug, Formatter},
sync::Weak,
};
use crate::{
ext::VecExt,
uia::{
element::UiAutomationElement,
pattern::{PatternCreatorWithAutomation, PatternError},
},
};
use windows::Win32::UI::Accessibility::{
IUIAutomation6, IUIAutomationTableItemPattern, IUIAutomationTablePattern,
RowOrColumnMajor_ColumnMajor, RowOrColumnMajor_Indeterminate, RowOrColumnMajor_RowMajor,
UIA_TableItemPatternId, UIA_TablePatternId, UIA_PATTERN_ID,
};
pub struct UiAutomationTablePattern(IUIAutomationTablePattern, Weak<IUIAutomation6>);
impl TryFrom<(IUIAutomationTablePattern, Weak<IUIAutomation6>)> for UiAutomationTablePattern {
type Error = PatternError;
fn try_from(
value: (IUIAutomationTablePattern, Weak<IUIAutomation6>),
) -> Result<Self, Self::Error> {
Ok(Self(value.0, value.1))
}
}
impl PatternCreatorWithAutomation<IUIAutomationTablePattern> for UiAutomationTablePattern {
const PATTERN: UIA_PATTERN_ID = UIA_TablePatternId;
}
impl UiAutomationTablePattern {
#[allow(non_upper_case_globals)]
pub fn row_or_column_major(&self) -> RowOrColumnMajor {
unsafe {
match self.0.CurrentRowOrColumnMajor() {
Ok(x) => match x {
RowOrColumnMajor_ColumnMajor => RowOrColumnMajor::Column,
RowOrColumnMajor_Indeterminate => RowOrColumnMajor::Indeterminate,
RowOrColumnMajor_RowMajor => RowOrColumnMajor::Row,
_ => RowOrColumnMajor::None,
},
Err(_) => RowOrColumnMajor::None,
}
}
}
pub fn column_headers(&self) -> Vec<UiAutomationElement> {
unsafe {
match self.0.GetCurrentColumnHeaders() {
Ok(x) => x
.to_vec()
.iter()
.map(|x| UiAutomationElement::obtain(self.1.clone(), x.clone()))
.collect(),
Err(_) => vec![],
}
}
}
}
pub enum RowOrColumnMajor {
Row,
Column,
Indeterminate,
None,
}
pub struct UiAutomationTableItemPattern(Weak<IUIAutomation6>, IUIAutomationTableItemPattern);
impl TryFrom<(IUIAutomationTableItemPattern, Weak<IUIAutomation6>)>
for UiAutomationTableItemPattern
{
type Error = PatternError;
fn try_from(
value: (IUIAutomationTableItemPattern, Weak<IUIAutomation6>),
) -> Result<Self, Self::Error> {
Ok(Self(value.1, value.0))
}
}
impl PatternCreatorWithAutomation<IUIAutomationTableItemPattern> for UiAutomationTableItemPattern {
const PATTERN: UIA_PATTERN_ID = UIA_TableItemPatternId;
}
impl UiAutomationTableItemPattern {
pub fn get_column_header_items(&self) -> Option<Vec<UiAutomationElement>> {
unsafe {
if let Ok(arr) = self.1.GetCurrentColumnHeaderItems() {
return Some(
arr.to_vec()
.iter()
.map(|i| UiAutomationElement::obtain(self.0.clone(), i.clone()))
.collect(),
);
}
None
}
}
pub fn get_row_header_items(&self) -> Option<Vec<UiAutomationElement>> {
unsafe {
if let Ok(arr) = self.1.GetCurrentRowHeaderItems() {
return Some(
arr.to_vec()
.iter()
.map(|i| UiAutomationElement::obtain(self.0.clone(), i.clone()))
.collect(),
);
}
None
}
}
}
impl Debug for UiAutomationTableItemPattern {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "UiAutomationTableItemPattern()")
}
}