Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

407 lines
10 KiB

  1. //****************************************************************************
  2. //
  3. // Copyright (c) 2001, Microsoft Corporation
  4. //
  5. // File: AccessibleWrapper.cpp
  6. //
  7. // Copied from nt\shell\themes\themeui\SettingsPg.h
  8. //
  9. //****************************************************************************
  10. #include "stdafx.h"
  11. #include "SchedMat.h"
  12. #include "AccessibleWrapper.h"
  13. #include "SchedBas.h"
  14. CAccessibleWrapper::CAccessibleWrapper (HWND hwnd, IAccessible * pAcc)
  15. : m_ref( 1 ),
  16. m_pAcc( pAcc ),
  17. m_hwnd( hwnd )
  18. {
  19. ASSERT( m_pAcc );
  20. m_pAcc->AddRef();
  21. }
  22. CAccessibleWrapper::~CAccessibleWrapper()
  23. {
  24. m_pAcc->Release();
  25. }
  26. // IUnknown
  27. // Implement refcounting ourselves
  28. // Also implement QI ourselves, so that we return a ptr back to the wrapper.
  29. STDMETHODIMP CAccessibleWrapper::QueryInterface(REFIID riid, void** ppv)
  30. {
  31. *ppv = NULL;
  32. if ((riid == IID_IUnknown) ||
  33. (riid == IID_IDispatch) ||
  34. (riid == IID_IAccessible))
  35. {
  36. *ppv = (IAccessible *) this;
  37. }
  38. else
  39. return(E_NOINTERFACE);
  40. AddRef();
  41. return(NOERROR);
  42. }
  43. STDMETHODIMP_(ULONG) CAccessibleWrapper::AddRef()
  44. {
  45. return ++m_ref;
  46. }
  47. STDMETHODIMP_(ULONG) CAccessibleWrapper::Release()
  48. {
  49. ULONG ulRet = --m_ref;
  50. if( ulRet == 0 )
  51. delete this;
  52. return ulRet;
  53. }
  54. // IDispatch
  55. // - pass all through m_pAcc
  56. STDMETHODIMP CAccessibleWrapper::GetTypeInfoCount(UINT* pctinfo)
  57. {
  58. return m_pAcc->GetTypeInfoCount(pctinfo);
  59. }
  60. STDMETHODIMP CAccessibleWrapper::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
  61. {
  62. return m_pAcc->GetTypeInfo(itinfo, lcid, pptinfo);
  63. }
  64. STDMETHODIMP CAccessibleWrapper::GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames,
  65. LCID lcid, DISPID* rgdispid)
  66. {
  67. return m_pAcc->GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
  68. }
  69. STDMETHODIMP CAccessibleWrapper::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
  70. DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo,
  71. UINT* puArgErr)
  72. {
  73. return m_pAcc->Invoke(dispidMember, riid, lcid, wFlags,
  74. pdispparams, pvarResult, pexcepinfo,
  75. puArgErr);
  76. }
  77. // IAccessible
  78. // - pass all through m_pAcc
  79. STDMETHODIMP CAccessibleWrapper::get_accParent(IDispatch ** ppdispParent)
  80. {
  81. return m_pAcc->get_accParent(ppdispParent);
  82. }
  83. STDMETHODIMP CAccessibleWrapper::get_accChildCount(long* pChildCount)
  84. {
  85. return m_pAcc->get_accChildCount(pChildCount);
  86. }
  87. STDMETHODIMP CAccessibleWrapper::get_accChild(VARIANT varChild, IDispatch ** ppdispChild)
  88. {
  89. return m_pAcc->get_accChild(varChild, ppdispChild);
  90. }
  91. STDMETHODIMP CAccessibleWrapper::get_accName(VARIANT varChild, BSTR* pszName)
  92. {
  93. if ( !pszName )
  94. return E_POINTER;
  95. if ( VT_I4 == varChild.vt && CHILDID_SELF == varChild.lVal )
  96. {
  97. const size_t bufLen = 256;
  98. WCHAR szName[bufLen];
  99. if ( 0 == SendMessage (m_hwnd, SCHEDMSG_GETSELDESCRIPTION, bufLen,
  100. (LPARAM) szName) )
  101. {
  102. *pszName = SysAllocString (szName);
  103. if ( *pszName )
  104. return S_OK;
  105. else
  106. return E_OUTOFMEMORY;
  107. }
  108. else
  109. return E_FAIL;
  110. }
  111. else
  112. return m_pAcc->get_accName(varChild, pszName);
  113. }
  114. STDMETHODIMP CAccessibleWrapper::get_accValue(VARIANT varChild, BSTR* pszValue)
  115. {
  116. // varChild.lVal specifies which sub-part of the component
  117. // is being queried.
  118. // CHILDID_SELF (0) specifies the overall component - other
  119. // non-0 values specify a child.
  120. if ( !pszValue )
  121. return E_POINTER;
  122. if( varChild.vt == VT_I4 && varChild.lVal == CHILDID_SELF )
  123. {
  124. LRESULT nPercentage = SendMessage (m_hwnd, SCHEDMSG_GETPERCENTAGE,
  125. 0, 0L);
  126. CString szValue;
  127. if ( -1 == nPercentage )
  128. {
  129. szValue.LoadString (IDS_MATRIX_ACC_VALUE_MULTIPLE_CELLS);
  130. }
  131. else
  132. {
  133. HWND hwndParent = GetParent (m_hwnd);
  134. if ( hwndParent )
  135. {
  136. LRESULT nIDD = SendMessage (hwndParent, BASEDLGMSG_GETIDD, 0, 0);
  137. switch ( nIDD )
  138. {
  139. case IDD_REPLICATION_SCHEDULE:
  140. if ( 0 == nPercentage )
  141. szValue.LoadString (IDS_REPLICATION_NOT_AVAILABLE);
  142. else
  143. szValue.LoadString (IDS_REPLICATION_AVAILABLE);
  144. break;
  145. case IDD_DS_SCHEDULE:
  146. switch (nPercentage)
  147. {
  148. case 0:
  149. szValue.LoadString (IDS_DO_NOT_REPLICATE);
  150. break;
  151. case 25:
  152. szValue.LoadString (IDS_REPLICATE_ONCE_PER_HOUR);
  153. break;
  154. case 50:
  155. szValue.LoadString (IDS_REPLICATE_TWICE_PER_HOUR);
  156. break;
  157. case 100:
  158. szValue.LoadString (IDS_REPLICATE_FOUR_TIMES_PER_HOUR);
  159. break;
  160. default:
  161. break;
  162. }
  163. break;
  164. case IDD_DIRSYNC_SCHEDULE:
  165. if ( 0 == nPercentage )
  166. szValue.LoadString (IDS_DONT_SYNCHRONIZE);
  167. else
  168. szValue.LoadString (IDS_SYNCHRONIZE);
  169. break;
  170. case IDD_DIALIN_HOURS:
  171. case IDD_LOGON_HOURS:
  172. if ( 0 == nPercentage )
  173. szValue.LoadString (IDS_LOGON_DENIED);
  174. else
  175. szValue.LoadString (IDS_LOGON_PERMITTED);
  176. break;
  177. default:
  178. break;
  179. }
  180. }
  181. }
  182. *pszValue = SysAllocString (szValue);
  183. if ( *pszValue )
  184. return S_OK;
  185. else
  186. return E_OUTOFMEMORY;
  187. }
  188. else
  189. {
  190. // Pass requests about the sub-components to the
  191. // 'original' IAccessible for us).
  192. return m_pAcc->get_accValue(varChild, pszValue);
  193. }
  194. }
  195. STDMETHODIMP CAccessibleWrapper::get_accDescription(VARIANT varChild, BSTR* pszDescription)
  196. {
  197. if ( varChild.vt == VT_I4 && varChild.lVal == CHILDID_SELF )
  198. {
  199. CString szDescription;
  200. HWND hwndParent = GetParent (m_hwnd);
  201. if ( hwndParent )
  202. {
  203. LRESULT nIDD = SendMessage (hwndParent, BASEDLGMSG_GETIDD, 0, 0);
  204. switch ( nIDD )
  205. {
  206. case IDD_REPLICATION_SCHEDULE:
  207. szDescription.LoadString (IDS_REPLICATION_SCHEDULE_ACC_DESCRIPTION);
  208. break;
  209. case IDD_DS_SCHEDULE:
  210. szDescription.LoadString (IDS_DS_SCHEDULE_ACC_DESCRIPTION);
  211. break;
  212. case IDD_DIRSYNC_SCHEDULE:
  213. szDescription.LoadString (IDS_DIRSYNC_SCHEDULE_ACC_DESCRIPTION);
  214. break;
  215. case IDD_DIALIN_HOURS:
  216. szDescription.LoadString (IDS_DIALIN_HOURS_ACC_DESCRIPTION);
  217. break;
  218. case IDD_LOGON_HOURS:
  219. szDescription.LoadString (IDS_LOGON_HOURS_ACC_DESCRIPTION);
  220. break;
  221. default:
  222. break;
  223. }
  224. }
  225. *pszDescription = SysAllocString (szDescription);
  226. if ( *pszDescription )
  227. return S_OK;
  228. else
  229. return E_OUTOFMEMORY;
  230. }
  231. else
  232. {
  233. return m_pAcc->get_accDescription(varChild, pszDescription);
  234. }
  235. }
  236. STDMETHODIMP CAccessibleWrapper::get_accRole(VARIANT varChild, VARIANT *pvarRole)
  237. {
  238. if ( !pvarRole )
  239. return E_POINTER;
  240. if ( VT_I4 == varChild.vt && CHILDID_SELF == varChild.lVal )
  241. {
  242. // reset the out variable
  243. V_VT(pvarRole) = VT_EMPTY;
  244. V_VT(pvarRole) = VT_I4;
  245. V_I4(pvarRole) = ROLE_SYSTEM_TABLE;
  246. return S_OK;
  247. }
  248. else
  249. return m_pAcc->get_accRole(varChild, pvarRole);
  250. }
  251. STDMETHODIMP CAccessibleWrapper::get_accState(VARIANT varChild, VARIANT *pvarState)
  252. {
  253. if ( !pvarState )
  254. return E_POINTER;
  255. if ( VT_I4 == varChild.vt && CHILDID_SELF == varChild.lVal )
  256. {
  257. // reset the out variable
  258. V_VT(pvarState) = VT_EMPTY;
  259. V_VT(pvarState) = VT_I4;
  260. V_I4(pvarState) = STATE_SYSTEM_FOCUSED | STATE_SYSTEM_FOCUSABLE |
  261. STATE_SYSTEM_MULTISELECTABLE | STATE_SYSTEM_SELECTABLE |
  262. STATE_SYSTEM_SELECTED;
  263. return S_OK;
  264. }
  265. else
  266. return m_pAcc->get_accState(varChild, pvarState);
  267. }
  268. STDMETHODIMP CAccessibleWrapper::get_accHelp(VARIANT varChild, BSTR* pszHelp)
  269. {
  270. return m_pAcc->get_accHelp(varChild, pszHelp);
  271. }
  272. STDMETHODIMP CAccessibleWrapper::get_accHelpTopic(BSTR* pszHelpFile, VARIANT varChild, long* pidTopic)
  273. {
  274. return m_pAcc->get_accHelpTopic(pszHelpFile, varChild, pidTopic);
  275. }
  276. STDMETHODIMP CAccessibleWrapper::get_accKeyboardShortcut(VARIANT varChild, BSTR* pszKeyboardShortcut)
  277. {
  278. return m_pAcc->get_accKeyboardShortcut(varChild, pszKeyboardShortcut);
  279. }
  280. STDMETHODIMP CAccessibleWrapper::get_accFocus(VARIANT * pvarFocusChild)
  281. {
  282. return m_pAcc->get_accFocus(pvarFocusChild);
  283. }
  284. STDMETHODIMP CAccessibleWrapper::get_accSelection(VARIANT * pvarSelectedChildren)
  285. {
  286. return m_pAcc->get_accSelection(pvarSelectedChildren);
  287. }
  288. STDMETHODIMP CAccessibleWrapper::get_accDefaultAction(VARIANT varChild, BSTR* pszDefaultAction)
  289. {
  290. return m_pAcc->get_accDefaultAction(varChild, pszDefaultAction);
  291. }
  292. STDMETHODIMP CAccessibleWrapper::accSelect(long flagsSel, VARIANT varChild)
  293. {
  294. return m_pAcc->accSelect(flagsSel, varChild);
  295. }
  296. STDMETHODIMP CAccessibleWrapper::accLocation(long* pxLeft, long* pyTop, long* pcxWidth, long* pcyHeight, VARIANT varChild)
  297. {
  298. return m_pAcc->accLocation(pxLeft, pyTop, pcxWidth, pcyHeight, varChild);
  299. }
  300. STDMETHODIMP CAccessibleWrapper::accNavigate(long navDir, VARIANT varStart, VARIANT * pvarEndUpAt)
  301. {
  302. return m_pAcc->accNavigate(navDir, varStart, pvarEndUpAt);
  303. }
  304. STDMETHODIMP CAccessibleWrapper::accHitTest(long xLeft, long yTop, VARIANT * pvarChildAtPoint)
  305. {
  306. return m_pAcc->accHitTest(xLeft, yTop, pvarChildAtPoint);
  307. }
  308. STDMETHODIMP CAccessibleWrapper::accDoDefaultAction(VARIANT varChild)
  309. {
  310. return m_pAcc->accDoDefaultAction(varChild);
  311. }
  312. STDMETHODIMP CAccessibleWrapper::put_accName(VARIANT varChild, BSTR szName)
  313. {
  314. return m_pAcc->put_accName(varChild, szName);
  315. }
  316. STDMETHODIMP CAccessibleWrapper::put_accValue(VARIANT varChild, BSTR pszValue)
  317. {
  318. return m_pAcc->put_accValue(varChild, pszValue);
  319. }