253 lines
6.1 KiB
C++
253 lines
6.1 KiB
C++
|
// Copyright (c) 1996-2000 Microsoft Corporation
|
||
|
|
||
|
// --------------------------------------------------------------------------
|
||
|
//
|
||
|
// accutil
|
||
|
//
|
||
|
// IAccessible proxy helper routines
|
||
|
//
|
||
|
// --------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
#include "oleacc_p.h"
|
||
|
//#include "accutil.h" // already in oleacc_p.h
|
||
|
|
||
|
|
||
|
// --------------------------------------------------------------------------
|
||
|
//
|
||
|
// GetWindowObject
|
||
|
//
|
||
|
// Gets an immediate child object.
|
||
|
//
|
||
|
// --------------------------------------------------------------------------
|
||
|
HRESULT GetWindowObject(HWND hwndChild, VARIANT * pvar)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
IDispatch * pdispChild;
|
||
|
|
||
|
pvar->vt = VT_EMPTY;
|
||
|
|
||
|
pdispChild = NULL;
|
||
|
|
||
|
hr = AccessibleObjectFromWindow(hwndChild, OBJID_WINDOW, IID_IDispatch,
|
||
|
(void **)&pdispChild);
|
||
|
|
||
|
if (!SUCCEEDED(hr))
|
||
|
return(hr);
|
||
|
if (! pdispChild)
|
||
|
return(E_FAIL);
|
||
|
|
||
|
pvar->vt = VT_DISPATCH;
|
||
|
pvar->pdispVal = pdispChild;
|
||
|
|
||
|
return(S_OK);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
// --------------------------------------------------------------------------
|
||
|
//
|
||
|
// GetNoncObject
|
||
|
//
|
||
|
// --------------------------------------------------------------------------
|
||
|
HRESULT GetNoncObject(HWND hwnd, LONG idFrameEl, VARIANT *pvar)
|
||
|
{
|
||
|
IDispatch * pdispEl;
|
||
|
HRESULT hr;
|
||
|
|
||
|
pvar->vt = VT_EMPTY;
|
||
|
|
||
|
pdispEl = NULL;
|
||
|
|
||
|
hr = AccessibleObjectFromWindow(hwnd, idFrameEl, IID_IDispatch,
|
||
|
(void **)&pdispEl);
|
||
|
if (!SUCCEEDED(hr))
|
||
|
return(hr);
|
||
|
if (!pdispEl)
|
||
|
return(E_FAIL);
|
||
|
|
||
|
pvar->vt = VT_DISPATCH;
|
||
|
pvar->pdispVal = pdispEl;
|
||
|
|
||
|
return(S_OK);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// --------------------------------------------------------------------------
|
||
|
//
|
||
|
// GetParentToNavigate()
|
||
|
//
|
||
|
// Gets the parent IAccessible object, and forwards the navigation request
|
||
|
// to it using the child's ID.
|
||
|
//
|
||
|
// --------------------------------------------------------------------------
|
||
|
HRESULT GetParentToNavigate(long idChild, HWND hwnd, long idParent, long dwNav,
|
||
|
VARIANT* pvarEnd)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
IAccessible* poleacc;
|
||
|
VARIANT varStart;
|
||
|
|
||
|
//
|
||
|
// Get our parent
|
||
|
//
|
||
|
poleacc = NULL;
|
||
|
hr = AccessibleObjectFromWindow(hwnd, idParent, IID_IAccessible,
|
||
|
(void**)&poleacc);
|
||
|
if (!SUCCEEDED(hr))
|
||
|
return(hr);
|
||
|
|
||
|
//
|
||
|
// Ask it to navigate
|
||
|
//
|
||
|
VariantInit(&varStart);
|
||
|
varStart.vt = VT_I4;
|
||
|
varStart.lVal = idChild;
|
||
|
|
||
|
hr = poleacc->accNavigate(dwNav, varStart, pvarEnd);
|
||
|
|
||
|
//
|
||
|
// Release our parent
|
||
|
//
|
||
|
poleacc->Release();
|
||
|
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
// --------------------------------------------------------------------------
|
||
|
//
|
||
|
// ValidateNavDir
|
||
|
//
|
||
|
// Validates navigation flags.
|
||
|
//
|
||
|
// --------------------------------------------------------------------------
|
||
|
BOOL ValidateNavDir(long navDir, LONG idChild)
|
||
|
{
|
||
|
|
||
|
#ifdef MAX_DEBUG
|
||
|
DBPRINTF (TEXT("Navigate "));
|
||
|
switch (navDir)
|
||
|
{
|
||
|
case NAVDIR_RIGHT:
|
||
|
DBPRINTF(TEXT("Right"));
|
||
|
break;
|
||
|
case NAVDIR_NEXT:
|
||
|
DBPRINTF (TEXT("Next"));
|
||
|
break;
|
||
|
case NAVDIR_LEFT:
|
||
|
DBPRINTF (TEXT("Left"));
|
||
|
break;
|
||
|
case NAVDIR_PREVIOUS:
|
||
|
DBPRINTF (TEXT("Previous"));
|
||
|
break;
|
||
|
case NAVDIR_UP:
|
||
|
DBPRINTF (TEXT("Up"));
|
||
|
break;
|
||
|
case NAVDIR_DOWN:
|
||
|
DBPRINTF (TEXT("Down"));
|
||
|
break;
|
||
|
case NAVDIR_FIRSTCHILD:
|
||
|
DBPRINTF (TEXT("First Child"));
|
||
|
break;
|
||
|
case NAVDIR_LASTCHILD:
|
||
|
DBPRINTF (TEXT("Last Child"));
|
||
|
break;
|
||
|
default:
|
||
|
DBPRINTF (TEXT("ERROR"));
|
||
|
}
|
||
|
if (idChild <= OBJID_WINDOW)
|
||
|
{
|
||
|
TCHAR szChild[50];
|
||
|
|
||
|
switch (idChild)
|
||
|
{
|
||
|
case OBJID_WINDOW:
|
||
|
lstrcpy (szChild,TEXT("SELF"));
|
||
|
break;
|
||
|
case OBJID_SYSMENU:
|
||
|
lstrcpy (szChild,TEXT("SYS MENU"));
|
||
|
break;
|
||
|
case OBJID_TITLEBAR:
|
||
|
lstrcpy (szChild,TEXT("TITLE BAR"));
|
||
|
break;
|
||
|
case OBJID_MENU:
|
||
|
lstrcpy (szChild,TEXT("MENU"));
|
||
|
break;
|
||
|
case OBJID_CLIENT:
|
||
|
lstrcpy (szChild,TEXT("CLIENT"));
|
||
|
break;
|
||
|
case OBJID_VSCROLL:
|
||
|
lstrcpy (szChild,TEXT("V SCROLL"));
|
||
|
break;
|
||
|
case OBJID_HSCROLL:
|
||
|
lstrcpy (szChild,TEXT("H SCROLL"));
|
||
|
break;
|
||
|
case OBJID_SIZEGRIP:
|
||
|
lstrcpy (szChild,TEXT("SIZE GRIP"));
|
||
|
break;
|
||
|
default:
|
||
|
wsprintf (szChild,TEXT("UNKNOWN 0x%lX"),idChild);
|
||
|
break;
|
||
|
}
|
||
|
DBPRINTF(TEXT(" from child %s\r\n"),szChild);
|
||
|
}
|
||
|
else
|
||
|
DBPRINTF(TEXT(" from child %ld\r\n"),idChild);
|
||
|
#endif
|
||
|
|
||
|
if ((navDir <= NAVDIR_MIN) || (navDir >= NAVDIR_MAX))
|
||
|
return(FALSE);
|
||
|
|
||
|
switch (navDir)
|
||
|
{
|
||
|
case NAVDIR_FIRSTCHILD:
|
||
|
case NAVDIR_LASTCHILD:
|
||
|
return(idChild == 0);
|
||
|
}
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
|
||
|
// --------------------------------------------------------------------------
|
||
|
//
|
||
|
// ValidateSelFlags
|
||
|
//
|
||
|
// Validates selection flags.
|
||
|
// this makes sure the only bits set are in the valid range and that you don't
|
||
|
// have any invalid combinations.
|
||
|
// Invalid combinations are
|
||
|
// ADDSELECTION and REMOVESELECTION
|
||
|
// ADDSELECTION and TAKESELECTION
|
||
|
// REMOVESELECTION and TAKESELECTION
|
||
|
// EXTENDSELECTION and TAKESELECTION
|
||
|
//
|
||
|
// --------------------------------------------------------------------------
|
||
|
BOOL ValidateSelFlags(long flags)
|
||
|
{
|
||
|
if (!ValidateFlags((flags), SELFLAG_VALID))
|
||
|
return (FALSE);
|
||
|
|
||
|
if ((flags & SELFLAG_ADDSELECTION) &&
|
||
|
(flags & SELFLAG_REMOVESELECTION))
|
||
|
return FALSE;
|
||
|
|
||
|
if ((flags & SELFLAG_ADDSELECTION) &&
|
||
|
(flags & SELFLAG_TAKESELECTION))
|
||
|
return FALSE;
|
||
|
|
||
|
if ((flags & SELFLAG_REMOVESELECTION) &&
|
||
|
(flags & SELFLAG_TAKESELECTION))
|
||
|
return FALSE;
|
||
|
|
||
|
if ((flags & SELFLAG_EXTENDSELECTION) &&
|
||
|
(flags & SELFLAG_TAKESELECTION))
|
||
|
return FALSE;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|