win_wrap/uia/pattern/
table.rs1use std::{
15 fmt::{Debug, Formatter},
16 sync::Weak,
17};
18
19use crate::{
20 ext::VecExt,
21 uia::{
22 element::UiAutomationElement,
23 pattern::{PatternCreatorWithAutomation, PatternError},
24 },
25};
26use windows::Win32::UI::Accessibility::{
27 IUIAutomation6, IUIAutomationTableItemPattern, IUIAutomationTablePattern,
28 RowOrColumnMajor_ColumnMajor, RowOrColumnMajor_Indeterminate, RowOrColumnMajor_RowMajor,
29 UIA_TableItemPatternId, UIA_TablePatternId, UIA_PATTERN_ID,
30};
31
32pub struct UiAutomationTablePattern(IUIAutomationTablePattern, Weak<IUIAutomation6>);
36
37impl TryFrom<(IUIAutomationTablePattern, Weak<IUIAutomation6>)> for UiAutomationTablePattern {
38 type Error = PatternError;
39
40 fn try_from(
41 value: (IUIAutomationTablePattern, Weak<IUIAutomation6>),
42 ) -> Result<Self, Self::Error> {
43 Ok(Self(value.0, value.1))
44 }
45}
46
47impl PatternCreatorWithAutomation<IUIAutomationTablePattern> for UiAutomationTablePattern {
48 const PATTERN: UIA_PATTERN_ID = UIA_TablePatternId;
49}
50
51impl UiAutomationTablePattern {
53 #[allow(non_upper_case_globals)]
57 pub fn row_or_column_major(&self) -> RowOrColumnMajor {
58 unsafe {
59 match self.0.CurrentRowOrColumnMajor() {
60 Ok(x) => match x {
61 RowOrColumnMajor_ColumnMajor => RowOrColumnMajor::Column,
62 RowOrColumnMajor_Indeterminate => RowOrColumnMajor::Indeterminate,
63 RowOrColumnMajor_RowMajor => RowOrColumnMajor::Row,
64 _ => RowOrColumnMajor::None,
65 },
66 Err(_) => RowOrColumnMajor::None,
67 }
68 }
69 }
70
71 pub fn column_headers(&self) -> Vec<UiAutomationElement> {
75 unsafe {
76 match self.0.GetCurrentColumnHeaders() {
77 Ok(x) => x
78 .to_vec()
79 .iter()
80 .map(|x| UiAutomationElement::obtain(self.1.clone(), x.clone()))
81 .collect(),
82 Err(_) => vec![],
83 }
84 }
85 }
86}
87
88pub enum RowOrColumnMajor {
89 Row,
90 Column,
91 Indeterminate,
92 None,
93}
94
95pub struct UiAutomationTableItemPattern(Weak<IUIAutomation6>, IUIAutomationTableItemPattern);
98
99impl TryFrom<(IUIAutomationTableItemPattern, Weak<IUIAutomation6>)>
100 for UiAutomationTableItemPattern
101{
102 type Error = PatternError;
103
104 fn try_from(
105 value: (IUIAutomationTableItemPattern, Weak<IUIAutomation6>),
106 ) -> Result<Self, Self::Error> {
107 Ok(Self(value.1, value.0))
108 }
109}
110
111impl PatternCreatorWithAutomation<IUIAutomationTableItemPattern> for UiAutomationTableItemPattern {
112 const PATTERN: UIA_PATTERN_ID = UIA_TableItemPatternId;
113}
114
115impl UiAutomationTableItemPattern {
117 pub fn get_column_header_items(&self) -> Option<Vec<UiAutomationElement>> {
121 unsafe {
122 if let Ok(arr) = self.1.GetCurrentColumnHeaderItems() {
123 return Some(
124 arr.to_vec()
125 .iter()
126 .map(|i| UiAutomationElement::obtain(self.0.clone(), i.clone()))
127 .collect(),
128 );
129 }
130 None
131 }
132 }
133
134 pub fn get_row_header_items(&self) -> Option<Vec<UiAutomationElement>> {
138 unsafe {
139 if let Ok(arr) = self.1.GetCurrentRowHeaderItems() {
140 return Some(
141 arr.to_vec()
142 .iter()
143 .map(|i| UiAutomationElement::obtain(self.0.clone(), i.clone()))
144 .collect(),
145 );
146 }
147 None
148 }
149 }
150}
151
152impl Debug for UiAutomationTableItemPattern {
153 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
154 write!(f, "UiAutomationTableItemPattern()")
155 }
156}