WindowsXP-SP1/windows/oleacc/oleacc/accutil.cpp
2020-09-30 16:53:49 +02:00

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;
}