xref: /AOO41X/main/winaccessibility/source/UAccCOM/MAccessible.cpp (revision 693722ac6e81ae0b75d971745c8990b9f58cd0db)
13a700b0aSSteve Yin /**************************************************************
25fdc4257SSteve Yin *
33a700b0aSSteve Yin * Licensed to the Apache Software Foundation (ASF) under one
43a700b0aSSteve Yin * or more contributor license agreements.  See the NOTICE file
53a700b0aSSteve Yin * distributed with this work for additional information
63a700b0aSSteve Yin * regarding copyright ownership.  The ASF licenses this file
73a700b0aSSteve Yin * to you under the Apache License, Version 2.0 (the
83a700b0aSSteve Yin * "License"); you may not use this file except in compliance
93a700b0aSSteve Yin * with the License.  You may obtain a copy of the License at
105fdc4257SSteve Yin *
113a700b0aSSteve Yin *   http://www.apache.org/licenses/LICENSE-2.0
125fdc4257SSteve Yin *
133a700b0aSSteve Yin * Unless required by applicable law or agreed to in writing,
143a700b0aSSteve Yin * software distributed under the License is distributed on an
153a700b0aSSteve Yin * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
163a700b0aSSteve Yin * KIND, either express or implied.  See the License for the
173a700b0aSSteve Yin * specific language governing permissions and limitations
183a700b0aSSteve Yin * under the License.
195fdc4257SSteve Yin *
203a700b0aSSteve Yin *************************************************************/
215fdc4257SSteve Yin 
225fdc4257SSteve Yin #include "stdafx.h"
235fdc4257SSteve Yin #include "UAccCOM2.h"
245fdc4257SSteve Yin #include "MAccessible.h"
255fdc4257SSteve Yin 
265fdc4257SSteve Yin #include <algorithm>
275fdc4257SSteve Yin #include "AccAction.h"
285fdc4257SSteve Yin 
295fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleText.hpp>
305fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleEditableText.hpp>
315fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleImage.hpp>
325fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleTable.hpp>
335fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleExtendedComponent.hpp>
345fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleAction.hpp>
355fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleKeyBinding.hpp>
365fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleHyperText.hpp>
375fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleHyperlink.hpp>
385fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleRelationSet.hpp>
395fdc4257SSteve Yin #include <com/sun/star/accessibility/AccessibleStateType.hpp>
405fdc4257SSteve Yin #include <com/sun/star/accessibility/AccessibleRole.hpp>
415fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleGroupPosition.hpp>
425fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleValue.hpp>
435fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleExtendedAttributes.hpp>
445fdc4257SSteve Yin #include <com/sun/star/style/LineSpacing.hpp>
455fdc4257SSteve Yin #include <com/sun/star/style/TabStop.hpp>
465fdc4257SSteve Yin #include <com/sun/star/container/XIndexReplace.hpp>
475fdc4257SSteve Yin 
48b0a7a3cfSSteve Yin #include "act.hxx"
493a700b0aSSteve Yin 
505fdc4257SSteve Yin using namespace com::sun::star::accessibility::AccessibleStateType;
515fdc4257SSteve Yin 
525fdc4257SSteve Yin // IA2 states mapping, and name
535fdc4257SSteve Yin // maintenance the consistency, change one array, change the three all
545fdc4257SSteve Yin long IA2_STATES[] =
555fdc4257SSteve Yin {
565fdc4257SSteve Yin 	IA2_STATE_ACTIVE,					// =					0x1;
575fdc4257SSteve Yin 	IA2_STATE_ARMED,					// =					0x2;
585fdc4257SSteve Yin 	IA2_STATE_DEFUNCT,					// =					0x4;
595fdc4257SSteve Yin 	IA2_STATE_EDITABLE,					// =					0x8;
605fdc4257SSteve Yin 	IA2_STATE_HORIZONTAL,				// =					0x10;
615fdc4257SSteve Yin 	IA2_STATE_ICONIFIED,				// =					0x20;
625fdc4257SSteve Yin 	IA2_STATE_INVALID_ENTRY,			// =					0x80;
635fdc4257SSteve Yin 	IA2_STATE_MANAGES_DESCENDANTS,		// =					0x100;
645fdc4257SSteve Yin 	IA2_STATE_MODAL,					// =					0x200;
655fdc4257SSteve Yin 	IA2_STATE_MULTI_LINE,				// =					0x400;
665fdc4257SSteve Yin 	IA2_STATE_OPAQUE,					// =					0x800;
675fdc4257SSteve Yin 	IA2_STATE_REQUIRED,					// =					0x2000;
685fdc4257SSteve Yin 	IA2_STATE_SELECTABLE_TEXT,			// =					0x3000;
695fdc4257SSteve Yin 	IA2_STATE_SINGLE_LINE,				// =					0x4000;
705fdc4257SSteve Yin 	IA2_STATE_STALE,					// =					0x8000;
715fdc4257SSteve Yin 	IA2_STATE_SUPPORTS_AUTOCOMPLETION,	// =					0x10000;
725fdc4257SSteve Yin 	IA2_STATE_TRANSIENT,				//=						0x20000;
735fdc4257SSteve Yin 	IA2_STATE_VERTICAL					// =					0x40000;
745fdc4257SSteve Yin };
755fdc4257SSteve Yin /*
765fdc4257SSteve Yin 
775fdc4257SSteve Yin <=== map ===>
785fdc4257SSteve Yin 
795fdc4257SSteve Yin */
805fdc4257SSteve Yin short UNO_STATES[] =
815fdc4257SSteve Yin {
825fdc4257SSteve Yin 	ACTIVE,			// = (sal_Int16)1;
835fdc4257SSteve Yin 	ARMED,			// = (sal_Int16)2;
845fdc4257SSteve Yin 	DEFUNC,			// = (sal_Int16)5;
855fdc4257SSteve Yin 	EDITABLE,		// = (sal_Int16)6;
865fdc4257SSteve Yin 	HORIZONTAL,		// = (sal_Int16)12;
875fdc4257SSteve Yin 	ICONIFIED,		// = (sal_Int16)13;
885fdc4257SSteve Yin 	-1,				//IA2_STATE_INVALID_ENTRY
895fdc4257SSteve Yin 	MANAGES_DESCENDANTS, // = (sal_Int16)15;
905fdc4257SSteve Yin 	MODAL,			// = (sal_Int16)16;
915fdc4257SSteve Yin 	MULTI_LINE,		// = (sal_Int16)17;
925fdc4257SSteve Yin 	OPAQUE,			// = (sal_Int16)19;
935fdc4257SSteve Yin 	-1,				//IA2_STATE_REQUIRED
945fdc4257SSteve Yin 	-1,				//IA2_STATE_SELECTABLE_TEXT
955fdc4257SSteve Yin 	SINGLE_LINE,	// = (sal_Int16)26;
965fdc4257SSteve Yin 	STALE,			// = (sal_Int16)27;
975fdc4257SSteve Yin 	-1,				//IA2_STATE_SUPPORTS_AUTOCOMPLETION
985fdc4257SSteve Yin 	TRANSIENT,		//IA2_STATE_TRANSIENT
995fdc4257SSteve Yin 	VERTICAL		// = (sal_Int16)29;
1005fdc4257SSteve Yin };
1015fdc4257SSteve Yin 
1025fdc4257SSteve Yin //  <=== map ===>
1035fdc4257SSteve Yin 
1045fdc4257SSteve Yin BSTR IA2_STATES_NAME[] =
1055fdc4257SSteve Yin {
1065fdc4257SSteve Yin 	_T("Active"),
1075fdc4257SSteve Yin 	_T("Armed"),
1085fdc4257SSteve Yin 	_T("Defunct"),
1095fdc4257SSteve Yin 	_T("Editable"),
1105fdc4257SSteve Yin 	_T("Horizontal"),
1115fdc4257SSteve Yin 	_T("Iconified"),
1125fdc4257SSteve Yin 	_T("Invalid Entry"),
1135fdc4257SSteve Yin 	_T("Manages Decendents"),
1145fdc4257SSteve Yin 	_T("Modal"),
1155fdc4257SSteve Yin 	_T("Multi Line"),
1165fdc4257SSteve Yin 	_T("Opaque"),
1175fdc4257SSteve Yin 	_T("Required"),
1185fdc4257SSteve Yin 	_T("Selectable Text"),
1195fdc4257SSteve Yin 	_T("Single Line"),
1205fdc4257SSteve Yin 	_T("Stale"),
1215fdc4257SSteve Yin 	_T("Supports Autocompletion"),
1225fdc4257SSteve Yin 	_T("Transient"),
1235fdc4257SSteve Yin 	_T("Vertical")
1245fdc4257SSteve Yin };
1255fdc4257SSteve Yin 
1265fdc4257SSteve Yin // IA2 states mapping, and name
1275fdc4257SSteve Yin // maintenance the consistency. change one, change them all
1285fdc4257SSteve Yin 
1295fdc4257SSteve Yin BSTR UNO_ALL_STATES[] =
1305fdc4257SSteve Yin {
1315fdc4257SSteve Yin 	_T("INVALID"),			// 	INVALID	( 0 )
1325fdc4257SSteve Yin 	_T("ACTIVE"),			// 	ACTIVE	( 1 )
1335fdc4257SSteve Yin 	_T("ARMED"),			// 	ARMED	( 2 )
1345fdc4257SSteve Yin 	_T("BUSY"),				// 	BUSY	( 3 )
1355fdc4257SSteve Yin 	_T("CHECKED"),			// 	CHECKED	( 4 )
1365fdc4257SSteve Yin 	_T("DEFUNC"),			// 	DEFUNC	( 5 )
1375fdc4257SSteve Yin 	_T("EDITABLE"),			// 	EDITABLE	( 6 )
1385fdc4257SSteve Yin 	_T("ENABLED"),			// 	ENABLED	( 7 )
1395fdc4257SSteve Yin 	_T("EXPANDABLE"),		// 	EXPANDABLE	( 8 )
1405fdc4257SSteve Yin 	_T("EXPANDED"),			// 	EXPANDED	( 9 )
1415fdc4257SSteve Yin 	_T("FOCUSABLE"),		// 	FOCUSABLE	( 10 )
1425fdc4257SSteve Yin 	_T("FOCUSED"),			// 	FOCUSED	( 11 )
1435fdc4257SSteve Yin 	_T("HORIZONTAL"),		// 	HORIZONTAL	( 12 )
1445fdc4257SSteve Yin 	_T("ICONIFIED"),		// 	ICONIFIED	( 13 )
1455fdc4257SSteve Yin 	_T("INDETERMINATE"),	// 	INDETERMINATE	( 14 )
1465fdc4257SSteve Yin 	_T("MANAGES_DESCENDANTS"),// 	MANAGES_DESCENDANTS	( 15 )
1475fdc4257SSteve Yin 	_T("MODAL"),			// 	MODAL	( 16 )
1485fdc4257SSteve Yin 	_T("MULTI_LINE"),		// 	MULTI_LINE	( 17 )
1495fdc4257SSteve Yin 	_T("MULTI_SELECTABLE"),	// 	MULTI_SELECTABLE	( 18 )
1505fdc4257SSteve Yin 	_T("OPAQUE"),			// 	OPAQUE	( 19 )
1515fdc4257SSteve Yin 	_T("PRESSED"),			// 	PRESSED	( 20 )
1525fdc4257SSteve Yin 	_T("RESIZABLE"),		// 	RESIZABLE	( 21 )
1535fdc4257SSteve Yin 	_T("SELECTABLE"),		// 	SELECTABLE	( 22 )
1545fdc4257SSteve Yin 	_T("SELECTED"),			// 	SELECTED	( 23 )
1555fdc4257SSteve Yin 	_T("SENSITIVE"),		// 	SENSITIVE	( 24 )
1565fdc4257SSteve Yin 	_T("SHOWING"),			// 	SHOWING	( 25 )
1575fdc4257SSteve Yin 	_T("SINGLE_LINE"),		// 	SINGLE_LINE	( 26 )
1585fdc4257SSteve Yin 	_T("STALE"),			// 	STALE	( 27 )
1595fdc4257SSteve Yin 	_T("TRANSIENT"),		// 	TRANSIENT	( 28 )
1605fdc4257SSteve Yin 	_T("VERTICAL"),			// 	VERTICAL	( 29 )
1615fdc4257SSteve Yin 	_T("VISIBLE"),			// 	VISIBLE	( 30 )
1625fdc4257SSteve Yin 	_T("MOVEABLE"),			//  MOVEABLE ( 31 )
1635fdc4257SSteve Yin 	_T("OFFSCREEN"),		//  OFFSCREEN ( 32 )
1645fdc4257SSteve Yin 	_T("COLLAPSE"),			//  COLLAPSE ( 33 )
1655fdc4257SSteve Yin 	_T("DEFAULT")			//  DEFAULT ( 34 )
1665fdc4257SSteve Yin };
1675fdc4257SSteve Yin 
1685fdc4257SSteve Yin 
1695fdc4257SSteve Yin using namespace com::sun::star::accessibility::AccessibleRole;
1705fdc4257SSteve Yin 
1715fdc4257SSteve Yin 
1725fdc4257SSteve Yin 
1735fdc4257SSteve Yin #define QUERYXINTERFACE(ainterface)	\
1745fdc4257SSteve Yin {							\
1755fdc4257SSteve Yin 	if(pXAcc == NULL)		\
1765fdc4257SSteve Yin 	return FALSE;		\
1775fdc4257SSteve Yin 	pRContext = pXAcc->getAccessibleContext();	\
1785fdc4257SSteve Yin 	if( !pRContext.is() )	\
1795fdc4257SSteve Yin {						\
1805fdc4257SSteve Yin 	return FALSE;		\
1815fdc4257SSteve Yin }						\
1825fdc4257SSteve Yin 	Reference<X##ainterface> pRXI(pRContext,UNO_QUERY);\
1835fdc4257SSteve Yin 	if( !pRXI.is() )		\
1845fdc4257SSteve Yin {						\
1855fdc4257SSteve Yin 	return FALSE;		\
1865fdc4257SSteve Yin }						\
1875fdc4257SSteve Yin 	*ppXI = (XInterface*)pRXI.get();		\
1885fdc4257SSteve Yin 	return TRUE;			\
1895fdc4257SSteve Yin }
1905fdc4257SSteve Yin 
1915fdc4257SSteve Yin #define ISDESTROY()	\
1925fdc4257SSteve Yin 	if(m_isDestroy)	\
1935fdc4257SSteve Yin 	return S_FALSE;
1945fdc4257SSteve Yin 
1955fdc4257SSteve Yin 
1965fdc4257SSteve Yin AccObjectManagerAgent* CMAccessible::g_pAgent = NULL;
1975fdc4257SSteve Yin 
1985fdc4257SSteve Yin CMAccessible::CMAccessible():
1995fdc4257SSteve Yin m_iRole(0x00),
2005fdc4257SSteve Yin m_dState(0x00),
2015fdc4257SSteve Yin m_dChildID(0x00),
2025fdc4257SSteve Yin m_dFocusChildID(UACC_NO_FOCUS),
2035fdc4257SSteve Yin m_hwnd(NULL),
2045fdc4257SSteve Yin m_pIParent(NULL),
2055fdc4257SSteve Yin m_pszName(NULL),
2065fdc4257SSteve Yin m_pszValue(NULL),
2075fdc4257SSteve Yin m_pszDescription(NULL),
2085fdc4257SSteve Yin m_isDestroy(FALSE),
2095fdc4257SSteve Yin m_pszActionDescription(NULL),
2105fdc4257SSteve Yin m_pXAction(NULL),
2115fdc4257SSteve Yin m_bRequiresSave(FALSE),
2125fdc4257SSteve Yin pUNOInterface(NULL)
2135fdc4257SSteve Yin {
2145fdc4257SSteve Yin 	m_sLocation.m_dLeft=0;
2155fdc4257SSteve Yin 	m_sLocation.m_dTop = 0;
2165fdc4257SSteve Yin 	m_sLocation.m_dWidth=0;
2175fdc4257SSteve Yin 	m_sLocation.m_dHeight=0;
2185fdc4257SSteve Yin 	CEnumVariant::Create(&m_pEnumVar);
219*693722acSSteve Yin 	m_containedObjects.clear();
2205fdc4257SSteve Yin }
2215fdc4257SSteve Yin 
2225fdc4257SSteve Yin CMAccessible::~CMAccessible()
2235fdc4257SSteve Yin {
2245fdc4257SSteve Yin 	if(m_pszName!=NULL)
2255fdc4257SSteve Yin 	{
2265fdc4257SSteve Yin 		SAFE_SYSFREESTRING(m_pszName);
2275fdc4257SSteve Yin 		m_pszName=NULL;
2285fdc4257SSteve Yin 	}
2295fdc4257SSteve Yin 	if(m_pszValue!=NULL)
2305fdc4257SSteve Yin 	{
2315fdc4257SSteve Yin 		SAFE_SYSFREESTRING(m_pszValue);
2325fdc4257SSteve Yin 		m_pszValue=NULL;
2335fdc4257SSteve Yin 	}
2345fdc4257SSteve Yin 	if(m_pszDescription!=NULL)
2355fdc4257SSteve Yin 	{
2365fdc4257SSteve Yin 		SAFE_SYSFREESTRING(m_pszDescription);
2375fdc4257SSteve Yin 		m_pszDescription=NULL;
2385fdc4257SSteve Yin 	}
2395fdc4257SSteve Yin 
2405fdc4257SSteve Yin 	if(m_pszActionDescription!=NULL)
2415fdc4257SSteve Yin 	{
2425fdc4257SSteve Yin 		SAFE_SYSFREESTRING(m_pszActionDescription);
2435fdc4257SSteve Yin 		m_pszActionDescription=NULL;
2445fdc4257SSteve Yin 	}
2455fdc4257SSteve Yin 
2465fdc4257SSteve Yin 	if(m_pIParent)
2475fdc4257SSteve Yin 	{
2485fdc4257SSteve Yin 		m_pIParent->Release();
2495fdc4257SSteve Yin 		m_pIParent=NULL;
2505fdc4257SSteve Yin 	}
2515fdc4257SSteve Yin 	pRef = NULL;
2525fdc4257SSteve Yin 	m_pEnumVar->Release();
2535fdc4257SSteve Yin 	m_containedObjects.clear();
2545fdc4257SSteve Yin 	pRContext = NULL;
2555fdc4257SSteve Yin }
2565fdc4257SSteve Yin 
2575fdc4257SSteve Yin /**
2585fdc4257SSteve Yin * Returns the Parent IAccessible interface pointer to AT.
2595fdc4257SSteve Yin * It should add reference, and the client should release the component.
2605fdc4257SSteve Yin * It should return E_FAIL when the parent point is null.
2615fdc4257SSteve Yin * @param	ppdispParent [in,out] used to return the parent interface point.
2625fdc4257SSteve Yin *			when the point is null, should return null.
2635fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if the m_pIParent is NULL.
2645fdc4257SSteve Yin */
2655fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accParent(IDispatch **ppdispParent)
2665fdc4257SSteve Yin {
2675fdc4257SSteve Yin 
2685fdc4257SSteve Yin 	CHECK_ENABLE_INF
2695fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
2705fdc4257SSteve Yin 		ISDESTROY()
2715fdc4257SSteve Yin 		// #CHECK#
2725fdc4257SSteve Yin 		if(ppdispParent == NULL)
2735fdc4257SSteve Yin 		{
2745fdc4257SSteve Yin 			return E_INVALIDARG;
2755fdc4257SSteve Yin 		}
2765fdc4257SSteve Yin 
2775fdc4257SSteve Yin 		if(m_pIParent)
2785fdc4257SSteve Yin 		{
2795fdc4257SSteve Yin 			*ppdispParent = m_pIParent;
2805fdc4257SSteve Yin 			(*ppdispParent)->AddRef();
2815fdc4257SSteve Yin 			return S_OK;
2825fdc4257SSteve Yin 		}
2835fdc4257SSteve Yin 		else if(m_hwnd)
2845fdc4257SSteve Yin 		{
2855fdc4257SSteve Yin 			HRESULT hr = AccessibleObjectFromWindow(m_hwnd, OBJID_WINDOW, IID_IAccessible, (void**)ppdispParent);
2865fdc4257SSteve Yin 			if( ! SUCCEEDED( hr ) || ! ppdispParent )
2875fdc4257SSteve Yin 			{
2885fdc4257SSteve Yin 				return S_FALSE;
2895fdc4257SSteve Yin 			}
2905fdc4257SSteve Yin 			return S_OK;
2915fdc4257SSteve Yin 		}
2925fdc4257SSteve Yin 		return S_FALSE;
2935fdc4257SSteve Yin 
2945fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
2955fdc4257SSteve Yin }
2965fdc4257SSteve Yin 
2975fdc4257SSteve Yin /**
2985fdc4257SSteve Yin * Returns child count of current COM object.
2995fdc4257SSteve Yin * @param	pcountChildren [in,out] used to return the children count.
3005fdc4257SSteve Yin * @return   S_OK if successful.
3015fdc4257SSteve Yin */
3025fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accChildCount(long *pcountChildren)
3035fdc4257SSteve Yin {
3045fdc4257SSteve Yin 
3055fdc4257SSteve Yin 	CHECK_ENABLE_INF
3065fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
3075fdc4257SSteve Yin 		ISDESTROY()
3085fdc4257SSteve Yin 		// #CHECK#
3095fdc4257SSteve Yin 		if(pcountChildren == NULL)
3105fdc4257SSteve Yin 		{
3115fdc4257SSteve Yin 			return E_INVALIDARG;
3125fdc4257SSteve Yin 		}
3135fdc4257SSteve Yin 
3145fdc4257SSteve Yin 		if(!pUNOInterface)
3155fdc4257SSteve Yin 			return S_FALSE;
3165fdc4257SSteve Yin 
3175fdc4257SSteve Yin 		Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext();
3185fdc4257SSteve Yin 		if( pRContext.is() )
3195fdc4257SSteve Yin 		{
3205fdc4257SSteve Yin 			*pcountChildren = pRContext->getAccessibleChildCount();
3215fdc4257SSteve Yin 		}
3225fdc4257SSteve Yin 
3235fdc4257SSteve Yin 		return S_OK;
3245fdc4257SSteve Yin 
3255fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
3265fdc4257SSteve Yin }
3275fdc4257SSteve Yin 
3285fdc4257SSteve Yin /**
3295fdc4257SSteve Yin * Returns child interface pointer for AT according to input child ID.
3305fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
3315fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
3325fdc4257SSteve Yin * @param	ppdispChild, [in,out] use to return the child interface point.
3335fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
3345fdc4257SSteve Yin */
3355fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accChild(VARIANT varChild, IDispatch **ppdispChild)
3365fdc4257SSteve Yin {
3375fdc4257SSteve Yin 
3385fdc4257SSteve Yin 	CHECK_ENABLE_INF
3395fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
3405fdc4257SSteve Yin 		ISDESTROY()
3415fdc4257SSteve Yin 		// #CHECK#
3425fdc4257SSteve Yin 		if(ppdispChild == NULL)
3435fdc4257SSteve Yin 		{
3445fdc4257SSteve Yin 			return E_INVALIDARG;
3455fdc4257SSteve Yin 		}
3465fdc4257SSteve Yin 		if(varChild.vt==VT_I4)
3475fdc4257SSteve Yin 		{
3485fdc4257SSteve Yin 			//get child interface pointer due to child ID
3495fdc4257SSteve Yin 			if(varChild.lVal==CHILDID_SELF)
3505fdc4257SSteve Yin 			{
3515fdc4257SSteve Yin 				AddRef();
3525fdc4257SSteve Yin 				*ppdispChild = this;
3535fdc4257SSteve Yin 				return S_OK;
3545fdc4257SSteve Yin 			}
3555fdc4257SSteve Yin 			*ppdispChild = GetChildInterface(varChild.lVal);
3565fdc4257SSteve Yin 			(*ppdispChild)->AddRef();
3575fdc4257SSteve Yin 			return (*ppdispChild)?S_OK:S_FALSE;
3585fdc4257SSteve Yin 		}
3595fdc4257SSteve Yin 		return S_FALSE;
3605fdc4257SSteve Yin 
3615fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
3625fdc4257SSteve Yin }
3635fdc4257SSteve Yin 
3645fdc4257SSteve Yin /**
3655fdc4257SSteve Yin * Returns the accessible name of the current COM object self or its one child to AT.
3665fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
3675fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
3685fdc4257SSteve Yin * @param	pszName, [in,out] use to return the name of the proper object.
3695fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
3705fdc4257SSteve Yin */
3715fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accName(VARIANT varChild, BSTR *pszName)
3725fdc4257SSteve Yin {
3735fdc4257SSteve Yin 
3745fdc4257SSteve Yin 	CHECK_ENABLE_INF
3755fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
3765fdc4257SSteve Yin 		ISDESTROY()
3775fdc4257SSteve Yin 		// #CHECK#
3785fdc4257SSteve Yin 		if(pszName == NULL)
3795fdc4257SSteve Yin 		{
3805fdc4257SSteve Yin 			return E_INVALIDARG;
3815fdc4257SSteve Yin 		}
3825fdc4257SSteve Yin 		if(varChild.vt==VT_I4)
3835fdc4257SSteve Yin 		{
3845fdc4257SSteve Yin 			if(varChild.lVal==CHILDID_SELF)
3855fdc4257SSteve Yin 			{
3865fdc4257SSteve Yin 				SAFE_SYSFREESTRING(*pszName);
3875fdc4257SSteve Yin 				*pszName = SysAllocString(m_pszName);
3885fdc4257SSteve Yin 				return S_OK;
3895fdc4257SSteve Yin 			}
3905fdc4257SSteve Yin 
3915fdc4257SSteve Yin 			long lVal = varChild.lVal;
3925fdc4257SSteve Yin 			varChild.lVal = CHILDID_SELF;
3935fdc4257SSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
3945fdc4257SSteve Yin 			if(!pChild)
3955fdc4257SSteve Yin 				return E_FAIL;
3965fdc4257SSteve Yin 			return pChild->get_accName(varChild,pszName);
3975fdc4257SSteve Yin 		}
3985fdc4257SSteve Yin 		return S_FALSE;
3995fdc4257SSteve Yin 
4005fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
4015fdc4257SSteve Yin }
4025fdc4257SSteve Yin 
4035fdc4257SSteve Yin /**
4045fdc4257SSteve Yin * Returns the accessible value of the current COM object self or its one child to AT.
4055fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
4065fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
4075fdc4257SSteve Yin * @param	pszValue, [in,out] use to return the value of the proper object.
4085fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
4095fdc4257SSteve Yin */
4105fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accValue(VARIANT varChild, BSTR *pszValue)
4115fdc4257SSteve Yin {
4125fdc4257SSteve Yin 
4135fdc4257SSteve Yin 	CHECK_ENABLE_INF
4145fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
4155fdc4257SSteve Yin 		ISDESTROY()
4165fdc4257SSteve Yin 		// #CHECK#
4175fdc4257SSteve Yin 		if( pszValue == NULL )
4185fdc4257SSteve Yin 		{
4195fdc4257SSteve Yin 			return E_INVALIDARG;
4205fdc4257SSteve Yin 		}
4215fdc4257SSteve Yin 		if( varChild.vt==VT_I4 )
4225fdc4257SSteve Yin 		{
4235fdc4257SSteve Yin 			if(varChild.lVal==CHILDID_SELF)
4245fdc4257SSteve Yin 			{
4255fdc4257SSteve Yin 				if(m_dState & STATE_SYSTEM_PROTECTED)
4265fdc4257SSteve Yin 					return E_ACCESSDENIED;
4275fdc4257SSteve Yin 
4285fdc4257SSteve Yin 				if ( m_pszValue !=NULL && wcslen(m_pszValue) == 0 )
4295fdc4257SSteve Yin 					return S_OK;
4305fdc4257SSteve Yin 
4315fdc4257SSteve Yin 				SAFE_SYSFREESTRING(*pszValue);
4325fdc4257SSteve Yin 				*pszValue = SysAllocString(m_pszValue);
4335fdc4257SSteve Yin 				return S_OK;
4345fdc4257SSteve Yin 			}
4355fdc4257SSteve Yin 
4365fdc4257SSteve Yin 			long lVal = varChild.lVal;
4375fdc4257SSteve Yin 			varChild.lVal = CHILDID_SELF;
4385fdc4257SSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
4395fdc4257SSteve Yin 			if(!pChild)
4405fdc4257SSteve Yin 				return E_FAIL;
4415fdc4257SSteve Yin 			return pChild->get_accValue(varChild,pszValue);
4425fdc4257SSteve Yin 		}
4435fdc4257SSteve Yin 		return S_FALSE;
4445fdc4257SSteve Yin 
4455fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
4465fdc4257SSteve Yin }
4475fdc4257SSteve Yin 
4485fdc4257SSteve Yin /**
4495fdc4257SSteve Yin * Returns the accessible description of the current COM object self or its one child to AT.
4505fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
4515fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
4525fdc4257SSteve Yin * @param	pszDescription, [in,out] use to return the description of the proper object.
4535fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
4545fdc4257SSteve Yin */
4555fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accDescription(VARIANT varChild, BSTR *pszDescription)
4565fdc4257SSteve Yin {
4575fdc4257SSteve Yin 
4585fdc4257SSteve Yin 	CHECK_ENABLE_INF
4595fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
4605fdc4257SSteve Yin 		ISDESTROY()
4615fdc4257SSteve Yin 		// #CHECK#
4625fdc4257SSteve Yin 		if(pszDescription == NULL)
4635fdc4257SSteve Yin 		{
4645fdc4257SSteve Yin 			return E_INVALIDARG;
4655fdc4257SSteve Yin 		}
4665fdc4257SSteve Yin 		if(varChild.vt==VT_I4)
4675fdc4257SSteve Yin 		{
4685fdc4257SSteve Yin 			if(varChild.lVal==CHILDID_SELF)
4695fdc4257SSteve Yin 			{
4705fdc4257SSteve Yin 				SAFE_SYSFREESTRING(*pszDescription);
4715fdc4257SSteve Yin 				*pszDescription = SysAllocString(m_pszDescription);
4725fdc4257SSteve Yin 				return S_OK;
4735fdc4257SSteve Yin 			}
4745fdc4257SSteve Yin 
4755fdc4257SSteve Yin 			long lVal = varChild.lVal;
4765fdc4257SSteve Yin 			varChild.lVal = CHILDID_SELF;
4775fdc4257SSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
4785fdc4257SSteve Yin 			if(!pChild)
4795fdc4257SSteve Yin 				return E_FAIL;
4805fdc4257SSteve Yin 			return pChild->get_accDescription(varChild,pszDescription);
4815fdc4257SSteve Yin 		}
4825fdc4257SSteve Yin 		return S_FALSE;
4835fdc4257SSteve Yin 
4845fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
4855fdc4257SSteve Yin }
4865fdc4257SSteve Yin 
4875fdc4257SSteve Yin /**
4885fdc4257SSteve Yin * Returns the accessible role of the current COM object self or its one child to AT.
4895fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
4905fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
4915fdc4257SSteve Yin * @param	pvarRole, [in,out] use to return the role of the proper object.
4925fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
4935fdc4257SSteve Yin */
4945fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accRole(VARIANT varChild, VARIANT *pvarRole)
4955fdc4257SSteve Yin {
4965fdc4257SSteve Yin 
4975fdc4257SSteve Yin 	CHECK_ENABLE_INF
4985fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
4995fdc4257SSteve Yin 		ISDESTROY()
5005fdc4257SSteve Yin 		// #CHECK#
5015fdc4257SSteve Yin 		if(pvarRole == NULL)
5025fdc4257SSteve Yin 		{
5035fdc4257SSteve Yin 			return E_INVALIDARG;
5045fdc4257SSteve Yin 		}
5055fdc4257SSteve Yin 		if(varChild.vt == VT_I4)
5065fdc4257SSteve Yin 		{
5075fdc4257SSteve Yin 
5085fdc4257SSteve Yin 			if(varChild.lVal == CHILDID_SELF)
5095fdc4257SSteve Yin 			{
5105fdc4257SSteve Yin 				if( m_iRole < IA2_ROLE_CAPTION )
5115fdc4257SSteve Yin 				{
5125fdc4257SSteve Yin 					VariantInit(pvarRole);
5135fdc4257SSteve Yin 					pvarRole->vt = VT_I4;
5145fdc4257SSteve Yin 					pvarRole->lVal = m_iRole;
5155fdc4257SSteve Yin 				}
5165fdc4257SSteve Yin 				else
5175fdc4257SSteve Yin 				{
5185fdc4257SSteve Yin 					VariantInit(pvarRole);
5195fdc4257SSteve Yin 					pvarRole->vt = VT_I4;
5205fdc4257SSteve Yin 					pvarRole->lVal = ROLE_SYSTEM_CLIENT;
5215fdc4257SSteve Yin 				}
5225fdc4257SSteve Yin 				return S_OK;
5235fdc4257SSteve Yin 			}
5245fdc4257SSteve Yin 
5255fdc4257SSteve Yin 
5265fdc4257SSteve Yin 			long lVal = varChild.lVal;
5275fdc4257SSteve Yin 			varChild.lVal = CHILDID_SELF;
5285fdc4257SSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
5295fdc4257SSteve Yin 			if(!pChild)
5305fdc4257SSteve Yin 				return E_FAIL;
5315fdc4257SSteve Yin 			return pChild->get_accRole(varChild,pvarRole);
5325fdc4257SSteve Yin 		}
5335fdc4257SSteve Yin 		return S_FALSE;
5345fdc4257SSteve Yin 
5355fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
5365fdc4257SSteve Yin }
5375fdc4257SSteve Yin 
5385fdc4257SSteve Yin /**
5395fdc4257SSteve Yin * Returns the accessible state of the current COM object self or its one child to AT.
5405fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
5415fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
5425fdc4257SSteve Yin * @param	pvarState, [in,out] use to return the state of the proper object.
5435fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
5445fdc4257SSteve Yin */
5455fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accState(VARIANT varChild, VARIANT *pvarState)
5465fdc4257SSteve Yin {
5475fdc4257SSteve Yin 
5485fdc4257SSteve Yin 	CHECK_ENABLE_INF
5495fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
5505fdc4257SSteve Yin 		ISDESTROY()
5515fdc4257SSteve Yin 		// #CHECK#
5525fdc4257SSteve Yin 		if(pvarState == NULL)
5535fdc4257SSteve Yin 		{
5545fdc4257SSteve Yin 			return E_INVALIDARG;
5555fdc4257SSteve Yin 		}
5565fdc4257SSteve Yin 		if(varChild.vt==VT_I4)
5575fdc4257SSteve Yin 		{
5585fdc4257SSteve Yin 			if(varChild.lVal == CHILDID_SELF)
5595fdc4257SSteve Yin 			{
5605fdc4257SSteve Yin 				if(pUNOInterface)
5615fdc4257SSteve Yin 				{
5625fdc4257SSteve Yin 					Reference< XAccessibleContext > pContext = pUNOInterface->getAccessibleContext();
5635fdc4257SSteve Yin 					if(pContext.is())
5645fdc4257SSteve Yin 					{
5655fdc4257SSteve Yin 						// add the STATE_SYSTEM_LINKED state
5665fdc4257SSteve Yin 						Reference< XAccessibleHypertext > pRHypertext(pContext,UNO_QUERY);
5675fdc4257SSteve Yin 						if(pRHypertext.is())
5685fdc4257SSteve Yin 						{
5695fdc4257SSteve Yin 							if( pRHypertext->getHyperLinkCount() > 0 )
5705fdc4257SSteve Yin 								m_dState |= STATE_SYSTEM_LINKED;
5715fdc4257SSteve Yin 							else
5725fdc4257SSteve Yin 								m_dState &= ~STATE_SYSTEM_LINKED;
5735fdc4257SSteve Yin 						}
5745fdc4257SSteve Yin 						else
5755fdc4257SSteve Yin 							m_dState &= ~STATE_SYSTEM_LINKED;
5765fdc4257SSteve Yin 					}
5775fdc4257SSteve Yin 				}
5785fdc4257SSteve Yin 
5795fdc4257SSteve Yin 				VariantInit(pvarState);
5805fdc4257SSteve Yin 				pvarState->vt = VT_I4;
5815fdc4257SSteve Yin 				pvarState->lVal = m_dState;
5825fdc4257SSteve Yin 				return S_OK;
5835fdc4257SSteve Yin 			}
5845fdc4257SSteve Yin 
5855fdc4257SSteve Yin 			long lVal = varChild.lVal;
5865fdc4257SSteve Yin 			varChild.lVal = CHILDID_SELF;
5875fdc4257SSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
5885fdc4257SSteve Yin 			if(!pChild)
5895fdc4257SSteve Yin 				return E_FAIL;
5905fdc4257SSteve Yin 			return pChild->get_accState(varChild,pvarState);
5915fdc4257SSteve Yin 		}
5925fdc4257SSteve Yin 		return S_FALSE;
5935fdc4257SSteve Yin 
5945fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
5955fdc4257SSteve Yin }
5965fdc4257SSteve Yin 
5975fdc4257SSteve Yin /**
5985fdc4257SSteve Yin * Returns the accessible helpString of the current COM object self or its one child to AT.
5995fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
6005fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
6015fdc4257SSteve Yin * @param	pszHelp, [in,out] use to return the helpString of the proper object.
6025fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
6035fdc4257SSteve Yin */
6045fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accHelp(VARIANT, BSTR *)
6055fdc4257SSteve Yin {
6065fdc4257SSteve Yin 	return E_NOTIMPL;
6075fdc4257SSteve Yin }
6085fdc4257SSteve Yin 
6095fdc4257SSteve Yin /**
6105fdc4257SSteve Yin * Returns the accessible HelpTopic of the current COM object self or its one child to AT.
6115fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
6125fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
6135fdc4257SSteve Yin * @param	pszHelpFile, [in,out] use to return the HelpTopic of the proper object.
6145fdc4257SSteve Yin * @param	pidTopic, use to return the HelpTopic ID of the proper object.
6155fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
6165fdc4257SSteve Yin * Not implemented yet
6175fdc4257SSteve Yin */
6185fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accHelpTopic(BSTR *, VARIANT, long *)
6195fdc4257SSteve Yin {
6205fdc4257SSteve Yin 	return E_NOTIMPL;
6215fdc4257SSteve Yin }
6225fdc4257SSteve Yin 
6235fdc4257SSteve Yin static void GetMnemonicChar( const ::rtl::OUString& aStr, WCHAR* wStr)
6245fdc4257SSteve Yin {
6255fdc4257SSteve Yin 	int  nLen    = aStr.pData->length;
6265fdc4257SSteve Yin 	int  i       = 0;
6275fdc4257SSteve Yin 	WCHAR* text = aStr.pData->buffer;
6285fdc4257SSteve Yin 
6295fdc4257SSteve Yin 	while ( i < nLen )
6305fdc4257SSteve Yin 	{
6315fdc4257SSteve Yin 		if ( text[i] == L'~' )
6325fdc4257SSteve Yin 			if ( text[i+1] != L'~' )
6335fdc4257SSteve Yin 			{
6345fdc4257SSteve Yin 				wStr[0] = text[i+1];
6355fdc4257SSteve Yin 				break;
6365fdc4257SSteve Yin 			}
6375fdc4257SSteve Yin 			i++;
6385fdc4257SSteve Yin 	}
6395fdc4257SSteve Yin }
6405fdc4257SSteve Yin 
6415fdc4257SSteve Yin /**
6425fdc4257SSteve Yin * Returns the accessible keyboard shortcut of the current COM object self or its one child to AT.
6435fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
6445fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
6455fdc4257SSteve Yin * @param	pszKeyboardShortcut, [in,out] use to return the kbshortcut of the proper object.
6465fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
6475fdc4257SSteve Yin */
6485fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accKeyboardShortcut(VARIANT varChild, BSTR *pszKeyboardShortcut)
6495fdc4257SSteve Yin {
6505fdc4257SSteve Yin 
6515fdc4257SSteve Yin 	CHECK_ENABLE_INF
6525fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
6535fdc4257SSteve Yin 
6545fdc4257SSteve Yin 		ISDESTROY()
6555fdc4257SSteve Yin 		// #CHECK#
6565fdc4257SSteve Yin 		if(pszKeyboardShortcut == NULL)
6575fdc4257SSteve Yin 		{
6585fdc4257SSteve Yin 			return E_INVALIDARG;
6595fdc4257SSteve Yin 		}
6605fdc4257SSteve Yin 
6615fdc4257SSteve Yin 		if(varChild.vt==VT_I4)
6625fdc4257SSteve Yin 		{
6635fdc4257SSteve Yin 			if(varChild.lVal == CHILDID_SELF)
6645fdc4257SSteve Yin 			{
6655fdc4257SSteve Yin 				if( pUNOInterface )
6665fdc4257SSteve Yin 				{
6675fdc4257SSteve Yin 					Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
6685fdc4257SSteve Yin 					if( !pRContext.is() )
6695fdc4257SSteve Yin 						return S_FALSE;
6705fdc4257SSteve Yin 
6715fdc4257SSteve Yin 					Reference<XAccessibleAction> pRXI(pRContext,UNO_QUERY);
6725fdc4257SSteve Yin 
6735fdc4257SSteve Yin 					OLECHAR wString[64]={0};
6745fdc4257SSteve Yin 
6755fdc4257SSteve Yin 					if( pRXI.is() && pRXI->getAccessibleActionCount() >= 1)
6765fdc4257SSteve Yin 					{
6775fdc4257SSteve Yin 						Reference< XAccessibleKeyBinding > binding = pRXI->getAccessibleActionKeyBinding(0);
6785fdc4257SSteve Yin 						if( binding.is() )
6795fdc4257SSteve Yin 						{
6805fdc4257SSteve Yin 							long nCount = binding->getAccessibleKeyBindingCount();
6815fdc4257SSteve Yin 							if(nCount >= 1)
6825fdc4257SSteve Yin 							{
6835fdc4257SSteve Yin 								CAccAction::GetkeyBindingStrByXkeyBinding( binding->getAccessibleKeyBinding(0),wString );
6845fdc4257SSteve Yin 							}
6855fdc4257SSteve Yin 						}
6865fdc4257SSteve Yin 					}
6875fdc4257SSteve Yin 					if(wString[0] == 0)
6885fdc4257SSteve Yin 					{
6895fdc4257SSteve Yin 						Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet();
6905fdc4257SSteve Yin 						if(!pRrelationSet.is())
6915fdc4257SSteve Yin 						{
6925fdc4257SSteve Yin 							return S_FALSE;
6935fdc4257SSteve Yin 						}
6945fdc4257SSteve Yin 
6955fdc4257SSteve Yin 						long nRelCount = pRrelationSet->getRelationCount();
6965fdc4257SSteve Yin 
6975fdc4257SSteve Yin 						// Modified by Steve Yin, for SODC_1552
6985fdc4257SSteve Yin 						if( /*nRelCount <= 0 &&*/ m_iRole == ROLE_SYSTEM_TEXT )
6995fdc4257SSteve Yin 						{
7005fdc4257SSteve Yin 							VARIANT varParentRole;
7015fdc4257SSteve Yin 							VariantInit( &varParentRole );
7025fdc4257SSteve Yin 
7035fdc4257SSteve Yin 							m_pIParent->get_accRole(varChild, &varParentRole);
7045fdc4257SSteve Yin 
7055fdc4257SSteve Yin 							if( m_pIParent && varParentRole.lVal == ROLE_SYSTEM_COMBOBOX ) // edit in comoboBox
7065fdc4257SSteve Yin 							{
7075fdc4257SSteve Yin 								m_pIParent->get_accKeyboardShortcut(varChild, pszKeyboardShortcut);
7085fdc4257SSteve Yin 								return S_OK;
7095fdc4257SSteve Yin 							}
7105fdc4257SSteve Yin 						}
7115fdc4257SSteve Yin 
7125fdc4257SSteve Yin 						AccessibleRelation *paccRelation = NULL;
7135fdc4257SSteve Yin 						AccessibleRelation accRelation;
7145fdc4257SSteve Yin 						for(int i=0; i<nRelCount ; i++)
7155fdc4257SSteve Yin 						{
7165fdc4257SSteve Yin 							if( pRrelationSet->getRelation(i).RelationType == 6 )
7175fdc4257SSteve Yin 							{
7185fdc4257SSteve Yin 								accRelation = pRrelationSet->getRelation(i);
7195fdc4257SSteve Yin 								paccRelation = &accRelation;
7205fdc4257SSteve Yin 							}
7215fdc4257SSteve Yin 						}
7225fdc4257SSteve Yin 
7235fdc4257SSteve Yin 						if(paccRelation == NULL)
7245fdc4257SSteve Yin 							return S_FALSE;
7255fdc4257SSteve Yin 
7265fdc4257SSteve Yin 						Sequence< Reference< XInterface > > xTargets = paccRelation->TargetSet;
7275fdc4257SSteve Yin 						Reference<XInterface> pRAcc = xTargets[0];
7285fdc4257SSteve Yin 
7295fdc4257SSteve Yin 						XAccessible* pXAcc = (XAccessible*)pRAcc.get();
7305fdc4257SSteve Yin 
7315fdc4257SSteve Yin 						Reference<XAccessibleContext> pRLebelContext = pXAcc->getAccessibleContext();
7325fdc4257SSteve Yin 						if(!pRLebelContext.is())
7335fdc4257SSteve Yin 							return S_FALSE;
7345fdc4257SSteve Yin 
7355fdc4257SSteve Yin 						pRrelationSet = pRLebelContext->getAccessibleRelationSet();
7365fdc4257SSteve Yin 						nRelCount = pRrelationSet->getRelationCount();
7375fdc4257SSteve Yin 
7385fdc4257SSteve Yin 						paccRelation = NULL;
7395fdc4257SSteve Yin 						for(int j=0; j<nRelCount ; j++)
7405fdc4257SSteve Yin 						{
7415fdc4257SSteve Yin 							if( pRrelationSet->getRelation(j).RelationType == 5 )
7425fdc4257SSteve Yin 							{
7435fdc4257SSteve Yin 								accRelation = pRrelationSet->getRelation(j);
7445fdc4257SSteve Yin 								paccRelation = &accRelation;
7455fdc4257SSteve Yin 							}
7465fdc4257SSteve Yin 						}
7475fdc4257SSteve Yin 
7485fdc4257SSteve Yin 						if(paccRelation)
7495fdc4257SSteve Yin 						{
7505fdc4257SSteve Yin 							xTargets = paccRelation->TargetSet;
7515fdc4257SSteve Yin 							pRAcc = xTargets[0];
7525fdc4257SSteve Yin 							if(pUNOInterface != (XAccessible*)pRAcc.get())
7535fdc4257SSteve Yin 								return S_FALSE;
7545fdc4257SSteve Yin 						}
7555fdc4257SSteve Yin 
7565fdc4257SSteve Yin 						Reference<XAccessibleExtendedComponent> pRXIE(pRLebelContext,UNO_QUERY);
7575fdc4257SSteve Yin 						if(!pRXIE.is())
7585fdc4257SSteve Yin 							return S_FALSE;
7595fdc4257SSteve Yin 
7605fdc4257SSteve Yin 						::rtl::OUString ouStr = pRXIE->getTitledBorderText();
7615fdc4257SSteve Yin 						WCHAR key[2] = {NULL};
7625fdc4257SSteve Yin 						GetMnemonicChar(ouStr, key);
7635fdc4257SSteve Yin 						if(key[0] != 0)
7645fdc4257SSteve Yin 						{
7655fdc4257SSteve Yin 							wcscat(wString, L"Alt+");
7665fdc4257SSteve Yin 							wcscat(wString, key);
7675fdc4257SSteve Yin 						}
7685fdc4257SSteve Yin 						else
7695fdc4257SSteve Yin 							return S_FALSE;
7705fdc4257SSteve Yin 					}
7715fdc4257SSteve Yin 
7725fdc4257SSteve Yin 					SAFE_SYSFREESTRING(*pszKeyboardShortcut);
7735fdc4257SSteve Yin 					*pszKeyboardShortcut = SysAllocString(wString);
7745fdc4257SSteve Yin 
7755fdc4257SSteve Yin 					return S_OK;
7765fdc4257SSteve Yin 				}
7775fdc4257SSteve Yin 				else
7785fdc4257SSteve Yin 				{
7795fdc4257SSteve Yin 					return S_FALSE;
7805fdc4257SSteve Yin 				}
7815fdc4257SSteve Yin 			}
7825fdc4257SSteve Yin 
7835fdc4257SSteve Yin 			long lVal = varChild.lVal;
7845fdc4257SSteve Yin 			varChild.lVal = CHILDID_SELF;
7855fdc4257SSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
7865fdc4257SSteve Yin 			if(!pChild)
7875fdc4257SSteve Yin 				return E_FAIL;
7885fdc4257SSteve Yin 
7895fdc4257SSteve Yin 			return pChild->get_accKeyboardShortcut(varChild,pszKeyboardShortcut);
7905fdc4257SSteve Yin 		}
7915fdc4257SSteve Yin 		return S_FALSE;
7925fdc4257SSteve Yin 
7935fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
7945fdc4257SSteve Yin }
7955fdc4257SSteve Yin 
7965fdc4257SSteve Yin /**
7975fdc4257SSteve Yin * Returns the current focused child to AT.
7985fdc4257SSteve Yin * @param	pvarChild, [in,out] vt member of pvarChild must be VT_I4,and lVal member stores the child ID,
7995fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
8005fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
8015fdc4257SSteve Yin */
8025fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accFocus(VARIANT *pvarChild)
8035fdc4257SSteve Yin {
8045fdc4257SSteve Yin 
8055fdc4257SSteve Yin 	CHECK_ENABLE_INF
8065fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
8075fdc4257SSteve Yin 		ISDESTROY()
8085fdc4257SSteve Yin 		// #CHECK#
8095fdc4257SSteve Yin 		if(pvarChild == NULL)
8105fdc4257SSteve Yin 		{
8115fdc4257SSteve Yin 			return E_INVALIDARG;
8125fdc4257SSteve Yin 		}
8135fdc4257SSteve Yin 		if( m_dFocusChildID==UACC_NO_FOCUS )
8145fdc4257SSteve Yin 		{
8155fdc4257SSteve Yin 			pvarChild->vt = VT_EMPTY;//no focus on the object and its children
8165fdc4257SSteve Yin 			return S_OK;
8175fdc4257SSteve Yin 		}
8185fdc4257SSteve Yin 		//if the descendant of current object has focus indicated by m_dFocusChildID, return the IDispatch of this focused object
8195fdc4257SSteve Yin 		else
8205fdc4257SSteve Yin 		{
8215fdc4257SSteve Yin 			IMAccessible* pIMAcc = NULL;
8225fdc4257SSteve Yin 			g_pAgent->GetIAccessibleFromResID(m_dFocusChildID,&pIMAcc);
8235fdc4257SSteve Yin 			pIMAcc->AddRef();
8245fdc4257SSteve Yin 			pvarChild->vt = VT_DISPATCH;
8255fdc4257SSteve Yin 			pvarChild->pdispVal = pIMAcc;
8265fdc4257SSteve Yin 
8275fdc4257SSteve Yin 		}
8285fdc4257SSteve Yin 		return S_OK;
8295fdc4257SSteve Yin 
8305fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
8315fdc4257SSteve Yin }
8325fdc4257SSteve Yin 
8335fdc4257SSteve Yin /**
8345fdc4257SSteve Yin * Returns the selection of the current COM object to AT.
8355fdc4257SSteve Yin * @param	pvarChildren,[in,out]
8365fdc4257SSteve Yin * if selection num is 0,return VT_EMPTY for vt,
8375fdc4257SSteve Yin * if selection num is 1,return VT_I4 for vt,and child index for lVal
8385fdc4257SSteve Yin * if selection num >1,return VT_UNKNOWN for vt, and IEnumVariant* for punkVal
8395fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
8405fdc4257SSteve Yin */
8415fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accSelection(VARIANT *pvarChildren)
8425fdc4257SSteve Yin {
8435fdc4257SSteve Yin 
8445fdc4257SSteve Yin 	CHECK_ENABLE_INF
8455fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
8465fdc4257SSteve Yin 		ISDESTROY()
8475fdc4257SSteve Yin 		// #CHECK#
8485fdc4257SSteve Yin 		if(pvarChildren == NULL)
8495fdc4257SSteve Yin 		{
8505fdc4257SSteve Yin 			return E_INVALIDARG;
8515fdc4257SSteve Yin 		}
8525fdc4257SSteve Yin 		switch(m_pEnumVar->GetCountOfElements())
8535fdc4257SSteve Yin 		{
8545fdc4257SSteve Yin 		case 0:
8555fdc4257SSteve Yin 			pvarChildren->vt = VT_EMPTY;
8565fdc4257SSteve Yin 			break;
8575fdc4257SSteve Yin 		case 1:
8585fdc4257SSteve Yin 			VARIANT varTmp[1];
8595fdc4257SSteve Yin 			ULONG count;
8605fdc4257SSteve Yin 			VariantInit(&varTmp[0]);
8615fdc4257SSteve Yin 			m_pEnumVar->Next(1,varTmp,&count);
8625fdc4257SSteve Yin 			if(count!=1)
8635fdc4257SSteve Yin 				return S_FALSE;
8645fdc4257SSteve Yin 			pvarChildren->vt = VT_I4;
8655fdc4257SSteve Yin 			pvarChildren->lVal = varTmp[0].lVal;
8665fdc4257SSteve Yin 			VariantClear(&varTmp[0]);
8675fdc4257SSteve Yin 			m_pEnumVar->Reset();
8685fdc4257SSteve Yin 			break;
8695fdc4257SSteve Yin 		default:
8705fdc4257SSteve Yin 			pvarChildren->vt = VT_UNKNOWN;
8715fdc4257SSteve Yin 			m_pEnumVar->AddRef();
8725fdc4257SSteve Yin 			pvarChildren->punkVal = m_pEnumVar;
8735fdc4257SSteve Yin 			break;
8745fdc4257SSteve Yin 		}
8755fdc4257SSteve Yin 		return S_OK;
8765fdc4257SSteve Yin 
8775fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
8785fdc4257SSteve Yin }
8795fdc4257SSteve Yin 
8805fdc4257SSteve Yin /**
8815fdc4257SSteve Yin * Returns the location of the current COM object self or its one child to AT.
8825fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
8835fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
8845fdc4257SSteve Yin * @param	pxLeft, [in,out] use to return the x-coordination of the proper object.
8855fdc4257SSteve Yin * @param	pyTop,  [in,out] use to return the y-coordination of the proper object.
8865fdc4257SSteve Yin * @param	pcxWidth, [in,out] use to return the x-coordination width of the proper object.
8875fdc4257SSteve Yin * @param	pcyHeight, [in,out] use to return the y-coordination height of the proper object.
8885fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
8895fdc4257SSteve Yin */
8905fdc4257SSteve Yin STDMETHODIMP CMAccessible::accLocation(long *pxLeft, long *pyTop, long *pcxWidth, long *pcyHeight, VARIANT varChild)
8915fdc4257SSteve Yin {
8925fdc4257SSteve Yin 
8935fdc4257SSteve Yin 	CHECK_ENABLE_INF
8945fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
8955fdc4257SSteve Yin 		ISDESTROY()
8965fdc4257SSteve Yin 		// #CHECK#
8975fdc4257SSteve Yin 		if(pxLeft == NULL || pyTop == NULL || pcxWidth == NULL || pcyHeight == NULL)
8985fdc4257SSteve Yin 		{
8995fdc4257SSteve Yin 			return E_INVALIDARG;
9005fdc4257SSteve Yin 		}
9015fdc4257SSteve Yin 
9025fdc4257SSteve Yin 		if(varChild.vt==VT_I4)
9035fdc4257SSteve Yin 		{
9045fdc4257SSteve Yin 			if(varChild.lVal==CHILDID_SELF)
9055fdc4257SSteve Yin 			{
9065fdc4257SSteve Yin 
9075fdc4257SSteve Yin 				if(pUNOInterface)
9085fdc4257SSteve Yin 				{
9095fdc4257SSteve Yin 					Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext();
9105fdc4257SSteve Yin 					if( !pRContext.is() )
9115fdc4257SSteve Yin 						return S_FALSE;
9125fdc4257SSteve Yin 					Reference< XAccessibleComponent > pRComponent(pRContext,UNO_QUERY);
9135fdc4257SSteve Yin 					if( !pRComponent.is() )
9145fdc4257SSteve Yin 						return S_FALSE;
9155fdc4257SSteve Yin 
9165fdc4257SSteve Yin 					::com::sun::star::awt::Point pCPoint = pRComponent->getLocationOnScreen();
9175fdc4257SSteve Yin 					::com::sun::star::awt::Size pCSize = pRComponent->getSize();
9185fdc4257SSteve Yin 					*pxLeft = pCPoint.X;
9195fdc4257SSteve Yin 					*pyTop =  pCPoint.Y;
9205fdc4257SSteve Yin 					*pcxWidth = pCSize.Width;
9215fdc4257SSteve Yin 					*pcyHeight = pCSize.Height;
9225fdc4257SSteve Yin 					return S_OK;
9235fdc4257SSteve Yin 				}
9245fdc4257SSteve Yin 				else
9255fdc4257SSteve Yin 				{
9265fdc4257SSteve Yin 					*pxLeft = m_sLocation.m_dLeft;
9275fdc4257SSteve Yin 					*pyTop = m_sLocation.m_dTop;
9285fdc4257SSteve Yin 					*pcxWidth = m_sLocation.m_dWidth;
9295fdc4257SSteve Yin 					*pcyHeight = m_sLocation.m_dHeight;
9305fdc4257SSteve Yin 					return S_OK;
9315fdc4257SSteve Yin 				}
9325fdc4257SSteve Yin 			}
9335fdc4257SSteve Yin 
9345fdc4257SSteve Yin 		}
9355fdc4257SSteve Yin 		return S_FALSE;
9365fdc4257SSteve Yin 
9375fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
9385fdc4257SSteve Yin }
9395fdc4257SSteve Yin 
9405fdc4257SSteve Yin /**
9415fdc4257SSteve Yin * Returns the current focused child to AT.
9425fdc4257SSteve Yin * @param	navDir, the direction flag of the navigation.
9435fdc4257SSteve Yin * @param	varStart, the start child id of this navigation action.
9445fdc4257SSteve Yin * @param	pvarEndUpAt, [in,out] the end up child of this navigation action.
9455fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
9465fdc4257SSteve Yin */
9475fdc4257SSteve Yin STDMETHODIMP CMAccessible::accNavigate(long navDir, VARIANT varStart, VARIANT *pvarEndUpAt)
9485fdc4257SSteve Yin {
9495fdc4257SSteve Yin 
9505fdc4257SSteve Yin 	CHECK_ENABLE_INF
9515fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
9525fdc4257SSteve Yin 		ISDESTROY()
9535fdc4257SSteve Yin 		// #CHECK#
9545fdc4257SSteve Yin 		if(pvarEndUpAt == NULL)
9555fdc4257SSteve Yin 		{
9565fdc4257SSteve Yin 			return E_INVALIDARG;
9575fdc4257SSteve Yin 		}
9585fdc4257SSteve Yin 		HRESULT ret = E_FAIL;
9595fdc4257SSteve Yin 		switch (navDir)
9605fdc4257SSteve Yin 		{
9615fdc4257SSteve Yin 		case NAVDIR_FIRSTCHILD:
9625fdc4257SSteve Yin 			ret = GetFirstChild(varStart,pvarEndUpAt);
9635fdc4257SSteve Yin 			break;
9645fdc4257SSteve Yin 		case NAVDIR_LASTCHILD:
9655fdc4257SSteve Yin 			ret = GetLastChild(varStart,pvarEndUpAt);
9665fdc4257SSteve Yin 			break;
9675fdc4257SSteve Yin 		case NAVDIR_NEXT:
9685fdc4257SSteve Yin 			ret = GetNextSibling(varStart,pvarEndUpAt);
9695fdc4257SSteve Yin 			break;
9705fdc4257SSteve Yin 		case NAVDIR_PREVIOUS:
9715fdc4257SSteve Yin 			ret = GetPreSibling(varStart,pvarEndUpAt);
9725fdc4257SSteve Yin 			break;
9735fdc4257SSteve Yin 		case NAVDIR_DOWN://do not implement temporarily
9745fdc4257SSteve Yin 			break;
9755fdc4257SSteve Yin 		case NAVDIR_UP://do not implement temporarily
9765fdc4257SSteve Yin 			break;
9775fdc4257SSteve Yin 		case NAVDIR_LEFT://do not implement temporarily
9785fdc4257SSteve Yin 			break;
9795fdc4257SSteve Yin 		case NAVDIR_RIGHT://do not implement temporarily
9805fdc4257SSteve Yin 			break;
9815fdc4257SSteve Yin 		default:
9825fdc4257SSteve Yin 			break;
9835fdc4257SSteve Yin 		};
9845fdc4257SSteve Yin 		return ret;
9855fdc4257SSteve Yin 
9865fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
9875fdc4257SSteve Yin }
9885fdc4257SSteve Yin 
9895fdc4257SSteve Yin STDMETHODIMP CMAccessible::accHitTest(long xLeft, long yTop, VARIANT *pvarChild)
9905fdc4257SSteve Yin {
9915fdc4257SSteve Yin 
9925fdc4257SSteve Yin 	CHECK_ENABLE_INF
9935fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
9945fdc4257SSteve Yin 		ISDESTROY()
9955fdc4257SSteve Yin 		// #CHECK#
9965fdc4257SSteve Yin 		if(pvarChild == NULL)
9975fdc4257SSteve Yin 		{
9985fdc4257SSteve Yin 			return E_INVALIDARG;
9995fdc4257SSteve Yin 		}
10005fdc4257SSteve Yin 		long x, y, w, h;
10015fdc4257SSteve Yin 		VARIANT varSelf;
10025fdc4257SSteve Yin 		VariantInit(&varSelf);
10035fdc4257SSteve Yin 		varSelf.vt = VT_I4;
10045fdc4257SSteve Yin 		varSelf.lVal = CHILDID_SELF;
10055fdc4257SSteve Yin 		accLocation(&x,&y,&w,&h,varSelf);
10065fdc4257SSteve Yin 		if( (x < xLeft && (x + w) >xLeft) && (y < yTop && (y + h) >yTop) )
10075fdc4257SSteve Yin 		{
10085fdc4257SSteve Yin 			int i, nCount;
10095fdc4257SSteve Yin 			pvarChild->vt = VT_EMPTY;
10105fdc4257SSteve Yin 			Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface);
10115fdc4257SSteve Yin 			nCount = pRContext->getAccessibleChildCount();
10125fdc4257SSteve Yin 			if(nCount > 256)
10135fdc4257SSteve Yin 				return E_FAIL;
10145fdc4257SSteve Yin 			IMAccessible* child = NULL;
10155fdc4257SSteve Yin 			for( i = 0; i<nCount; i++)
10165fdc4257SSteve Yin 			{
10175fdc4257SSteve Yin 
10185fdc4257SSteve Yin 				child = GetChildInterface(i + 1);
10195fdc4257SSteve Yin 				if(child && child->accHitTest(xLeft,yTop,pvarChild) == S_OK)
10205fdc4257SSteve Yin 					break;
10215fdc4257SSteve Yin 			}
10225fdc4257SSteve Yin 
10235fdc4257SSteve Yin 			if(pvarChild->vt == VT_DISPATCH)
10245fdc4257SSteve Yin 				return S_OK;
10255fdc4257SSteve Yin 
10265fdc4257SSteve Yin 			if( i < nCount)
10275fdc4257SSteve Yin 			{
10285fdc4257SSteve Yin 				pvarChild->vt = VT_DISPATCH;
10295fdc4257SSteve Yin 				pvarChild->pdispVal = child;
10305fdc4257SSteve Yin 				child->AddRef();
10315fdc4257SSteve Yin 			}
10325fdc4257SSteve Yin 			else
10335fdc4257SSteve Yin 			{
10345fdc4257SSteve Yin 				pvarChild->vt = VT_I4;
10355fdc4257SSteve Yin 				pvarChild->lVal = CHILDID_SELF;
10365fdc4257SSteve Yin 			}
10375fdc4257SSteve Yin 			return S_OK;
10385fdc4257SSteve Yin 		}
10395fdc4257SSteve Yin 		return S_FALSE;
10405fdc4257SSteve Yin 
10415fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
10425fdc4257SSteve Yin }
10435fdc4257SSteve Yin 
10445fdc4257SSteve Yin /**
10455fdc4257SSteve Yin * Get The other Interface from CMAccessible.
10465fdc4257SSteve Yin * @param	guidService, must be IID_IAccessible here.
10475fdc4257SSteve Yin * @param	riid, the IID interface .
10485fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
10495fdc4257SSteve Yin */
10505fdc4257SSteve Yin STDMETHODIMP CMAccessible::QueryService(REFGUID guidService, REFIID riid, void** ppvObject)
10515fdc4257SSteve Yin {
10525fdc4257SSteve Yin 	if( InlineIsEqualGUID(guidService, IID_IAccessible) )
10535fdc4257SSteve Yin 		return QueryInterface(riid, ppvObject);
10545fdc4257SSteve Yin 	return S_FALSE;
10555fdc4257SSteve Yin }
10565fdc4257SSteve Yin 
10575fdc4257SSteve Yin /**
10585fdc4257SSteve Yin * Set the accessible name of the current COM object self or its one child from UNO.
10595fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
10605fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
10615fdc4257SSteve Yin * @param	szName, the name used to set the name of the proper object.
10625fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
10635fdc4257SSteve Yin */
10645fdc4257SSteve Yin STDMETHODIMP CMAccessible::put_accName(VARIANT varChild, BSTR szName)
10655fdc4257SSteve Yin {
10665fdc4257SSteve Yin 
10675fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
10685fdc4257SSteve Yin 		ISDESTROY()
10695fdc4257SSteve Yin 		if(varChild.vt==VT_I4)
10705fdc4257SSteve Yin 		{
10715fdc4257SSteve Yin 			if(varChild.lVal==CHILDID_SELF)
10725fdc4257SSteve Yin 			{
10735fdc4257SSteve Yin 				SAFE_SYSFREESTRING(m_pszName);
10745fdc4257SSteve Yin 				m_pszName=SysAllocString(szName);
10755fdc4257SSteve Yin 				return S_OK;
10765fdc4257SSteve Yin 			}
10775fdc4257SSteve Yin 
10785fdc4257SSteve Yin 			long lVal = varChild.lVal;
10795fdc4257SSteve Yin 			varChild.lVal = CHILDID_SELF;
10805fdc4257SSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
10815fdc4257SSteve Yin 			if(!pChild)
10825fdc4257SSteve Yin 				return E_FAIL;
10835fdc4257SSteve Yin 			return pChild->put_accName(varChild,szName);
10845fdc4257SSteve Yin 		}
10855fdc4257SSteve Yin 		return E_FAIL;
10865fdc4257SSteve Yin 
10875fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
10885fdc4257SSteve Yin }
10895fdc4257SSteve Yin 
10905fdc4257SSteve Yin /**
10915fdc4257SSteve Yin * Set the accessible value of the current COM object self or its one child from UNO.
10925fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
10935fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
10945fdc4257SSteve Yin * @param	szValue, the value used to set the value of the proper object.
10955fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
10965fdc4257SSteve Yin */
10975fdc4257SSteve Yin STDMETHODIMP CMAccessible::put_accValue(VARIANT varChild, BSTR szValue)
10985fdc4257SSteve Yin {
10995fdc4257SSteve Yin 
11005fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
11015fdc4257SSteve Yin 		ISDESTROY()
11025fdc4257SSteve Yin 		if(varChild.vt==VT_I4)
11035fdc4257SSteve Yin 		{
11045fdc4257SSteve Yin 			if(varChild.lVal==CHILDID_SELF)
11055fdc4257SSteve Yin 			{
11065fdc4257SSteve Yin 				SysAllocString(m_pszValue);
11075fdc4257SSteve Yin 				m_pszValue=SysAllocString(szValue);
11085fdc4257SSteve Yin 				return S_OK;
11095fdc4257SSteve Yin 			}
11105fdc4257SSteve Yin 
11115fdc4257SSteve Yin 			long lVal = varChild.lVal;
11125fdc4257SSteve Yin 			varChild.lVal = CHILDID_SELF;
11135fdc4257SSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
11145fdc4257SSteve Yin 			if(!pChild)
11155fdc4257SSteve Yin 				return E_FAIL;
11165fdc4257SSteve Yin 			return pChild->put_accValue(varChild,szValue);
11175fdc4257SSteve Yin 		}
11185fdc4257SSteve Yin 		return E_FAIL;
11195fdc4257SSteve Yin 
11205fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
11215fdc4257SSteve Yin }
11225fdc4257SSteve Yin 
11235fdc4257SSteve Yin /**
11245fdc4257SSteve Yin * Set the accessible name of the current COM object self from UNO.
11255fdc4257SSteve Yin * @param	pszName, the name value used to set the name of the current object.
11265fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
11275fdc4257SSteve Yin */
11285fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccName(const OLECHAR __RPC_FAR *pszName)
11295fdc4257SSteve Yin {
11305fdc4257SSteve Yin 
11315fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
11325fdc4257SSteve Yin 		ISDESTROY()
11335fdc4257SSteve Yin 		// #CHECK#
11345fdc4257SSteve Yin 		if(pszName == NULL)
11355fdc4257SSteve Yin 		{
11365fdc4257SSteve Yin 			return E_INVALIDARG;
11375fdc4257SSteve Yin 		}
11385fdc4257SSteve Yin 
11395fdc4257SSteve Yin 		SAFE_SYSFREESTRING(m_pszName);//??
11405fdc4257SSteve Yin 		m_pszName = SysAllocString(pszName);
11415fdc4257SSteve Yin 		if(m_pszName==NULL)
11425fdc4257SSteve Yin 			return E_FAIL;
11435fdc4257SSteve Yin 		return S_OK;
11445fdc4257SSteve Yin 
11455fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
11465fdc4257SSteve Yin }
11475fdc4257SSteve Yin 
11485fdc4257SSteve Yin /**
11495fdc4257SSteve Yin * Set the accessible role of the current COM object self from UNO.
11505fdc4257SSteve Yin * @param	pRole, the role value used to set the role of the current object.
11515fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
11525fdc4257SSteve Yin */
11535fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccRole(unsigned short pRole)
11545fdc4257SSteve Yin {
11555fdc4257SSteve Yin 	m_iRole = pRole;
11565fdc4257SSteve Yin 	return S_OK;
11575fdc4257SSteve Yin }
11585fdc4257SSteve Yin 
11595fdc4257SSteve Yin /**
11605fdc4257SSteve Yin * Add one state into the current state set for the current COM object from UNO.
11615fdc4257SSteve Yin * @param	pXSate, the state used to set the name of the current object.
11625fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
11635fdc4257SSteve Yin */
11645fdc4257SSteve Yin STDMETHODIMP CMAccessible::DecreaseState(DWORD pXSate)
11655fdc4257SSteve Yin {
11665fdc4257SSteve Yin 	m_dState &= (~pXSate);
11675fdc4257SSteve Yin 	return S_OK;
11685fdc4257SSteve Yin }
11695fdc4257SSteve Yin 
11705fdc4257SSteve Yin /**
11715fdc4257SSteve Yin * Delete one state into the current state set for the current COM object from UNO.
11725fdc4257SSteve Yin * @param	pXSate, the state used to set the name of the current object.
11735fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
11745fdc4257SSteve Yin */
11755fdc4257SSteve Yin STDMETHODIMP CMAccessible::IncreaseState(DWORD pXSate)
11765fdc4257SSteve Yin {
11775fdc4257SSteve Yin 	m_dState |= pXSate;
11785fdc4257SSteve Yin 	return S_OK;
11795fdc4257SSteve Yin }
11805fdc4257SSteve Yin 
11815fdc4257SSteve Yin /**
11825fdc4257SSteve Yin * Set state into the current state set for the current COM object from UNO.
11835fdc4257SSteve Yin * @param	pXSate, the state used to set the name of the current object.
11845fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
11855fdc4257SSteve Yin */
11865fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetState(DWORD pXSate)
11875fdc4257SSteve Yin {
11885fdc4257SSteve Yin 	m_dState = pXSate;
11895fdc4257SSteve Yin 	return S_OK;
11905fdc4257SSteve Yin }
11915fdc4257SSteve Yin 
11925fdc4257SSteve Yin 
11935fdc4257SSteve Yin 
11945fdc4257SSteve Yin /**
11955fdc4257SSteve Yin * Set the accessible description of the current COM object self from UNO.
11965fdc4257SSteve Yin * @param	pszDescription, the name used to set the description of the current object.
11975fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
11985fdc4257SSteve Yin */
11995fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccDescription(const OLECHAR __RPC_FAR *pszDescription)
12005fdc4257SSteve Yin {
12015fdc4257SSteve Yin 
12025fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
12035fdc4257SSteve Yin 		ISDESTROY()
12045fdc4257SSteve Yin 		// #CHECK#
12055fdc4257SSteve Yin 		if(pszDescription == NULL)
12065fdc4257SSteve Yin 		{
12075fdc4257SSteve Yin 			return E_INVALIDARG;
12085fdc4257SSteve Yin 		}
12095fdc4257SSteve Yin 
12105fdc4257SSteve Yin 		SAFE_SYSFREESTRING(m_pszDescription);
12115fdc4257SSteve Yin 		m_pszDescription = SysAllocString(pszDescription);
12125fdc4257SSteve Yin 
12135fdc4257SSteve Yin 		if(m_pszDescription==NULL)
12145fdc4257SSteve Yin 			return E_FAIL;
12155fdc4257SSteve Yin 		return S_OK;
12165fdc4257SSteve Yin 
12175fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
12185fdc4257SSteve Yin }
12195fdc4257SSteve Yin 
12205fdc4257SSteve Yin /**
12215fdc4257SSteve Yin * Set the accessible value of the current COM object self from UNO.
12225fdc4257SSteve Yin * @param	pszAccValue, the name used to set the value of the current object.
12235fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
12245fdc4257SSteve Yin */
12255fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccValue(const OLECHAR __RPC_FAR *pszAccValue)
12265fdc4257SSteve Yin {
12275fdc4257SSteve Yin 
12285fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
12295fdc4257SSteve Yin 		ISDESTROY()
12305fdc4257SSteve Yin 		// #CHECK#
12315fdc4257SSteve Yin 		if(pszAccValue == NULL)
12325fdc4257SSteve Yin 		{
12335fdc4257SSteve Yin 			return E_INVALIDARG;
12345fdc4257SSteve Yin 		}
12355fdc4257SSteve Yin 		SAFE_SYSFREESTRING(m_pszValue);
12365fdc4257SSteve Yin 		m_pszValue = SysAllocString(pszAccValue);
12375fdc4257SSteve Yin 		if(m_pszValue==NULL)
12385fdc4257SSteve Yin 			return E_FAIL;
12395fdc4257SSteve Yin 		return S_OK;
12405fdc4257SSteve Yin 
12415fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
12425fdc4257SSteve Yin }
12435fdc4257SSteve Yin 
12445fdc4257SSteve Yin /**
12455fdc4257SSteve Yin * Set the HWND value of the current COM object self from UNO. It should set the parent IAccessible
12465fdc4257SSteve Yin * Object through the method AccessibleObjectFromWindow(...).
12475fdc4257SSteve Yin * @param	hwnd, the HWND used to set the value of the current object.
12485fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
12495fdc4257SSteve Yin */
12505fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccWindowHandle(HWND hwnd)
12515fdc4257SSteve Yin {
12525fdc4257SSteve Yin 
12535fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
12545fdc4257SSteve Yin 		ISDESTROY()
12555fdc4257SSteve Yin 		m_hwnd = hwnd;
12565fdc4257SSteve Yin 	return S_OK;
12575fdc4257SSteve Yin 
12585fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
12595fdc4257SSteve Yin }
12605fdc4257SSteve Yin 
12615fdc4257SSteve Yin /**
12625fdc4257SSteve Yin * Set accessible focus by specifying child ID
12635fdc4257SSteve Yin * @param	dChildID, the child id identifies the focus child.
12645fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
12655fdc4257SSteve Yin */
12665fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccFocus(long dChildID)
12675fdc4257SSteve Yin {
12685fdc4257SSteve Yin 
12695fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
12705fdc4257SSteve Yin 		ISDESTROY()
12715fdc4257SSteve Yin 
12725fdc4257SSteve Yin 		if(dChildID==CHILDID_SELF)
12735fdc4257SSteve Yin 		{
12745fdc4257SSteve Yin 			if(m_pIParent)
12755fdc4257SSteve Yin 			{
12765fdc4257SSteve Yin 				m_pIParent->Put_XAccFocus(m_dChildID);
12775fdc4257SSteve Yin 			}
12785fdc4257SSteve Yin 		}
12795fdc4257SSteve Yin 		else
12805fdc4257SSteve Yin 		{
12815fdc4257SSteve Yin 			m_dFocusChildID = dChildID;
12825fdc4257SSteve Yin 			//traverse all ancestors to set the focused child ID so that when the get_accFocus is called on
12835fdc4257SSteve Yin 			//any of the ancestors, this id can be used to get the IAccessible of focused object.
12845fdc4257SSteve Yin 			if(m_pIParent)
12855fdc4257SSteve Yin 			{
12865fdc4257SSteve Yin 				m_pIParent->Put_XAccFocus(dChildID);
12875fdc4257SSteve Yin 			}
12885fdc4257SSteve Yin 		}
12895fdc4257SSteve Yin 		return S_OK;
12905fdc4257SSteve Yin 
12915fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
12925fdc4257SSteve Yin }
12935fdc4257SSteve Yin 
12945fdc4257SSteve Yin /**
12955fdc4257SSteve Yin *Set accessible object location for the current COM object
12965fdc4257SSteve Yin * @param	sLocation, the location of the current object.
12975fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
12985fdc4257SSteve Yin */
12995fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccLocation(const Location sLocation)
13005fdc4257SSteve Yin {
13015fdc4257SSteve Yin 
13025fdc4257SSteve Yin 	this->m_sLocation = sLocation;
13035fdc4257SSteve Yin 	return S_OK;
13045fdc4257SSteve Yin }
13055fdc4257SSteve Yin 
13065fdc4257SSteve Yin /**
13075fdc4257SSteve Yin * Set accessible parent object for the current COM object if
13085fdc4257SSteve Yin * the current object is a child of some COM object
13095fdc4257SSteve Yin * @param	pIParent, the parent of the current object.
13105fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
13115fdc4257SSteve Yin */
13125fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccParent(IMAccessible __RPC_FAR *pIParent)
13135fdc4257SSteve Yin {
13145fdc4257SSteve Yin 	this->m_pIParent = pIParent;
13155fdc4257SSteve Yin 
13165fdc4257SSteve Yin 	if(pIParent)
13175fdc4257SSteve Yin 		m_pIParent->AddRef();
13185fdc4257SSteve Yin 
13195fdc4257SSteve Yin 	return S_OK;
13205fdc4257SSteve Yin }
13215fdc4257SSteve Yin 
13225fdc4257SSteve Yin /**
13235fdc4257SSteve Yin * Set unique child id to COM
13245fdc4257SSteve Yin * @param	dChildID, the id of the current object.
13255fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
13265fdc4257SSteve Yin */
13275fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccChildID(long dChildID)
13285fdc4257SSteve Yin {
13295fdc4257SSteve Yin 
13305fdc4257SSteve Yin 	this->m_dChildID = dChildID;
13315fdc4257SSteve Yin 	return S_OK;
13325fdc4257SSteve Yin }
13335fdc4257SSteve Yin 
13345fdc4257SSteve Yin /**
13355fdc4257SSteve Yin * Set AccObjectManagerAgent object pointer to COM
13365fdc4257SSteve Yin * @param	pAgent, the AccObjectManagerAgent point.
13375fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
13385fdc4257SSteve Yin */
13395fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccAgent(long pAgent)
13405fdc4257SSteve Yin {
13415fdc4257SSteve Yin 	g_pAgent = (AccObjectManagerAgent*)pAgent;
13425fdc4257SSteve Yin 	return S_OK;
13435fdc4257SSteve Yin }
13445fdc4257SSteve Yin 
13455fdc4257SSteve Yin /**
13465fdc4257SSteve Yin * When a UNO control disposing, it disposes its listeners,
13475fdc4257SSteve Yin * then notify AccObject in bridge management, then notify
13485fdc4257SSteve Yin * COM that the XAccessible is invalid,so set pUNOInterface as NULL
13495fdc4257SSteve Yin * @param	isDestroy, true is it need to be destroyed.
13505fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
13515fdc4257SSteve Yin */
13525fdc4257SSteve Yin STDMETHODIMP CMAccessible::NotifyDestroy(BOOL isDestroy)
13535fdc4257SSteve Yin {
13545fdc4257SSteve Yin 
13555fdc4257SSteve Yin 	m_isDestroy = isDestroy;
13565fdc4257SSteve Yin 	pUNOInterface = NULL;
13575fdc4257SSteve Yin 	return S_OK;
13585fdc4257SSteve Yin }
13595fdc4257SSteve Yin 
13605fdc4257SSteve Yin /**
13615fdc4257SSteve Yin *private methods that help implement public functions
13625fdc4257SSteve Yin */
13635fdc4257SSteve Yin 
13645fdc4257SSteve Yin /**
13655fdc4257SSteve Yin * Return child interface pointer by child ID,note: need to call AddRef()
13665fdc4257SSteve Yin * @param	lChildID, specify child index,which AT(such as Inspect32) gives.
13675fdc4257SSteve Yin * @return  IMAccessible*, pointer to the corresponding child object.
13685fdc4257SSteve Yin */
13695fdc4257SSteve Yin IMAccessible* CMAccessible::GetChildInterface(long dChildID)//for test
13705fdc4257SSteve Yin {
13715fdc4257SSteve Yin 
13725fdc4257SSteve Yin 	long dChildIndex = 0;
13735fdc4257SSteve Yin 	if(dChildID<0)
13745fdc4257SSteve Yin 	{
13755fdc4257SSteve Yin 		if(g_pAgent)
13765fdc4257SSteve Yin 		{
13775fdc4257SSteve Yin 			IMAccessible* pIMAcc = NULL;
13785fdc4257SSteve Yin 			g_pAgent->GetIAccessibleFromResID(dChildID,&pIMAcc);
13795fdc4257SSteve Yin 			return pIMAcc;
13805fdc4257SSteve Yin 		}
13815fdc4257SSteve Yin 		return NULL;
13825fdc4257SSteve Yin 	}
13835fdc4257SSteve Yin 	else
13845fdc4257SSteve Yin 	{
13855fdc4257SSteve Yin 		Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext();
13865fdc4257SSteve Yin 		if( !pRContext.is() )
13875fdc4257SSteve Yin 			return NULL;
13885fdc4257SSteve Yin 
13895fdc4257SSteve Yin 		if(dChildID<1 || dChildID>pRContext->getAccessibleChildCount())
13905fdc4257SSteve Yin 			return NULL;
13915fdc4257SSteve Yin 
13925fdc4257SSteve Yin 		IAccessible* pChild = NULL;
13935fdc4257SSteve Yin 		Reference< XAccessible > pXChild = pRContext->getAccessibleChild(dChildID-1);
13945fdc4257SSteve Yin 		BOOL isGet = get_IAccessibleFromXAccessible((long)pXChild.get(),&pChild);
13955fdc4257SSteve Yin 
13965fdc4257SSteve Yin 		if(!isGet)
13975fdc4257SSteve Yin 		{
13985fdc4257SSteve Yin 			g_pAgent->InsertAccObj(pXChild.get(),pUNOInterface,(long)m_hwnd);
13995fdc4257SSteve Yin 			isGet = get_IAccessibleFromXAccessible((long)pXChild.get(),&pChild);
14005fdc4257SSteve Yin 		}
14015fdc4257SSteve Yin 
14025fdc4257SSteve Yin 		if(isGet)
14035fdc4257SSteve Yin 		{
14045fdc4257SSteve Yin 			IMAccessible* pIMAcc =  (IMAccessible*)pChild;
14055fdc4257SSteve Yin 			return pIMAcc;
14065fdc4257SSteve Yin 		}
14075fdc4257SSteve Yin 	}
14085fdc4257SSteve Yin 
14095fdc4257SSteve Yin 	return NULL;
14105fdc4257SSteve Yin }
14115fdc4257SSteve Yin 
14125fdc4257SSteve Yin /**
14135fdc4257SSteve Yin * For List, tree and table,these roles belong to manage_decendant in UNO,
14145fdc4257SSteve Yin * need to process specifically when navigate
14155fdc4257SSteve Yin * @return  BOOL, if it is decendantmanager, return true.
14165fdc4257SSteve Yin */
14175fdc4257SSteve Yin BOOL CMAccessible::IsDecendantManage()
14185fdc4257SSteve Yin {
14195fdc4257SSteve Yin 
14205fdc4257SSteve Yin 	return (m_iRole==ROLE_SYSTEM_LIST)||(m_iRole==ROLE_SYSTEM_OUTLINE)||(m_iRole==ROLE_SYSTEM_TABLE);
14215fdc4257SSteve Yin }
14225fdc4257SSteve Yin 
14235fdc4257SSteve Yin /**
14245fdc4257SSteve Yin * for decendantmanager circumstance,provide child interface when navigate
14255fdc4257SSteve Yin * @param	varCur, the current child.
14265fdc4257SSteve Yin * @param	flags, the navigation direction.
14275fdc4257SSteve Yin * @return  IMAccessible*, the child of the end up node.
14285fdc4257SSteve Yin */
14295fdc4257SSteve Yin IMAccessible* CMAccessible::GetNavigateChildForDM(VARIANT varCur, short flags)
14305fdc4257SSteve Yin {
14315fdc4257SSteve Yin 
14325fdc4257SSteve Yin 	XAccessibleContext* pXContext = GetContextByXAcc(pUNOInterface);
14335fdc4257SSteve Yin 	if(pXContext==NULL)
14345fdc4257SSteve Yin 	{
14355fdc4257SSteve Yin 		return NULL;
14365fdc4257SSteve Yin 	}
14375fdc4257SSteve Yin 
14385fdc4257SSteve Yin 	int count = pXContext->getAccessibleChildCount();
14395fdc4257SSteve Yin 	if(count<1)
14405fdc4257SSteve Yin 	{
14415fdc4257SSteve Yin 		return NULL;
14425fdc4257SSteve Yin 	}
14435fdc4257SSteve Yin 
14445fdc4257SSteve Yin 	IMAccessible* pCurChild = NULL;
14455fdc4257SSteve Yin 	XAccessible* pChildXAcc = NULL;
14465fdc4257SSteve Yin 	Reference<XAccessible> pRChildXAcc;
14475fdc4257SSteve Yin 	XAccessibleContext* pChildContext = NULL;
14485fdc4257SSteve Yin 	int index = 0,delta=0;
14495fdc4257SSteve Yin 	switch(flags)
14505fdc4257SSteve Yin 	{
14515fdc4257SSteve Yin 	case DM_FIRSTCHILD:
14525fdc4257SSteve Yin 		pRChildXAcc = pXContext->getAccessibleChild(0);
14535fdc4257SSteve Yin 		break;
14545fdc4257SSteve Yin 	case DM_LASTCHILD:
14555fdc4257SSteve Yin 		pRChildXAcc = pXContext->getAccessibleChild(count-1);
14565fdc4257SSteve Yin 		break;
14575fdc4257SSteve Yin 	case DM_NEXTCHILD:
14585fdc4257SSteve Yin 	case DM_PREVCHILD:
14595fdc4257SSteve Yin 		pCurChild = GetChildInterface(varCur.lVal);
14605fdc4257SSteve Yin 		if(pCurChild==NULL)
14615fdc4257SSteve Yin 		{
14625fdc4257SSteve Yin 			return NULL;
14635fdc4257SSteve Yin 		}
14645fdc4257SSteve Yin 		pCurChild->GetUNOInterface((long*)&pChildXAcc);
14655fdc4257SSteve Yin 		if(pChildXAcc==NULL)
14665fdc4257SSteve Yin 		{
14675fdc4257SSteve Yin 			return NULL;
14685fdc4257SSteve Yin 		}
14695fdc4257SSteve Yin 		pChildContext = GetContextByXAcc(pChildXAcc);
14705fdc4257SSteve Yin 		if(pChildContext == NULL)
14715fdc4257SSteve Yin 		{
14725fdc4257SSteve Yin 			return NULL;
14735fdc4257SSteve Yin 		}
14745fdc4257SSteve Yin 		delta = (flags==DM_NEXTCHILD)?1:-1;
14755fdc4257SSteve Yin 		//currently, getAccessibleIndexInParent is error in UNO for
14765fdc4257SSteve Yin 		//some kind of List,such as ValueSet, the index will be less 1 than
14775fdc4257SSteve Yin 		//what should be, need to fix UNO code
14785fdc4257SSteve Yin 		index = pChildContext->getAccessibleIndexInParent()+delta;
14795fdc4257SSteve Yin 		if((index>=0)&&(index<=count-1))
14805fdc4257SSteve Yin 		{
14815fdc4257SSteve Yin 			pRChildXAcc = pXContext->getAccessibleChild(index);
14825fdc4257SSteve Yin 		}
14835fdc4257SSteve Yin 		break;
14845fdc4257SSteve Yin 	default:
14855fdc4257SSteve Yin 		break;
14865fdc4257SSteve Yin 	}
14875fdc4257SSteve Yin 
14885fdc4257SSteve Yin 	if(!pRChildXAcc.is())
14895fdc4257SSteve Yin 	{
14905fdc4257SSteve Yin 		return NULL;
14915fdc4257SSteve Yin 	}
14925fdc4257SSteve Yin 	pChildXAcc = pRChildXAcc.get();
14935fdc4257SSteve Yin 	g_pAgent->InsertAccObj(pChildXAcc,pUNOInterface);
14945fdc4257SSteve Yin 	return g_pAgent->GetIMAccByXAcc(pChildXAcc);
14955fdc4257SSteve Yin }
14965fdc4257SSteve Yin 
14975fdc4257SSteve Yin /**
14985fdc4257SSteve Yin *the following 4 private methods are for accNavigate implementation
14995fdc4257SSteve Yin */
15005fdc4257SSteve Yin 
15015fdc4257SSteve Yin /**
15025fdc4257SSteve Yin * Return first child for parent container, process differently according
15035fdc4257SSteve Yin * to whether it is decendant manage
15045fdc4257SSteve Yin * @param	varStart, the start child id of this navigation action.
15055fdc4257SSteve Yin * @param	pvarEndUpAt, [in,out] the end up child of this navigation action.
15065fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
15075fdc4257SSteve Yin */
15085fdc4257SSteve Yin HRESULT CMAccessible::GetFirstChild(VARIANT varStart,VARIANT* pvarEndUpAt)
15095fdc4257SSteve Yin {
15105fdc4257SSteve Yin 
15115fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
15125fdc4257SSteve Yin 		ISDESTROY()
15135fdc4257SSteve Yin 		// #CHECK#
15145fdc4257SSteve Yin 		if(pvarEndUpAt == NULL)
15155fdc4257SSteve Yin 		{
15165fdc4257SSteve Yin 			return E_INVALIDARG;
15175fdc4257SSteve Yin 		}
15185fdc4257SSteve Yin 		if(varStart.vt != VT_I4)
15195fdc4257SSteve Yin 		{
15205fdc4257SSteve Yin 			pvarEndUpAt->vt = VT_EMPTY;
15215fdc4257SSteve Yin 			return E_INVALIDARG;
15225fdc4257SSteve Yin 		}
15235fdc4257SSteve Yin 
15245fdc4257SSteve Yin 		pvarEndUpAt->pdispVal = GetNavigateChildForDM(varStart, DM_FIRSTCHILD);
15255fdc4257SSteve Yin 		if(pvarEndUpAt->pdispVal)
15265fdc4257SSteve Yin 		{
15275fdc4257SSteve Yin 			pvarEndUpAt->pdispVal->AddRef();
15285fdc4257SSteve Yin 			pvarEndUpAt->vt = VT_DISPATCH;
15295fdc4257SSteve Yin 			return S_OK;
15305fdc4257SSteve Yin 		}
15315fdc4257SSteve Yin 
15325fdc4257SSteve Yin 		pvarEndUpAt->vt = VT_EMPTY;
15335fdc4257SSteve Yin 		return E_FAIL;
15345fdc4257SSteve Yin 
15355fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
15365fdc4257SSteve Yin }
15375fdc4257SSteve Yin 
15385fdc4257SSteve Yin /**
15395fdc4257SSteve Yin * Return last child for parent container, process differently according
15405fdc4257SSteve Yin * to whether it is decendant manage
15415fdc4257SSteve Yin * @param	varStart, the start child id of this navigation action.
15425fdc4257SSteve Yin * @param	pvarEndUpAt, [in,out] the end up child of this navigation action.
15435fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
15445fdc4257SSteve Yin */
15455fdc4257SSteve Yin HRESULT CMAccessible::GetLastChild(VARIANT varStart,VARIANT* pvarEndUpAt)
15465fdc4257SSteve Yin {
15475fdc4257SSteve Yin 
15485fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
15495fdc4257SSteve Yin 		ISDESTROY()
15505fdc4257SSteve Yin 		// #CHECK#
15515fdc4257SSteve Yin 		if(pvarEndUpAt == NULL)
15525fdc4257SSteve Yin 		{
15535fdc4257SSteve Yin 			return E_INVALIDARG;
15545fdc4257SSteve Yin 		}
15555fdc4257SSteve Yin 		if(varStart.vt != VT_I4)
15565fdc4257SSteve Yin 		{
15575fdc4257SSteve Yin 			pvarEndUpAt->vt = VT_EMPTY;
15585fdc4257SSteve Yin 			return E_INVALIDARG;
15595fdc4257SSteve Yin 		}
15605fdc4257SSteve Yin 
15615fdc4257SSteve Yin 		pvarEndUpAt->pdispVal = GetNavigateChildForDM(varStart, DM_LASTCHILD);
15625fdc4257SSteve Yin 		if(pvarEndUpAt->pdispVal)
15635fdc4257SSteve Yin 		{
15645fdc4257SSteve Yin 			pvarEndUpAt->pdispVal->AddRef();
15655fdc4257SSteve Yin 			pvarEndUpAt->vt = VT_DISPATCH;
15665fdc4257SSteve Yin 			return S_OK;
15675fdc4257SSteve Yin 		}
15685fdc4257SSteve Yin 		pvarEndUpAt->vt = VT_EMPTY;
15695fdc4257SSteve Yin 		return E_FAIL;
15705fdc4257SSteve Yin 
15715fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
15725fdc4257SSteve Yin }
15735fdc4257SSteve Yin 
15745fdc4257SSteve Yin /**
15755fdc4257SSteve Yin * The method GetNextSibling is general, whatever it is decendant manage or not
15765fdc4257SSteve Yin * Get the next sibling object.
15775fdc4257SSteve Yin * @param	varStart, the start child id of this navigation action.
15785fdc4257SSteve Yin * @param	pvarEndUpAt, [in,out] the end up child of this navigation action.
15795fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
15805fdc4257SSteve Yin */
15815fdc4257SSteve Yin HRESULT CMAccessible::GetNextSibling(VARIANT varStart,VARIANT* pvarEndUpAt)
15825fdc4257SSteve Yin {
15835fdc4257SSteve Yin 
15845fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
15855fdc4257SSteve Yin 		ISDESTROY()
15865fdc4257SSteve Yin 		if(varStart.vt != VT_I4)
15875fdc4257SSteve Yin 		{
15885fdc4257SSteve Yin 			pvarEndUpAt->vt = VT_EMPTY;
15895fdc4257SSteve Yin 			return E_INVALIDARG;
15905fdc4257SSteve Yin 		}
15915fdc4257SSteve Yin 
15925fdc4257SSteve Yin 		Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface);
15935fdc4257SSteve Yin 		if(pRContext.is())
15945fdc4257SSteve Yin 		{
15955fdc4257SSteve Yin 			varStart.iVal = sal_Int16(pRContext->getAccessibleIndexInParent() + 2);
15965fdc4257SSteve Yin 			if(m_pIParent)
15975fdc4257SSteve Yin 				if( m_pIParent->get_accChild(varStart,&pvarEndUpAt->pdispVal) == S_OK)
15985fdc4257SSteve Yin 				{
15995fdc4257SSteve Yin 					pvarEndUpAt->vt = VT_DISPATCH;
16005fdc4257SSteve Yin 					return S_OK;
16015fdc4257SSteve Yin 				}
16025fdc4257SSteve Yin 		}
16035fdc4257SSteve Yin 		pvarEndUpAt->vt = VT_EMPTY;
16045fdc4257SSteve Yin 		return E_FAIL;
16055fdc4257SSteve Yin 
16065fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
16075fdc4257SSteve Yin }
16085fdc4257SSteve Yin 
16095fdc4257SSteve Yin /**
16105fdc4257SSteve Yin *the method GetPreSibling is general, whatever it is decendant manage or not
16115fdc4257SSteve Yin * @param	varStart, the start child id of this navigation action.
16125fdc4257SSteve Yin * @param	pvarEndUpAt, [in,out] the end up child of this navigation action.
16135fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
16145fdc4257SSteve Yin */
16155fdc4257SSteve Yin HRESULT CMAccessible::GetPreSibling(VARIANT varStart,VARIANT* pvarEndUpAt)
16165fdc4257SSteve Yin {
16175fdc4257SSteve Yin 
16185fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
16195fdc4257SSteve Yin 		ISDESTROY()
16205fdc4257SSteve Yin 		// #CHECK#
16215fdc4257SSteve Yin 		if(pvarEndUpAt == NULL)
16225fdc4257SSteve Yin 		{
16235fdc4257SSteve Yin 			return E_INVALIDARG;
16245fdc4257SSteve Yin 		}
16255fdc4257SSteve Yin 		if(varStart.vt != VT_I4)
16265fdc4257SSteve Yin 		{
16275fdc4257SSteve Yin 			pvarEndUpAt->vt = VT_EMPTY;
16285fdc4257SSteve Yin 			return E_INVALIDARG;
16295fdc4257SSteve Yin 		}
16305fdc4257SSteve Yin 
16315fdc4257SSteve Yin 		Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface);
16325fdc4257SSteve Yin 		if(pRContext.is())
16335fdc4257SSteve Yin 		{
16345fdc4257SSteve Yin 			varStart.iVal = sal_Int16(pRContext->getAccessibleIndexInParent());
16355fdc4257SSteve Yin 			if(m_pIParent && varStart.iVal > 0)
16365fdc4257SSteve Yin 				if( m_pIParent->get_accChild(varStart,&pvarEndUpAt->pdispVal) == S_OK)
16375fdc4257SSteve Yin 				{
16385fdc4257SSteve Yin 					pvarEndUpAt->vt = VT_DISPATCH;
16395fdc4257SSteve Yin 					return S_OK;
16405fdc4257SSteve Yin 				}
16415fdc4257SSteve Yin 		}
16425fdc4257SSteve Yin 		pvarEndUpAt->vt = VT_EMPTY;
16435fdc4257SSteve Yin 		return E_FAIL;
16445fdc4257SSteve Yin 
16455fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
16465fdc4257SSteve Yin }
16475fdc4257SSteve Yin 
16485fdc4257SSteve Yin /**
16495fdc4257SSteve Yin * For IAccessible2 implementation methods
16505fdc4257SSteve Yin */
16515fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_nRelations( long __RPC_FAR *nRelations)
16525fdc4257SSteve Yin {
16535fdc4257SSteve Yin 
16545fdc4257SSteve Yin 	CHECK_ENABLE_INF
16555fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
16565fdc4257SSteve Yin 
16575fdc4257SSteve Yin 		// #CHECK#
16585fdc4257SSteve Yin 		if(nRelations == NULL)
16595fdc4257SSteve Yin 		{
16605fdc4257SSteve Yin 			return E_INVALIDARG;
16615fdc4257SSteve Yin 		}
16625fdc4257SSteve Yin 
16635fdc4257SSteve Yin 		*nRelations = 0;
16645fdc4257SSteve Yin 
16655fdc4257SSteve Yin 		if( !pRContext.is() )
16665fdc4257SSteve Yin 			return E_FAIL;
16675fdc4257SSteve Yin 		Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet();
16685fdc4257SSteve Yin 		if(!pRrelationSet.is())
16695fdc4257SSteve Yin 		{
16705fdc4257SSteve Yin 			*nRelations = 0;
16715fdc4257SSteve Yin 			return S_OK;
16725fdc4257SSteve Yin 		}
16735fdc4257SSteve Yin 
16745fdc4257SSteve Yin 		*nRelations = pRrelationSet->getRelationCount();
16755fdc4257SSteve Yin 		return S_OK;
16765fdc4257SSteve Yin 
16775fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
16785fdc4257SSteve Yin }
16795fdc4257SSteve Yin 
16805fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_relation( long relationIndex, IAccessibleRelation __RPC_FAR *__RPC_FAR *relation)
16815fdc4257SSteve Yin {
16825fdc4257SSteve Yin 
16835fdc4257SSteve Yin 	CHECK_ENABLE_INF
16845fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
16855fdc4257SSteve Yin 		ISDESTROY()
16865fdc4257SSteve Yin 		// #CHECK#
16875fdc4257SSteve Yin 		if(relation == NULL)
16885fdc4257SSteve Yin 		{
16895fdc4257SSteve Yin 			return E_INVALIDARG;
16905fdc4257SSteve Yin 		}
16915fdc4257SSteve Yin 
16925fdc4257SSteve Yin 		if( !pRContext.is() )
16935fdc4257SSteve Yin 			return E_FAIL;
16945fdc4257SSteve Yin 
16955fdc4257SSteve Yin 
16965fdc4257SSteve Yin 		long nMax = 0;
16975fdc4257SSteve Yin 		long nReal = 0;
16985fdc4257SSteve Yin 		get_nRelations(&nMax);
16995fdc4257SSteve Yin 
17005fdc4257SSteve Yin 		*relation = (IAccessibleRelation*)::CoTaskMemAlloc(sizeof(IAccessibleRelation));
17015fdc4257SSteve Yin 
17025fdc4257SSteve Yin 		// #CHECK Memory Allocation#
17035fdc4257SSteve Yin 		if(*relation == NULL)
17045fdc4257SSteve Yin 		{
17055fdc4257SSteve Yin 			return E_FAIL;
17065fdc4257SSteve Yin 		}
17075fdc4257SSteve Yin 
17085fdc4257SSteve Yin 		if( relationIndex < nMax )
17095fdc4257SSteve Yin 		{
17105fdc4257SSteve Yin 
17115fdc4257SSteve Yin 
17125fdc4257SSteve Yin 			Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet();
17135fdc4257SSteve Yin 			if(!pRrelationSet.is())
17145fdc4257SSteve Yin 			{
17155fdc4257SSteve Yin 
17165fdc4257SSteve Yin 				return E_FAIL;
17175fdc4257SSteve Yin 			}
17185fdc4257SSteve Yin 
17195fdc4257SSteve Yin 			IAccessibleRelation* pRelation = NULL;
1720b0a7a3cfSSteve Yin 			ActivateActContext();
17215fdc4257SSteve Yin 			HRESULT hr = CoCreateInstance( CLSID_AccRelation, NULL, CLSCTX_SERVER ,
17225fdc4257SSteve Yin 				IID_IAccessibleRelation,
17235fdc4257SSteve Yin 				(void **)&pRelation);
1724b0a7a3cfSSteve Yin 			DeactivateActContext();
17255fdc4257SSteve Yin 			if(SUCCEEDED(hr))
17265fdc4257SSteve Yin 			{
17275fdc4257SSteve Yin 				IUNOXWrapper* wrapper = NULL;
17285fdc4257SSteve Yin 				hr = pRelation->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper);
17295fdc4257SSteve Yin 				if(SUCCEEDED(hr))
17305fdc4257SSteve Yin 				{
17315fdc4257SSteve Yin 					AccessibleRelation accRelation = pRrelationSet->getRelation(relationIndex);
17325fdc4257SSteve Yin 					wrapper->put_XSubInterface((long)&accRelation);
17335fdc4257SSteve Yin 					wrapper->Release();
17345fdc4257SSteve Yin 					*relation = pRelation;
17355fdc4257SSteve Yin 					return S_OK;
17365fdc4257SSteve Yin 				}
17375fdc4257SSteve Yin 
17385fdc4257SSteve Yin 			}
17395fdc4257SSteve Yin 		}
17405fdc4257SSteve Yin 
17415fdc4257SSteve Yin 		return E_FAIL;
17425fdc4257SSteve Yin 
17435fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
17445fdc4257SSteve Yin }
17455fdc4257SSteve Yin 
17465fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_relations( long, IAccessibleRelation __RPC_FAR *__RPC_FAR *relation, long __RPC_FAR *nRelations)
17475fdc4257SSteve Yin {
17485fdc4257SSteve Yin 
17495fdc4257SSteve Yin 	CHECK_ENABLE_INF
17505fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
17515fdc4257SSteve Yin 
17525fdc4257SSteve Yin 		// #CHECK#
17535fdc4257SSteve Yin 		if(relation == NULL || nRelations == NULL)
17545fdc4257SSteve Yin 		{
17555fdc4257SSteve Yin 			return E_INVALIDARG;
17565fdc4257SSteve Yin 		}
17575fdc4257SSteve Yin 		// #CHECK XInterface#
17585fdc4257SSteve Yin 
17595fdc4257SSteve Yin 		if( !pRContext.is() )
17605fdc4257SSteve Yin 			return E_FAIL;
17615fdc4257SSteve Yin 
17625fdc4257SSteve Yin 		Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet();
17635fdc4257SSteve Yin 		if(!pRrelationSet.is())
17645fdc4257SSteve Yin 		{
17655fdc4257SSteve Yin 			*nRelations = 0;
17665fdc4257SSteve Yin 			return S_OK;
17675fdc4257SSteve Yin 		}
17685fdc4257SSteve Yin 
17695fdc4257SSteve Yin 		long nCount = pRrelationSet->getRelationCount();
17705fdc4257SSteve Yin 
17715fdc4257SSteve Yin 		*relation = (IAccessibleRelation*)::CoTaskMemAlloc(nCount*sizeof(IAccessibleRelation));
17725fdc4257SSteve Yin 
17735fdc4257SSteve Yin 		// #CHECK Memory Allocation#
17745fdc4257SSteve Yin 		if(*relation == NULL)
17755fdc4257SSteve Yin 		{
17765fdc4257SSteve Yin 			return E_FAIL;
17775fdc4257SSteve Yin 		}
17785fdc4257SSteve Yin 
17795fdc4257SSteve Yin 		for(int i=0; i<nCount ; i++)
17805fdc4257SSteve Yin 		{
17815fdc4257SSteve Yin 			IAccessibleRelation* pRelation = NULL;
1782b0a7a3cfSSteve Yin 			ActivateActContext();
17835fdc4257SSteve Yin 			HRESULT hr = CoCreateInstance( CLSID_AccRelation, NULL, CLSCTX_SERVER ,
17845fdc4257SSteve Yin 				IID_IAccessibleRelation,
17855fdc4257SSteve Yin 				(void **)&pRelation);
1786b0a7a3cfSSteve Yin 			DeactivateActContext();
17875fdc4257SSteve Yin 			if(SUCCEEDED(hr))
17885fdc4257SSteve Yin 			{
17895fdc4257SSteve Yin 				IUNOXWrapper* wrapper = NULL;
17905fdc4257SSteve Yin 				hr = pRelation->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper);
17915fdc4257SSteve Yin 				if(SUCCEEDED(hr))
17925fdc4257SSteve Yin 				{
17935fdc4257SSteve Yin 					AccessibleRelation accRelation = pRrelationSet->getRelation(i);
17945fdc4257SSteve Yin 					wrapper->put_XSubInterface((long)&accRelation);
17955fdc4257SSteve Yin 					wrapper->Release();
17965fdc4257SSteve Yin 				}
17975fdc4257SSteve Yin 				(relation)[i] = pRelation;
17985fdc4257SSteve Yin 			}
17995fdc4257SSteve Yin 		}
18005fdc4257SSteve Yin 
18015fdc4257SSteve Yin 		*nRelations = nCount;
18025fdc4257SSteve Yin 		return S_OK;
18035fdc4257SSteve Yin 
18045fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
18055fdc4257SSteve Yin }
18065fdc4257SSteve Yin 
18075fdc4257SSteve Yin STDMETHODIMP CMAccessible::role(long __RPC_FAR *role)
18085fdc4257SSteve Yin {
18095fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
18105fdc4257SSteve Yin 
18115fdc4257SSteve Yin 		(*role) = m_iRole;
18125fdc4257SSteve Yin 
18135fdc4257SSteve Yin 	return S_OK;
18145fdc4257SSteve Yin 
18155fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
18165fdc4257SSteve Yin }
18175fdc4257SSteve Yin 
18185fdc4257SSteve Yin 
18195fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_nActions(long __RPC_FAR *nActions)
18205fdc4257SSteve Yin {
18215fdc4257SSteve Yin 
18225fdc4257SSteve Yin 	try
18235fdc4257SSteve Yin 	{
18245fdc4257SSteve Yin 		ISDESTROY()
18255fdc4257SSteve Yin 			// #CHECK#
18265fdc4257SSteve Yin 			if(nActions == NULL)
18275fdc4257SSteve Yin 			{
18285fdc4257SSteve Yin 				return E_INVALIDARG;
18295fdc4257SSteve Yin 			}
18305fdc4257SSteve Yin 			*nActions = 0L;
18315fdc4257SSteve Yin 			IAccessibleAction* pAcc = NULL;
18325fdc4257SSteve Yin 			HRESULT hr = QueryInterface(IID_IAccessibleAction, (void**)&pAcc);
18335fdc4257SSteve Yin 			if( hr == S_OK )
18345fdc4257SSteve Yin 			{
18355fdc4257SSteve Yin 				pAcc->nActions(nActions);
18365fdc4257SSteve Yin 				pAcc->Release();
18375fdc4257SSteve Yin 			}
18385fdc4257SSteve Yin 
18395fdc4257SSteve Yin 			return S_OK;
18405fdc4257SSteve Yin 	}
18415fdc4257SSteve Yin 	catch(...)
18425fdc4257SSteve Yin 	{
18435fdc4257SSteve Yin 		*nActions = 0L;
18445fdc4257SSteve Yin 		return S_OK;
18455fdc4257SSteve Yin 	}
18465fdc4257SSteve Yin }
18475fdc4257SSteve Yin 
18485fdc4257SSteve Yin 
18495fdc4257SSteve Yin STDMETHODIMP CMAccessible:: scrollToPoint(enum IA2CoordinateType, long, long)
18505fdc4257SSteve Yin {
18515fdc4257SSteve Yin 
18525fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
18535fdc4257SSteve Yin 	ISDESTROY()
18545fdc4257SSteve Yin 	return E_NOTIMPL;
18555fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
18565fdc4257SSteve Yin 
18575fdc4257SSteve Yin }
18585fdc4257SSteve Yin STDMETHODIMP CMAccessible:: scrollTo(enum IA2ScrollType)
18595fdc4257SSteve Yin {
18605fdc4257SSteve Yin 
18615fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
18625fdc4257SSteve Yin 	ISDESTROY()
18635fdc4257SSteve Yin 
18645fdc4257SSteve Yin 	return E_NOTIMPL;
18655fdc4257SSteve Yin 
18665fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
18675fdc4257SSteve Yin }
18685fdc4257SSteve Yin 
18695fdc4257SSteve Yin static XAccessible* getTheParentOfMember(XAccessible* pXAcc)
18705fdc4257SSteve Yin {
18715fdc4257SSteve Yin 	// #CHECK#
18725fdc4257SSteve Yin 	if(pXAcc == NULL)
18735fdc4257SSteve Yin 	{
18745fdc4257SSteve Yin 		return NULL;
18755fdc4257SSteve Yin 	}
18765fdc4257SSteve Yin 	Reference<XAccessibleContext> pRContext = pXAcc->getAccessibleContext();
18775fdc4257SSteve Yin 	Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet();
18785fdc4257SSteve Yin 	long nRelations = pRrelationSet->getRelationCount();
18795fdc4257SSteve Yin 	for(int i=0 ; i<nRelations ; i++)
18805fdc4257SSteve Yin 	{
18815fdc4257SSteve Yin 		AccessibleRelation accRelation = pRrelationSet->getRelation(i);
18825fdc4257SSteve Yin 		if(accRelation.RelationType == 7)
18835fdc4257SSteve Yin 		{
18845fdc4257SSteve Yin 			Sequence< Reference< XInterface > > xTargets = accRelation.TargetSet;
18855fdc4257SSteve Yin 			return (XAccessible*)xTargets[0].get();
18865fdc4257SSteve Yin 		}
18875fdc4257SSteve Yin 	}
18885fdc4257SSteve Yin 	return NULL;
18895fdc4257SSteve Yin }
18905fdc4257SSteve Yin 
18915fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_groupPosition(long __RPC_FAR *groupLevel,long __RPC_FAR *similarItemsInGroup,long __RPC_FAR *positionInGroup)
18925fdc4257SSteve Yin {
18935fdc4257SSteve Yin 
18945fdc4257SSteve Yin 	CHECK_ENABLE_INF
18955fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
18965fdc4257SSteve Yin 		ISDESTROY()
18975fdc4257SSteve Yin 		// #CHECK#
18985fdc4257SSteve Yin 		if(groupLevel == NULL || similarItemsInGroup == NULL || positionInGroup == NULL)
18995fdc4257SSteve Yin 		{
19005fdc4257SSteve Yin 			return E_INVALIDARG;
19015fdc4257SSteve Yin 		}
19025fdc4257SSteve Yin 
19035fdc4257SSteve Yin 		Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
19045fdc4257SSteve Yin 		if(!pRContext.is())
19055fdc4257SSteve Yin 			return E_FAIL;
19065fdc4257SSteve Yin 		long Role = pRContext->getAccessibleRole();
19075fdc4257SSteve Yin 
19085fdc4257SSteve Yin 		*groupLevel = 0;
19095fdc4257SSteve Yin 		*similarItemsInGroup = 0;
19105fdc4257SSteve Yin 		*positionInGroup = 0;
19115fdc4257SSteve Yin 
19125fdc4257SSteve Yin 		if (Role != AccessibleRole::DOCUMENT)
19135fdc4257SSteve Yin 		{
19145fdc4257SSteve Yin 			Reference< XAccessibleGroupPosition > xGroupPosition( pRContext, UNO_QUERY );
19155fdc4257SSteve Yin 			if ( xGroupPosition.is() )
19165fdc4257SSteve Yin 			{
19175fdc4257SSteve Yin 				Sequence< sal_Int32 > rSeq = xGroupPosition->getGroupPosition( makeAny( pRContext ) );
19185fdc4257SSteve Yin 				sal_Int32* pSeq = rSeq.getArray();
19195fdc4257SSteve Yin 				if ( pSeq )
19205fdc4257SSteve Yin 				{
19215fdc4257SSteve Yin 					*groupLevel = pSeq[0];
19225fdc4257SSteve Yin 					*similarItemsInGroup = pSeq[1];
19235fdc4257SSteve Yin 					*positionInGroup = pSeq[2];
19245fdc4257SSteve Yin 					return S_OK;
19255fdc4257SSteve Yin 				}
19265fdc4257SSteve Yin 				return S_OK;
19275fdc4257SSteve Yin 			}
19285fdc4257SSteve Yin 		}
19295fdc4257SSteve Yin 
19305fdc4257SSteve Yin 		Reference< XAccessible> pParentAcc = pRContext->getAccessibleParent();
19315fdc4257SSteve Yin 		if( !pParentAcc.is() )
19325fdc4257SSteve Yin 		{
19335fdc4257SSteve Yin 			return S_OK;
19345fdc4257SSteve Yin 		}
19355fdc4257SSteve Yin 
19365fdc4257SSteve Yin 		Reference<XAccessibleContext> pRParentContext = pParentAcc->getAccessibleContext();
19375fdc4257SSteve Yin 
19385fdc4257SSteve Yin 		int level = 0;
19395fdc4257SSteve Yin 		int index = 0;
19405fdc4257SSteve Yin 		int number = 0;
19415fdc4257SSteve Yin 
19425fdc4257SSteve Yin 		if( Role ==  RADIO_BUTTON )
19435fdc4257SSteve Yin 		{
19445fdc4257SSteve Yin 			Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet();
19455fdc4257SSteve Yin 			long nRel = pRrelationSet->getRelationCount();
19465fdc4257SSteve Yin 			for(int i=0 ; i<nRel ; i++)
19475fdc4257SSteve Yin 			{
19485fdc4257SSteve Yin 				AccessibleRelation accRelation = pRrelationSet->getRelation(i);
19495fdc4257SSteve Yin 				if(accRelation.RelationType == 7)
19505fdc4257SSteve Yin 				{
19515fdc4257SSteve Yin 					Sequence< Reference< XInterface > > xTargets = accRelation.TargetSet;
19525fdc4257SSteve Yin 					int nCount = xTargets.getLength();
19535fdc4257SSteve Yin 
19545fdc4257SSteve Yin 					Reference<XInterface> pRAcc = xTargets[0];
19555fdc4257SSteve Yin 					for(int j=0; j<pRParentContext->getAccessibleChildCount(); j++)
19565fdc4257SSteve Yin 					{
19575fdc4257SSteve Yin 						if( getTheParentOfMember(pRParentContext->getAccessibleChild(j).get())
19585fdc4257SSteve Yin 							== (XAccessible*)pRAcc.get() &&
19595fdc4257SSteve Yin 							pRParentContext->getAccessibleChild(j)->getAccessibleContext()->getAccessibleRole() == RADIO_BUTTON)
19605fdc4257SSteve Yin 							number++;
19615fdc4257SSteve Yin 						if(pRParentContext->getAccessibleChild(j).get() == pUNOInterface)
19625fdc4257SSteve Yin 							index = number;
19635fdc4257SSteve Yin 					}
19645fdc4257SSteve Yin 				}
19655fdc4257SSteve Yin 			}
19665fdc4257SSteve Yin 			*groupLevel = 1;
19675fdc4257SSteve Yin 			*similarItemsInGroup = number;
19685fdc4257SSteve Yin 			*positionInGroup = index;
19695fdc4257SSteve Yin 			return S_OK;
19705fdc4257SSteve Yin 		}
19715fdc4257SSteve Yin 
19725fdc4257SSteve Yin 		else if ( COMBO_BOX == Role )
19735fdc4257SSteve Yin 		{
19745fdc4257SSteve Yin 			*groupLevel = 1;
19755fdc4257SSteve Yin 			*similarItemsInGroup = 0;
19765fdc4257SSteve Yin 			*positionInGroup = -1;
19775fdc4257SSteve Yin 
19785fdc4257SSteve Yin 			long nCount = pRContext->getAccessibleChildCount();
19795fdc4257SSteve Yin 			if( 2 != nCount)
19805fdc4257SSteve Yin 			{
19815fdc4257SSteve Yin 				return S_OK;
19825fdc4257SSteve Yin 			}
19835fdc4257SSteve Yin 			Reference<XAccessible> xList=pRContext->getAccessibleChild(1);
19845fdc4257SSteve Yin 			if (!xList.is())
19855fdc4257SSteve Yin 			{
19865fdc4257SSteve Yin 				return S_OK;
19875fdc4257SSteve Yin 			}
19885fdc4257SSteve Yin 			Reference<XAccessibleContext> xListContext(xList,UNO_QUERY);
19895fdc4257SSteve Yin 			if (!xListContext.is())
19905fdc4257SSteve Yin 			{
19915fdc4257SSteve Yin 				return S_OK;
19925fdc4257SSteve Yin 			}
19935fdc4257SSteve Yin 			Reference<XAccessibleSelection> xListSel(xList,UNO_QUERY);
19945fdc4257SSteve Yin 			if (!xListSel.is())
19955fdc4257SSteve Yin 			{
19965fdc4257SSteve Yin 				return S_OK;
19975fdc4257SSteve Yin 			}
19985fdc4257SSteve Yin 			*similarItemsInGroup = xListContext->getAccessibleChildCount();
19995fdc4257SSteve Yin 			if (*similarItemsInGroup > 0 )
20005fdc4257SSteve Yin 			{
20015fdc4257SSteve Yin 				try
20025fdc4257SSteve Yin 				{
20035fdc4257SSteve Yin 					Reference<XAccessible> xChild = xListSel->getSelectedAccessibleChild(0);
20045fdc4257SSteve Yin 					if (xChild.is())
20055fdc4257SSteve Yin 					{
20065fdc4257SSteve Yin 						Reference<XAccessibleContext> xChildContext(xChild,UNO_QUERY);
20075fdc4257SSteve Yin 						if (xChildContext.is())
20085fdc4257SSteve Yin 						{
20095fdc4257SSteve Yin 							*positionInGroup=xChildContext->getAccessibleIndexInParent() + 1 ;
20105fdc4257SSteve Yin 							return S_OK;
20115fdc4257SSteve Yin 						}
20125fdc4257SSteve Yin 					}
20135fdc4257SSteve Yin 				}
20145fdc4257SSteve Yin 				catch(...)
20155fdc4257SSteve Yin 				{}
20165fdc4257SSteve Yin 			}
20175fdc4257SSteve Yin 			return S_OK;
20185fdc4257SSteve Yin 		}
20195fdc4257SSteve Yin 		else if ( PAGE_TAB == Role )
20205fdc4257SSteve Yin 		{
20215fdc4257SSteve Yin 			*groupLevel = 1;
20225fdc4257SSteve Yin 			*similarItemsInGroup = pRParentContext->getAccessibleChildCount();
20235fdc4257SSteve Yin 
20245fdc4257SSteve Yin 			if (*similarItemsInGroup > 0 )
20255fdc4257SSteve Yin 			{
20265fdc4257SSteve Yin 				*positionInGroup=pRContext->getAccessibleIndexInParent() + 1 ;
20275fdc4257SSteve Yin 			}
20285fdc4257SSteve Yin 			else
20295fdc4257SSteve Yin 			{
20305fdc4257SSteve Yin 				*positionInGroup = -1;
20315fdc4257SSteve Yin 			}
20325fdc4257SSteve Yin 			return S_OK;
20335fdc4257SSteve Yin 		}
20345fdc4257SSteve Yin 
20355fdc4257SSteve Yin 
20365fdc4257SSteve Yin 		BOOL isFound = FALSE;
20375fdc4257SSteve Yin 		while( pParentAcc.is() && !isFound)
20385fdc4257SSteve Yin 		{
20395fdc4257SSteve Yin 			level++;
20405fdc4257SSteve Yin 			pRParentContext = pParentAcc->getAccessibleContext();
20415fdc4257SSteve Yin 			Role = pRParentContext->getAccessibleRole();
20425fdc4257SSteve Yin 			if( (Role == TREE) || (Role == LIST) )
20435fdc4257SSteve Yin 				isFound = TRUE;
20445fdc4257SSteve Yin 			pParentAcc = pRParentContext->getAccessibleParent();
20455fdc4257SSteve Yin 		}
20465fdc4257SSteve Yin 
20475fdc4257SSteve Yin 		if( isFound )
20485fdc4257SSteve Yin 		{
20495fdc4257SSteve Yin 			Reference< XAccessible> pTempAcc = pRContext->getAccessibleParent();
20505fdc4257SSteve Yin 			pRParentContext = pTempAcc->getAccessibleContext();
20515fdc4257SSteve Yin 			*groupLevel = level;
20525fdc4257SSteve Yin 			*similarItemsInGroup = pRParentContext->getAccessibleChildCount();
20535fdc4257SSteve Yin 			*positionInGroup = pRContext->getAccessibleIndexInParent() + 1;
20545fdc4257SSteve Yin 		}
20555fdc4257SSteve Yin 		else
20565fdc4257SSteve Yin 		{
20575fdc4257SSteve Yin 			*groupLevel = 0;
20585fdc4257SSteve Yin 			*similarItemsInGroup = 0;
20595fdc4257SSteve Yin 			*positionInGroup = 0;
20605fdc4257SSteve Yin 		}
20615fdc4257SSteve Yin 		return S_OK;
20625fdc4257SSteve Yin 
20635fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
20645fdc4257SSteve Yin }
20655fdc4257SSteve Yin 
20665fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_extendedStates( long, BSTR __RPC_FAR *__RPC_FAR *, long __RPC_FAR *)
20675fdc4257SSteve Yin {
20685fdc4257SSteve Yin 
20695fdc4257SSteve Yin 	CHECK_ENABLE_INF
20705fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
20715fdc4257SSteve Yin 		ISDESTROY()
20725fdc4257SSteve Yin 
20735fdc4257SSteve Yin 		return E_NOTIMPL;
20745fdc4257SSteve Yin 
20755fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
20765fdc4257SSteve Yin }
20775fdc4257SSteve Yin 
20785fdc4257SSteve Yin 
20795fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_uniqueID(long __RPC_FAR *uniqueID)
20805fdc4257SSteve Yin {
20815fdc4257SSteve Yin 
20825fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
20835fdc4257SSteve Yin 		ISDESTROY()
20845fdc4257SSteve Yin 		// #CHECK#
20855fdc4257SSteve Yin 		if(uniqueID == NULL)
20865fdc4257SSteve Yin 		{
20875fdc4257SSteve Yin 			return E_INVALIDARG;
20885fdc4257SSteve Yin 		}
20895fdc4257SSteve Yin 		*uniqueID = m_dChildID;
20905fdc4257SSteve Yin 		return S_OK;
20915fdc4257SSteve Yin 
20925fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
20935fdc4257SSteve Yin }
20945fdc4257SSteve Yin 
20955fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_windowHandle(HWND __RPC_FAR *windowHandle)
20965fdc4257SSteve Yin {
20975fdc4257SSteve Yin 
20985fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
20995fdc4257SSteve Yin 		ISDESTROY()
21005fdc4257SSteve Yin 		// #CHECK#
21015fdc4257SSteve Yin 		if(windowHandle == NULL)
21025fdc4257SSteve Yin 		{
21035fdc4257SSteve Yin 			return E_INVALIDARG;
21045fdc4257SSteve Yin 		}
21055fdc4257SSteve Yin 
21065fdc4257SSteve Yin 		HWND nHwnd = m_hwnd;
21075fdc4257SSteve Yin 		IAccessible* pParent = m_pIParent;
21085fdc4257SSteve Yin 		CMAccessible* pChild = this;
21095fdc4257SSteve Yin 		while((nHwnd==0) && pParent)
21105fdc4257SSteve Yin 		{
21115fdc4257SSteve Yin 			pChild = (CMAccessible*)pParent;
21125fdc4257SSteve Yin 			if(pChild)
21135fdc4257SSteve Yin 			{
21145fdc4257SSteve Yin 				pParent = (IAccessible*)pChild->m_pIParent;
21155fdc4257SSteve Yin 				nHwnd = (HWND)pChild->m_hwnd;
21165fdc4257SSteve Yin 			}
21175fdc4257SSteve Yin 			else
21185fdc4257SSteve Yin 				pParent = NULL;
21195fdc4257SSteve Yin 		}
21205fdc4257SSteve Yin 
21215fdc4257SSteve Yin 		*windowHandle = nHwnd;
21225fdc4257SSteve Yin 		return S_OK;
21235fdc4257SSteve Yin 
21245fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
21255fdc4257SSteve Yin }
21265fdc4257SSteve Yin 
21275fdc4257SSteve Yin /**
21285fdc4257SSteve Yin * Get XAccessibleContext directly from UNO by the stored XAccessible pointer
21295fdc4257SSteve Yin * @param	pXAcc, UNO XAccessible object point.
21305fdc4257SSteve Yin * @return   XAccessibleContext*, the context of the pXAcc.
21315fdc4257SSteve Yin */
21325fdc4257SSteve Yin XAccessibleContext* CMAccessible::GetContextByXAcc( XAccessible* pXAcc )
21335fdc4257SSteve Yin {
21345fdc4257SSteve Yin 	Reference< XAccessibleContext > pRContext;
21355fdc4257SSteve Yin 	if( pXAcc == NULL)
21365fdc4257SSteve Yin 		return NULL;
21375fdc4257SSteve Yin 
21385fdc4257SSteve Yin 	pRContext = pXAcc->getAccessibleContext();
21395fdc4257SSteve Yin 	if( !pRContext.is() )
21405fdc4257SSteve Yin 		return NULL;
21415fdc4257SSteve Yin 	return pRContext.get();
21425fdc4257SSteve Yin }
21435fdc4257SSteve Yin 
21445fdc4257SSteve Yin /**
21455fdc4257SSteve Yin * Return the member variable m_pXAccessibleSelection, instead of
21465fdc4257SSteve Yin * get XAccessibleSelection according to XAccessibleContext because if so,it will
21475fdc4257SSteve Yin * depend on the UNO implementation code,so when COM is created, put XAccessibleSelection
21485fdc4257SSteve Yin * by bridge management system
21495fdc4257SSteve Yin * @return   XAccessibleSelection*, the selection of the current object.
21505fdc4257SSteve Yin */
21515fdc4257SSteve Yin Reference< XAccessibleSelection > CMAccessible::GetSelection()
21525fdc4257SSteve Yin {
21535fdc4257SSteve Yin 	if( pUNOInterface == NULL )
21545fdc4257SSteve Yin 		return NULL;
21555fdc4257SSteve Yin 	Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext();
21565fdc4257SSteve Yin 	if(pRContext.is())
21575fdc4257SSteve Yin 	{
21585fdc4257SSteve Yin 		Reference< XAccessibleSelection > pRSelection(pRContext,UNO_QUERY);
21595fdc4257SSteve Yin 		return pRSelection;
21605fdc4257SSteve Yin 	}
21615fdc4257SSteve Yin 	return NULL;
21625fdc4257SSteve Yin }
21635fdc4257SSteve Yin 
21645fdc4257SSteve Yin /**
21655fdc4257SSteve Yin * Select one XAccessible item, for accSelect implementation
21665fdc4257SSteve Yin * @param	pItem, the item should be selected.
21675fdc4257SSteve Yin * @return  S_OK if successful.
21685fdc4257SSteve Yin */
21695fdc4257SSteve Yin HRESULT CMAccessible::SelectChild(XAccessible* pItem)
21705fdc4257SSteve Yin {
21715fdc4257SSteve Yin 
21725fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
21735fdc4257SSteve Yin 		ISDESTROY()
21745fdc4257SSteve Yin 		XAccessibleContext* pParentContext = GetContextByXAcc( pUNOInterface );
21755fdc4257SSteve Yin 	XAccessibleContext* pContext = GetContextByXAcc( pItem );
21765fdc4257SSteve Yin 	if( pParentContext == NULL || pContext == NULL )
21775fdc4257SSteve Yin 		return E_FAIL;
21785fdc4257SSteve Yin 
21795fdc4257SSteve Yin 	Reference< XAccessibleSelection > pRSelection = GetSelection();
21805fdc4257SSteve Yin 	if( !pRSelection.is() )
21815fdc4257SSteve Yin 		return E_FAIL;
21825fdc4257SSteve Yin 	long Index = pContext->getAccessibleIndexInParent();
21835fdc4257SSteve Yin 	pRSelection->selectAccessibleChild( Index );
21845fdc4257SSteve Yin 	return S_OK;
21855fdc4257SSteve Yin 
21865fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
21875fdc4257SSteve Yin }
21885fdc4257SSteve Yin 
21895fdc4257SSteve Yin /**
21905fdc4257SSteve Yin * Deselect one XAccessible item, for accSelect implimentation
21915fdc4257SSteve Yin * @param	pItem, the item should be deselected.
21925fdc4257SSteve Yin * @return  S_OK if successful.
21935fdc4257SSteve Yin */
21945fdc4257SSteve Yin HRESULT CMAccessible::DeSelectChild(XAccessible* pItem)
21955fdc4257SSteve Yin {
21965fdc4257SSteve Yin 
21975fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
21985fdc4257SSteve Yin 		ISDESTROY()
21995fdc4257SSteve Yin 		XAccessibleContext* pParentContext = GetContextByXAcc( pUNOInterface );
22005fdc4257SSteve Yin 	;
22015fdc4257SSteve Yin 	XAccessibleContext* pContext = GetContextByXAcc( pItem );
22025fdc4257SSteve Yin 	if( pParentContext == NULL || pContext == NULL )
22035fdc4257SSteve Yin 		return E_INVALIDARG;
22045fdc4257SSteve Yin 
22055fdc4257SSteve Yin 	Reference< XAccessibleSelection > pRSelection = GetSelection();
22065fdc4257SSteve Yin 	if( !pRSelection.is() )
22075fdc4257SSteve Yin 		return E_FAIL;
22085fdc4257SSteve Yin 	long Index = pContext->getAccessibleIndexInParent();
22095fdc4257SSteve Yin 	pRSelection->deselectAccessibleChild( Index );
22105fdc4257SSteve Yin 
22115fdc4257SSteve Yin 	return S_OK;
22125fdc4257SSteve Yin 
22135fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
22145fdc4257SSteve Yin }
22155fdc4257SSteve Yin 
22165fdc4257SSteve Yin /**
22175fdc4257SSteve Yin * Select multiple XAccessible items,for implementation of accSelect
22185fdc4257SSteve Yin * @param	pItem, the items should be selected.
22195fdc4257SSteve Yin * @param	size, the size of the items.
22205fdc4257SSteve Yin * @return  S_OK if successful.
22215fdc4257SSteve Yin */
22225fdc4257SSteve Yin HRESULT	CMAccessible::SelectMutipleChidren( XAccessible** pItem,int size )
22235fdc4257SSteve Yin {
22245fdc4257SSteve Yin 
22255fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
22265fdc4257SSteve Yin 		ISDESTROY()
22275fdc4257SSteve Yin 		// #CHECK#
22285fdc4257SSteve Yin 		if(pItem == NULL)
22295fdc4257SSteve Yin 		{
22305fdc4257SSteve Yin 			return E_INVALIDARG;
22315fdc4257SSteve Yin 		}
22325fdc4257SSteve Yin 		for(int index = 0;index < size;index++)
22335fdc4257SSteve Yin 		{
22345fdc4257SSteve Yin 			SelectChild( pItem[index] );
22355fdc4257SSteve Yin 		}
22365fdc4257SSteve Yin 		return S_OK;
22375fdc4257SSteve Yin 
22385fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
22395fdc4257SSteve Yin }
22405fdc4257SSteve Yin 
22415fdc4257SSteve Yin /**
22425fdc4257SSteve Yin * Deselect multiple XAccessible items,for implementation of accSelect
22435fdc4257SSteve Yin * @param	pItem, the items should be selected.
22445fdc4257SSteve Yin * @param	size, the size of the items.
22455fdc4257SSteve Yin * @return  S_OK if successful.
22465fdc4257SSteve Yin */
22475fdc4257SSteve Yin HRESULT CMAccessible::DeSelectMutipleChildren( XAccessible** pItem,int size )
22485fdc4257SSteve Yin {
22495fdc4257SSteve Yin 
22505fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
22515fdc4257SSteve Yin 		ISDESTROY()
22525fdc4257SSteve Yin 		// #CHECK#
22535fdc4257SSteve Yin 		if(pItem == NULL)
22545fdc4257SSteve Yin 		{
22555fdc4257SSteve Yin 			return E_INVALIDARG;
22565fdc4257SSteve Yin 		}
22575fdc4257SSteve Yin 		for(int index = 0;index < size;index++)
22585fdc4257SSteve Yin 		{
22595fdc4257SSteve Yin 			DeSelectChild( pItem[index] );
22605fdc4257SSteve Yin 		}
22615fdc4257SSteve Yin 		return S_OK;
22625fdc4257SSteve Yin 
22635fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
22645fdc4257SSteve Yin }
22655fdc4257SSteve Yin 
22665fdc4257SSteve Yin /**
22675fdc4257SSteve Yin * When COM is created, UNO set XAccessible pointer to it
22685fdc4257SSteve Yin * in order to COM can operate UNO information
22695fdc4257SSteve Yin * @param	pXAcc, the XAccessible object of current object.
22705fdc4257SSteve Yin * @return  S_OK if successful.
22715fdc4257SSteve Yin */
22725fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetXAccessible(long pXAcc)
22735fdc4257SSteve Yin {
22745fdc4257SSteve Yin 	pUNOInterface = (XAccessible*)pXAcc;
22755fdc4257SSteve Yin 	pRef = pUNOInterface;
22765fdc4257SSteve Yin 	m_pEnumVar->PutSelection(/*XAccessibleSelection*/(long)pUNOInterface);
22775fdc4257SSteve Yin 
22785fdc4257SSteve Yin 	pRContext = pUNOInterface->getAccessibleContext();
22795fdc4257SSteve Yin 	pRContextInterface = (XAccessibleContext*)pRContext.is();
22805fdc4257SSteve Yin 
22815fdc4257SSteve Yin 	return S_OK;
22825fdc4257SSteve Yin }
22835fdc4257SSteve Yin 
22845fdc4257SSteve Yin /**
22855fdc4257SSteve Yin * accSelect method has many optional flags, needs to process comprehensively
22865fdc4257SSteve Yin * Mozilla and Microsoft do not implement SELFLAG_EXTENDSELECTION flag.
22875fdc4257SSteve Yin * The implementation of this flag is a little trouble-shooting,so we also
22885fdc4257SSteve Yin * do not implement it now
22895fdc4257SSteve Yin * @param	flagsSelect, the selection flag of the select action.
22905fdc4257SSteve Yin * @param	varChild, the child object pointer of current action.
22915fdc4257SSteve Yin * @return  S_OK if successful.
22925fdc4257SSteve Yin */
22935fdc4257SSteve Yin STDMETHODIMP CMAccessible::accSelect(long flagsSelect, VARIANT varChild)
22945fdc4257SSteve Yin {
22955fdc4257SSteve Yin 
22965fdc4257SSteve Yin 	CHECK_ENABLE_INF
22975fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
22985fdc4257SSteve Yin 		ISDESTROY()
22995fdc4257SSteve Yin 		if( (flagsSelect&SELFLAG_ADDSELECTION) &&
23005fdc4257SSteve Yin 			(SELFLAG_REMOVESELECTION&flagsSelect) )
23015fdc4257SSteve Yin 			return E_INVALIDARG;
23025fdc4257SSteve Yin 
23035fdc4257SSteve Yin 	if ( (flagsSelect&SELFLAG_TAKESELECTION) &&
23045fdc4257SSteve Yin 		(
23055fdc4257SSteve Yin 		(flagsSelect&SELFLAG_ADDSELECTION) ||
23065fdc4257SSteve Yin 		(flagsSelect&SELFLAG_REMOVESELECTION) ||
23075fdc4257SSteve Yin 		(flagsSelect&SELFLAG_EXTENDSELECTION )
23085fdc4257SSteve Yin 		)
23095fdc4257SSteve Yin 		)
23105fdc4257SSteve Yin 		return E_INVALIDARG;
23115fdc4257SSteve Yin 
23125fdc4257SSteve Yin 	if ( varChild.vt !=	VT_I4 )
23135fdc4257SSteve Yin 		return E_INVALIDARG;
23145fdc4257SSteve Yin 
23155fdc4257SSteve Yin 	IMAccessible* pSelectAcc;
23165fdc4257SSteve Yin 	if( varChild.lVal == CHILDID_SELF )
23175fdc4257SSteve Yin 	{
23185fdc4257SSteve Yin 		pSelectAcc = this;
23195fdc4257SSteve Yin 		pSelectAcc->AddRef();
23205fdc4257SSteve Yin 	}
23215fdc4257SSteve Yin 	else
23225fdc4257SSteve Yin 	{
23235fdc4257SSteve Yin 		pSelectAcc = GetChildInterface(varChild.lVal);
23245fdc4257SSteve Yin 	}
23255fdc4257SSteve Yin 
23265fdc4257SSteve Yin 	if( pSelectAcc == NULL )
23275fdc4257SSteve Yin 		return E_INVALIDARG;
23285fdc4257SSteve Yin 
23295fdc4257SSteve Yin 	if( flagsSelect&SELFLAG_TAKEFOCUS )
23305fdc4257SSteve Yin 	{
23315fdc4257SSteve Yin 		long pTempUNO = 0;
23325fdc4257SSteve Yin 		pSelectAcc->GetUNOInterface( &pTempUNO);
23335fdc4257SSteve Yin 
23345fdc4257SSteve Yin 		if( pTempUNO == NULL )
23355fdc4257SSteve Yin 			return NULL;
23365fdc4257SSteve Yin 
23375fdc4257SSteve Yin 		Reference< XAccessibleContext > pRContext = ( (XAccessible*)pTempUNO)->getAccessibleContext();
23385fdc4257SSteve Yin 		Reference< XAccessibleComponent > pRComponent(pRContext,UNO_QUERY);
23395fdc4257SSteve Yin 		Reference< XAccessible > pRParentXAcc = pRContext->getAccessibleParent();
23405fdc4257SSteve Yin 		Reference< XAccessibleContext > pRParentContext = pRParentXAcc->getAccessibleContext();
23415fdc4257SSteve Yin 		Reference< XAccessibleComponent > pRParentComponent(pRParentContext,UNO_QUERY);
23425fdc4257SSteve Yin 		Reference< XAccessibleSelection > pRParentSelection(pRParentContext,UNO_QUERY);
23435fdc4257SSteve Yin 
23445fdc4257SSteve Yin 
23455fdc4257SSteve Yin 		pRComponent->grabFocus();
23465fdc4257SSteve Yin 
23475fdc4257SSteve Yin 		if( flagsSelect & SELFLAG_TAKESELECTION )
23485fdc4257SSteve Yin 		{
23495fdc4257SSteve Yin 			pRParentSelection->clearAccessibleSelection();
23505fdc4257SSteve Yin 			pRParentSelection->selectAccessibleChild( pRContext->getAccessibleIndexInParent() );
23515fdc4257SSteve Yin 		}
23525fdc4257SSteve Yin 
23535fdc4257SSteve Yin 		if( flagsSelect & SELFLAG_ADDSELECTION  )
23545fdc4257SSteve Yin 		{
23555fdc4257SSteve Yin 			pRParentSelection->selectAccessibleChild( pRContext->getAccessibleIndexInParent() );
23565fdc4257SSteve Yin 		}
23575fdc4257SSteve Yin 
23585fdc4257SSteve Yin 		if( flagsSelect & SELFLAG_REMOVESELECTION )
23595fdc4257SSteve Yin 		{
23605fdc4257SSteve Yin 			pRParentSelection->deselectAccessibleChild( pRContext->getAccessibleIndexInParent() );
23615fdc4257SSteve Yin 		}
23625fdc4257SSteve Yin 
23635fdc4257SSteve Yin 		if( flagsSelect & SELFLAG_EXTENDSELECTION  )
23645fdc4257SSteve Yin 		{
23655fdc4257SSteve Yin 			long indexInParrent = pRContext->getAccessibleIndexInParent();
23665fdc4257SSteve Yin 
23675fdc4257SSteve Yin 			if( pRParentSelection->isAccessibleChildSelected( indexInParrent + 1 ) ||
23685fdc4257SSteve Yin 				pRParentSelection->isAccessibleChildSelected( indexInParrent - 1 ) )
23695fdc4257SSteve Yin 			{
23705fdc4257SSteve Yin 				pRParentSelection->selectAccessibleChild( indexInParrent );
23715fdc4257SSteve Yin 			}
23725fdc4257SSteve Yin 		}
23735fdc4257SSteve Yin 
23745fdc4257SSteve Yin 	}
23755fdc4257SSteve Yin 
23765fdc4257SSteve Yin 	pSelectAcc->Release();
23775fdc4257SSteve Yin 	return S_OK;
23785fdc4257SSteve Yin 
23795fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
23805fdc4257SSteve Yin }
23815fdc4257SSteve Yin 
23825fdc4257SSteve Yin /**
23835fdc4257SSteve Yin * Return XAccessible interface pointer when needed
23845fdc4257SSteve Yin * @param pXAcc, [in, out] the Uno interface of the current object.
23855fdc4257SSteve Yin * @return S_OK if successful.
23865fdc4257SSteve Yin */
23875fdc4257SSteve Yin STDMETHODIMP CMAccessible::GetUNOInterface(long* pXAcc)
23885fdc4257SSteve Yin {
23895fdc4257SSteve Yin 	// #CHECK#
23905fdc4257SSteve Yin 	if(pXAcc == NULL)
23915fdc4257SSteve Yin 		return E_INVALIDARG;
23925fdc4257SSteve Yin 
23935fdc4257SSteve Yin 	*pXAcc = (long)pUNOInterface;
23945fdc4257SSteve Yin 	return S_OK;
23955fdc4257SSteve Yin }
23965fdc4257SSteve Yin 
23975fdc4257SSteve Yin /**
23985fdc4257SSteve Yin * Helper method for Implementation of get_accDefaultAction
23995fdc4257SSteve Yin * @param pAction, the default action point of the current object.
24005fdc4257SSteve Yin * @return S_OK if successful.
24015fdc4257SSteve Yin */
24025fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetDefaultAction(long pAction)
24035fdc4257SSteve Yin {
24045fdc4257SSteve Yin 	m_pXAction = (XAccessibleAction*)pAction;
24055fdc4257SSteve Yin 	return S_OK;
24065fdc4257SSteve Yin }
24075fdc4257SSteve Yin 
24085fdc4257SSteve Yin /**
24095fdc4257SSteve Yin * This method is called when AT open some UI elements initially
24105fdc4257SSteve Yin * the UI element takes the default action defined here
24115fdc4257SSteve Yin * @param varChild, the child id of the defaultaction.
24125fdc4257SSteve Yin * @param pszDefaultAction,[in/out] the description of the current action.
24135fdc4257SSteve Yin * @return S_OK if successful.
24145fdc4257SSteve Yin */
24155fdc4257SSteve Yin HRESULT STDMETHODCALLTYPE CMAccessible::get_accDefaultAction(VARIANT varChild, BSTR *pszDefaultAction)
24165fdc4257SSteve Yin {
24175fdc4257SSteve Yin 
24185fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
24195fdc4257SSteve Yin 		ISDESTROY()
24205fdc4257SSteve Yin 		// #CHECK#
24215fdc4257SSteve Yin 		if(pszDefaultAction == NULL)
24225fdc4257SSteve Yin 		{
24235fdc4257SSteve Yin 			return E_INVALIDARG;
24245fdc4257SSteve Yin 		}
24255fdc4257SSteve Yin 		if(varChild.vt==VT_I4)
24265fdc4257SSteve Yin 		{
24275fdc4257SSteve Yin 			if(varChild.lVal==CHILDID_SELF)
24285fdc4257SSteve Yin 			{
24295fdc4257SSteve Yin 				if( m_pXAction == NULL )
24305fdc4257SSteve Yin 					return DISP_E_MEMBERNOTFOUND;
24315fdc4257SSteve Yin 				SAFE_SYSFREESTRING(*pszDefaultAction);
24325fdc4257SSteve Yin 				*pszDefaultAction = SysAllocString(m_pszActionDescription);
24335fdc4257SSteve Yin 				return S_OK;
24345fdc4257SSteve Yin 			}
24355fdc4257SSteve Yin 
24365fdc4257SSteve Yin 			long lVal = varChild.lVal;
24375fdc4257SSteve Yin 			varChild.lVal = CHILDID_SELF;
24385fdc4257SSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
24395fdc4257SSteve Yin 			if(!pChild)
24405fdc4257SSteve Yin 				return E_FAIL;
24415fdc4257SSteve Yin 			return pChild->get_accDefaultAction(varChild,pszDefaultAction);
24425fdc4257SSteve Yin 		}
24435fdc4257SSteve Yin 		return S_FALSE;
24445fdc4257SSteve Yin 
24455fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
24465fdc4257SSteve Yin }
24475fdc4257SSteve Yin 
24485fdc4257SSteve Yin /**
24495fdc4257SSteve Yin * AT call this method to operate application
24505fdc4257SSteve Yin * @param varChild, the child id of the action object.
24515fdc4257SSteve Yin * @return S_OK if successful.
24525fdc4257SSteve Yin */
24535fdc4257SSteve Yin HRESULT STDMETHODCALLTYPE CMAccessible::accDoDefaultAction(VARIANT varChild)
24545fdc4257SSteve Yin {
24555fdc4257SSteve Yin 
24565fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
24575fdc4257SSteve Yin 		ISDESTROY()
24585fdc4257SSteve Yin 		if( varChild.vt != VT_I4 )
24595fdc4257SSteve Yin 			return E_INVALIDARG;
24605fdc4257SSteve Yin 	if( m_pXAction == NULL )
24615fdc4257SSteve Yin 		return E_FAIL;
24625fdc4257SSteve Yin 	if( m_pXAction->getAccessibleActionCount() == 0 )
24635fdc4257SSteve Yin 		return E_FAIL;
24645fdc4257SSteve Yin 
24655fdc4257SSteve Yin 	if(varChild.lVal==CHILDID_SELF)
24665fdc4257SSteve Yin 	{
24675fdc4257SSteve Yin 		if(m_pXAction->getAccessibleActionCount() > 0)
24685fdc4257SSteve Yin 			m_pXAction->doAccessibleAction(0);
24695fdc4257SSteve Yin 		return S_OK;
24705fdc4257SSteve Yin 	}
24715fdc4257SSteve Yin 
24725fdc4257SSteve Yin 	long lVal = varChild.lVal;
24735fdc4257SSteve Yin 	varChild.lVal = CHILDID_SELF;
24745fdc4257SSteve Yin 	IMAccessible *pChild = this->GetChildInterface(lVal);
24755fdc4257SSteve Yin 	if(!pChild)
24765fdc4257SSteve Yin 		return E_FAIL;
24775fdc4257SSteve Yin 	return pChild->accDoDefaultAction( varChild );
24785fdc4257SSteve Yin 
24795fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
24805fdc4257SSteve Yin }
24815fdc4257SSteve Yin 
24825fdc4257SSteve Yin /**
24835fdc4257SSteve Yin * UNO set description information for action to COM.
24845fdc4257SSteve Yin * @param szAction, the action description of the current object.
24855fdc4257SSteve Yin * @return S_OK if successful.
24865fdc4257SSteve Yin */
24875fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_ActionDescription( const OLECHAR* szAction)
24885fdc4257SSteve Yin {
24895fdc4257SSteve Yin 
24905fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
24915fdc4257SSteve Yin 		ISDESTROY()
24925fdc4257SSteve Yin 		// #CHECK#
24935fdc4257SSteve Yin 		if(szAction == NULL)
24945fdc4257SSteve Yin 		{
24955fdc4257SSteve Yin 			return E_INVALIDARG;
24965fdc4257SSteve Yin 		}
24975fdc4257SSteve Yin 		SAFE_SYSFREESTRING(m_pszActionDescription );
24985fdc4257SSteve Yin 		m_pszActionDescription = SysAllocString( szAction );
24995fdc4257SSteve Yin 		return S_OK;
25005fdc4257SSteve Yin 
25015fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
25025fdc4257SSteve Yin }
25035fdc4257SSteve Yin 
25045fdc4257SSteve Yin BOOL CMAccessible::GetXInterfaceFromXAccessible(XAccessible* pXAcc, XInterface** ppXI, int index)
25055fdc4257SSteve Yin {
25065fdc4257SSteve Yin 	Reference< XAccessibleContext > pRContext;
25075fdc4257SSteve Yin 
25085fdc4257SSteve Yin 	switch(index)
25095fdc4257SSteve Yin 	{
25105fdc4257SSteve Yin 	case XI_COMPONENT:
25115fdc4257SSteve Yin 		QUERYXINTERFACE(AccessibleComponent)
25125fdc4257SSteve Yin 			break;
25135fdc4257SSteve Yin 	case XI_TEXT:
25145fdc4257SSteve Yin 		QUERYXINTERFACE(AccessibleText)
25155fdc4257SSteve Yin 			break;
25165fdc4257SSteve Yin 	case XI_EDITABLETEXT:
25175fdc4257SSteve Yin 		QUERYXINTERFACE(AccessibleEditableText)
25185fdc4257SSteve Yin 			break;
25195fdc4257SSteve Yin 	case XI_TABLE:
25205fdc4257SSteve Yin 		QUERYXINTERFACE(AccessibleTable)
25215fdc4257SSteve Yin 			break;
25225fdc4257SSteve Yin 	case XI_SELECTION:
25235fdc4257SSteve Yin 		QUERYXINTERFACE(AccessibleSelection)
25245fdc4257SSteve Yin 			break;
25255fdc4257SSteve Yin 	case XI_EXTENDEDCOMP:
25265fdc4257SSteve Yin 		QUERYXINTERFACE(AccessibleExtendedComponent)
25275fdc4257SSteve Yin 			break;
25285fdc4257SSteve Yin 	case XI_KEYBINDING:
25295fdc4257SSteve Yin 		QUERYXINTERFACE(AccessibleKeyBinding)
25305fdc4257SSteve Yin 			break;
25315fdc4257SSteve Yin 	case XI_ACTION:
25325fdc4257SSteve Yin 		QUERYXINTERFACE(AccessibleAction)
25335fdc4257SSteve Yin 			break;
25345fdc4257SSteve Yin 	case XI_VALUE:
25355fdc4257SSteve Yin 		QUERYXINTERFACE(AccessibleValue)
25365fdc4257SSteve Yin 			break;
25375fdc4257SSteve Yin 	case XI_HYPERTEXT:
25385fdc4257SSteve Yin 		QUERYXINTERFACE(AccessibleHypertext)
25395fdc4257SSteve Yin 			break;
25405fdc4257SSteve Yin 	case XI_HYPERLINK:
25415fdc4257SSteve Yin 		QUERYXINTERFACE(AccessibleHyperlink)
25425fdc4257SSteve Yin 			break;
25435fdc4257SSteve Yin 	case XI_IMAGE:
25445fdc4257SSteve Yin 		QUERYXINTERFACE(AccessibleImage)
25455fdc4257SSteve Yin 			break;
25465fdc4257SSteve Yin 	default:
25475fdc4257SSteve Yin 		break;
25485fdc4257SSteve Yin 	}
25495fdc4257SSteve Yin 
25505fdc4257SSteve Yin 	return FALSE;
25515fdc4257SSteve Yin }
25525fdc4257SSteve Yin 
25535fdc4257SSteve Yin HRESULT WINAPI CMAccessible::SmartQI(void* pv, REFIID iid, void** ppvObject)
25545fdc4257SSteve Yin {
25555fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
25565fdc4257SSteve Yin 		ISDESTROY()
25575fdc4257SSteve Yin 		if( ImplIsEqualGUID(iid,IID_IAccIdentity) ||
25585fdc4257SSteve Yin 			ImplIsEqualGUID(iid,IID_IStdMarshalInfo) ||
25595fdc4257SSteve Yin 			ImplIsEqualGUID(iid,IID_IMarshal) ||
25605fdc4257SSteve Yin 			ImplIsEqualGUID(iid,IID_IExternalConnection)||
25615fdc4257SSteve Yin 			ImplIsEqualGUID(iid,IID_IOleWindow))
25625fdc4257SSteve Yin 			return E_FAIL;
25635fdc4257SSteve Yin 
25645fdc4257SSteve Yin 
25655fdc4257SSteve Yin 	_UNO_AGGMAP_ENTRY* pMap = _GetAggEntries();
25665fdc4257SSteve Yin 	while(pMap && pMap->piid)
25675fdc4257SSteve Yin 	{
25685fdc4257SSteve Yin 		if(ImplIsEqualGUID(iid, *pMap->piid))
25695fdc4257SSteve Yin 		{
25705fdc4257SSteve Yin 			XInterface* pXI = NULL;
25715fdc4257SSteve Yin 			BOOL bFound = GetXInterfaceFromXAccessible(pUNOInterface,&pXI,pMap->XIFIndex);
25725fdc4257SSteve Yin 			if(!bFound)
25735fdc4257SSteve Yin 			{
25745fdc4257SSteve Yin 				return E_FAIL;
25755fdc4257SSteve Yin 			}
25765fdc4257SSteve Yin 
25775fdc4257SSteve Yin 			XGUIDToComObjHash::iterator pIndTemp = m_containedObjects.find( iid );
25785fdc4257SSteve Yin 			if ( pIndTemp != m_containedObjects.end() )
25795fdc4257SSteve Yin 			{
25805fdc4257SSteve Yin 				return pIndTemp->second.p->QueryInterface( iid, ppvObject );
25815fdc4257SSteve Yin 			}
25825fdc4257SSteve Yin 			else
25835fdc4257SSteve Yin 			{
2584b0a7a3cfSSteve Yin 				ActivateActContext();
25855fdc4257SSteve Yin 				HRESULT hr = pMap->pfnCreateInstance(pv, iid, ppvObject);
2586b0a7a3cfSSteve Yin 				DeactivateActContext();
25875fdc4257SSteve Yin 				if(hr == S_OK)
25885fdc4257SSteve Yin 				{
25895fdc4257SSteve Yin 					m_containedObjects.insert(XGUIDToComObjHash::value_type(*pMap->piid,(IUnknown*)*ppvObject));
25905fdc4257SSteve Yin 					IUNOXWrapper* wrapper = NULL;
25915fdc4257SSteve Yin 					((IUnknown*)*ppvObject)->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper);
25925fdc4257SSteve Yin 					if(wrapper)
25935fdc4257SSteve Yin 					{
25945fdc4257SSteve Yin 						wrapper->put_XInterface((long)pUNOInterface);
25955fdc4257SSteve Yin 						wrapper->Release();
25965fdc4257SSteve Yin 					}
25975fdc4257SSteve Yin 					return S_OK;
25985fdc4257SSteve Yin 				}
25995fdc4257SSteve Yin 			}
26005fdc4257SSteve Yin 			return E_FAIL;
26015fdc4257SSteve Yin 		}
26025fdc4257SSteve Yin 		pMap++;
26035fdc4257SSteve Yin 	}
26045fdc4257SSteve Yin 	return E_FAIL;
26055fdc4257SSteve Yin 
26065fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
26075fdc4257SSteve Yin }
26085fdc4257SSteve Yin 
26095fdc4257SSteve Yin BOOL CMAccessible::get_IAccessibleFromXAccessible(long pXAcc, IAccessible **ppIA)
26105fdc4257SSteve Yin {
26115fdc4257SSteve Yin 
26125fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
26135fdc4257SSteve Yin 
26145fdc4257SSteve Yin 		// #CHECK#
26155fdc4257SSteve Yin 		if(ppIA == NULL)
26165fdc4257SSteve Yin 		{
26175fdc4257SSteve Yin 			return E_INVALIDARG;
26185fdc4257SSteve Yin 		}
26195fdc4257SSteve Yin 		BOOL isGet = FALSE;
26205fdc4257SSteve Yin 		if(g_pAgent)
26215fdc4257SSteve Yin 			isGet = g_pAgent->GetIAccessibleFromXAccessible((XAccessible*)pXAcc,ppIA);
26225fdc4257SSteve Yin 
26235fdc4257SSteve Yin 		if(isGet)
26245fdc4257SSteve Yin 			return TRUE;
26255fdc4257SSteve Yin 		else
26265fdc4257SSteve Yin 			return FALSE;
26275fdc4257SSteve Yin 
26285fdc4257SSteve Yin 		LEAVE_PROTECTED_BLOCK
26295fdc4257SSteve Yin }
26305fdc4257SSteve Yin 
26315fdc4257SSteve Yin void CMAccessible::get_OLECHARFromAny(Any& pAny, OLECHAR* pChar)
26325fdc4257SSteve Yin {
26335fdc4257SSteve Yin 	// #CHECK#
26345fdc4257SSteve Yin 	if(pChar == NULL)
26355fdc4257SSteve Yin 		return;
26365fdc4257SSteve Yin 
26375fdc4257SSteve Yin 	switch(pAny.getValueTypeClass())
26385fdc4257SSteve Yin 	{
26395fdc4257SSteve Yin 	case TypeClass_CHAR:
26405fdc4257SSteve Yin 		{
26415fdc4257SSteve Yin 			sal_Int8 val;
26425fdc4257SSteve Yin 			pAny >>= val;
26435fdc4257SSteve Yin 			swprintf( pChar, L"%d", val);
26445fdc4257SSteve Yin 			break;
26455fdc4257SSteve Yin 		}
26465fdc4257SSteve Yin 	case TypeClass_BOOLEAN:
26475fdc4257SSteve Yin 		{
26485fdc4257SSteve Yin 			sal_Bool val;
26495fdc4257SSteve Yin 			pAny >>= val;
26505fdc4257SSteve Yin 			swprintf( pChar, L"%d", val);
26515fdc4257SSteve Yin 			break;
26525fdc4257SSteve Yin 		}
26535fdc4257SSteve Yin 	case TypeClass_BYTE:
26545fdc4257SSteve Yin 		{
26555fdc4257SSteve Yin 			sal_Int8 val;
26565fdc4257SSteve Yin 			pAny >>= val;
26575fdc4257SSteve Yin 			swprintf( pChar, L"%d", val);
26585fdc4257SSteve Yin 			break;
26595fdc4257SSteve Yin 		}
26605fdc4257SSteve Yin 	case TypeClass_SHORT:
26615fdc4257SSteve Yin 		{
26625fdc4257SSteve Yin 			SHORT val;
26635fdc4257SSteve Yin 			pAny >>= val;
26645fdc4257SSteve Yin 			swprintf( pChar, L"%d", val);
26655fdc4257SSteve Yin 			break;
26665fdc4257SSteve Yin 		}
26675fdc4257SSteve Yin 	case TypeClass_UNSIGNED_SHORT:
26685fdc4257SSteve Yin 		{
26695fdc4257SSteve Yin 			USHORT val;
26705fdc4257SSteve Yin 			pAny >>= val;
26715fdc4257SSteve Yin 			swprintf( pChar, L"%d", val);
26725fdc4257SSteve Yin 			break;
26735fdc4257SSteve Yin 		}
26745fdc4257SSteve Yin 	case TypeClass_LONG:
26755fdc4257SSteve Yin 		{
26765fdc4257SSteve Yin 			LONG val;
26775fdc4257SSteve Yin 			pAny >>= val;
26785fdc4257SSteve Yin 			swprintf( pChar, L"%ld", val);
26795fdc4257SSteve Yin 			break;
26805fdc4257SSteve Yin 		}
26815fdc4257SSteve Yin 	case TypeClass_UNSIGNED_LONG:
26825fdc4257SSteve Yin 		{
26835fdc4257SSteve Yin 			ULONG val;
26845fdc4257SSteve Yin 			pAny >>= val;
26855fdc4257SSteve Yin 			swprintf( pChar, L"%ld", val);
26865fdc4257SSteve Yin 			break;
26875fdc4257SSteve Yin 		}
26885fdc4257SSteve Yin 	case TypeClass_FLOAT:
26895fdc4257SSteve Yin 		{
26905fdc4257SSteve Yin 			FLOAT val;
26915fdc4257SSteve Yin 			pAny >>= val;
26925fdc4257SSteve Yin 			swprintf( pChar, L"%.3f", val);
26935fdc4257SSteve Yin 			break;
26945fdc4257SSteve Yin 		}
26955fdc4257SSteve Yin 	case TypeClass_DOUBLE:
26965fdc4257SSteve Yin 		{
26975fdc4257SSteve Yin 			DOUBLE val;
26985fdc4257SSteve Yin 			pAny >>= val;
26995fdc4257SSteve Yin 			swprintf( pChar, L"%.6lf", val);
27005fdc4257SSteve Yin 			break;
27015fdc4257SSteve Yin 		}
27025fdc4257SSteve Yin 	case TypeClass_STRING:
27035fdc4257SSteve Yin 		{
27045fdc4257SSteve Yin 			::rtl::OUString val;
27055fdc4257SSteve Yin 			pAny >>= val;
27065fdc4257SSteve Yin 			wcscpy(pChar, val.getStr());
27075fdc4257SSteve Yin 			break;
27085fdc4257SSteve Yin 		}
27095fdc4257SSteve Yin 	case TypeClass_SEQUENCE:
27105fdc4257SSteve Yin 		{
27115fdc4257SSteve Yin 			if(pAny.getValueType() == getCppuType( (Sequence< ::rtl::OUString > *)0 ) )
27125fdc4257SSteve Yin 			{
27135fdc4257SSteve Yin 				Sequence < ::rtl::OUString > val;
27145fdc4257SSteve Yin 				pAny >>= val;
27155fdc4257SSteve Yin 
27165fdc4257SSteve Yin 				::rtl::OUString pString;
27175fdc4257SSteve Yin 
27185fdc4257SSteve Yin 				int count = val.getLength();
27195fdc4257SSteve Yin 
27205fdc4257SSteve Yin 				for( int iIndex = 0;iIndex < count;iIndex++ )
27215fdc4257SSteve Yin 				{
27225fdc4257SSteve Yin 					pString += val[iIndex];
27235fdc4257SSteve Yin 				}
27245fdc4257SSteve Yin 				wcscpy(pChar, pString.getStr());
27255fdc4257SSteve Yin 			}
27265fdc4257SSteve Yin 			else if (pAny.getValueType() == getCppuType( (Sequence< ::com::sun::star::style::TabStop >* )0 ) )
27275fdc4257SSteve Yin 			{
27285fdc4257SSteve Yin 				Sequence < ::com::sun::star::style::TabStop > val;
27295fdc4257SSteve Yin 				pAny >>= val;
27305fdc4257SSteve Yin 				int count = val.getLength();
27315fdc4257SSteve Yin 
27325fdc4257SSteve Yin 				for( int iIndex = 0;iIndex < count;iIndex++ )
27335fdc4257SSteve Yin 				{
27345fdc4257SSteve Yin 					OLECHAR pAttrs[512] = {NULL};
27355fdc4257SSteve Yin 
27365fdc4257SSteve Yin 					OLECHAR pAttrsPosition[512] = {NULL};
27375fdc4257SSteve Yin 					OLECHAR pAttrsDescimalChar[512] = {NULL};
27385fdc4257SSteve Yin 					OLECHAR pAttrsFillChar[512] = {NULL};
27395fdc4257SSteve Yin 
27405fdc4257SSteve Yin 					::com::sun::star::style::TabStop sigleVal = val[iIndex];
27415fdc4257SSteve Yin 
27425fdc4257SSteve Yin 					swprintf( pAttrsPosition, L"Position=%ld,TabAlign=%ld",
27435fdc4257SSteve Yin 						sigleVal.Position, sigleVal.Alignment);
27445fdc4257SSteve Yin 
27455fdc4257SSteve Yin 					if(sigleVal.DecimalChar==';' || sigleVal.DecimalChar == ':' || sigleVal.DecimalChar == ',' ||
27465fdc4257SSteve Yin 						sigleVal.DecimalChar == '=' || sigleVal.DecimalChar == '\\')
27475fdc4257SSteve Yin 						swprintf( pAttrsDescimalChar, L"DecimalChar=\\%c",sigleVal.DecimalChar);
27485fdc4257SSteve Yin 					else
27495fdc4257SSteve Yin 						swprintf( pAttrsDescimalChar, L"DecimalChar=%c",sigleVal.DecimalChar);
27505fdc4257SSteve Yin 
27515fdc4257SSteve Yin 					if(sigleVal.FillChar==';' || sigleVal.FillChar == ':' || sigleVal.FillChar == ',' ||
27525fdc4257SSteve Yin 						sigleVal.FillChar == '=' || sigleVal.FillChar == '\\')
27535fdc4257SSteve Yin 						swprintf( pAttrsFillChar, L"FillChar=\\%c",sigleVal.FillChar);
27545fdc4257SSteve Yin 					else
27555fdc4257SSteve Yin 						swprintf( pAttrsFillChar, L"FillChar=%c",sigleVal.FillChar);
27565fdc4257SSteve Yin 
27575fdc4257SSteve Yin 					swprintf( pAttrs, L"%s,%s,%s,",pAttrsPosition,pAttrsDescimalChar,pAttrsFillChar);
27585fdc4257SSteve Yin 
27595fdc4257SSteve Yin 					wcscat(pChar,pAttrs);
27605fdc4257SSteve Yin 				}
27615fdc4257SSteve Yin 			}
27625fdc4257SSteve Yin 			break;
27635fdc4257SSteve Yin 		}
27645fdc4257SSteve Yin 	case TypeClass_ENUM:
27655fdc4257SSteve Yin 		{
27665fdc4257SSteve Yin 			if (pAny.getValueType() == getCppuType( (::com::sun::star::awt::FontSlant* )0 ) )
27675fdc4257SSteve Yin 			{
27685fdc4257SSteve Yin 				com::sun::star::awt::FontSlant val;
27695fdc4257SSteve Yin 				pAny >>= val;
27705fdc4257SSteve Yin 				swprintf( pChar, L"%d", val);
27715fdc4257SSteve Yin 			}
27725fdc4257SSteve Yin 		}
27735fdc4257SSteve Yin 	case TypeClass_STRUCT:
27745fdc4257SSteve Yin 		{
27755fdc4257SSteve Yin 			if (pAny.getValueType() == getCppuType( (::com::sun::star::style::LineSpacing* )0 ) )
27765fdc4257SSteve Yin 			{
27775fdc4257SSteve Yin 				com::sun::star::style::LineSpacing val;
27785fdc4257SSteve Yin 				pAny >>= val;
27795fdc4257SSteve Yin 				swprintf( pChar, L"Mode=%ld,Height=%ld,", val.Mode, val.Height);
27805fdc4257SSteve Yin 			}
27815fdc4257SSteve Yin 			else if (pAny.getValueType() == getCppuType( (com::sun::star::accessibility::TextSegment *)0 ) )
27825fdc4257SSteve Yin 			{
27835fdc4257SSteve Yin 				com::sun::star::accessibility::TextSegment val;
27845fdc4257SSteve Yin 				pAny >>= val;
27855fdc4257SSteve Yin 				::rtl::OUString realVal(val.SegmentText);
27865fdc4257SSteve Yin 				wcscpy(pChar, realVal.getStr());
27875fdc4257SSteve Yin 			}
27885fdc4257SSteve Yin 			break;
27895fdc4257SSteve Yin 		}
27905fdc4257SSteve Yin 	case TypeClass_VOID:
27915fdc4257SSteve Yin 	case TypeClass_HYPER:
27925fdc4257SSteve Yin 	case TypeClass_UNSIGNED_HYPER:
27935fdc4257SSteve Yin 	case TypeClass_TYPE:
27945fdc4257SSteve Yin 	case TypeClass_ANY:
27955fdc4257SSteve Yin 	case TypeClass_TYPEDEF:
27965fdc4257SSteve Yin 	case TypeClass_UNION:
27975fdc4257SSteve Yin 	case TypeClass_EXCEPTION:
27985fdc4257SSteve Yin 	case TypeClass_ARRAY:
27995fdc4257SSteve Yin 	case TypeClass_INTERFACE:
28005fdc4257SSteve Yin 	case TypeClass_SERVICE:
28015fdc4257SSteve Yin 	case TypeClass_MODULE:
28025fdc4257SSteve Yin 	case TypeClass_INTERFACE_METHOD:
28035fdc4257SSteve Yin 	case TypeClass_INTERFACE_ATTRIBUTE:
28045fdc4257SSteve Yin 	case TypeClass_UNKNOWN:
28055fdc4257SSteve Yin 	case TypeClass_PROPERTY:
28065fdc4257SSteve Yin 	case TypeClass_CONSTANT:
28075fdc4257SSteve Yin 	case TypeClass_CONSTANTS:
28085fdc4257SSteve Yin 	case TypeClass_SINGLETON:
28095fdc4257SSteve Yin 	case TypeClass_MAKE_FIXED_SIZE:
28105fdc4257SSteve Yin 		break;
28115fdc4257SSteve Yin 	default:
28125fdc4257SSteve Yin 		break;
28135fdc4257SSteve Yin 	}
28145fdc4257SSteve Yin }
28155fdc4257SSteve Yin 
28165fdc4257SSteve Yin void CMAccessible::get_OLECHAR4Numbering(const Any& pAny, short numberingLevel,const OUString& numberingPrefix,OLECHAR* pChar)
28175fdc4257SSteve Yin {
28185fdc4257SSteve Yin 	if(pChar == NULL)
28195fdc4257SSteve Yin 		return;
28205fdc4257SSteve Yin 	Reference< ::com::sun::star::container::XIndexReplace > pXIndex;
28215fdc4257SSteve Yin 	if((pAny>>=pXIndex) && (numberingLevel !=-1))//numbering level is -1,means invalid value
28225fdc4257SSteve Yin 	{
28235fdc4257SSteve Yin 		Any aAny = pXIndex->getByIndex(numberingLevel);
28245fdc4257SSteve Yin 		Sequence< ::com::sun::star::beans::PropertyValue > aProps;
28255fdc4257SSteve Yin 		aAny >>= aProps;
28265fdc4257SSteve Yin 		const ::com::sun::star::beans::PropertyValue* pPropArray = aProps.getConstArray();
28275fdc4257SSteve Yin 		sal_Int32 nCount = aProps.getLength();
28285fdc4257SSteve Yin 		swprintf(pChar,L"Numbering:NumberingLevel=%d,",numberingLevel);
28295fdc4257SSteve Yin 		for( sal_Int32 i=0; i<nCount; i++ )
28305fdc4257SSteve Yin 		{
28315fdc4257SSteve Yin 			::com::sun::star::beans::PropertyValue rProp = pPropArray[i];
28325fdc4257SSteve Yin 			if(	(rProp.Name.compareTo(OUString::createFromAscii("BulletChar"))==0)||
28335fdc4257SSteve Yin 				(rProp.Name.compareTo(OUString::createFromAscii("GraphicURL"))==0)||
28345fdc4257SSteve Yin 				(rProp.Name.compareTo(OUString::createFromAscii("NumberingType"))==0))
28355fdc4257SSteve Yin 			{
28365fdc4257SSteve Yin 				OLECHAR propStr[512] = {NULL};
28375fdc4257SSteve Yin 				swprintf(propStr,L"%s=",rProp.Name.getStr());
28385fdc4257SSteve Yin 				OLECHAR pTemp[256] = {NULL};
28395fdc4257SSteve Yin 				CMAccessible::get_OLECHARFromAny(rProp.Value,pTemp);
28405fdc4257SSteve Yin 				if(rProp.Name.compareTo(OUString::createFromAscii("GraphicURL"))==0)
28415fdc4257SSteve Yin 				{
28425fdc4257SSteve Yin 					OLECHAR* pOccur = wcschr(pTemp,':');
28435fdc4257SSteve Yin 					if(pOccur)
28445fdc4257SSteve Yin 						*pOccur = '.';
28455fdc4257SSteve Yin 				}
28465fdc4257SSteve Yin 				wcscat(propStr,pTemp);
28475fdc4257SSteve Yin 				wcscat(pChar,propStr);
28485fdc4257SSteve Yin 				wcscat(pChar,L",");
28495fdc4257SSteve Yin 
28505fdc4257SSteve Yin 				if(rProp.Name.compareTo(OUString::createFromAscii("NumberingType"))==0)
28515fdc4257SSteve Yin 				{
28525fdc4257SSteve Yin 					if(numberingPrefix.getLength()!=0)
28535fdc4257SSteve Yin 					{
28545fdc4257SSteve Yin 						swprintf(pTemp,L"NumberingPrefix=%s,",numberingPrefix.getStr());
28555fdc4257SSteve Yin 						wcscat(pChar,pTemp);
28565fdc4257SSteve Yin 					}
28575fdc4257SSteve Yin 				}
28585fdc4257SSteve Yin 			}
28595fdc4257SSteve Yin 		}
28605fdc4257SSteve Yin 	}
28615fdc4257SSteve Yin 
28625fdc4257SSteve Yin 	//Because now have three types numbering level:
28635fdc4257SSteve Yin 	//1.real numbering list,numbering level>=0 and numbering Rule !=NULL;
28645fdc4257SSteve Yin 	//2.common paragraph, numbering level >=0, and numbering Rule == NULL;
28655fdc4257SSteve Yin 	//3.TOC paragraph, numbering level >0, and numbering Rule ==NULL;
28665fdc4257SSteve Yin 	// IAText:numberinglevel base on 0, but TOC's level base on 1,
28675fdc4257SSteve Yin 	// so NumberingLevel value will be decreased 1 in bridge code.
28685fdc4257SSteve Yin 	else if(numberingLevel >0)
28695fdc4257SSteve Yin 	{
28705fdc4257SSteve Yin 		swprintf(pChar,L"Numbering:NumberingLevel=%d,NumberingType=4,NumberingPrefix=,",numberingLevel-1);
28715fdc4257SSteve Yin 	}
28725fdc4257SSteve Yin 	else
28735fdc4257SSteve Yin 	{
28745fdc4257SSteve Yin 		swprintf(pChar,L"Numbering:");
28755fdc4257SSteve Yin 	}
28765fdc4257SSteve Yin }
28775fdc4257SSteve Yin 
28785fdc4257SSteve Yin void CMAccessible::ConvertAnyToVariant(const ::com::sun::star::uno::Any &rAnyVal, VARIANT *pvData)
28795fdc4257SSteve Yin {
28805fdc4257SSteve Yin 	if(rAnyVal.hasValue())
28815fdc4257SSteve Yin 	{
28825fdc4257SSteve Yin 		// Clear VARIANT variable.
28835fdc4257SSteve Yin 		VariantClear(pvData);
28845fdc4257SSteve Yin 
28855fdc4257SSteve Yin 		// Set value according to value type.
28865fdc4257SSteve Yin 		switch(rAnyVal.getValueTypeClass())
28875fdc4257SSteve Yin 		{
28885fdc4257SSteve Yin 		case TypeClass_CHAR:
28895fdc4257SSteve Yin 			pvData->vt = VT_UI1;
28905fdc4257SSteve Yin 			memcpy(&pvData->bVal, rAnyVal.getValue(), sizeof(sal_Char));
28915fdc4257SSteve Yin 			break;
28925fdc4257SSteve Yin 
28935fdc4257SSteve Yin 		case TypeClass_BOOLEAN:
28945fdc4257SSteve Yin 			pvData->vt = VT_BOOL;
28955fdc4257SSteve Yin 			memcpy(&pvData->boolVal, rAnyVal.getValue(), sizeof(sal_Bool));
28965fdc4257SSteve Yin 			break;
28975fdc4257SSteve Yin 
28985fdc4257SSteve Yin 		case TypeClass_BYTE:
28995fdc4257SSteve Yin 			pvData->vt = VT_UI1;
29005fdc4257SSteve Yin 			memcpy(&pvData->bVal, rAnyVal.getValue(), sizeof(sal_Int8));
29015fdc4257SSteve Yin 			break;
29025fdc4257SSteve Yin 
29035fdc4257SSteve Yin 		case TypeClass_SHORT:
29045fdc4257SSteve Yin 			pvData->vt = VT_I2;
29055fdc4257SSteve Yin 			memcpy(&pvData->iVal, rAnyVal.getValue(), sizeof(sal_Int16));
29065fdc4257SSteve Yin 			break;
29075fdc4257SSteve Yin 
29085fdc4257SSteve Yin 		case TypeClass_UNSIGNED_SHORT:
29095fdc4257SSteve Yin 			pvData->vt = VT_I2;
29105fdc4257SSteve Yin 			memcpy(&pvData->iVal, rAnyVal.getValue(), sizeof(sal_uInt16));
29115fdc4257SSteve Yin 			break;
29125fdc4257SSteve Yin 
29135fdc4257SSteve Yin 		case TypeClass_LONG:
29145fdc4257SSteve Yin 			pvData->vt = VT_I4;
29155fdc4257SSteve Yin 			memcpy(&pvData->lVal, rAnyVal.getValue(), sizeof(sal_Int32));
29165fdc4257SSteve Yin 			break;
29175fdc4257SSteve Yin 
29185fdc4257SSteve Yin 		case TypeClass_UNSIGNED_LONG:
29195fdc4257SSteve Yin 			pvData->vt = VT_I4;
29205fdc4257SSteve Yin 			memcpy(&pvData->lVal, rAnyVal.getValue(), sizeof(sal_uInt32));
29215fdc4257SSteve Yin 			break;
29225fdc4257SSteve Yin 
29235fdc4257SSteve Yin 		case TypeClass_FLOAT:
29245fdc4257SSteve Yin 			pvData->vt = VT_R4;
29255fdc4257SSteve Yin 			memcpy(&pvData->fltVal, rAnyVal.getValue(), sizeof(float));
29265fdc4257SSteve Yin 			break;
29275fdc4257SSteve Yin 
29285fdc4257SSteve Yin 		case TypeClass_DOUBLE:
29295fdc4257SSteve Yin 			pvData->vt = VT_R8;
29305fdc4257SSteve Yin 			memcpy(&pvData->dblVal, rAnyVal.getValue(), sizeof(double));
29315fdc4257SSteve Yin 			break;
29325fdc4257SSteve Yin 
29335fdc4257SSteve Yin 		case TypeClass_STRING:
29345fdc4257SSteve Yin 			{
29355fdc4257SSteve Yin 				pvData->vt = VT_BSTR;
29365fdc4257SSteve Yin 				::rtl::OUString val;
29375fdc4257SSteve Yin 				rAnyVal >>= val;
29385fdc4257SSteve Yin 				pvData->bstrVal = SysAllocString((OLECHAR *)val.getStr());
29395fdc4257SSteve Yin 				break;
29405fdc4257SSteve Yin 			}
29415fdc4257SSteve Yin 
29425fdc4257SSteve Yin 		case TypeClass_VOID:
29435fdc4257SSteve Yin 		case TypeClass_HYPER:
29445fdc4257SSteve Yin 		case TypeClass_UNSIGNED_HYPER:
29455fdc4257SSteve Yin 		case TypeClass_TYPE:
29465fdc4257SSteve Yin 		case TypeClass_ANY:
29475fdc4257SSteve Yin 		case TypeClass_ENUM:
29485fdc4257SSteve Yin 		case TypeClass_TYPEDEF:
29495fdc4257SSteve Yin 		case TypeClass_STRUCT:
29505fdc4257SSteve Yin 		case TypeClass_UNION:
29515fdc4257SSteve Yin 		case TypeClass_EXCEPTION:
29525fdc4257SSteve Yin 		case TypeClass_SEQUENCE:
29535fdc4257SSteve Yin 		case TypeClass_ARRAY:
29545fdc4257SSteve Yin 		case TypeClass_INTERFACE:
29555fdc4257SSteve Yin 			{
29565fdc4257SSteve Yin 				Reference< XAccessible > pXAcc;
29575fdc4257SSteve Yin 				if(rAnyVal >>= pXAcc)
29585fdc4257SSteve Yin 				{
29595fdc4257SSteve Yin 					if(pXAcc.is())
29605fdc4257SSteve Yin 					{
29615fdc4257SSteve Yin 						IAccessible* pIAcc = NULL;
29625fdc4257SSteve Yin 						get_IAccessibleFromXAccessible((long)pXAcc.get(), &pIAcc);
29635fdc4257SSteve Yin 						if(pIAcc == NULL)
29645fdc4257SSteve Yin 						{
29655fdc4257SSteve Yin 							Reference< XAccessibleContext > pXAccContext = pXAcc->getAccessibleContext();
29665fdc4257SSteve Yin 							g_pAgent->InsertAccObj(pXAcc.get(),pXAccContext->getAccessibleParent().get());
29675fdc4257SSteve Yin 							get_IAccessibleFromXAccessible((long)pXAcc.get(), &pIAcc);
29685fdc4257SSteve Yin 						}
29695fdc4257SSteve Yin 						if(pIAcc)
29705fdc4257SSteve Yin 						{
29715fdc4257SSteve Yin 							pIAcc->AddRef();
29725fdc4257SSteve Yin 
29735fdc4257SSteve Yin 							pvData->vt = VT_UNKNOWN;
29745fdc4257SSteve Yin 							pvData->pdispVal = (IAccessible2*)pIAcc;
29755fdc4257SSteve Yin 							break;
29765fdc4257SSteve Yin 						}
29775fdc4257SSteve Yin 					}
29785fdc4257SSteve Yin 				}
29795fdc4257SSteve Yin 			}
29805fdc4257SSteve Yin 		case TypeClass_SERVICE:
29815fdc4257SSteve Yin 		case TypeClass_MODULE:
29825fdc4257SSteve Yin 		case TypeClass_INTERFACE_METHOD:
29835fdc4257SSteve Yin 		case TypeClass_INTERFACE_ATTRIBUTE:
29845fdc4257SSteve Yin 		case TypeClass_UNKNOWN:
29855fdc4257SSteve Yin 		case TypeClass_PROPERTY:
29865fdc4257SSteve Yin 		case TypeClass_CONSTANT:
29875fdc4257SSteve Yin 		case TypeClass_CONSTANTS:
29885fdc4257SSteve Yin 		case TypeClass_SINGLETON:
29895fdc4257SSteve Yin 		case TypeClass_MAKE_FIXED_SIZE:
29905fdc4257SSteve Yin 			// Output the type string, if there is other uno value type.
29915fdc4257SSteve Yin 			pvData->vt = VT_BSTR;
29925fdc4257SSteve Yin 			pvData->bstrVal = SysAllocString(rAnyVal.getValueTypeName().getStr());
29935fdc4257SSteve Yin 			break;
29945fdc4257SSteve Yin 
29955fdc4257SSteve Yin 		default:
29965fdc4257SSteve Yin 			break;
29975fdc4257SSteve Yin 		}
29985fdc4257SSteve Yin 	}
29995fdc4257SSteve Yin 	else
30005fdc4257SSteve Yin 	{
30015fdc4257SSteve Yin 		VariantClear(pvData);
30025fdc4257SSteve Yin 	}
30035fdc4257SSteve Yin }
30045fdc4257SSteve Yin 
30055fdc4257SSteve Yin STDMETHODIMP CMAccessible::Get_XAccChildID(long* childID)
30065fdc4257SSteve Yin {
30075fdc4257SSteve Yin 	// #CHECK#
30085fdc4257SSteve Yin 	if(childID == NULL)
30095fdc4257SSteve Yin 	{
30105fdc4257SSteve Yin 		return E_FAIL;
30115fdc4257SSteve Yin 	}
30125fdc4257SSteve Yin 	*childID = m_dChildID;
30135fdc4257SSteve Yin 	return S_OK;
30145fdc4257SSteve Yin }
30155fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_states(AccessibleStates __RPC_FAR *states )
30165fdc4257SSteve Yin {
30175fdc4257SSteve Yin 
30185fdc4257SSteve Yin 	CHECK_ENABLE_INF
30195fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
30205fdc4257SSteve Yin 		ISDESTROY()
30215fdc4257SSteve Yin 		// #CHECK XInterface#
30225fdc4257SSteve Yin 		if( !pRContext.is() )
30235fdc4257SSteve Yin 			return E_FAIL;
30245fdc4257SSteve Yin 
30255fdc4257SSteve Yin 	Reference<XAccessibleStateSet> pRStateSet = pRContext.get()->getAccessibleStateSet();
30265fdc4257SSteve Yin 	if(!pRStateSet.is())
30275fdc4257SSteve Yin 	{
30285fdc4257SSteve Yin 		return S_OK;
30295fdc4257SSteve Yin 	}
30305fdc4257SSteve Yin 	Sequence<short> pStates = pRStateSet->getStates();
30315fdc4257SSteve Yin 
30325fdc4257SSteve Yin 
30335fdc4257SSteve Yin 	long count = pStates.getLength() ;
30345fdc4257SSteve Yin 	*states = 0x0;
30355fdc4257SSteve Yin 	for( int i = 0; i < count; i++  )
30365fdc4257SSteve Yin 	{
30375fdc4257SSteve Yin 		for( int j = 0; j < sizeof(UNO_STATES) / sizeof(UNO_STATES[0]); j++ )
30385fdc4257SSteve Yin 		{
30395fdc4257SSteve Yin 			if( pStates[i] == UNO_STATES[j] )
30405fdc4257SSteve Yin 			{
30415fdc4257SSteve Yin 				*states |= IA2_STATES[j];
30425fdc4257SSteve Yin 				break;
30435fdc4257SSteve Yin 			}
30445fdc4257SSteve Yin 		}
30455fdc4257SSteve Yin 	}
30465fdc4257SSteve Yin 	return S_OK;
30475fdc4257SSteve Yin 
30485fdc4257SSteve Yin 
30495fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
30505fdc4257SSteve Yin }
30515fdc4257SSteve Yin 
30525fdc4257SSteve Yin // return the UNO roles
30535fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_extendedRole( BSTR __RPC_FAR *  )
30545fdc4257SSteve Yin {
30555fdc4257SSteve Yin 
30565fdc4257SSteve Yin 	CHECK_ENABLE_INF
30575fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
30585fdc4257SSteve Yin 		ISDESTROY()
30595fdc4257SSteve Yin 
30605fdc4257SSteve Yin 		return E_NOTIMPL;
30615fdc4257SSteve Yin 
30625fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
30635fdc4257SSteve Yin }
30645fdc4257SSteve Yin 
30655fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_localizedExtendedRole( BSTR __RPC_FAR *  )
30665fdc4257SSteve Yin {
30675fdc4257SSteve Yin 
30685fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
30695fdc4257SSteve Yin 		ISDESTROY()
30705fdc4257SSteve Yin 		return E_NOTIMPL;
30715fdc4257SSteve Yin 
30725fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
30735fdc4257SSteve Yin }
30745fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_nExtendedStates( long __RPC_FAR * )
30755fdc4257SSteve Yin {
30765fdc4257SSteve Yin 
30775fdc4257SSteve Yin 	CHECK_ENABLE_INF
30785fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
30795fdc4257SSteve Yin 		ISDESTROY()
30805fdc4257SSteve Yin 
30815fdc4257SSteve Yin 		return E_NOTIMPL;
30825fdc4257SSteve Yin 
30835fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
30845fdc4257SSteve Yin }
30855fdc4257SSteve Yin 
30865fdc4257SSteve Yin 
30875fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_localizedExtendedStates( long, BSTR __RPC_FAR *__RPC_FAR *, long __RPC_FAR *)
30885fdc4257SSteve Yin {
30895fdc4257SSteve Yin 
30905fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
30915fdc4257SSteve Yin 		ISDESTROY()
30925fdc4257SSteve Yin 		return E_NOTIMPL;
30935fdc4257SSteve Yin 
30945fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
30955fdc4257SSteve Yin }
30965fdc4257SSteve Yin 
30975fdc4257SSteve Yin 
30985fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_indexInParent( long __RPC_FAR *accParentIndex)
30995fdc4257SSteve Yin {
31005fdc4257SSteve Yin 
31015fdc4257SSteve Yin 	CHECK_ENABLE_INF
31025fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
31035fdc4257SSteve Yin 		ISDESTROY()
31045fdc4257SSteve Yin 		// #CHECK#
31055fdc4257SSteve Yin 		if(accParentIndex == NULL)
31065fdc4257SSteve Yin 			return E_INVALIDARG;
31075fdc4257SSteve Yin 
31085fdc4257SSteve Yin 	// #CHECK XInterface#
31095fdc4257SSteve Yin 	if( !pRContext.is() )
31105fdc4257SSteve Yin 		return E_FAIL;
31115fdc4257SSteve Yin 
31125fdc4257SSteve Yin 	*accParentIndex = pRContext.get()->getAccessibleIndexInParent();
31135fdc4257SSteve Yin 	return S_OK;
31145fdc4257SSteve Yin 
31155fdc4257SSteve Yin 
31165fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
31175fdc4257SSteve Yin }
31185fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_locale( IA2Locale __RPC_FAR *locale  )
31195fdc4257SSteve Yin {
31205fdc4257SSteve Yin 
31215fdc4257SSteve Yin 	CHECK_ENABLE_INF
31225fdc4257SSteve Yin 		ENTER_PROTECTED_BLOCK
31235fdc4257SSteve Yin 		ISDESTROY()
31245fdc4257SSteve Yin 		if(locale == NULL)
31255fdc4257SSteve Yin 			return E_INVALIDARG;
31265fdc4257SSteve Yin 	// #CHECK XInterface#
31275fdc4257SSteve Yin 
31285fdc4257SSteve Yin 	if( !pRContext.is() )
31295fdc4257SSteve Yin 		return E_FAIL;
31305fdc4257SSteve Yin 
31315fdc4257SSteve Yin 	::com::sun::star::lang::Locale unoLoc = pRContext.get()->getLocale();
31325fdc4257SSteve Yin 	locale->language = SysAllocString((OLECHAR*)unoLoc.Language.getStr());
31335fdc4257SSteve Yin 	locale->country = SysAllocString((OLECHAR*)unoLoc.Country.getStr());
31345fdc4257SSteve Yin 	locale->variant = SysAllocString((OLECHAR*)unoLoc.Variant.getStr());
31355fdc4257SSteve Yin 
31365fdc4257SSteve Yin 	return S_OK;
31375fdc4257SSteve Yin 
31385fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
31395fdc4257SSteve Yin }
31405fdc4257SSteve Yin 
31415fdc4257SSteve Yin DWORD GetMSAAStateFromUNO(short xState)
31425fdc4257SSteve Yin {
31435fdc4257SSteve Yin 	DWORD IState = STATE_SYSTEM_UNAVAILABLE;
31445fdc4257SSteve Yin 	switch( xState )
31455fdc4257SSteve Yin 	{
31465fdc4257SSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::BUSY:
31475fdc4257SSteve Yin 		IState = STATE_SYSTEM_BUSY;
31485fdc4257SSteve Yin 		break;
31495fdc4257SSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::CHECKED:
31505fdc4257SSteve Yin 		IState = STATE_SYSTEM_CHECKED;
31515fdc4257SSteve Yin 		break;
31525fdc4257SSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::DEFUNC:
31535fdc4257SSteve Yin 		IState = STATE_SYSTEM_UNAVAILABLE;
31545fdc4257SSteve Yin 		break;
31555fdc4257SSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::EXPANDED:
31565fdc4257SSteve Yin 		IState = STATE_SYSTEM_EXPANDED;
31575fdc4257SSteve Yin 		break;
31585fdc4257SSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::FOCUSABLE:
31595fdc4257SSteve Yin 		IState = STATE_SYSTEM_FOCUSABLE;
31605fdc4257SSteve Yin 		break;
31615fdc4257SSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::FOCUSED:
31625fdc4257SSteve Yin 		IState = STATE_SYSTEM_FOCUSED;
31635fdc4257SSteve Yin 		break;
31645fdc4257SSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::INDETERMINATE:
31655fdc4257SSteve Yin 		IState = STATE_SYSTEM_MIXED;
31665fdc4257SSteve Yin 		break;
31675fdc4257SSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::MULTI_SELECTABLE:
31685fdc4257SSteve Yin 		IState = STATE_SYSTEM_MULTISELECTABLE;
31695fdc4257SSteve Yin 		break;
31705fdc4257SSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::PRESSED:
31715fdc4257SSteve Yin 		IState = STATE_SYSTEM_PRESSED;
31725fdc4257SSteve Yin 		break;
31735fdc4257SSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::RESIZABLE:
31745fdc4257SSteve Yin 		IState = STATE_SYSTEM_SIZEABLE;
31755fdc4257SSteve Yin 		break;
31765fdc4257SSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::SELECTABLE:
31775fdc4257SSteve Yin 		IState = STATE_SYSTEM_SELECTABLE;
31785fdc4257SSteve Yin 		break;
31795fdc4257SSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::SELECTED:
31805fdc4257SSteve Yin 		IState = STATE_SYSTEM_SELECTED;
31815fdc4257SSteve Yin 		break;
31825fdc4257SSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::ARMED:
31835fdc4257SSteve Yin 		IState = STATE_SYSTEM_FOCUSED;
31845fdc4257SSteve Yin 		break;
31855fdc4257SSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::EXPANDABLE:
31865fdc4257SSteve Yin 		IState = STATE_SYSTEM_COLLAPSED;
31875fdc4257SSteve Yin 		break;
31885fdc4257SSteve Yin 	default:
31895fdc4257SSteve Yin 		break;
31905fdc4257SSteve Yin 	}
31915fdc4257SSteve Yin 	return IState;
31925fdc4257SSteve Yin }
31935fdc4257SSteve Yin 
31945fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_appName( BSTR __RPC_FAR *name)
31955fdc4257SSteve Yin {
31965fdc4257SSteve Yin 
31975fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
31985fdc4257SSteve Yin 		ISDESTROY()
31995fdc4257SSteve Yin 		if(name == NULL)
32005fdc4257SSteve Yin 			return E_INVALIDARG;
32015fdc4257SSteve Yin 
32025fdc4257SSteve Yin 	*name = SysAllocString(OLESTR("Hannover"));
32035fdc4257SSteve Yin 	return S_OK;
32045fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
32055fdc4257SSteve Yin }
32065fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_appVersion(BSTR __RPC_FAR *version)
32075fdc4257SSteve Yin {
32085fdc4257SSteve Yin 
32095fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
32105fdc4257SSteve Yin 		ISDESTROY()
32115fdc4257SSteve Yin 		if(version == NULL)
32125fdc4257SSteve Yin 			return E_INVALIDARG;
32135fdc4257SSteve Yin 	*version=SysAllocString(OLESTR("3.0"));
32145fdc4257SSteve Yin 	return S_OK;
32155fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
32165fdc4257SSteve Yin }
32175fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_toolkitName(BSTR __RPC_FAR *name)
32185fdc4257SSteve Yin {
32195fdc4257SSteve Yin 
32205fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
32215fdc4257SSteve Yin 		ISDESTROY()
32225fdc4257SSteve Yin 		if(name == NULL)
32235fdc4257SSteve Yin 			return E_INVALIDARG;
32245fdc4257SSteve Yin 	*name = SysAllocString(OLESTR(" "));
32255fdc4257SSteve Yin 	return S_OK;
32265fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
32275fdc4257SSteve Yin }
32285fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_toolkitVersion(BSTR __RPC_FAR *version)
32295fdc4257SSteve Yin {
32305fdc4257SSteve Yin 
32315fdc4257SSteve Yin 	ENTER_PROTECTED_BLOCK
32325fdc4257SSteve Yin 		ISDESTROY()
32335fdc4257SSteve Yin 		if(version == NULL)
32345fdc4257SSteve Yin 			return E_INVALIDARG;
32355fdc4257SSteve Yin 	*version = SysAllocString(OLESTR(" "));
32365fdc4257SSteve Yin 	return S_OK;
32375fdc4257SSteve Yin 	LEAVE_PROTECTED_BLOCK
32385fdc4257SSteve Yin }
32395fdc4257SSteve Yin 
32405fdc4257SSteve Yin 
32415fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_attributes(/*[out]*/ BSTR *pAttr)
32425fdc4257SSteve Yin {
32435fdc4257SSteve Yin 	CHECK_ENABLE_INF
32445fdc4257SSteve Yin 		Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
32455fdc4257SSteve Yin 	if( !pRContext.is() )
32465fdc4257SSteve Yin 	{
32475fdc4257SSteve Yin 		return E_FAIL;
32485fdc4257SSteve Yin 	}
32495fdc4257SSteve Yin 	Reference<XAccessibleExtendedAttributes> pRXI(pRContext,UNO_QUERY);
32505fdc4257SSteve Yin 	if( !pRXI.is() )
32515fdc4257SSteve Yin 		return E_FAIL;
32525fdc4257SSteve Yin 	else
32535fdc4257SSteve Yin 	{
32545fdc4257SSteve Yin 		com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleExtendedAttributes> pRXAttr;
32555fdc4257SSteve Yin 		pRXAttr = pRXI.get();
32565fdc4257SSteve Yin 		::com::sun::star::uno::Any	anyVal = pRXAttr->getExtendedAttributes();
32575fdc4257SSteve Yin 
32585fdc4257SSteve Yin 		::rtl::OUString val;
32595fdc4257SSteve Yin 		anyVal >>= val;
32605fdc4257SSteve Yin 
32615fdc4257SSteve Yin 		if(*pAttr)
32625fdc4257SSteve Yin 			SAFE_SYSFREESTRING(*pAttr);
32635fdc4257SSteve Yin 		*pAttr = SysAllocString((OLECHAR *)val.getStr());
32645fdc4257SSteve Yin 
32655fdc4257SSteve Yin 		return S_OK;
32665fdc4257SSteve Yin 	}
32675fdc4257SSteve Yin }
32685fdc4257SSteve Yin 
3269