// Recursively give information about an object
void LogObject(int indent, IAccessible* obj);
+ // Get info for a child (id > 0) or object (id == 0)
+ void GetInfo(IAccessible* accessible, int id, wxString& name, wxString& role);
private:
wxTextCtrl* m_textCtrl;
{
m_textCtrl = NULL;
- SetAccessible(new FrameAccessible(this));
+// SetAccessible(new FrameAccessible(this));
// set the frame icon
SetIcon(wxICON(mondrian));
SetMenuBar(menuBar);
#endif // wxUSE_MENUS
-#if 1 // wxUSE_STATUSBAR
+#if 0 // wxUSE_STATUSBAR
// create a status bar just for fun (by default with 1 pane only)
CreateStatusBar(2);
SetStatusText(_T("Welcome to wxWindows!"));
#endif // wxUSE_STATUSBAR
+#if 1
wxSplitterWindow* splitter = new wxSplitterWindow(this, -1);
splitter->CreateAccessible();
m_textCtrl->CreateAccessible();
splitter->SplitHorizontally(listBox, m_textCtrl, 150);
+#endif
#if 0
#if 1
}
if (accessibleFrame)
{
- Log(wxT("Got an IAccessible for the frame."));
+ //Log(wxT("Got an IAccessible for the frame."));
LogObject(0, accessibleFrame);
+ Log(wxT("Checking children using AccessibleChildren()..."));
+
+ // Now check the AccessibleChildren function works OK
+ long childCount = 0;
+ if (S_OK != accessibleFrame->get_accChildCount(& childCount))
+ {
+ Log(wxT("Could not get number of children."));
+ accessibleFrame->Release();
+ return;
+ }
+ else if (childCount == 0)
+ {
+ Log(wxT("No children."));
+ accessibleFrame->Release();
+ return;
+ }
+
+
+ long obtained = 0;
+ VARIANT *var = new VARIANT[childCount];
+ int i;
+ for (i = 0; i < childCount; i++)
+ {
+ VariantInit(& (var[i]));
+ var[i].vt = VT_DISPATCH;
+ }
+
+ if (S_OK == AccessibleChildren(accessibleFrame, 0, childCount, var, &obtained))
+ {
+ for (i = 0; i < childCount; i++)
+ {
+ IAccessible* childAccessible = NULL;
+ if (var[i].pdispVal)
+ {
+ if (var[i].pdispVal->QueryInterface(IID_IAccessible, (LPVOID*) & childAccessible) == S_OK)
+ {
+ var[i].pdispVal->Release();
+
+ wxString name, role;
+ GetInfo(childAccessible, 0, name, role);
+ wxString str;
+ str.Printf(wxT("Found child %s/%s"), name.c_str(), role.c_str());
+ Log(str);
+ childAccessible->Release();
+ }
+ else
+ {
+ var[i].pdispVal->Release();
+ }
+ }
+ }
+ }
+ else
+ {
+ Log(wxT("AccessibleChildren failed."));
+ }
+ delete[] var;
+
+
accessibleFrame->Release();
}
}
// Recursively give information about an object
void MyFrame::LogObject(int indent, IAccessible* obj)
{
- VARIANT var;
- VariantInit(& var);
- var.vt = VT_I4;
- var.lVal = 0;
-
- BSTR bStrName = 0;
- HRESULT hResult = obj->get_accName(var, & bStrName);
-
- if (hResult == S_OK)
- {
- wxString strName(wxConvertStringFromOle(bStrName));
- SysFreeString(bStrName);
-
- wxString str;
- str.Printf(wxT("Name: %s"), strName.c_str());
- str.Pad(indent, wxT(' '), FALSE);
- Log(str);
- }
- else
- {
- wxString str;
- str.Printf(wxT("NO NAME"));
- str.Pad(indent, wxT(' '), FALSE);
- Log(str);
- }
-
- VARIANT varRole;
- VariantInit(& varRole);
-
- hResult = obj->get_accRole(var, & varRole);
-
- if (hResult == S_OK && varRole.vt == VT_I4)
+ wxString name, role;
+ if (indent == 0)
{
- wxChar buf[256];
- GetRoleText(varRole.lVal, buf, 256);
-
- wxString strRole(buf);
-
+ GetInfo(obj, 0, name, role);
+
wxString str;
- str.Printf(wxT("Role: %s"), strRole.c_str());
+ str.Printf(wxT("Name = %s; Role = %s"), name.c_str(), role.c_str());
str.Pad(indent, wxT(' '), FALSE);
Log(str);
}
- else
- {
- wxString str;
- str.Printf(wxT("NO ROLE"));
- str.Pad(indent, wxT(' '), FALSE);
- Log(str);
- }
long childCount = 0;
if (S_OK == obj->get_accChildCount(& childCount))
str.Printf(wxT("There are %d children."), (int) childCount);
str.Pad(indent, wxT(' '), FALSE);
Log(str);
+ Log(wxT(""));
}
int i;
for (i = 1; i <= childCount; i++)
{
+ GetInfo(obj, i, name, role);
+
+ wxString str;
+ str.Printf(wxT("%d) Name = %s; Role = %s"), i, name.c_str(), role.c_str());
+ str.Pad(indent, wxT(' '), FALSE);
+ Log(str);
+
VARIANT var;
VariantInit(& var);
var.vt = VT_I4;
IDispatch* pDisp = NULL;
IAccessible* childObject = NULL;
- BSTR bStrName = 0;
- HRESULT hResult = obj->get_accName(var, & bStrName);
-
- if (hResult == S_OK)
- {
- wxString strName(wxConvertStringFromOle(bStrName));
- SysFreeString(bStrName);
-
- wxString str;
- str.Printf(wxT("Name: %s"), strName.c_str());
- str.Pad(indent+4, wxT(' '), FALSE);
- Log(str);
- }
- else
- {
- wxString str;
- str.Printf(wxT("NO NAME"));
- str.Pad(indent+4, wxT(' '), FALSE);
- Log(str);
- }
-
- VARIANT varRole;
- VariantInit(& varRole);
-
- hResult = obj->get_accRole(var, & varRole);
-
- if (hResult == S_OK && varRole.vt == VT_I4)
- {
- wxChar buf[256];
- GetRoleText(varRole.lVal, buf, 256);
-
- wxString strRole(buf);
-
- wxString str;
- str.Printf(wxT("Role: %s"), strRole.c_str());
- str.Pad(indent+4, wxT(' '), FALSE);
- Log(str);
- }
- else
- {
- wxString str;
- str.Printf(wxT("NO ROLE"));
- str.Pad(indent+4, wxT(' '), FALSE);
- Log(str);
- }
-
if (S_OK == obj->get_accChild(var, & pDisp) && pDisp)
{
wxString str;
str.Pad(indent+4, wxT(' '), FALSE);
Log(str);
}
- Log(wxT(""));
+ // Log(wxT(""));
}
}
+// Get info for a child (id > 0) or object (id == 0)
+void MyFrame::GetInfo(IAccessible* accessible, int id, wxString& name, wxString& role)
+{
+ VARIANT var;
+ VariantInit(& var);
+ var.vt = VT_I4;
+ var.lVal = id;
+
+ BSTR bStrName = 0;
+ HRESULT hResult = accessible->get_accName(var, & bStrName);
+
+ if (hResult == S_OK)
+ {
+ name = wxConvertStringFromOle(bStrName);
+ SysFreeString(bStrName);
+ }
+ else
+ {
+ name = wxT("NO NAME");
+ }
+
+ VARIANT varRole;
+ VariantInit(& varRole);
+
+ hResult = accessible->get_accRole(var, & varRole);
+
+ if (hResult == S_OK && varRole.vt == VT_I4)
+ {
+ wxChar buf[256];
+ GetRoleText(varRole.lVal, buf, 256);
+
+ role = buf;
+ }
+ else
+ {
+ role = wxT("NO ROLE");
+ }
+}
// Call Release if this is non-NULL.
IAccessible* GetChildStdAccessible(int id);
+ // Gets the IAccessible interface for the given child or object.
+ // Call Release if this is non-NULL.
+ IAccessible* GetChildAccessible(int id);
+
private:
wxAccessible *m_pAccessible; // pointer to C++ class we belong to
// Use standard interface instead.
IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
if (!stdInterface)
- return E_FAIL;
+ return E_NOTIMPL;
else
return stdInterface->accHitTest(xLeft, yLeft, pVarID);
}
{
wxIAccessible* childIA = childObject->GetIAccessible();
if (!childIA)
- return E_FAIL;
+ return E_NOTIMPL;
if (childIA->QueryInterface(IID_IDispatch, (LPVOID*) & pVarID->pdispVal) != S_OK)
return E_FAIL;
pVarID->vt = VT_DISPATCH;
-// pVarID->pdispVal->AddRef();
return S_OK;
}
}
return S_FALSE;
}
- return E_FAIL;
+ return E_NOTIMPL;
}
// Retrieves the specified object's current screen location. All visual objects must
if (status == wxACC_NOT_IMPLEMENTED)
{
- // Use standard interface instead.
- IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
- if (!stdInterface)
- return E_FAIL;
- else
- return stdInterface->accLocation(pxLeft, pyTop, pcxWidth, pcyHeight, varID);
+ // Try to use child object directly.
+ if (varID.lVal > 0)
+ {
+ IAccessible* childAccessible = GetChildAccessible(varID.lVal);
+ if (childAccessible)
+ {
+ varID.lVal = 0;
+ HRESULT hResult = childAccessible->accLocation(pxLeft, pyTop, pcxWidth, pcyHeight, varID);
+ childAccessible->Release();
+ return hResult;
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->accLocation(pxLeft, pyTop, pcxWidth, pcyHeight, varID);
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->accLocation(pxLeft, pyTop, pcxWidth, pcyHeight, varID);
}
else
{
return S_OK;
}
- return E_FAIL;
+ return E_NOTIMPL;
}
// Traverses to another user interface element within a container and retrieves the object.
{
wxLogDebug("Navigate not implemented");
- // Use standard interface instead.
- IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
- if (!stdInterface)
- return E_FAIL;
- else
- return stdInterface->accNavigate ( navDir, varStart, pVarEnd);
+ // Try to use child object directly.
+ if (varStart.vt == VT_I4 && varStart.lVal > 0)
+ {
+ IAccessible* childAccessible = GetChildAccessible(varStart.lVal);
+ if (childAccessible)
+ {
+ varStart.lVal = 0;
+ HRESULT hResult = childAccessible->accNavigate(navDir, varStart, pVarEnd);
+ childAccessible->Release();
+ return hResult;
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->accNavigate(navDir, varStart, pVarEnd);
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->accNavigate(navDir, varStart, pVarEnd);
}
else
{
wxLogDebug("Called QueryInterface for Navigate");
pVarEnd->vt = VT_DISPATCH;
-// pVarEnd->pdispVal->AddRef();
return S_OK;
}
else if (elementId > 0)
}
wxLogDebug("Failing Navigate");
- return E_FAIL;
+ return E_NOTIMPL;
}
// Retrieves the address of an IDispatch interface for the specified child.
// Use standard interface instead.
IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
if (!stdInterface)
- return E_FAIL;
+ return E_NOTIMPL;
else
{
wxLogDebug("Using standard interface for get_accChild");
{
wxIAccessible* objectIA = child->GetIAccessible();
if (!objectIA)
- return E_FAIL;
+ return E_NOTIMPL;
if (objectIA->QueryInterface(IID_IDispatch, (LPVOID*) ppDispChild) != S_OK)
{
return E_FAIL;
}
-// (*ppDispChild)->AddRef();
return S_OK;
}
else
}
}
- return E_FAIL;
+ return E_NOTIMPL;
}
// Retrieves the number of children that belong to this object.
// Use standard interface instead.
IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
if (!stdInterface)
- return E_FAIL;
+ return E_NOTIMPL;
else
{
wxLogDebug("Using standard interface for get_accChildCount");
return S_OK;
}
- return E_FAIL;
+ return E_NOTIMPL;
}
// Retrieves the IDispatch interface of the object's parent.
// Use standard interface instead.
IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
if (!stdInterface)
- return E_FAIL;
+ return E_NOTIMPL;
else
return stdInterface->get_accParent (ppDispParent);
}
return E_FAIL;
}
-// (*ppDispParent)->AddRef();
wxLogDebug("Returning S_OK for get_accParent");
return S_OK;
-/*
- wxIAccessible* objectIA = parent->GetIAccessible();
- if (!objectIA)
- return E_FAIL;
- objectIA->AddRef();
- *ppDispParent = objectIA;
- return S_OK;
-*/
}
else
{
}
}
- return E_FAIL;
+ return E_NOTIMPL;
}
// Performs the object's default action. Not all objects have a default
if (status == wxACC_NOT_IMPLEMENTED)
{
- // Use standard interface instead.
- IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
- if (!stdInterface)
- return E_FAIL;
- else
- return stdInterface->accDoDefaultAction(varID);
+ // Try to use child object directly.
+ if (varID.lVal > 0)
+ {
+ IAccessible* childAccessible = GetChildAccessible(varID.lVal);
+ if (childAccessible)
+ {
+ varID.lVal = 0;
+ HRESULT hResult = childAccessible->accDoDefaultAction(varID);
+ childAccessible->Release();
+ return hResult;
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->accDoDefaultAction(varID);
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->accDoDefaultAction(varID);
}
return E_FAIL;
}
if (status == wxACC_NOT_IMPLEMENTED)
{
- // Use standard interface instead.
- IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
- if (!stdInterface)
- return E_FAIL;
- else
- return stdInterface->get_accDefaultAction (varID, pszDefaultAction);
+ // Try to use child object directly.
+ if (varID.lVal > 0)
+ {
+ IAccessible* childAccessible = GetChildAccessible(varID.lVal);
+ if (childAccessible)
+ {
+ varID.lVal = 0;
+ HRESULT hResult = childAccessible->get_accDefaultAction(varID, pszDefaultAction);
+ childAccessible->Release();
+ return hResult;
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accDefaultAction(varID, pszDefaultAction);
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accDefaultAction(varID, pszDefaultAction);
}
else
{
if (status == wxACC_NOT_IMPLEMENTED)
{
- // Use standard interface instead.
- IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
- if (!stdInterface)
- return E_FAIL;
- else
- return stdInterface->get_accDescription (varID, pszDescription);
+ // Try to use child object directly.
+ if (varID.lVal > 0)
+ {
+ IAccessible* childAccessible = GetChildAccessible(varID.lVal);
+ if (childAccessible)
+ {
+ varID.lVal = 0;
+ HRESULT hResult = childAccessible->get_accDescription(varID, pszDescription);
+ childAccessible->Release();
+ return hResult;
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accDescription(varID, pszDescription);
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accDescription(varID, pszDescription);
}
else
{
return S_OK;
}
}
- return E_FAIL;
+ return E_NOTIMPL;
}
// Retrieves an object's Help property string.
if (status == wxACC_NOT_IMPLEMENTED)
{
- // Use standard interface instead.
- IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
- if (!stdInterface)
- return E_FAIL;
- else
- return stdInterface->get_accHelp (varID, pszHelp);
+ // Try to use child object directly.
+ if (varID.lVal > 0)
+ {
+ IAccessible* childAccessible = GetChildAccessible(varID.lVal);
+ if (childAccessible)
+ {
+ varID.lVal = 0;
+ HRESULT hResult = childAccessible->get_accHelp(varID, pszHelp);
+ childAccessible->Release();
+ return hResult;
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accHelp(varID, pszHelp);
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accHelp (varID, pszHelp);
}
else
{
return S_OK;
}
}
- return E_FAIL;
+ return E_NOTIMPL;
}
// Retrieves the full path of the WinHelp file associated with the specified
if (status == wxACC_NOT_IMPLEMENTED)
{
- // Use standard interface instead.
- IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
- if (!stdInterface)
- return E_FAIL;
- else
- return stdInterface->get_accHelpTopic (pszHelpFile, varChild, pidTopic);
+ // Try to use child object directly.
+ if (varChild.lVal > 0)
+ {
+ IAccessible* childAccessible = GetChildAccessible(varChild.lVal);
+ if (childAccessible)
+ {
+ varChild.lVal = 0;
+ HRESULT hResult = childAccessible->get_accHelpTopic(pszHelpFile, varChild, pidTopic);
+ childAccessible->Release();
+ return hResult;
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accHelpTopic(pszHelpFile, varChild, pidTopic);
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accHelpTopic (pszHelpFile, varChild, pidTopic);
}
- return E_FAIL;
+ return E_NOTIMPL;
}
// Retrieves the specified object's shortcut key or access key, also known as
if (status == wxACC_NOT_IMPLEMENTED)
{
- // Use standard interface instead.
- IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
- if (!stdInterface)
- return E_FAIL;
- else
- return stdInterface->get_accKeyboardShortcut(varID, pszKeyboardShortcut);
+ // Try to use child object directly.
+ if (varID.lVal > 0)
+ {
+ IAccessible* childAccessible = GetChildAccessible(varID.lVal);
+ if (childAccessible)
+ {
+ varID.lVal = 0;
+ HRESULT hResult = childAccessible->get_accKeyboardShortcut(varID, pszKeyboardShortcut);
+ childAccessible->Release();
+ return hResult;
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accKeyboardShortcut(varID, pszKeyboardShortcut);
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accKeyboardShortcut (varID, pszKeyboardShortcut);
}
else
{
return S_OK;
}
}
- return E_FAIL;
+ return E_NOTIMPL;
}
// Retrieves the name of the specified object.
if (status == wxACC_NOT_IMPLEMENTED)
{
-#if 0
- // Use standard interface instead.
- IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
- if (!stdInterface)
- return E_FAIL;
- else
- return stdInterface->get_accName (varID, pszName);
-#endif
- // Turn child reference into object reference.
- IAccessible* stdInterface = GetChildStdAccessible(varID.lVal);
- if (stdInterface)
+ // Try to use child object directly.
+ if (varID.lVal > 0)
{
- varID.lVal = 0;
- HRESULT hResult = stdInterface->get_accName(varID, pszName);
- stdInterface->Release();
- return hResult;
+ IAccessible* childAccessible = GetChildAccessible(varID.lVal);
+ if (childAccessible)
+ {
+ varID.lVal = 0;
+ HRESULT hResult = childAccessible->get_accName(varID, pszName);
+ childAccessible->Release();
+ return hResult;
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accName(varID, pszName);
}
- else
- return E_FAIL;
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accName (varID, pszName);
}
else
{
*pszName = basicString.Get();
return S_OK;
}
- return E_FAIL;
+ return E_NOTIMPL;
}
// Retrieves information that describes the role of the specified object.
if (status == wxACC_NOT_IMPLEMENTED)
{
- // Use standard interface instead.
- IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
- if (!stdInterface)
- return E_FAIL;
- else
- return stdInterface->get_accRole (varID, pVarRole);
+ // Try to use child object directly.
+ if (varID.lVal > 0)
+ {
+ IAccessible* childAccessible = GetChildAccessible(varID.lVal);
+ if (childAccessible)
+ {
+ varID.lVal = 0;
+ HRESULT hResult = childAccessible->get_accRole(varID, pVarRole);
+ childAccessible->Release();
+ return hResult;
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accRole(varID, pVarRole);
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accRole (varID, pVarRole);
}
else
{
return S_OK;
}
- return E_FAIL;
+ return E_NOTIMPL;
}
// Retrieves the current state of the specified object.
if (!m_pAccessible)
return E_FAIL;
- if (varID.vt != VT_I4)
+ if (varID.vt != VT_I4 && varID.vt != VT_EMPTY)
{
wxLogDebug("Invalid arg for get_accState");
return E_INVALIDARG;
if (status == wxACC_NOT_IMPLEMENTED)
{
- // Use standard interface instead.
- IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
- if (!stdInterface)
- return E_FAIL;
- else
- return stdInterface->get_accState (varID, pVarState);
+ // Try to use child object directly.
+ if (varID.lVal > 0)
+ {
+ IAccessible* childAccessible = GetChildAccessible(varID.lVal);
+ if (childAccessible)
+ {
+ varID.lVal = 0;
+ HRESULT hResult = childAccessible->get_accState(varID, pVarState);
+ childAccessible->Release();
+ return hResult;
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accState(varID, pVarState);
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accState (varID, pVarState);
}
else
{
pVarState->vt = VT_I4;
return S_OK;
}
- return E_FAIL;
+ return E_NOTIMPL;
}
// Retrieves the value of the specified object.
if (status == wxACC_NOT_IMPLEMENTED)
{
- // Use standard interface instead.
- IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
- if (!stdInterface)
- return E_FAIL;
- else
- return stdInterface->get_accValue (varID, pszValue);
+ // Try to use child object directly.
+ if (varID.lVal > 0)
+ {
+ IAccessible* childAccessible = GetChildAccessible(varID.lVal);
+ if (childAccessible)
+ {
+ varID.lVal = 0;
+ HRESULT hResult = childAccessible->get_accValue(varID, pszValue);
+ childAccessible->Release();
+ return hResult;
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accValue(varID, pszValue);
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->get_accValue (varID, pszValue);
}
else
{
* pszValue = basicString.Get();
return S_OK;
}
- return E_FAIL;
+ return E_NOTIMPL;
}
// Modifies the selection or moves the keyboard focus of the
if (status == wxACC_NOT_IMPLEMENTED)
{
- // Use standard interface instead.
- IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
- if (!stdInterface)
- return E_FAIL;
- else
- return stdInterface->accSelect ( flagsSelect, varID );
+ // Try to use child object directly.
+ if (varID.lVal > 0 && varID.lVal > 0)
+ {
+ IAccessible* childAccessible = GetChildAccessible(varID.lVal);
+ if (childAccessible)
+ {
+ varID.lVal = 0;
+ HRESULT hResult = childAccessible->accSelect(flagsSelect, varID);
+ childAccessible->Release();
+ return hResult;
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->accSelect(flagsSelect, varID);
+ }
+ else if (m_pAccessible->GetIAccessibleStd())
+ return ((IAccessible*) m_pAccessible->GetIAccessibleStd())->accSelect(flagsSelect, varID);
}
else
return S_OK;
- return E_FAIL;
+ return E_NOTIMPL;
}
// Retrieves the object that has the keyboard focus. All objects
// Use standard interface instead.
IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
if (!stdInterface)
- return E_FAIL;
+ return E_NOTIMPL;
else
return stdInterface->get_accFocus (pVarID);
}
{
wxIAccessible* childIA = childObject->GetIAccessible();
if (!childIA)
- return E_FAIL;
+ return E_NOTIMPL;
if (childIA->QueryInterface(IID_IDispatch, (LPVOID*) & pVarID->pdispVal) != S_OK)
return E_FAIL;
pVarID->vt = VT_DISPATCH;
-// pVarID->pdispVal->AddRef();
return S_OK;
}
}
return S_FALSE;
}
- return E_FAIL;
+ return E_NOTIMPL;
}
// Retrieves the selected children of this object. All objects
// Use standard interface instead.
IAccessible* stdInterface = (IAccessible*)m_pAccessible->GetIAccessibleStd();
if (!stdInterface)
- return E_FAIL;
+ return E_NOTIMPL;
else
return stdInterface->get_accSelection (pVarChildren);
}
wxAccessible* childObject = (wxAccessible*) selections.GetVoidPtr();
wxIAccessible* childIA = childObject->GetIAccessible();
if (!childIA)
- return E_FAIL;
+ return E_NOTIMPL;
if (childIA->QueryInterface(IID_IDispatch, (LPVOID*) & pVarChildren->pdispVal) != S_OK)
return E_FAIL;
pVarChildren->vt = VT_DISPATCH;
-// pVarChildren->pdispVal->AddRef();
return S_OK;
}
}
}
- return E_FAIL;
+ return E_NOTIMPL;
}
// Get type info
return E_NOTIMPL;
}
-// Gets the IAccessible interface for the given child or object.
+// Gets the standard IAccessible interface for the given child or object.
// Call Release if this is non-NULL.
IAccessible* wxIAccessible::GetChildStdAccessible(int id)
{
return NULL;
}
+// Gets the IAccessible interface for the given child or object.
+// Call Release if this is non-NULL.
+IAccessible* wxIAccessible::GetChildAccessible(int id)
+{
+ if (id == 0)
+ {
+ IAccessible* obj = this;
+
+ obj->AddRef();
+ return obj;
+ }
+ else
+ {
+ VARIANT var;
+ VariantInit(& var);
+ var.vt = VT_I4;
+ var.lVal = id;
+ IDispatch* pDispatch = NULL;
+ if (S_OK == get_accChild ( var, & pDispatch))
+ {
+ IAccessible* childAccessible = NULL;
+ if (pDispatch->QueryInterface(IID_IAccessible, (LPVOID*) & childAccessible) == S_OK)
+ {
+ pDispatch->Release();
+ return childAccessible;
+ }
+ else
+ {
+ pDispatch->Release();
+ }
+ }
+ }
+ return NULL;
+}
// ----------------------------------------------------------------------------
// wxAccessible implementation
if (GetWindow())
{
-#if 0
- HRESULT retCode = ::CreateStdAccessibleProxy((HWND) GetWindow()->GetHWND(),
- wxT("wxWindowClass"), OBJID_CLIENT, IID_IAccessible, (void**) & m_pIAccessibleStd);
-#else
HRESULT retCode = ::CreateStdAccessibleObject((HWND) GetWindow()->GetHWND(),
OBJID_CLIENT, IID_IAccessible, (void**) & m_pIAccessibleStd);
-#endif
if (retCode == S_OK)
return m_pIAccessibleStd;
else