X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a37e4a071ce9bbd6825fb6c6a03154d4318d2cff..efa4bab2d1fc98b69d50a20759b5a6a26cef1f8d:/src/msw/ole/access.cpp diff --git a/src/msw/ole/access.cpp b/src/msw/ole/access.cpp index ce0088ba9c..32dab02e82 100644 --- a/src/msw/ole/access.cpp +++ b/src/msw/ole/access.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: msw/ole/access.cpp +// Name: src/msw/ole/access.cpp // Purpose: implementation of wxIAccessible and wxAccessible // Author: Julian Smart // Modified by: @@ -17,28 +17,22 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "access.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #if defined(__BORLANDC__) #pragma hdrstop #endif -#ifndef WX_PRECOMP -#include "wx/window.h" -#endif - -#include "wx/setup.h" #if wxUSE_OLE && wxUSE_ACCESSIBILITY -#include "wx/log.h" #include "wx/access.h" -#include +#ifndef WX_PRECOMP + #include "wx/msw/wrapwin.h" + #include "wx/window.h" + #include "wx/log.h" +#endif // for some compilers, the entire ole2.h must be included, not only oleauto.h #if wxUSE_NORLANDER_HEADERS || defined(__WATCOMC__) @@ -47,7 +41,6 @@ #include #include -#include #include "wx/msw/ole/oleutils.h" @@ -71,6 +64,7 @@ int wxConvertToWindowsSelFlag(wxAccSelectionFlags sel); // Convert from Windows selection flag wxAccSelectionFlags wxConvertFromWindowsSelFlag(int sel); +#if wxUSE_VARIANT // ---------------------------------------------------------------------------- // wxIEnumVARIANT interface implementation // ---------------------------------------------------------------------------- @@ -79,7 +73,7 @@ class wxIEnumVARIANT : public IEnumVARIANT { public: wxIEnumVARIANT(const wxVariant& variant); - ~wxIEnumVARIANT() { } + virtual ~wxIEnumVARIANT() { } DECLARE_IUNKNOWN_METHODS; @@ -93,7 +87,7 @@ private: wxVariant m_variant; // List of further variants int m_nCurrent; // Current enum position - DECLARE_NO_COPY_CLASS(wxIEnumVARIANT) + wxDECLARE_NO_COPY_CLASS(wxIEnumVARIANT); }; // ---------------------------------------------------------------------------- @@ -182,6 +176,7 @@ STDMETHODIMP wxIEnumVARIANT::Clone(IEnumVARIANT **ppenum) return S_OK; } +#endif // wxUSE_VARIANT // ---------------------------------------------------------------------------- // wxIAccessible implementation of IAccessible interface @@ -192,6 +187,9 @@ class wxIAccessible : public IAccessible public: wxIAccessible(wxAccessible *pAccessible); + // Called to indicate object should prepare to be deleted. + void Quiesce(); + DECLARE_IUNKNOWN_METHODS; // IAccessible @@ -199,12 +197,12 @@ public: // Navigation and Hierarchy // Retrieves the child element or child object at a given point on the screen. - // All visual objects support this method; sound objects do not support it. + // All visual objects support this method; sound objects do not support it. STDMETHODIMP accHitTest(long xLeft, long yLeft, VARIANT* pVarID); // Retrieves the specified object's current screen location. All visual objects must - // support this method; sound objects do not support it. + // support this method; sound objects do not support it. STDMETHODIMP accLocation ( long* pxLeft, long* pyTop, long* pcxWidth, long* pcyHeight, VARIANT varID); @@ -215,29 +213,29 @@ public: // Retrieves the address of an IDispatch interface for the specified child. // All objects must support this property. - + STDMETHODIMP get_accChild ( VARIANT varChildID, IDispatch** ppDispChild); // Retrieves the number of children that belong to this object. // All objects must support this property. - + STDMETHODIMP get_accChildCount ( long* pCountChildren); // Retrieves the IDispatch interface of the object's parent. // All objects support this property. - + STDMETHODIMP get_accParent ( IDispatch** ppDispParent); // Descriptive Properties and Methods // Performs the object's default action. Not all objects have a default // action. - + STDMETHODIMP accDoDefaultAction(VARIANT varID); // Retrieves a string that describes the object's default action. // Not all objects have a default action. - + STDMETHODIMP get_accDefaultAction ( VARIANT varID, BSTR* pszDefaultAction); // Retrieves a string that describes the visual appearance of the specified object. @@ -253,18 +251,18 @@ public: // Retrieves the full path of the WinHelp file associated with the specified // object and the identifier of the appropriate topic within that file. // Not all objects support this property. - + STDMETHODIMP get_accHelpTopic ( BSTR* pszHelpFile, VARIANT varChild, long* pidTopic); // Retrieves the specified object's shortcut key or access key, also known as // the mnemonic. All objects that have a shortcut key or access key support // this property. - + STDMETHODIMP get_accKeyboardShortcut ( VARIANT varID, BSTR* pszKeyboardShortcut); // Retrieves the name of the specified object. // All objects support this property. - + STDMETHODIMP get_accName ( VARIANT varID, BSTR* pszName); // Retrieves information that describes the role of the specified object. @@ -274,9 +272,9 @@ public: // Retrieves the current state of the specified object. // All objects support this property. - + STDMETHODIMP get_accState ( VARIANT varID, VARIANT* pVarState); - + // Retrieves the value of the specified object. // Not all objects have a value. @@ -292,18 +290,18 @@ public: // Retrieves the object that has the keyboard focus. All objects // that receive the keyboard focus must support this property. - + STDMETHODIMP get_accFocus ( VARIANT* pVarID); // Retrieves the selected children of this object. All objects // selected must support this property. - + STDMETHODIMP get_accSelection ( VARIANT * pVarChildren); // Obsolete - STDMETHODIMP put_accName(VARIANT varChild, BSTR szName) { return E_FAIL; } - STDMETHODIMP put_accValue(VARIANT varChild, BSTR szName) { return E_FAIL; } + STDMETHODIMP put_accName(VARIANT WXUNUSED(varChild), BSTR WXUNUSED(szName)) { return E_FAIL; } + STDMETHODIMP put_accValue(VARIANT WXUNUSED(varChild), BSTR WXUNUSED(szName)) { return E_FAIL; } // IDispatch @@ -322,9 +320,9 @@ public: // Invoke - STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, - WORD wFlags, DISPPARAMS *pDispParams, - VARIANT *pVarResult, EXCEPINFO *pExcepInfo, + STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, + WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, unsigned int *puArgErr ); // Helpers @@ -339,8 +337,9 @@ public: private: wxAccessible *m_pAccessible; // pointer to C++ class we belong to + bool m_bQuiescing; // Object is to be deleted - DECLARE_NO_COPY_CLASS(wxIAccessible) + wxDECLARE_NO_COPY_CLASS(wxIAccessible); }; // ============================================================================ @@ -363,27 +362,36 @@ wxIAccessible::wxIAccessible(wxAccessible *pAccessible) wxASSERT( pAccessible != NULL ); m_pAccessible = pAccessible; + m_bQuiescing = false; +} + +// Called to indicate object should prepare to be deleted. + +void wxIAccessible::Quiesce() +{ + m_bQuiescing = true; + m_pAccessible = NULL; } // Retrieves the child element or child object at a given point on the screen. -// All visual objects support this method; sound objects do not support it. +// All visual objects support this method; sound objects do not support it. STDMETHODIMP wxIAccessible::accHitTest(long xLeft, long yLeft, VARIANT* pVarID) { - wxLogTrace(wxT("access"), "accHitTest"); - wxASSERT (m_pAccessible != NULL); + wxLogTrace(wxT("access"), wxT("accHitTest")); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; - + wxAccessible* childObject = NULL; int childId = 0; VariantInit(pVarID); - + wxAccStatus status = m_pAccessible->HitTest(wxPoint(xLeft, yLeft), & childId, & childObject); - + if (status == wxACC_FAIL) return E_FAIL; - + if (status == wxACC_NOT_IMPLEMENTED) { // Use standard interface instead. @@ -393,7 +401,7 @@ STDMETHODIMP wxIAccessible::accHitTest(long xLeft, long yLeft, VARIANT* pVarID) else return stdInterface->accHitTest(xLeft, yLeft, pVarID); } - + if (childObject) { if (childObject == m_pAccessible) @@ -408,9 +416,9 @@ STDMETHODIMP wxIAccessible::accHitTest(long xLeft, long yLeft, VARIANT* pVarID) if (!childIA) return E_NOTIMPL; - if (childIA->QueryInterface(IID_IDispatch, (LPVOID*) & pVarID->pdispVal) != S_OK) - return E_FAIL; - + if (childIA->QueryInterface(IID_IDispatch, (LPVOID*) & pVarID->pdispVal) != S_OK) + return E_FAIL; + pVarID->vt = VT_DISPATCH; return S_OK; } @@ -426,26 +434,30 @@ STDMETHODIMP wxIAccessible::accHitTest(long xLeft, long yLeft, VARIANT* pVarID) pVarID->vt = VT_EMPTY; return S_FALSE; } - + + #if 0 + // all cases above already cause some return action so below line + // is unreachable and cause unnecessary warning return E_NOTIMPL; + #endif } // Retrieves the specified object's current screen location. All visual objects must -// support this method; sound objects do not support it. +// support this method; sound objects do not support it. STDMETHODIMP wxIAccessible::accLocation ( long* pxLeft, long* pyTop, long* pcxWidth, long* pcyHeight, VARIANT varID) { - wxLogTrace(wxT("access"), "accLocation"); - wxASSERT (m_pAccessible != NULL); + wxLogTrace(wxT("access"), wxT("accLocation")); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; - + wxRect rect; wxAccStatus status = m_pAccessible->GetLocation(rect, varID.lVal); if (status == wxACC_FAIL) return E_FAIL; - + if (status == wxACC_NOT_IMPLEMENTED) { // Try to use child object directly. @@ -482,17 +494,23 @@ STDMETHODIMP wxIAccessible::accLocation ( long* pxLeft, long* pyTop, long* pcxWi STDMETHODIMP wxIAccessible::accNavigate ( long navDir, VARIANT varStart, VARIANT* pVarEnd) { - wxASSERT (m_pAccessible != NULL); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; wxLogTrace(wxT("access"), wxString(wxT("accNavigate for ")) + m_pAccessible->GetWindow()->GetClassInfo()->GetClassName()); - if ((varStart.vt != VT_I4 && varStart.vt != VT_EMPTY) || varStart.vt < 0) + if ((varStart.vt != VT_I4 && varStart.vt != VT_EMPTY) + #if 0 + // according to MSDN and sources varStart.vt is unsigned + // so below line cause warning "Condition is always false" + || varStart.vt < 0 + #endif + ) { - wxLogTrace(wxT("access"), "Invalid arg for accNavigate"); + wxLogTrace(wxT("access"), wxT("Invalid arg for accNavigate")); return E_INVALIDARG; } - + wxAccessible* elementObject = NULL; int elementId = 0; VariantInit(pVarEnd); @@ -548,25 +566,25 @@ STDMETHODIMP wxIAccessible::accNavigate ( long navDir, VARIANT varStart, VARIANT } } wxLogTrace(wxT("access"), navStr); - + wxAccStatus status = m_pAccessible->Navigate(navDirWX, varStart.lVal, & elementId, & elementObject); if (status == wxACC_FAIL) { - wxLogTrace(wxT("access"), "wxAccessible::Navigate failed"); + wxLogTrace(wxT("access"), wxT("wxAccessible::Navigate failed")); return E_FAIL; } - + if (status == wxACC_FALSE) { - wxLogTrace(wxT("access"), "wxAccessible::Navigate found no object in this direction"); + wxLogTrace(wxT("access"), wxT("wxAccessible::Navigate found no object in this direction")); return S_FALSE; } - + if (status == wxACC_NOT_IMPLEMENTED) { - wxLogTrace(wxT("access"), "Navigate not implemented"); + wxLogTrace(wxT("access"), wxT("Navigate not implemented")); // Try to use child object directly. if (varStart.vt == VT_I4 && varStart.lVal > 0) @@ -589,57 +607,57 @@ STDMETHODIMP wxIAccessible::accNavigate ( long navDir, VARIANT varStart, VARIANT { if (elementObject) { - wxLogTrace(wxT("access"), "Getting wxIAccessible and calling QueryInterface for Navigate"); + wxLogTrace(wxT("access"), wxT("Getting wxIAccessible and calling QueryInterface for Navigate")); wxIAccessible* objectIA = elementObject->GetIAccessible(); if (!objectIA) { - wxLogTrace(wxT("access"), "No wxIAccessible"); + wxLogTrace(wxT("access"), wxT("No wxIAccessible")); return E_FAIL; } - HRESULT hResult = objectIA->QueryInterface(IID_IDispatch, (LPVOID*) & pVarEnd->pdispVal); + HRESULT hResult = objectIA->QueryInterface(IID_IDispatch, (LPVOID*) & pVarEnd->pdispVal); if (hResult != S_OK) { - wxLogTrace(wxT("access"), "QueryInterface failed"); - return E_FAIL; + wxLogTrace(wxT("access"), wxT("QueryInterface failed")); + return E_FAIL; } - - wxLogTrace(wxT("access"), "Called QueryInterface for Navigate"); + + wxLogTrace(wxT("access"), wxT("Called QueryInterface for Navigate")); pVarEnd->vt = VT_DISPATCH; return S_OK; } else if (elementId > 0) { - wxLogTrace(wxT("access"), "Returning element id from Navigate"); + wxLogTrace(wxT("access"), wxT("Returning element id from Navigate")); pVarEnd->vt = VT_I4; pVarEnd->lVal = elementId; return S_OK; } else { - wxLogTrace(wxT("access"), "No object in accNavigate"); + wxLogTrace(wxT("access"), wxT("No object in accNavigate")); pVarEnd->vt = VT_EMPTY; return S_FALSE; } } - wxLogTrace(wxT("access"), "Failing Navigate"); + wxLogTrace(wxT("access"), wxT("Failing Navigate")); return E_NOTIMPL; } // Retrieves the address of an IDispatch interface for the specified child. // All objects must support this property. - + STDMETHODIMP wxIAccessible::get_accChild ( VARIANT varChildID, IDispatch** ppDispChild) { - wxLogTrace(wxT("access"), "get_accChild"); - wxASSERT (m_pAccessible != NULL); + wxLogTrace(wxT("access"), wxT("get_accChild")); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; - + if (varChildID.vt != VT_I4) { - wxLogTrace(wxT("access"), "Invalid arg for get_accChild"); + wxLogTrace(wxT("access"), wxT("Invalid arg for get_accChild")); return E_INVALIDARG; } @@ -649,16 +667,16 @@ STDMETHODIMP wxIAccessible::get_accChild ( VARIANT varChildID, IDispatch** ppDis AddRef(); return S_OK; } - + wxAccessible* child = NULL; wxAccStatus status = m_pAccessible->GetChild(varChildID.lVal, & child); if (status == wxACC_FAIL) { - wxLogTrace(wxT("access"), "GetChild failed"); + wxLogTrace(wxT("access"), wxT("GetChild failed")); return E_FAIL; } - + if (status == wxACC_NOT_IMPLEMENTED) { // Use standard interface instead. @@ -667,7 +685,7 @@ STDMETHODIMP wxIAccessible::get_accChild ( VARIANT varChildID, IDispatch** ppDis return E_NOTIMPL; else { - wxLogTrace(wxT("access"), "Using standard interface for get_accChild"); + wxLogTrace(wxT("access"), wxT("Using standard interface for get_accChild")); return stdInterface->get_accChild (varChildID, ppDispChild); } } @@ -679,39 +697,43 @@ STDMETHODIMP wxIAccessible::get_accChild ( VARIANT varChildID, IDispatch** ppDis if (!objectIA) return E_NOTIMPL; - if (objectIA->QueryInterface(IID_IDispatch, (LPVOID*) ppDispChild) != S_OK) + if (objectIA->QueryInterface(IID_IDispatch, (LPVOID*) ppDispChild) != S_OK) { - wxLogTrace(wxT("access"), "QueryInterface failed in get_accChild"); - return E_FAIL; + wxLogTrace(wxT("access"), wxT("QueryInterface failed in get_accChild")); + return E_FAIL; } - + return S_OK; } else { - wxLogTrace(wxT("access"), "Not an accessible object"); + wxLogTrace(wxT("access"), wxT("Not an accessible object")); return S_FALSE; // Indicates it's not an accessible object } } + #if 0 + // all cases above already cause some return action so below line + // is unreachable and cause unnecessary warning return E_NOTIMPL; + #endif } // Retrieves the number of children that belong to this object. // All objects must support this property. - + STDMETHODIMP wxIAccessible::get_accChildCount ( long* pCountChildren) { - wxLogTrace(wxT("access"), "get_accChildCount"); - wxASSERT (m_pAccessible != NULL); + wxLogTrace(wxT("access"), wxT("get_accChildCount")); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; - + int childCount = 0; wxAccStatus status = m_pAccessible->GetChildCount(& childCount); if (status == wxACC_FAIL) return E_FAIL; - + if (status == wxACC_NOT_IMPLEMENTED) { // Use standard interface instead. @@ -720,7 +742,7 @@ STDMETHODIMP wxIAccessible::get_accChildCount ( long* pCountChildren) return E_NOTIMPL; else { - wxLogTrace(wxT("access"), "Using standard interface for get_accChildCount"); + wxLogTrace(wxT("access"), wxT("Using standard interface for get_accChildCount")); HRESULT res = stdInterface->get_accChildCount (pCountChildren); wxString str; str.Printf(wxT("Number of children was %d"), (int) (*pCountChildren)); @@ -734,19 +756,23 @@ STDMETHODIMP wxIAccessible::get_accChildCount ( long* pCountChildren) return S_OK; } + #if 0 + // all cases above already cause some return action so below line + // is unreachable and cause unnecessary warning return E_NOTIMPL; + #endif } // Retrieves the IDispatch interface of the object's parent. // All objects support this property. - + STDMETHODIMP wxIAccessible::get_accParent ( IDispatch** ppDispParent) { - wxLogTrace(wxT("access"), "get_accParent"); - wxASSERT (m_pAccessible != NULL); + wxLogTrace(wxT("access"), wxT("get_accParent")); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; - + wxAccessible* parent = NULL; wxAccStatus status = m_pAccessible->GetParent(& parent); @@ -754,11 +780,11 @@ STDMETHODIMP wxIAccessible::get_accParent ( IDispatch** ppDispParent) return E_FAIL; // It doesn't seem acceptable to return S_FALSE with a NULL - // ppDispParent, so if we have no wxWindows parent, we leave + // ppDispParent, so if we have no wxWidgets parent, we leave // it to the standard interface. if (status == wxACC_NOT_IMPLEMENTED || !parent) { - wxLogTrace(wxT("access"), "Using standard interface to get the parent."); + wxLogTrace(wxT("access"), wxT("Using standard interface to get the parent.")); // Use standard interface instead. IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd(); if (!stdInterface) @@ -774,52 +800,56 @@ STDMETHODIMP wxIAccessible::get_accParent ( IDispatch** ppDispParent) if (!objectIA) return E_FAIL; - wxLogTrace(wxT("access"), "About to call QueryInterface"); - if (objectIA->QueryInterface(IID_IDispatch, (LPVOID*) ppDispParent) != S_OK) + wxLogTrace(wxT("access"), wxT("About to call QueryInterface")); + if (objectIA->QueryInterface(IID_IDispatch, (LPVOID*) ppDispParent) != S_OK) { - wxLogTrace(wxT("access"), "Failed QueryInterface"); - return E_FAIL; + wxLogTrace(wxT("access"), wxT("Failed QueryInterface")); + return E_FAIL; } - - wxLogTrace(wxT("access"), "Returning S_OK for get_accParent"); + + wxLogTrace(wxT("access"), wxT("Returning S_OK for get_accParent")); return S_OK; } else { // This doesn't seem to be allowed, despite the documentation, // so we handle it higher up by using the standard interface. - wxLogTrace(wxT("access"), "Returning NULL parent because there was none"); + wxLogTrace(wxT("access"), wxT("Returning NULL parent because there was none")); *ppDispParent = NULL; return S_FALSE; } } + #if 0 + // all cases above already cause some return action so below line + // is unreachable and cause unnecessary warning return E_NOTIMPL; + #endif } // Performs the object's default action. Not all objects have a default // action. - + STDMETHODIMP wxIAccessible::accDoDefaultAction(VARIANT varID) { - wxLogTrace(wxT("access"), "accDoDefaultAction"); - wxASSERT (m_pAccessible != NULL); + wxLogTrace(wxT("access"), wxT("accDoDefaultAction")); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; - + if (varID.vt != VT_I4) { - wxLogTrace(wxT("access"), "Invalid arg for accDoDefaultAction"); + wxLogTrace(wxT("access"), wxT("Invalid arg for accDoDefaultAction")); return E_INVALIDARG; } - + wxAccStatus status = m_pAccessible->DoDefaultAction(varID.lVal); if (status == wxACC_FAIL) return E_FAIL; if (status == wxACC_NOT_SUPPORTED) return DISP_E_MEMBERNOTFOUND; - + if (status == wxACC_NOT_IMPLEMENTED) { // Try to use child object directly. @@ -844,28 +874,28 @@ STDMETHODIMP wxIAccessible::accDoDefaultAction(VARIANT varID) // Retrieves a string that describes the object's default action. // Not all objects have a default action. - + STDMETHODIMP wxIAccessible::get_accDefaultAction ( VARIANT varID, BSTR* pszDefaultAction) { - wxLogTrace(wxT("access"), "get_accDefaultAction"); - wxASSERT (m_pAccessible != NULL); + wxLogTrace(wxT("access"), wxT("get_accDefaultAction")); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; - + if (varID.vt != VT_I4) { - wxLogTrace(wxT("access"), "Invalid arg for get_accDefaultAction"); + wxLogTrace(wxT("access"), wxT("Invalid arg for get_accDefaultAction")); return E_INVALIDARG; } - + wxString defaultAction; wxAccStatus status = m_pAccessible->GetDefaultAction(varID.lVal, & defaultAction); if (status == wxACC_FAIL) return E_FAIL; - + if (status == wxACC_NOT_SUPPORTED) return DISP_E_MEMBERNOTFOUND; - + if (status == wxACC_NOT_IMPLEMENTED) { // Try to use child object directly. @@ -907,22 +937,22 @@ STDMETHODIMP wxIAccessible::get_accDefaultAction ( VARIANT varID, BSTR* pszDefau STDMETHODIMP wxIAccessible::get_accDescription ( VARIANT varID, BSTR* pszDescription) { - wxLogTrace(wxT("access"), "get_accDescription"); - wxASSERT (m_pAccessible != NULL); + wxLogTrace(wxT("access"), wxT("get_accDescription")); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; - + if (varID.vt != VT_I4) { - wxLogTrace(wxT("access"), "Invalid arg for get_accDescription"); + wxLogTrace(wxT("access"), wxT("Invalid arg for get_accDescription")); return E_INVALIDARG; } - + wxString description; wxAccStatus status = m_pAccessible->GetDescription(varID.lVal, & description); if (status == wxACC_FAIL) return E_FAIL; - + if (status == wxACC_NOT_IMPLEMENTED) { // Try to use child object directly. @@ -944,7 +974,7 @@ STDMETHODIMP wxIAccessible::get_accDescription ( VARIANT varID, BSTR* pszDescrip } else { - if (description.IsEmpty()) + if (description.empty()) { * pszDescription = NULL; return S_FALSE; @@ -954,7 +984,7 @@ STDMETHODIMP wxIAccessible::get_accDescription ( VARIANT varID, BSTR* pszDescrip wxBasicString basicString(description); * pszDescription = basicString.Get(); return S_OK; - } + } } return E_NOTIMPL; } @@ -964,22 +994,22 @@ STDMETHODIMP wxIAccessible::get_accDescription ( VARIANT varID, BSTR* pszDescrip STDMETHODIMP wxIAccessible::get_accHelp ( VARIANT varID, BSTR* pszHelp) { - wxLogTrace(wxT("access"), "get_accHelp"); - wxASSERT (m_pAccessible != NULL); + wxLogTrace(wxT("access"), wxT("get_accHelp")); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; - + if (varID.vt != VT_I4) { - wxLogTrace(wxT("access"), "Invalid arg for get_accHelp"); + wxLogTrace(wxT("access"), wxT("Invalid arg for get_accHelp")); return E_INVALIDARG; } - + wxString helpString; wxAccStatus status = m_pAccessible->GetHelpText(varID.lVal, & helpString); if (status == wxACC_FAIL) return E_FAIL; - + if (status == wxACC_NOT_IMPLEMENTED) { // Try to use child object directly. @@ -1001,7 +1031,7 @@ STDMETHODIMP wxIAccessible::get_accHelp ( VARIANT varID, BSTR* pszHelp) } else { - if (helpString.IsEmpty()) + if (helpString.empty()) { * pszHelp = NULL; return S_FALSE; @@ -1011,7 +1041,7 @@ STDMETHODIMP wxIAccessible::get_accHelp ( VARIANT varID, BSTR* pszHelp) wxBasicString basicString(helpString); * pszHelp = basicString.Get(); return S_OK; - } + } } return E_NOTIMPL; } @@ -1019,26 +1049,26 @@ STDMETHODIMP wxIAccessible::get_accHelp ( VARIANT varID, BSTR* pszHelp) // Retrieves the full path of the WinHelp file associated with the specified // object and the identifier of the appropriate topic within that file. // Not all objects support this property. -// NOTE: not supported by wxWindows at this time. Use +// NOTE: not supported by wxWidgets at this time. Use // GetHelpText instead. - + STDMETHODIMP wxIAccessible::get_accHelpTopic ( BSTR* pszHelpFile, VARIANT varChild, long* pidTopic) { - wxLogTrace(wxT("access"), "get_accHelpTopic"); - wxASSERT (m_pAccessible != NULL); + wxLogTrace(wxT("access"), wxT("get_accHelpTopic")); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; - + if (varChild.vt != VT_I4) { - wxLogTrace(wxT("access"), "Invalid arg for get_accHelpTopic"); + wxLogTrace(wxT("access"), wxT("Invalid arg for get_accHelpTopic")); return E_INVALIDARG; } - + wxAccStatus status = wxACC_NOT_IMPLEMENTED; if (status == wxACC_FAIL) return E_FAIL; - + if (status == wxACC_NOT_IMPLEMENTED) { // Try to use child object directly. @@ -1064,27 +1094,27 @@ STDMETHODIMP wxIAccessible::get_accHelpTopic ( BSTR* pszHelpFile, VARIANT varChi // Retrieves the specified object's shortcut key or access key, also known as // the mnemonic. All objects that have a shortcut key or access key support // this property. - + STDMETHODIMP wxIAccessible::get_accKeyboardShortcut ( VARIANT varID, BSTR* pszKeyboardShortcut) { - wxLogTrace(wxT("access"), "get_accKeyboardShortcut"); + wxLogTrace(wxT("access"), wxT("get_accKeyboardShortcut")); *pszKeyboardShortcut = NULL; - wxASSERT (m_pAccessible != NULL); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; - + if (varID.vt != VT_I4) { - wxLogTrace(wxT("access"), "Invalid arg for get_accKeyboardShortcut"); + wxLogTrace(wxT("access"), wxT("Invalid arg for get_accKeyboardShortcut")); return E_INVALIDARG; } - + wxString keyboardShortcut; wxAccStatus status = m_pAccessible->GetKeyboardShortcut(varID.lVal, & keyboardShortcut); if (status == wxACC_FAIL) return E_FAIL; - + if (status == wxACC_NOT_IMPLEMENTED) { // Try to use child object directly. @@ -1106,7 +1136,7 @@ STDMETHODIMP wxIAccessible::get_accKeyboardShortcut ( VARIANT varID, BSTR* pszKe } else { - if (keyboardShortcut.IsEmpty()) + if (keyboardShortcut.empty()) { * pszKeyboardShortcut = NULL; return S_FALSE; @@ -1116,36 +1146,36 @@ STDMETHODIMP wxIAccessible::get_accKeyboardShortcut ( VARIANT varID, BSTR* pszKe wxBasicString basicString(keyboardShortcut); * pszKeyboardShortcut = basicString.Get(); return S_OK; - } + } } return E_NOTIMPL; } // Retrieves the name of the specified object. // All objects support this property. - + STDMETHODIMP wxIAccessible::get_accName ( VARIANT varID, BSTR* pszName) { - wxLogTrace(wxT("access"), "get_accName"); + wxLogTrace(wxT("access"), wxT("get_accName")); *pszName = NULL; - wxASSERT (m_pAccessible != NULL); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; if (varID.vt != VT_I4) { - wxLogTrace(wxT("access"), "Invalid arg for get_accName"); + wxLogTrace(wxT("access"), wxT("Invalid arg for get_accName")); return E_INVALIDARG; } - + wxString name; - + wxAccStatus status = m_pAccessible->GetName(varID.lVal, & name); - + if (status == wxACC_FAIL) return E_FAIL; - + if (status == wxACC_NOT_IMPLEMENTED) { // Try to use child object directly. @@ -1179,26 +1209,26 @@ STDMETHODIMP wxIAccessible::get_accName ( VARIANT varID, BSTR* pszName) STDMETHODIMP wxIAccessible::get_accRole ( VARIANT varID, VARIANT* pVarRole) { - wxLogTrace(wxT("access"), "get_accRole"); - wxASSERT (m_pAccessible != NULL); + wxLogTrace(wxT("access"), wxT("get_accRole")); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; - + if (varID.vt != VT_I4) { - wxLogTrace(wxT("access"), "Invalid arg for get_accRole"); + wxLogTrace(wxT("access"), wxT("Invalid arg for get_accRole")); return E_INVALIDARG; } - + VariantInit(pVarRole); wxAccRole role = wxROLE_NONE; - + wxAccStatus status = m_pAccessible->GetRole(varID.lVal, & role); - + if (status == wxACC_FAIL) return E_FAIL; - + if (status == wxACC_NOT_IMPLEMENTED) { // Try to use child object directly. @@ -1236,26 +1266,26 @@ STDMETHODIMP wxIAccessible::get_accRole ( VARIANT varID, VARIANT* pVarRole) // Retrieves the current state of the specified object. // All objects support this property. - + STDMETHODIMP wxIAccessible::get_accState ( VARIANT varID, VARIANT* pVarState) { - wxLogTrace(wxT("access"), "get_accState"); - wxASSERT (m_pAccessible != NULL); + wxLogTrace(wxT("access"), wxT("get_accState")); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; - + if (varID.vt != VT_I4 && varID.vt != VT_EMPTY) { - wxLogTrace(wxT("access"), "Invalid arg for get_accState"); + wxLogTrace(wxT("access"), wxT("Invalid arg for get_accState")); return E_INVALIDARG; } long wxstate = 0; - + wxAccStatus status = m_pAccessible->GetState(varID.lVal, & wxstate); if (status == wxACC_FAIL) return E_FAIL; - + if (status == wxACC_NOT_IMPLEMENTED) { // Try to use child object directly. @@ -1284,30 +1314,30 @@ STDMETHODIMP wxIAccessible::get_accState ( VARIANT varID, VARIANT* pVarState) } return E_NOTIMPL; } - + // Retrieves the value of the specified object. // Not all objects have a value. STDMETHODIMP wxIAccessible::get_accValue ( VARIANT varID, BSTR* pszValue) { - wxLogTrace(wxT("access"), "get_accValue"); - wxASSERT (m_pAccessible != NULL); + wxLogTrace(wxT("access"), wxT("get_accValue")); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; - + if (varID.vt != VT_I4) { - wxLogTrace(wxT("access"), "Invalid arg for get_accValue"); + wxLogTrace(wxT("access"), wxT("Invalid arg for get_accValue")); return E_INVALIDARG; } - + wxString strValue; - + wxAccStatus status = m_pAccessible->GetValue(varID.lVal, & strValue); - + if (status == wxACC_FAIL) return E_FAIL; - + if (status == wxACC_NOT_IMPLEMENTED) { // Try to use child object directly. @@ -1342,23 +1372,23 @@ STDMETHODIMP wxIAccessible::get_accValue ( VARIANT varID, BSTR* pszValue) STDMETHODIMP wxIAccessible::accSelect ( long flagsSelect, VARIANT varID ) { - wxLogTrace(wxT("access"), "get_accSelect"); - wxASSERT (m_pAccessible != NULL); + wxLogTrace(wxT("access"), wxT("get_accSelect")); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; - + if (varID.vt != VT_I4 && varID.vt != VT_EMPTY) { - wxLogTrace(wxT("access"), "Invalid arg for accSelect"); + wxLogTrace(wxT("access"), wxT("Invalid arg for accSelect")); return E_INVALIDARG; } - + wxAccSelectionFlags wxsel = wxConvertFromWindowsSelFlag(flagsSelect); wxAccStatus status = m_pAccessible->Select(varID.lVal, wxsel); if (status == wxACC_FAIL) return E_FAIL; - + if (status == wxACC_NOT_IMPLEMENTED) { // Try to use child object directly. @@ -1386,22 +1416,22 @@ STDMETHODIMP wxIAccessible::accSelect ( long flagsSelect, VARIANT varID ) // Retrieves the object that has the keyboard focus. All objects // that receive the keyboard focus must support this property. - + STDMETHODIMP wxIAccessible::get_accFocus ( VARIANT* pVarID) { - wxLogTrace(wxT("access"), "get_accFocus"); - wxASSERT (m_pAccessible != NULL); + wxLogTrace(wxT("access"), wxT("get_accFocus")); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; - + wxAccessible* childObject = NULL; int childId = 0; VariantInit(pVarID); - + wxAccStatus status = m_pAccessible->GetFocus(& childId, & childObject); if (status == wxACC_FAIL) return E_FAIL; - + if (status == wxACC_NOT_IMPLEMENTED) { // Use standard interface instead. @@ -1424,9 +1454,9 @@ STDMETHODIMP wxIAccessible::get_accFocus ( VARIANT* pVarID) if (!childIA) return E_NOTIMPL; - if (childIA->QueryInterface(IID_IDispatch, (LPVOID*) & pVarID->pdispVal) != S_OK) - return E_FAIL; - + if (childIA->QueryInterface(IID_IDispatch, (LPVOID*) & pVarID->pdispVal) != S_OK) + return E_FAIL; + pVarID->vt = VT_DISPATCH; return S_OK; } @@ -1442,27 +1472,32 @@ STDMETHODIMP wxIAccessible::get_accFocus ( VARIANT* pVarID) pVarID->vt = VT_EMPTY; return S_FALSE; } - + + #if 0 + // all cases above already cause some return action so below line + // is unreachable and cause unnecessary warning return E_NOTIMPL; + #endif } // Retrieves the selected children of this object. All objects // selected must support this property. - + STDMETHODIMP wxIAccessible::get_accSelection ( VARIANT * pVarChildren) { - wxLogTrace(wxT("access"), "get_accSelection"); - wxASSERT (m_pAccessible != NULL); +#if wxUSE_VARIANT + wxLogTrace(wxT("access"), wxT("get_accSelection")); + wxASSERT( ( m_pAccessible != NULL ) || ( m_bQuiescing == true ) ); if (!m_pAccessible) return E_FAIL; VariantInit(pVarChildren); - + wxVariant selections; wxAccStatus status = m_pAccessible->GetSelections(& selections); if (status == wxACC_FAIL) return E_FAIL; - + if (status == wxACC_NOT_IMPLEMENTED) { // Use standard interface instead. @@ -1488,9 +1523,9 @@ STDMETHODIMP wxIAccessible::get_accSelection ( VARIANT * pVarChildren) if (!childIA) return E_NOTIMPL; - if (childIA->QueryInterface(IID_IDispatch, (LPVOID*) & pVarChildren->pdispVal) != S_OK) - return E_FAIL; - + if (childIA->QueryInterface(IID_IDispatch, (LPVOID*) & pVarChildren->pdispVal) != S_OK) + return E_FAIL; + pVarChildren->vt = VT_DISPATCH; return S_OK; @@ -1508,13 +1543,16 @@ STDMETHODIMP wxIAccessible::get_accSelection ( VARIANT * pVarChildren) return S_OK; } } +#else + wxUnusedVar(pVarChildren); +#endif // wxUSE_VARIANT return E_NOTIMPL; } // Get type info -STDMETHODIMP wxIAccessible::GetTypeInfo(unsigned int typeInfo, LCID lcid, ITypeInfo** ppTypeInfo) +STDMETHODIMP wxIAccessible::GetTypeInfo(unsigned int WXUNUSED(typeInfo), LCID WXUNUSED(lcid), ITypeInfo** ppTypeInfo) { *ppTypeInfo = NULL; return E_NOTIMPL; @@ -1530,18 +1568,18 @@ STDMETHODIMP wxIAccessible::GetTypeInfoCount(unsigned int* typeInfoCount) // Get ids of names -STDMETHODIMP wxIAccessible::GetIDsOfNames(REFIID riid, OLECHAR** names, unsigned int cNames, - LCID lcid, DISPID* dispId) +STDMETHODIMP wxIAccessible::GetIDsOfNames(REFIID WXUNUSED(riid), OLECHAR** WXUNUSED(names), unsigned int WXUNUSED(cNames), + LCID WXUNUSED(lcid), DISPID* WXUNUSED(dispId)) { return E_NOTIMPL; } // Invoke -STDMETHODIMP wxIAccessible::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, - WORD wFlags, DISPPARAMS *pDispParams, - VARIANT *pVarResult, EXCEPINFO *pExcepInfo, - unsigned int *puArgErr ) +STDMETHODIMP wxIAccessible::Invoke(DISPID WXUNUSED(dispIdMember), REFIID WXUNUSED(riid), LCID WXUNUSED(lcid), + WORD WXUNUSED(wFlags), DISPPARAMS *WXUNUSED(pDispParams), + VARIANT *WXUNUSED(pVarResult), EXCEPINFO *WXUNUSED(pExcepInfo), + unsigned int *WXUNUSED(puArgErr) ) { return E_NOTIMPL; } @@ -1579,7 +1617,7 @@ IAccessible* wxIAccessible::GetChildStdAccessible(int id) else { pDispatch->Release(); - } + } } } @@ -1613,7 +1651,7 @@ IAccessible* wxIAccessible::GetChildStdAccessible(int id) else { var.pdispVal->Release(); - } + } } } break; @@ -1653,7 +1691,7 @@ IAccessible* wxIAccessible::GetChildAccessible(int id) else { pDispatch->Release(); - } + } } } return NULL; @@ -1681,6 +1719,7 @@ wxAccessible::wxAccessible(wxWindow* win) wxAccessible::~wxAccessible() { + m_pIAccessible->Quiesce(); m_pIAccessible->Release(); if (m_pIAccessibleStd) ((IAccessible*)m_pIAccessibleStd)->Release(); @@ -1722,6 +1761,8 @@ int wxConvertToWindowsRole(wxAccRole wxrole) { switch (wxrole) { + case wxROLE_NONE: + return 0; case wxROLE_SYSTEM_ALERT: return ROLE_SYSTEM_ALERT; case wxROLE_SYSTEM_ANIMATION: @@ -1938,15 +1979,15 @@ int wxConvertToWindowsSelFlag(wxAccSelectionFlags wxsel) { int sel = 0; - if (sel & wxACC_SEL_TAKEFOCUS) + if (wxsel & wxACC_SEL_TAKEFOCUS) sel |= SELFLAG_TAKEFOCUS; - if (sel & wxACC_SEL_TAKESELECTION) + if (wxsel & wxACC_SEL_TAKESELECTION) sel |= SELFLAG_TAKESELECTION; - if (sel & wxACC_SEL_EXTENDSELECTION) + if (wxsel & wxACC_SEL_EXTENDSELECTION) sel |= SELFLAG_EXTENDSELECTION; - if (sel & wxACC_SEL_ADDSELECTION) + if (wxsel & wxACC_SEL_ADDSELECTION) sel |= SELFLAG_ADDSELECTION; - if (sel & wxACC_SEL_REMOVESELECTION) + if (wxsel & wxACC_SEL_REMOVESELECTION) sel |= SELFLAG_REMOVESELECTION; return sel; } @@ -1970,4 +2011,4 @@ wxAccSelectionFlags wxConvertFromWindowsSelFlag(int sel) } -#endif //USE_ACCESSIBILITY +#endif // wxUSE_OLE && wxUSE_ACCESSIBILITY