2#include <core/SWndAccessible.h>
3#include <atl.mini/SComCli.h>
7#pragma comment(lib, "oleacc.lib")
9SAccessible::SAccessible(IWindow *pWnd)
14SAccessible::~SAccessible()
18HRESULT SAccessible::get_accParent(IDispatch **ppdispParent)
21 return CO_E_OBJNOTCONNECTED;
22 if (!m_pWnd->GetParent())
24 return AccessibleObjectFromWindow(m_pWnd->GetContainer()->GetHostHwnd(), (DWORD)OBJID_WINDOW, IID_IAccessible, (
void **)ppdispParent);
26 SComPtr<IAccessible> pAcc = m_pWnd->GetParent()->GetAccessible();
29 return pAcc->QueryInterface(IID_IDispatch, (
void **)ppdispParent);
32HRESULT SAccessible::get_accChild(VARIANT varChild, IDispatch **ppdispChild)
35 return CO_E_OBJNOTCONNECTED;
36 if (varChild.vt != VT_I4 || !ppdispChild)
41 SComPtr<IAccessible> pAcc = pChild->GetAccessible();
44 return pAcc->QueryInterface(IID_IDispatch, (
void **)ppdispChild);
47HRESULT SAccessible::get_accChildCount(
long *pcountChildren)
50 return CO_E_OBJNOTCONNECTED;
51 *pcountChildren = m_pWnd->GetChildrenCount();
55HRESULT SAccessible::get_accValue(VARIANT varChild, BSTR *pszValue)
58 return CO_E_OBJNOTCONNECTED;
59 if (varChild.vt != VT_I4 || !pszValue)
64 return pChild->
GetAccProxy()->get_accValue(pszValue);
67HRESULT SAccessible::put_accValue(VARIANT varChild, BSTR szValue)
70 return CO_E_OBJNOTCONNECTED;
71 if (varChild.vt != VT_I4)
76 return pChild->
GetAccProxy()->put_accValue(szValue);
79HRESULT SAccessible::get_accName(VARIANT varChild, BSTR *pszName)
82 return CO_E_OBJNOTCONNECTED;
84 if (varChild.vt != VT_I4)
92HRESULT SAccessible::put_accName(VARIANT varChild, BSTR szName)
95 return CO_E_OBJNOTCONNECTED;
96 if (varChild.vt != VT_I4)
104HRESULT SAccessible::accDoDefaultAction(VARIANT varChild)
107 return CO_E_OBJNOTCONNECTED;
108 if (varChild.vt != VT_I4)
113 return pChild->
GetAccProxy()->accDoDefaultAction();
116HRESULT SAccessible::get_accDefaultAction(VARIANT varChild, BSTR *pszDefaultAction)
119 return CO_E_OBJNOTCONNECTED;
120 if (varChild.vt != VT_I4)
125 return pChild->
GetAccProxy()->get_accDefaultAction(pszDefaultAction);
128HRESULT SAccessible::accHitTest(
long xLeft,
long yTop, VARIANT *pvarChild)
131 return CO_E_OBJNOTCONNECTED;
134 CPoint pt(xLeft, yTop);
135 ScreenToClient(m_pWnd->GetContainer()->GetHostHwnd(), &pt);
136 m_pWnd->TransformPointEx(pt);
148 pvarChild->vt = VT_I4;
149 pvarChild->lVal = CHILDID_SELF;
153 pvarChild->vt = VT_DISPATCH;
154 pChild->GetAccessible()->
QueryInterface(IID_IDispatch, (
void **)&pvarChild->pdispVal);
167BOOL SAccessible::accValidateNavStart(VARIANT *pvar)
const
178 case VT_VARIANT | VT_BYREF:
179 VariantCopy(pvar, pvar->pvarVal);
183 if (pvar->scode != DISP_E_PARAMNOTFOUND)
192 if ((pvar->lVal < 0) || (pvar->lVal > (LONG)m_pWnd->GetChildrenCount()))
205HRESULT SAccessible::accNavigate(
long navDir, VARIANT varStart, VARIANT *pvarEndUpAt)
208 return CO_E_OBJNOTCONNECTED;
209 HRESULT hr = E_INVALIDARG;
210 pvarEndUpAt->vt = VT_EMPTY;
211 if (!accValidateNavStart(&varStart))
215 case NAVDIR_FIRSTCHILD:
216 if (m_pWnd->GetChildrenCount() == 0)
218 if ((varStart.vt == VT_DISPATCH && varStart.pdispVal == NULL) || (varStart.vt == VT_I4 && varStart.lVal == CHILDID_SELF))
220 pvarEndUpAt->vt = VT_I4;
221 pvarEndUpAt->lVal = 1;
225 case NAVDIR_LASTCHILD:
226 if (m_pWnd->GetChildrenCount() == 0)
228 if ((varStart.vt == VT_DISPATCH && varStart.pdispVal == NULL) || (varStart.vt == VT_I4 && varStart.lVal == CHILDID_SELF))
230 pvarEndUpAt->vt = VT_I4;
231 pvarEndUpAt->lVal = m_pWnd->GetChildrenCount();
238 if (varStart.vt == VT_DISPATCH)
240 SAccessible *pAcc = varStart.pdispVal ? (SAccessible *)varStart.pdispVal : this;
244 SComPtr<IAccessible> pAcc = pNext->GetAccessible();
247 pvarEndUpAt->vt = VT_DISPATCH;
248 pAcc->QueryInterface(IID_IDispatch, (
void **)pvarEndUpAt->pdispVal);
253 else if (varStart.vt == VT_I4)
255 if (m_pWnd->GetChildrenCount() == 0)
257 pvarEndUpAt->vt = VT_I4;
258 pvarEndUpAt->lVal = varStart.lVal + 1;
259 if (pvarEndUpAt->lVal > (
int)m_pWnd->GetChildrenCount())
260 pvarEndUpAt->lVal = 1;
266 case NAVDIR_PREVIOUS:
267 if (varStart.vt == VT_DISPATCH)
269 SAccessible *pAcc = varStart.pdispVal ? (SAccessible *)varStart.pdispVal : this;
273 SComPtr<IAccessible> pAcc = pNext->GetAccessible();
276 pvarEndUpAt->vt = VT_DISPATCH;
277 pAcc->QueryInterface(IID_IDispatch, (
void **)pvarEndUpAt->pdispVal);
282 else if (varStart.vt == VT_I4)
284 if (m_pWnd->GetChildrenCount() == 0)
286 pvarEndUpAt->vt = VT_I4;
287 pvarEndUpAt->lVal = varStart.lVal - 1;
288 if (pvarEndUpAt->lVal < 1)
289 pvarEndUpAt->lVal = m_pWnd->GetChildrenCount();
297HRESULT SAccessible::accLocation(
long *pxLeft,
long *pyTop,
long *pcxWidth,
long *pcyHeight, VARIANT varChild)
300 return CO_E_OBJNOTCONNECTED;
301 if (!(varChild.vt == VT_I4 && pxLeft && pyTop && pcxWidth && pcyHeight))
308 CPoint pt = rc.TopLeft();
309 ClientToScreen(m_pWnd->GetContainer()->GetHostHwnd(), &pt);
312 *pcxWidth = rc.Width();
313 *pcyHeight = rc.Height();
317HRESULT SAccessible::accSelect(
long flagsSelect, VARIANT varChild)
320 return CO_E_OBJNOTCONNECTED;
321 if (varChild.vt != VT_I4)
327 return pChild->
GetAccProxy()->accSelect(flagsSelect);
330HRESULT SAccessible::get_accSelection(VARIANT *pvarChildren)
335HRESULT SAccessible::get_accFocus(VARIANT *pvarChild)
338 return CO_E_OBJNOTCONNECTED;
339 HWND hFocused = ::GetFocus();
340 if (hFocused == m_pWnd->GetContainer()->GetHostHwnd())
342 SWND hFocus = m_pWnd->GetContainer()->GetFocus();
346 if (pFocus == m_pWnd)
348 pvarChild->vt = VT_I4;
349 pvarChild->lVal = CHILDID_SELF;
360 pvarChild->vt = VT_I4;
361 pvarChild->lVal = iChild;
365 pvarChild->vt = VT_DISPATCH;
366 pFocus->GetAccessible()->
QueryInterface(IID_IDispatch, (
void **)&pvarChild->pdispVal);
377 pvarChild->vt = VT_DISPATCH;
378 return AccessibleObjectFromWindow(hFocused, OBJID_WINDOW, IID_IAccessible, (
void **)&pvarChild->pdispVal);
382HRESULT SAccessible::get_accState(VARIANT varChild, VARIANT *pvarState)
385 return CO_E_OBJNOTCONNECTED;
386 if (varChild.vt != VT_I4)
392 return pChild->
GetAccProxy()->get_accState(pvarState);
395STDMETHODIMP SAccessible::get_accHelp(VARIANT varChild, BSTR *pszHelp)
398 return CO_E_OBJNOTCONNECTED;
399 if (varChild.vt != VT_I4)
405 return pChild->
GetAccProxy()->get_accHelp(pszHelp);
408STDMETHODIMP SAccessible::get_accHelpTopic(BSTR *pszHelpFile, VARIANT varChild,
long *pidTopic)
410 if (varChild.vt != VT_I4)
416 return pChild->
GetAccProxy()->get_accHelpTopic(pszHelpFile, pidTopic);
419STDMETHODIMP SAccessible::get_accKeyboardShortcut(VARIANT varChild, BSTR *pszKeyboardShortcut)
422 return CO_E_OBJNOTCONNECTED;
423 if (varChild.vt != VT_I4)
429 return pChild->
GetAccProxy()->get_accKeyboardShortcut(pszKeyboardShortcut);
432HRESULT SAccessible::get_accRole(VARIANT varChild, VARIANT *pvarRole)
435 return CO_E_OBJNOTCONNECTED;
436 if (varChild.vt != VT_I4)
442 return pAccProxy->get_accRole(pvarRole);
445HRESULT SAccessible::get_accDescription(VARIANT varChild, BSTR *pszDescription)
448 return CO_E_OBJNOTCONNECTED;
449 if (varChild.vt != VT_I4)
454 return pChild->
GetAccProxy()->get_accDescription(pszDescription);
458STDMETHODIMP SAccessible::GetTypeInfoCount(
unsigned int *pctinfo)
463STDMETHODIMP SAccessible::GetTypeInfo(
unsigned int iTInfo, LCID lcid, ITypeInfo **ppTInfo)
468STDMETHODIMP SAccessible::GetIDsOfNames(REFIID riid, OLECHAR **rgszNames,
unsigned int cNames, LCID lcid, DISPID *rgDispId)
473STDMETHODIMP SAccessible::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo,
unsigned int *puArgErr)
Base class for SOUI DUI windows.
SWindow * GetParent() const
Retrieves the parent window.
HRESULT QueryInterface(REFGUID id, IObjRef **ppRet) OVERRIDE
Queries an interface.
SWindow * GetChild(int iChild) const
Retrieves a child window by index.
IAccProxy * GetAccProxy()
Retrieves the accessibility proxy for the window.
BOOL IsVisible(BOOL bCheckParent=FALSE) SCONST OVERRIDE
Checks if the window is visible.
BOOL IsContainPoint(POINT pt, BOOL bClientOnly) SCONST OVERRIDE
Checks if the window contains a specified point.
SWindow * GetWindow(int uCode) const
Retrieves a window based on a given code.
void TransformPoint(CPoint &pt) const
Transforms a point based on the current window's transformation matrix.
void GetWindowRect(LPRECT prect) SCONST OVERRIDE
Retrieves the bounding rectangle of the window.
static SWindow * GetWindow(SWND swnd)
Retrieves the SWindow pointer from a given handle.