13a700b0aSSteve Yin /**************************************************************
2*b0a7a3cfSSteve Yin *
3*b0a7a3cfSSteve Yin * Licensed to the Apache Software Foundation (ASF) under one
4*b0a7a3cfSSteve Yin * or more contributor license agreements.  See the NOTICE file
5*b0a7a3cfSSteve Yin * distributed with this work for additional information
6*b0a7a3cfSSteve Yin * regarding copyright ownership.  The ASF licenses this file
7*b0a7a3cfSSteve Yin * to you under the Apache License, Version 2.0 (the
8*b0a7a3cfSSteve Yin * "License"); you may not use this file except in compliance
9*b0a7a3cfSSteve Yin * with the License.  You may obtain a copy of the License at
10*b0a7a3cfSSteve Yin *
11*b0a7a3cfSSteve Yin *   http://www.apache.org/licenses/LICENSE-2.0
12*b0a7a3cfSSteve Yin *
13*b0a7a3cfSSteve Yin * Unless required by applicable law or agreed to in writing,
14*b0a7a3cfSSteve Yin * software distributed under the License is distributed on an
15*b0a7a3cfSSteve Yin * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b0a7a3cfSSteve Yin * KIND, either express or implied.  See the License for the
17*b0a7a3cfSSteve Yin * specific language governing permissions and limitations
18*b0a7a3cfSSteve Yin * under the License.
19*b0a7a3cfSSteve Yin *
20*b0a7a3cfSSteve 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 
48*b0a7a3cfSSteve 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[] =
55*b0a7a3cfSSteve Yin {
56*b0a7a3cfSSteve Yin 	IA2_STATE_ACTIVE,					// =					0x1;
57*b0a7a3cfSSteve Yin 	IA2_STATE_ARMED,					// =					0x2;
58*b0a7a3cfSSteve Yin 	IA2_STATE_DEFUNCT,					// =					0x4;
59*b0a7a3cfSSteve Yin 	IA2_STATE_EDITABLE,					// =					0x8;
60*b0a7a3cfSSteve Yin 	IA2_STATE_HORIZONTAL,				// =					0x10;
61*b0a7a3cfSSteve Yin 	IA2_STATE_ICONIFIED,				// =					0x20;
62*b0a7a3cfSSteve Yin 	IA2_STATE_INVALID_ENTRY,			// =					0x80;
63*b0a7a3cfSSteve Yin 	IA2_STATE_MANAGES_DESCENDANTS,		// =					0x100;
64*b0a7a3cfSSteve Yin 	IA2_STATE_MODAL,					// =					0x200;
65*b0a7a3cfSSteve Yin 	IA2_STATE_MULTI_LINE,				// =					0x400;
66*b0a7a3cfSSteve Yin 	IA2_STATE_OPAQUE,					// =					0x800;
67*b0a7a3cfSSteve Yin 	IA2_STATE_REQUIRED,					// =					0x2000;
68*b0a7a3cfSSteve Yin 	IA2_STATE_SELECTABLE_TEXT,			// =					0x3000;
69*b0a7a3cfSSteve Yin 	IA2_STATE_SINGLE_LINE,				// =					0x4000;
70*b0a7a3cfSSteve Yin 	IA2_STATE_STALE,					// =					0x8000;
71*b0a7a3cfSSteve Yin 	IA2_STATE_SUPPORTS_AUTOCOMPLETION,	// =					0x10000;
72*b0a7a3cfSSteve Yin 	IA2_STATE_TRANSIENT,				//=						0x20000;
73*b0a7a3cfSSteve Yin 	IA2_STATE_VERTICAL					// =					0x40000;
74*b0a7a3cfSSteve Yin };
755fdc4257SSteve Yin /*
76*b0a7a3cfSSteve Yin 
775fdc4257SSteve Yin <=== map ===>
78*b0a7a3cfSSteve Yin 
795fdc4257SSteve Yin */
805fdc4257SSteve Yin short UNO_STATES[] =
81*b0a7a3cfSSteve Yin {
82*b0a7a3cfSSteve Yin 	ACTIVE,			// = (sal_Int16)1;
83*b0a7a3cfSSteve Yin 	ARMED,			// = (sal_Int16)2;
84*b0a7a3cfSSteve Yin 	DEFUNC,			// = (sal_Int16)5;
85*b0a7a3cfSSteve Yin 	EDITABLE,		// = (sal_Int16)6;
86*b0a7a3cfSSteve Yin 	HORIZONTAL,		// = (sal_Int16)12;
87*b0a7a3cfSSteve Yin 	ICONIFIED,		// = (sal_Int16)13;
88*b0a7a3cfSSteve Yin 	-1,				//IA2_STATE_INVALID_ENTRY
89*b0a7a3cfSSteve Yin 	MANAGES_DESCENDANTS, // = (sal_Int16)15;
90*b0a7a3cfSSteve Yin 	MODAL,			// = (sal_Int16)16;
91*b0a7a3cfSSteve Yin 	MULTI_LINE,		// = (sal_Int16)17;
92*b0a7a3cfSSteve Yin 	OPAQUE,			// = (sal_Int16)19;
93*b0a7a3cfSSteve Yin 	-1,				//IA2_STATE_REQUIRED
94*b0a7a3cfSSteve Yin 	-1,				//IA2_STATE_SELECTABLE_TEXT
95*b0a7a3cfSSteve Yin 	SINGLE_LINE,	// = (sal_Int16)26;
96*b0a7a3cfSSteve Yin 	STALE,			// = (sal_Int16)27;
97*b0a7a3cfSSteve Yin 	-1,				//IA2_STATE_SUPPORTS_AUTOCOMPLETION
98*b0a7a3cfSSteve Yin 	TRANSIENT,		//IA2_STATE_TRANSIENT
99*b0a7a3cfSSteve Yin 	VERTICAL		// = (sal_Int16)29;
100*b0a7a3cfSSteve Yin };
1015fdc4257SSteve Yin 
1025fdc4257SSteve Yin //  <=== map ===>
1035fdc4257SSteve Yin 
1045fdc4257SSteve Yin BSTR IA2_STATES_NAME[] =
105*b0a7a3cfSSteve Yin {
106*b0a7a3cfSSteve Yin 	_T("Active"),
107*b0a7a3cfSSteve Yin 	_T("Armed"),
108*b0a7a3cfSSteve Yin 	_T("Defunct"),
109*b0a7a3cfSSteve Yin 	_T("Editable"),
110*b0a7a3cfSSteve Yin 	_T("Horizontal"),
111*b0a7a3cfSSteve Yin 	_T("Iconified"),
112*b0a7a3cfSSteve Yin 	_T("Invalid Entry"),
113*b0a7a3cfSSteve Yin 	_T("Manages Decendents"),
114*b0a7a3cfSSteve Yin 	_T("Modal"),
115*b0a7a3cfSSteve Yin 	_T("Multi Line"),
116*b0a7a3cfSSteve Yin 	_T("Opaque"),
117*b0a7a3cfSSteve Yin 	_T("Required"),
118*b0a7a3cfSSteve Yin 	_T("Selectable Text"),
119*b0a7a3cfSSteve Yin 	_T("Single Line"),
120*b0a7a3cfSSteve Yin 	_T("Stale"),
121*b0a7a3cfSSteve Yin 	_T("Supports Autocompletion"),
122*b0a7a3cfSSteve Yin 	_T("Transient"),
123*b0a7a3cfSSteve Yin 	_T("Vertical")
124*b0a7a3cfSSteve 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[] =
130*b0a7a3cfSSteve Yin {
131*b0a7a3cfSSteve Yin 	_T("INVALID"),			// 	INVALID	( 0 )
132*b0a7a3cfSSteve Yin 	_T("ACTIVE"),			// 	ACTIVE	( 1 )
133*b0a7a3cfSSteve Yin 	_T("ARMED"),			// 	ARMED	( 2 )
134*b0a7a3cfSSteve Yin 	_T("BUSY"),				// 	BUSY	( 3 )
135*b0a7a3cfSSteve Yin 	_T("CHECKED"),			// 	CHECKED	( 4 )
136*b0a7a3cfSSteve Yin 	_T("DEFUNC"),			// 	DEFUNC	( 5 )
137*b0a7a3cfSSteve Yin 	_T("EDITABLE"),			// 	EDITABLE	( 6 )
138*b0a7a3cfSSteve Yin 	_T("ENABLED"),			// 	ENABLED	( 7 )
139*b0a7a3cfSSteve Yin 	_T("EXPANDABLE"),		// 	EXPANDABLE	( 8 )
140*b0a7a3cfSSteve Yin 	_T("EXPANDED"),			// 	EXPANDED	( 9 )
141*b0a7a3cfSSteve Yin 	_T("FOCUSABLE"),		// 	FOCUSABLE	( 10 )
142*b0a7a3cfSSteve Yin 	_T("FOCUSED"),			// 	FOCUSED	( 11 )
143*b0a7a3cfSSteve Yin 	_T("HORIZONTAL"),		// 	HORIZONTAL	( 12 )
144*b0a7a3cfSSteve Yin 	_T("ICONIFIED"),		// 	ICONIFIED	( 13 )
145*b0a7a3cfSSteve Yin 	_T("INDETERMINATE"),	// 	INDETERMINATE	( 14 )
146*b0a7a3cfSSteve Yin 	_T("MANAGES_DESCENDANTS"),// 	MANAGES_DESCENDANTS	( 15 )
147*b0a7a3cfSSteve Yin 	_T("MODAL"),			// 	MODAL	( 16 )
148*b0a7a3cfSSteve Yin 	_T("MULTI_LINE"),		// 	MULTI_LINE	( 17 )
149*b0a7a3cfSSteve Yin 	_T("MULTI_SELECTABLE"),	// 	MULTI_SELECTABLE	( 18 )
150*b0a7a3cfSSteve Yin 	_T("OPAQUE"),			// 	OPAQUE	( 19 )
151*b0a7a3cfSSteve Yin 	_T("PRESSED"),			// 	PRESSED	( 20 )
152*b0a7a3cfSSteve Yin 	_T("RESIZABLE"),		// 	RESIZABLE	( 21 )
153*b0a7a3cfSSteve Yin 	_T("SELECTABLE"),		// 	SELECTABLE	( 22 )
154*b0a7a3cfSSteve Yin 	_T("SELECTED"),			// 	SELECTED	( 23 )
155*b0a7a3cfSSteve Yin 	_T("SENSITIVE"),		// 	SENSITIVE	( 24 )
156*b0a7a3cfSSteve Yin 	_T("SHOWING"),			// 	SHOWING	( 25 )
157*b0a7a3cfSSteve Yin 	_T("SINGLE_LINE"),		// 	SINGLE_LINE	( 26 )
158*b0a7a3cfSSteve Yin 	_T("STALE"),			// 	STALE	( 27 )
159*b0a7a3cfSSteve Yin 	_T("TRANSIENT"),		// 	TRANSIENT	( 28 )
160*b0a7a3cfSSteve Yin 	_T("VERTICAL"),			// 	VERTICAL	( 29 )
161*b0a7a3cfSSteve Yin 	_T("VISIBLE"),			// 	VISIBLE	( 30 )
162*b0a7a3cfSSteve Yin 	_T("MOVEABLE"),			//  MOVEABLE ( 31 )
163*b0a7a3cfSSteve Yin 	_T("OFFSCREEN"),		//  OFFSCREEN ( 32 )
164*b0a7a3cfSSteve Yin 	_T("COLLAPSE"),			//  COLLAPSE ( 33 )
165*b0a7a3cfSSteve Yin 	_T("DEFAULT")			//  DEFAULT ( 34 )
166*b0a7a3cfSSteve 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)		\
176*b0a7a3cfSSteve Yin 	return FALSE;		\
1775fdc4257SSteve Yin 	pRContext = pXAcc->getAccessibleContext();	\
1785fdc4257SSteve Yin 	if( !pRContext.is() )	\
179*b0a7a3cfSSteve Yin {						\
180*b0a7a3cfSSteve Yin 	return FALSE;		\
181*b0a7a3cfSSteve Yin }						\
1825fdc4257SSteve Yin 	Reference<X##ainterface> pRXI(pRContext,UNO_QUERY);\
1835fdc4257SSteve Yin 	if( !pRXI.is() )		\
184*b0a7a3cfSSteve Yin {						\
185*b0a7a3cfSSteve Yin 	return FALSE;		\
186*b0a7a3cfSSteve Yin }						\
1875fdc4257SSteve Yin 	*ppXI = (XInterface*)pRXI.get();		\
1885fdc4257SSteve Yin 	return TRUE;			\
1895fdc4257SSteve Yin }
1905fdc4257SSteve Yin 
1915fdc4257SSteve Yin #define ISDESTROY()	\
1925fdc4257SSteve Yin 	if(m_isDestroy)	\
193*b0a7a3cfSSteve Yin 	return S_FALSE;
1945fdc4257SSteve Yin 
1955fdc4257SSteve Yin 
1965fdc4257SSteve Yin AccObjectManagerAgent* CMAccessible::g_pAgent = NULL;
1975fdc4257SSteve Yin 
1985fdc4257SSteve Yin CMAccessible::CMAccessible():
199*b0a7a3cfSSteve Yin m_iRole(0x00),
200*b0a7a3cfSSteve Yin m_dState(0x00),
201*b0a7a3cfSSteve Yin m_dChildID(0x00),
202*b0a7a3cfSSteve Yin m_dFocusChildID(UACC_NO_FOCUS),
203*b0a7a3cfSSteve Yin m_hwnd(NULL),
204*b0a7a3cfSSteve Yin m_pIParent(NULL),
205*b0a7a3cfSSteve Yin m_pszName(NULL),
206*b0a7a3cfSSteve Yin m_pszValue(NULL),
207*b0a7a3cfSSteve Yin m_pszDescription(NULL),
208*b0a7a3cfSSteve Yin m_isDestroy(FALSE),
209*b0a7a3cfSSteve Yin m_pszActionDescription(NULL),
210*b0a7a3cfSSteve Yin m_pXAction(NULL),
211*b0a7a3cfSSteve Yin m_bRequiresSave(FALSE),
212*b0a7a3cfSSteve Yin pUNOInterface(NULL)
213*b0a7a3cfSSteve Yin {
214*b0a7a3cfSSteve Yin 	m_sLocation.m_dLeft=0;
215*b0a7a3cfSSteve Yin 	m_sLocation.m_dTop = 0;
216*b0a7a3cfSSteve Yin 	m_sLocation.m_dWidth=0;
217*b0a7a3cfSSteve Yin 	m_sLocation.m_dHeight=0;
218*b0a7a3cfSSteve Yin 	CEnumVariant::Create(&m_pEnumVar);
2195fdc4257SSteve Yin }
2205fdc4257SSteve Yin 
2215fdc4257SSteve Yin CMAccessible::~CMAccessible()
2225fdc4257SSteve Yin {
223*b0a7a3cfSSteve Yin 	if(m_pszName!=NULL)
224*b0a7a3cfSSteve Yin 	{
225*b0a7a3cfSSteve Yin 		SAFE_SYSFREESTRING(m_pszName);
226*b0a7a3cfSSteve Yin 		m_pszName=NULL;
227*b0a7a3cfSSteve Yin 	}
228*b0a7a3cfSSteve Yin 	if(m_pszValue!=NULL)
229*b0a7a3cfSSteve Yin 	{
230*b0a7a3cfSSteve Yin 		SAFE_SYSFREESTRING(m_pszValue);
231*b0a7a3cfSSteve Yin 		m_pszValue=NULL;
232*b0a7a3cfSSteve Yin 	}
233*b0a7a3cfSSteve Yin 	if(m_pszDescription!=NULL)
234*b0a7a3cfSSteve Yin 	{
235*b0a7a3cfSSteve Yin 		SAFE_SYSFREESTRING(m_pszDescription);
236*b0a7a3cfSSteve Yin 		m_pszDescription=NULL;
237*b0a7a3cfSSteve Yin 	}
238*b0a7a3cfSSteve Yin 
239*b0a7a3cfSSteve Yin 	if(m_pszActionDescription!=NULL)
240*b0a7a3cfSSteve Yin 	{
241*b0a7a3cfSSteve Yin 		SAFE_SYSFREESTRING(m_pszActionDescription);
242*b0a7a3cfSSteve Yin 		m_pszActionDescription=NULL;
243*b0a7a3cfSSteve Yin 	}
244*b0a7a3cfSSteve Yin 
245*b0a7a3cfSSteve Yin 	if(m_pIParent)
246*b0a7a3cfSSteve Yin 	{
247*b0a7a3cfSSteve Yin 		m_pIParent->Release();
248*b0a7a3cfSSteve Yin 		m_pIParent=NULL;
249*b0a7a3cfSSteve Yin 	}
250*b0a7a3cfSSteve Yin 	pRef = NULL;
251*b0a7a3cfSSteve Yin 	m_pEnumVar->Release();
252*b0a7a3cfSSteve Yin 	m_containedObjects.clear();
253*b0a7a3cfSSteve Yin 	pRContext = NULL;
2545fdc4257SSteve Yin }
2555fdc4257SSteve Yin 
2565fdc4257SSteve Yin /**
2575fdc4257SSteve Yin * Returns the Parent IAccessible interface pointer to AT.
2585fdc4257SSteve Yin * It should add reference, and the client should release the component.
2595fdc4257SSteve Yin * It should return E_FAIL when the parent point is null.
2605fdc4257SSteve Yin * @param	ppdispParent [in,out] used to return the parent interface point.
2615fdc4257SSteve Yin *			when the point is null, should return null.
2625fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if the m_pIParent is NULL.
2635fdc4257SSteve Yin */
2645fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accParent(IDispatch **ppdispParent)
2655fdc4257SSteve Yin {
266*b0a7a3cfSSteve Yin 
2675fdc4257SSteve Yin 	CHECK_ENABLE_INF
268*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
269*b0a7a3cfSSteve Yin 		ISDESTROY()
270*b0a7a3cfSSteve Yin 		// #CHECK#
271*b0a7a3cfSSteve Yin 		if(ppdispParent == NULL)
272*b0a7a3cfSSteve Yin 		{
273*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
274*b0a7a3cfSSteve Yin 		}
275*b0a7a3cfSSteve Yin 
276*b0a7a3cfSSteve Yin 		if(m_pIParent)
277*b0a7a3cfSSteve Yin 		{
278*b0a7a3cfSSteve Yin 			*ppdispParent = m_pIParent;
279*b0a7a3cfSSteve Yin 			(*ppdispParent)->AddRef();
280*b0a7a3cfSSteve Yin 			return S_OK;
281*b0a7a3cfSSteve Yin 		}
282*b0a7a3cfSSteve Yin 		else if(m_hwnd)
283*b0a7a3cfSSteve Yin 		{
284*b0a7a3cfSSteve Yin 			HRESULT hr = AccessibleObjectFromWindow(m_hwnd, OBJID_WINDOW, IID_IAccessible, (void**)ppdispParent);
285*b0a7a3cfSSteve Yin 			if( ! SUCCEEDED( hr ) || ! ppdispParent )
286*b0a7a3cfSSteve Yin 			{
287*b0a7a3cfSSteve Yin 				return S_FALSE;
288*b0a7a3cfSSteve Yin 			}
289*b0a7a3cfSSteve Yin 			return S_OK;
290*b0a7a3cfSSteve Yin 		}
291*b0a7a3cfSSteve Yin 		return S_FALSE;
292*b0a7a3cfSSteve Yin 
293*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
2945fdc4257SSteve Yin }
2955fdc4257SSteve Yin 
2965fdc4257SSteve Yin /**
2975fdc4257SSteve Yin * Returns child count of current COM object.
2985fdc4257SSteve Yin * @param	pcountChildren [in,out] used to return the children count.
2995fdc4257SSteve Yin * @return   S_OK if successful.
3005fdc4257SSteve Yin */
3015fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accChildCount(long *pcountChildren)
3025fdc4257SSteve Yin {
303*b0a7a3cfSSteve Yin 
3045fdc4257SSteve Yin 	CHECK_ENABLE_INF
305*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
306*b0a7a3cfSSteve Yin 		ISDESTROY()
307*b0a7a3cfSSteve Yin 		// #CHECK#
308*b0a7a3cfSSteve Yin 		if(pcountChildren == NULL)
309*b0a7a3cfSSteve Yin 		{
310*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
311*b0a7a3cfSSteve Yin 		}
3125fdc4257SSteve Yin 
313*b0a7a3cfSSteve Yin 		if(!pUNOInterface)
314*b0a7a3cfSSteve Yin 			return S_FALSE;
3155fdc4257SSteve Yin 
316*b0a7a3cfSSteve Yin 		Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext();
317*b0a7a3cfSSteve Yin 		if( pRContext.is() )
318*b0a7a3cfSSteve Yin 		{
319*b0a7a3cfSSteve Yin 			*pcountChildren = pRContext->getAccessibleChildCount();
320*b0a7a3cfSSteve Yin 		}
3215fdc4257SSteve Yin 
322*b0a7a3cfSSteve Yin 		return S_OK;
3235fdc4257SSteve Yin 
324*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
3255fdc4257SSteve Yin }
3265fdc4257SSteve Yin 
3275fdc4257SSteve Yin /**
3285fdc4257SSteve Yin * Returns child interface pointer for AT according to input child ID.
3295fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
3305fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
3315fdc4257SSteve Yin * @param	ppdispChild, [in,out] use to return the child interface point.
3325fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
3335fdc4257SSteve Yin */
3345fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accChild(VARIANT varChild, IDispatch **ppdispChild)
3355fdc4257SSteve Yin {
336*b0a7a3cfSSteve Yin 
3375fdc4257SSteve Yin 	CHECK_ENABLE_INF
338*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
339*b0a7a3cfSSteve Yin 		ISDESTROY()
340*b0a7a3cfSSteve Yin 		// #CHECK#
341*b0a7a3cfSSteve Yin 		if(ppdispChild == NULL)
342*b0a7a3cfSSteve Yin 		{
343*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
344*b0a7a3cfSSteve Yin 		}
345*b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
346*b0a7a3cfSSteve Yin 		{
347*b0a7a3cfSSteve Yin 			//get child interface pointer due to child ID
348*b0a7a3cfSSteve Yin 			if(varChild.lVal==CHILDID_SELF)
349*b0a7a3cfSSteve Yin 			{
350*b0a7a3cfSSteve Yin 				AddRef();
351*b0a7a3cfSSteve Yin 				*ppdispChild = this;
352*b0a7a3cfSSteve Yin 				return S_OK;
353*b0a7a3cfSSteve Yin 			}
354*b0a7a3cfSSteve Yin 			*ppdispChild = GetChildInterface(varChild.lVal);
355*b0a7a3cfSSteve Yin 			(*ppdispChild)->AddRef();
356*b0a7a3cfSSteve Yin 			return (*ppdispChild)?S_OK:S_FALSE;
357*b0a7a3cfSSteve Yin 		}
358*b0a7a3cfSSteve Yin 		return S_FALSE;
359*b0a7a3cfSSteve Yin 
360*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
3615fdc4257SSteve Yin }
3625fdc4257SSteve Yin 
3635fdc4257SSteve Yin /**
3645fdc4257SSteve Yin * Returns the accessible name of the current COM object self or its one child to AT.
3655fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
3665fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
3675fdc4257SSteve Yin * @param	pszName, [in,out] use to return the name of the proper object.
3685fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
3695fdc4257SSteve Yin */
3705fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accName(VARIANT varChild, BSTR *pszName)
3715fdc4257SSteve Yin {
372*b0a7a3cfSSteve Yin 
3735fdc4257SSteve Yin 	CHECK_ENABLE_INF
374*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
375*b0a7a3cfSSteve Yin 		ISDESTROY()
376*b0a7a3cfSSteve Yin 		// #CHECK#
377*b0a7a3cfSSteve Yin 		if(pszName == NULL)
378*b0a7a3cfSSteve Yin 		{
379*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
380*b0a7a3cfSSteve Yin 		}
381*b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
382*b0a7a3cfSSteve Yin 		{
383*b0a7a3cfSSteve Yin 			if(varChild.lVal==CHILDID_SELF)
384*b0a7a3cfSSteve Yin 			{
385*b0a7a3cfSSteve Yin 				SAFE_SYSFREESTRING(*pszName);
386*b0a7a3cfSSteve Yin 				*pszName = SysAllocString(m_pszName);
387*b0a7a3cfSSteve Yin 				return S_OK;
388*b0a7a3cfSSteve Yin 			}
389*b0a7a3cfSSteve Yin 
390*b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
391*b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
392*b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
393*b0a7a3cfSSteve Yin 			if(!pChild)
394*b0a7a3cfSSteve Yin 				return E_FAIL;
395*b0a7a3cfSSteve Yin 			return pChild->get_accName(varChild,pszName);
396*b0a7a3cfSSteve Yin 		}
397*b0a7a3cfSSteve Yin 		return S_FALSE;
398*b0a7a3cfSSteve Yin 
399*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
4005fdc4257SSteve Yin }
4015fdc4257SSteve Yin 
4025fdc4257SSteve Yin /**
4035fdc4257SSteve Yin * Returns the accessible value of the current COM object self or its one child to AT.
4045fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
4055fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
4065fdc4257SSteve Yin * @param	pszValue, [in,out] use to return the value of the proper object.
4075fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
4085fdc4257SSteve Yin */
4095fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accValue(VARIANT varChild, BSTR *pszValue)
4105fdc4257SSteve Yin {
411*b0a7a3cfSSteve Yin 
4125fdc4257SSteve Yin 	CHECK_ENABLE_INF
413*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
414*b0a7a3cfSSteve Yin 		ISDESTROY()
415*b0a7a3cfSSteve Yin 		// #CHECK#
416*b0a7a3cfSSteve Yin 		if( pszValue == NULL )
417*b0a7a3cfSSteve Yin 		{
418*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
419*b0a7a3cfSSteve Yin 		}
420*b0a7a3cfSSteve Yin 		if( varChild.vt==VT_I4 )
421*b0a7a3cfSSteve Yin 		{
422*b0a7a3cfSSteve Yin 			if(varChild.lVal==CHILDID_SELF)
423*b0a7a3cfSSteve Yin 			{
424*b0a7a3cfSSteve Yin 				if(m_dState & STATE_SYSTEM_PROTECTED)
425*b0a7a3cfSSteve Yin 					return E_ACCESSDENIED;
426*b0a7a3cfSSteve Yin 
427*b0a7a3cfSSteve Yin 				if ( m_pszValue !=NULL && wcslen(m_pszValue) == 0 )
428*b0a7a3cfSSteve Yin 					return S_OK;
429*b0a7a3cfSSteve Yin 
430*b0a7a3cfSSteve Yin 				SAFE_SYSFREESTRING(*pszValue);
431*b0a7a3cfSSteve Yin 				*pszValue = SysAllocString(m_pszValue);
432*b0a7a3cfSSteve Yin 				return S_OK;
433*b0a7a3cfSSteve Yin 			}
434*b0a7a3cfSSteve Yin 
435*b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
436*b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
437*b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
438*b0a7a3cfSSteve Yin 			if(!pChild)
439*b0a7a3cfSSteve Yin 				return E_FAIL;
440*b0a7a3cfSSteve Yin 			return pChild->get_accValue(varChild,pszValue);
441*b0a7a3cfSSteve Yin 		}
442*b0a7a3cfSSteve Yin 		return S_FALSE;
443*b0a7a3cfSSteve Yin 
444*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
4455fdc4257SSteve Yin }
4465fdc4257SSteve Yin 
4475fdc4257SSteve Yin /**
4485fdc4257SSteve Yin * Returns the accessible description of the current COM object self or its one child to AT.
4495fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
4505fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
4515fdc4257SSteve Yin * @param	pszDescription, [in,out] use to return the description of the proper object.
4525fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
4535fdc4257SSteve Yin */
4545fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accDescription(VARIANT varChild, BSTR *pszDescription)
4555fdc4257SSteve Yin {
456*b0a7a3cfSSteve Yin 
4575fdc4257SSteve Yin 	CHECK_ENABLE_INF
458*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
459*b0a7a3cfSSteve Yin 		ISDESTROY()
460*b0a7a3cfSSteve Yin 		// #CHECK#
461*b0a7a3cfSSteve Yin 		if(pszDescription == NULL)
462*b0a7a3cfSSteve Yin 		{
463*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
464*b0a7a3cfSSteve Yin 		}
465*b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
466*b0a7a3cfSSteve Yin 		{
467*b0a7a3cfSSteve Yin 			if(varChild.lVal==CHILDID_SELF)
468*b0a7a3cfSSteve Yin 			{
469*b0a7a3cfSSteve Yin 				SAFE_SYSFREESTRING(*pszDescription);
470*b0a7a3cfSSteve Yin 				*pszDescription = SysAllocString(m_pszDescription);
471*b0a7a3cfSSteve Yin 				return S_OK;
472*b0a7a3cfSSteve Yin 			}
473*b0a7a3cfSSteve Yin 
474*b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
475*b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
476*b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
477*b0a7a3cfSSteve Yin 			if(!pChild)
478*b0a7a3cfSSteve Yin 				return E_FAIL;
479*b0a7a3cfSSteve Yin 			return pChild->get_accDescription(varChild,pszDescription);
480*b0a7a3cfSSteve Yin 		}
481*b0a7a3cfSSteve Yin 		return S_FALSE;
482*b0a7a3cfSSteve Yin 
483*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
4845fdc4257SSteve Yin }
4855fdc4257SSteve Yin 
4865fdc4257SSteve Yin /**
4875fdc4257SSteve Yin * Returns the accessible role of the current COM object self or its one child to AT.
4885fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
4895fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
4905fdc4257SSteve Yin * @param	pvarRole, [in,out] use to return the role of the proper object.
4915fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
4925fdc4257SSteve Yin */
4935fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accRole(VARIANT varChild, VARIANT *pvarRole)
4945fdc4257SSteve Yin {
495*b0a7a3cfSSteve Yin 
4965fdc4257SSteve Yin 	CHECK_ENABLE_INF
497*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
498*b0a7a3cfSSteve Yin 		ISDESTROY()
499*b0a7a3cfSSteve Yin 		// #CHECK#
500*b0a7a3cfSSteve Yin 		if(pvarRole == NULL)
501*b0a7a3cfSSteve Yin 		{
502*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
503*b0a7a3cfSSteve Yin 		}
504*b0a7a3cfSSteve Yin 		if(varChild.vt == VT_I4)
505*b0a7a3cfSSteve Yin 		{
506*b0a7a3cfSSteve Yin 
507*b0a7a3cfSSteve Yin 			if(varChild.lVal == CHILDID_SELF)
508*b0a7a3cfSSteve Yin 			{
509*b0a7a3cfSSteve Yin 				if( m_iRole < IA2_ROLE_CAPTION )
510*b0a7a3cfSSteve Yin 				{
511*b0a7a3cfSSteve Yin 					VariantInit(pvarRole);
512*b0a7a3cfSSteve Yin 					pvarRole->vt = VT_I4;
513*b0a7a3cfSSteve Yin 					pvarRole->lVal = m_iRole;
514*b0a7a3cfSSteve Yin 				}
515*b0a7a3cfSSteve Yin 				else
516*b0a7a3cfSSteve Yin 				{
517*b0a7a3cfSSteve Yin 					VariantInit(pvarRole);
518*b0a7a3cfSSteve Yin 					pvarRole->vt = VT_I4;
519*b0a7a3cfSSteve Yin 					pvarRole->lVal = ROLE_SYSTEM_CLIENT;
520*b0a7a3cfSSteve Yin 				}
521*b0a7a3cfSSteve Yin 				return S_OK;
522*b0a7a3cfSSteve Yin 			}
523*b0a7a3cfSSteve Yin 
524*b0a7a3cfSSteve Yin 
525*b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
526*b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
527*b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
528*b0a7a3cfSSteve Yin 			if(!pChild)
529*b0a7a3cfSSteve Yin 				return E_FAIL;
530*b0a7a3cfSSteve Yin 			return pChild->get_accRole(varChild,pvarRole);
531*b0a7a3cfSSteve Yin 		}
532*b0a7a3cfSSteve Yin 		return S_FALSE;
533*b0a7a3cfSSteve Yin 
534*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
5355fdc4257SSteve Yin }
5365fdc4257SSteve Yin 
5375fdc4257SSteve Yin /**
5385fdc4257SSteve Yin * Returns the accessible state of the current COM object self or its one child to AT.
5395fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
5405fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
5415fdc4257SSteve Yin * @param	pvarState, [in,out] use to return the state of the proper object.
5425fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
5435fdc4257SSteve Yin */
5445fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accState(VARIANT varChild, VARIANT *pvarState)
5455fdc4257SSteve Yin {
546*b0a7a3cfSSteve Yin 
5475fdc4257SSteve Yin 	CHECK_ENABLE_INF
548*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
549*b0a7a3cfSSteve Yin 		ISDESTROY()
550*b0a7a3cfSSteve Yin 		// #CHECK#
551*b0a7a3cfSSteve Yin 		if(pvarState == NULL)
552*b0a7a3cfSSteve Yin 		{
553*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
554*b0a7a3cfSSteve Yin 		}
555*b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
556*b0a7a3cfSSteve Yin 		{
557*b0a7a3cfSSteve Yin 			if(varChild.lVal == CHILDID_SELF)
558*b0a7a3cfSSteve Yin 			{
559*b0a7a3cfSSteve Yin 				if(pUNOInterface)
560*b0a7a3cfSSteve Yin 				{
561*b0a7a3cfSSteve Yin 					Reference< XAccessibleContext > pContext = pUNOInterface->getAccessibleContext();
562*b0a7a3cfSSteve Yin 					if(pContext.is())
563*b0a7a3cfSSteve Yin 					{
564*b0a7a3cfSSteve Yin 						// add the STATE_SYSTEM_LINKED state
565*b0a7a3cfSSteve Yin 						Reference< XAccessibleHypertext > pRHypertext(pContext,UNO_QUERY);
566*b0a7a3cfSSteve Yin 						if(pRHypertext.is())
567*b0a7a3cfSSteve Yin 						{
568*b0a7a3cfSSteve Yin 							if( pRHypertext->getHyperLinkCount() > 0 )
569*b0a7a3cfSSteve Yin 								m_dState |= STATE_SYSTEM_LINKED;
570*b0a7a3cfSSteve Yin 							else
571*b0a7a3cfSSteve Yin 								m_dState &= ~STATE_SYSTEM_LINKED;
572*b0a7a3cfSSteve Yin 						}
573*b0a7a3cfSSteve Yin 						else
574*b0a7a3cfSSteve Yin 							m_dState &= ~STATE_SYSTEM_LINKED;
575*b0a7a3cfSSteve Yin 					}
576*b0a7a3cfSSteve Yin 				}
577*b0a7a3cfSSteve Yin 
578*b0a7a3cfSSteve Yin 				VariantInit(pvarState);
579*b0a7a3cfSSteve Yin 				pvarState->vt = VT_I4;
580*b0a7a3cfSSteve Yin 				pvarState->lVal = m_dState;
581*b0a7a3cfSSteve Yin 				return S_OK;
582*b0a7a3cfSSteve Yin 			}
583*b0a7a3cfSSteve Yin 
584*b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
585*b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
586*b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
587*b0a7a3cfSSteve Yin 			if(!pChild)
588*b0a7a3cfSSteve Yin 				return E_FAIL;
589*b0a7a3cfSSteve Yin 			return pChild->get_accState(varChild,pvarState);
590*b0a7a3cfSSteve Yin 		}
591*b0a7a3cfSSteve Yin 		return S_FALSE;
592*b0a7a3cfSSteve Yin 
593*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
5945fdc4257SSteve Yin }
5955fdc4257SSteve Yin 
5965fdc4257SSteve Yin /**
5975fdc4257SSteve Yin * Returns the accessible helpString of the current COM object self or its one child to AT.
5985fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
5995fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
6005fdc4257SSteve Yin * @param	pszHelp, [in,out] use to return the helpString of the proper object.
6015fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
6025fdc4257SSteve Yin */
6035fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accHelp(VARIANT, BSTR *)
6045fdc4257SSteve Yin {
605*b0a7a3cfSSteve Yin 	return E_NOTIMPL;
6065fdc4257SSteve Yin }
6075fdc4257SSteve Yin 
6085fdc4257SSteve Yin /**
6095fdc4257SSteve Yin * Returns the accessible HelpTopic of the current COM object self or its one child to AT.
6105fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
6115fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
6125fdc4257SSteve Yin * @param	pszHelpFile, [in,out] use to return the HelpTopic of the proper object.
6135fdc4257SSteve Yin * @param	pidTopic, use to return the HelpTopic ID of the proper object.
6145fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
6155fdc4257SSteve Yin * Not implemented yet
6165fdc4257SSteve Yin */
6175fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accHelpTopic(BSTR *, VARIANT, long *)
6185fdc4257SSteve Yin {
619*b0a7a3cfSSteve Yin 	return E_NOTIMPL;
6205fdc4257SSteve Yin }
6215fdc4257SSteve Yin 
6225fdc4257SSteve Yin static void GetMnemonicChar( const ::rtl::OUString& aStr, WCHAR* wStr)
6235fdc4257SSteve Yin {
624*b0a7a3cfSSteve Yin 	int  nLen    = aStr.pData->length;
625*b0a7a3cfSSteve Yin 	int  i       = 0;
626*b0a7a3cfSSteve Yin 	WCHAR* text = aStr.pData->buffer;
6275fdc4257SSteve Yin 
628*b0a7a3cfSSteve Yin 	while ( i < nLen )
629*b0a7a3cfSSteve Yin 	{
630*b0a7a3cfSSteve Yin 		if ( text[i] == L'~' )
631*b0a7a3cfSSteve Yin 			if ( text[i+1] != L'~' )
632*b0a7a3cfSSteve Yin 			{
633*b0a7a3cfSSteve Yin 				wStr[0] = text[i+1];
634*b0a7a3cfSSteve Yin 				break;
635*b0a7a3cfSSteve Yin 			}
636*b0a7a3cfSSteve Yin 			i++;
637*b0a7a3cfSSteve Yin 	}
6385fdc4257SSteve Yin }
6395fdc4257SSteve Yin 
6405fdc4257SSteve Yin /**
6415fdc4257SSteve Yin * Returns the accessible keyboard shortcut of the current COM object self or its one child to AT.
6425fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
6435fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
6445fdc4257SSteve Yin * @param	pszKeyboardShortcut, [in,out] use to return the kbshortcut of the proper object.
6455fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
6465fdc4257SSteve Yin */
6475fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accKeyboardShortcut(VARIANT varChild, BSTR *pszKeyboardShortcut)
6485fdc4257SSteve Yin {
649*b0a7a3cfSSteve Yin 
6505fdc4257SSteve Yin 	CHECK_ENABLE_INF
651*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
652*b0a7a3cfSSteve Yin 
653*b0a7a3cfSSteve Yin 		ISDESTROY()
654*b0a7a3cfSSteve Yin 		// #CHECK#
655*b0a7a3cfSSteve Yin 		if(pszKeyboardShortcut == NULL)
656*b0a7a3cfSSteve Yin 		{
657*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
658*b0a7a3cfSSteve Yin 		}
659*b0a7a3cfSSteve Yin 
660*b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
661*b0a7a3cfSSteve Yin 		{
662*b0a7a3cfSSteve Yin 			if(varChild.lVal == CHILDID_SELF)
663*b0a7a3cfSSteve Yin 			{
664*b0a7a3cfSSteve Yin 				if( pUNOInterface )
665*b0a7a3cfSSteve Yin 				{
666*b0a7a3cfSSteve Yin 					Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
667*b0a7a3cfSSteve Yin 					if( !pRContext.is() )
668*b0a7a3cfSSteve Yin 						return S_FALSE;
669*b0a7a3cfSSteve Yin 
670*b0a7a3cfSSteve Yin 					Reference<XAccessibleAction> pRXI(pRContext,UNO_QUERY);
671*b0a7a3cfSSteve Yin 
672*b0a7a3cfSSteve Yin 					OLECHAR wString[64]={0};
673*b0a7a3cfSSteve Yin 
674*b0a7a3cfSSteve Yin 					if( pRXI.is() && pRXI->getAccessibleActionCount() >= 1)
675*b0a7a3cfSSteve Yin 					{
676*b0a7a3cfSSteve Yin 						Reference< XAccessibleKeyBinding > binding = pRXI->getAccessibleActionKeyBinding(0);
677*b0a7a3cfSSteve Yin 						if( binding.is() )
678*b0a7a3cfSSteve Yin 						{
679*b0a7a3cfSSteve Yin 							long nCount = binding->getAccessibleKeyBindingCount();
680*b0a7a3cfSSteve Yin 							if(nCount >= 1)
681*b0a7a3cfSSteve Yin 							{
682*b0a7a3cfSSteve Yin 								CAccAction::GetkeyBindingStrByXkeyBinding( binding->getAccessibleKeyBinding(0),wString );
683*b0a7a3cfSSteve Yin 							}
684*b0a7a3cfSSteve Yin 						}
685*b0a7a3cfSSteve Yin 					}
686*b0a7a3cfSSteve Yin 					if(wString[0] == 0)
687*b0a7a3cfSSteve Yin 					{
688*b0a7a3cfSSteve Yin 						Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet();
689*b0a7a3cfSSteve Yin 						if(!pRrelationSet.is())
6905fdc4257SSteve Yin 						{
691*b0a7a3cfSSteve Yin 							return S_FALSE;
6925fdc4257SSteve Yin 						}
6935fdc4257SSteve Yin 
694*b0a7a3cfSSteve Yin 						long nRelCount = pRrelationSet->getRelationCount();
695*b0a7a3cfSSteve Yin 
696*b0a7a3cfSSteve Yin 						// Modified by Steve Yin, for SODC_1552
697*b0a7a3cfSSteve Yin 						if( /*nRelCount <= 0 &&*/ m_iRole == ROLE_SYSTEM_TEXT )
698*b0a7a3cfSSteve Yin 						{
699*b0a7a3cfSSteve Yin 							VARIANT varParentRole;
700*b0a7a3cfSSteve Yin 							VariantInit( &varParentRole );
7015fdc4257SSteve Yin 
702*b0a7a3cfSSteve Yin 							m_pIParent->get_accRole(varChild, &varParentRole);
7035fdc4257SSteve Yin 
704*b0a7a3cfSSteve Yin 							if( m_pIParent && varParentRole.lVal == ROLE_SYSTEM_COMBOBOX ) // edit in comoboBox
705*b0a7a3cfSSteve Yin 							{
706*b0a7a3cfSSteve Yin 								m_pIParent->get_accKeyboardShortcut(varChild, pszKeyboardShortcut);
707*b0a7a3cfSSteve Yin 								return S_OK;
708*b0a7a3cfSSteve Yin 							}
709*b0a7a3cfSSteve Yin 						}
710*b0a7a3cfSSteve Yin 
711*b0a7a3cfSSteve Yin 						AccessibleRelation *paccRelation = NULL;
712*b0a7a3cfSSteve Yin 						AccessibleRelation accRelation;
713*b0a7a3cfSSteve Yin 						for(int i=0; i<nRelCount ; i++)
714*b0a7a3cfSSteve Yin 						{
715*b0a7a3cfSSteve Yin 							if( pRrelationSet->getRelation(i).RelationType == 6 )
716*b0a7a3cfSSteve Yin 							{
717*b0a7a3cfSSteve Yin 								accRelation = pRrelationSet->getRelation(i);
718*b0a7a3cfSSteve Yin 								paccRelation = &accRelation;
719*b0a7a3cfSSteve Yin 							}
720*b0a7a3cfSSteve Yin 						}
7215fdc4257SSteve Yin 
722*b0a7a3cfSSteve Yin 						if(paccRelation == NULL)
723*b0a7a3cfSSteve Yin 							return S_FALSE;
7245fdc4257SSteve Yin 
725*b0a7a3cfSSteve Yin 						Sequence< Reference< XInterface > > xTargets = paccRelation->TargetSet;
726*b0a7a3cfSSteve Yin 						Reference<XInterface> pRAcc = xTargets[0];
7275fdc4257SSteve Yin 
728*b0a7a3cfSSteve Yin 						XAccessible* pXAcc = (XAccessible*)pRAcc.get();
729*b0a7a3cfSSteve Yin 
730*b0a7a3cfSSteve Yin 						Reference<XAccessibleContext> pRLebelContext = pXAcc->getAccessibleContext();
731*b0a7a3cfSSteve Yin 						if(!pRLebelContext.is())
732*b0a7a3cfSSteve Yin 							return S_FALSE;
733*b0a7a3cfSSteve Yin 
734*b0a7a3cfSSteve Yin 						pRrelationSet = pRLebelContext->getAccessibleRelationSet();
735*b0a7a3cfSSteve Yin 						nRelCount = pRrelationSet->getRelationCount();
736*b0a7a3cfSSteve Yin 
737*b0a7a3cfSSteve Yin 						paccRelation = NULL;
738*b0a7a3cfSSteve Yin 						for(int j=0; j<nRelCount ; j++)
739*b0a7a3cfSSteve Yin 						{
740*b0a7a3cfSSteve Yin 							if( pRrelationSet->getRelation(j).RelationType == 5 )
741*b0a7a3cfSSteve Yin 							{
742*b0a7a3cfSSteve Yin 								accRelation = pRrelationSet->getRelation(j);
743*b0a7a3cfSSteve Yin 								paccRelation = &accRelation;
744*b0a7a3cfSSteve Yin 							}
745*b0a7a3cfSSteve Yin 						}
746*b0a7a3cfSSteve Yin 
747*b0a7a3cfSSteve Yin 						if(paccRelation)
748*b0a7a3cfSSteve Yin 						{
749*b0a7a3cfSSteve Yin 							xTargets = paccRelation->TargetSet;
750*b0a7a3cfSSteve Yin 							pRAcc = xTargets[0];
751*b0a7a3cfSSteve Yin 							if(pUNOInterface != (XAccessible*)pRAcc.get())
752*b0a7a3cfSSteve Yin 								return S_FALSE;
753*b0a7a3cfSSteve Yin 						}
754*b0a7a3cfSSteve Yin 
755*b0a7a3cfSSteve Yin 						Reference<XAccessibleExtendedComponent> pRXIE(pRLebelContext,UNO_QUERY);
756*b0a7a3cfSSteve Yin 						if(!pRXIE.is())
757*b0a7a3cfSSteve Yin 							return S_FALSE;
758*b0a7a3cfSSteve Yin 
759*b0a7a3cfSSteve Yin 						::rtl::OUString ouStr = pRXIE->getTitledBorderText();
760*b0a7a3cfSSteve Yin 						WCHAR key[2] = {NULL};
761*b0a7a3cfSSteve Yin 						GetMnemonicChar(ouStr, key);
762*b0a7a3cfSSteve Yin 						if(key[0] != 0)
7635fdc4257SSteve Yin 						{
764*b0a7a3cfSSteve Yin 							wcscat(wString, L"Alt+");
765*b0a7a3cfSSteve Yin 							wcscat(wString, key);
7665fdc4257SSteve Yin 						}
767*b0a7a3cfSSteve Yin 						else
768*b0a7a3cfSSteve Yin 							return S_FALSE;
769*b0a7a3cfSSteve Yin 					}
770*b0a7a3cfSSteve Yin 
771*b0a7a3cfSSteve Yin 					SAFE_SYSFREESTRING(*pszKeyboardShortcut);
772*b0a7a3cfSSteve Yin 					*pszKeyboardShortcut = SysAllocString(wString);
773*b0a7a3cfSSteve Yin 
774*b0a7a3cfSSteve Yin 					return S_OK;
775*b0a7a3cfSSteve Yin 				}
776*b0a7a3cfSSteve Yin 				else
777*b0a7a3cfSSteve Yin 				{
778*b0a7a3cfSSteve Yin 					return S_FALSE;
779*b0a7a3cfSSteve Yin 				}
780*b0a7a3cfSSteve Yin 			}
781*b0a7a3cfSSteve Yin 
782*b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
783*b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
784*b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
785*b0a7a3cfSSteve Yin 			if(!pChild)
786*b0a7a3cfSSteve Yin 				return E_FAIL;
787*b0a7a3cfSSteve Yin 
788*b0a7a3cfSSteve Yin 			return pChild->get_accKeyboardShortcut(varChild,pszKeyboardShortcut);
789*b0a7a3cfSSteve Yin 		}
790*b0a7a3cfSSteve Yin 		return S_FALSE;
791*b0a7a3cfSSteve Yin 
792*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
7935fdc4257SSteve Yin }
7945fdc4257SSteve Yin 
7955fdc4257SSteve Yin /**
7965fdc4257SSteve Yin * Returns the current focused child to AT.
7975fdc4257SSteve Yin * @param	pvarChild, [in,out] vt member of pvarChild must be VT_I4,and lVal member stores the child ID,
7985fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
7995fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
8005fdc4257SSteve Yin */
8015fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accFocus(VARIANT *pvarChild)
8025fdc4257SSteve Yin {
8035fdc4257SSteve Yin 
804*b0a7a3cfSSteve Yin 	CHECK_ENABLE_INF
805*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
806*b0a7a3cfSSteve Yin 		ISDESTROY()
807*b0a7a3cfSSteve Yin 		// #CHECK#
808*b0a7a3cfSSteve Yin 		if(pvarChild == NULL)
809*b0a7a3cfSSteve Yin 		{
810*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
811*b0a7a3cfSSteve Yin 		}
812*b0a7a3cfSSteve Yin 		if( m_dFocusChildID==UACC_NO_FOCUS )
813*b0a7a3cfSSteve Yin 		{
814*b0a7a3cfSSteve Yin 			pvarChild->vt = VT_EMPTY;//no focus on the object and its children
815*b0a7a3cfSSteve Yin 			return S_OK;
816*b0a7a3cfSSteve Yin 		}
817*b0a7a3cfSSteve Yin 		//if the descendant of current object has focus indicated by m_dFocusChildID, return the IDispatch of this focused object
818*b0a7a3cfSSteve Yin 		else
819*b0a7a3cfSSteve Yin 		{
820*b0a7a3cfSSteve Yin 			IMAccessible* pIMAcc = NULL;
821*b0a7a3cfSSteve Yin 			g_pAgent->GetIAccessibleFromResID(m_dFocusChildID,&pIMAcc);
822*b0a7a3cfSSteve Yin 			pIMAcc->AddRef();
823*b0a7a3cfSSteve Yin 			pvarChild->vt = VT_DISPATCH;
824*b0a7a3cfSSteve Yin 			pvarChild->pdispVal = pIMAcc;
825*b0a7a3cfSSteve Yin 
826*b0a7a3cfSSteve Yin 		}
827*b0a7a3cfSSteve Yin 		return S_OK;
828*b0a7a3cfSSteve Yin 
829*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
8305fdc4257SSteve Yin }
8315fdc4257SSteve Yin 
8325fdc4257SSteve Yin /**
8335fdc4257SSteve Yin * Returns the selection of the current COM object to AT.
8345fdc4257SSteve Yin * @param	pvarChildren,[in,out]
8355fdc4257SSteve Yin * if selection num is 0,return VT_EMPTY for vt,
8365fdc4257SSteve Yin * if selection num is 1,return VT_I4 for vt,and child index for lVal
8375fdc4257SSteve Yin * if selection num >1,return VT_UNKNOWN for vt, and IEnumVariant* for punkVal
8385fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
8395fdc4257SSteve Yin */
8405fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_accSelection(VARIANT *pvarChildren)
8415fdc4257SSteve Yin {
842*b0a7a3cfSSteve Yin 
8435fdc4257SSteve Yin 	CHECK_ENABLE_INF
844*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
845*b0a7a3cfSSteve Yin 		ISDESTROY()
846*b0a7a3cfSSteve Yin 		// #CHECK#
847*b0a7a3cfSSteve Yin 		if(pvarChildren == NULL)
848*b0a7a3cfSSteve Yin 		{
849*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
850*b0a7a3cfSSteve Yin 		}
851*b0a7a3cfSSteve Yin 		switch(m_pEnumVar->GetCountOfElements())
852*b0a7a3cfSSteve Yin 		{
853*b0a7a3cfSSteve Yin 		case 0:
854*b0a7a3cfSSteve Yin 			pvarChildren->vt = VT_EMPTY;
855*b0a7a3cfSSteve Yin 			break;
856*b0a7a3cfSSteve Yin 		case 1:
857*b0a7a3cfSSteve Yin 			VARIANT varTmp[1];
858*b0a7a3cfSSteve Yin 			ULONG count;
859*b0a7a3cfSSteve Yin 			VariantInit(&varTmp[0]);
860*b0a7a3cfSSteve Yin 			m_pEnumVar->Next(1,varTmp,&count);
861*b0a7a3cfSSteve Yin 			if(count!=1)
862*b0a7a3cfSSteve Yin 				return S_FALSE;
863*b0a7a3cfSSteve Yin 			pvarChildren->vt = VT_I4;
864*b0a7a3cfSSteve Yin 			pvarChildren->lVal = varTmp[0].lVal;
865*b0a7a3cfSSteve Yin 			VariantClear(&varTmp[0]);
866*b0a7a3cfSSteve Yin 			m_pEnumVar->Reset();
867*b0a7a3cfSSteve Yin 			break;
868*b0a7a3cfSSteve Yin 		default:
869*b0a7a3cfSSteve Yin 			pvarChildren->vt = VT_UNKNOWN;
870*b0a7a3cfSSteve Yin 			m_pEnumVar->AddRef();
871*b0a7a3cfSSteve Yin 			pvarChildren->punkVal = m_pEnumVar;
872*b0a7a3cfSSteve Yin 			break;
873*b0a7a3cfSSteve Yin 		}
874*b0a7a3cfSSteve Yin 		return S_OK;
875*b0a7a3cfSSteve Yin 
876*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
8775fdc4257SSteve Yin }
8785fdc4257SSteve Yin 
8795fdc4257SSteve Yin /**
8805fdc4257SSteve Yin * Returns the location of the current COM object self or its one child to AT.
8815fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
8825fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
8835fdc4257SSteve Yin * @param	pxLeft, [in,out] use to return the x-coordination of the proper object.
8845fdc4257SSteve Yin * @param	pyTop,  [in,out] use to return the y-coordination of the proper object.
8855fdc4257SSteve Yin * @param	pcxWidth, [in,out] use to return the x-coordination width of the proper object.
8865fdc4257SSteve Yin * @param	pcyHeight, [in,out] use to return the y-coordination height of the proper object.
8875fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
8885fdc4257SSteve Yin */
8895fdc4257SSteve Yin STDMETHODIMP CMAccessible::accLocation(long *pxLeft, long *pyTop, long *pcxWidth, long *pcyHeight, VARIANT varChild)
8905fdc4257SSteve Yin {
891*b0a7a3cfSSteve Yin 
8925fdc4257SSteve Yin 	CHECK_ENABLE_INF
893*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
894*b0a7a3cfSSteve Yin 		ISDESTROY()
895*b0a7a3cfSSteve Yin 		// #CHECK#
896*b0a7a3cfSSteve Yin 		if(pxLeft == NULL || pyTop == NULL || pcxWidth == NULL || pcyHeight == NULL)
897*b0a7a3cfSSteve Yin 		{
898*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
899*b0a7a3cfSSteve Yin 		}
900*b0a7a3cfSSteve Yin 
901*b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
902*b0a7a3cfSSteve Yin 		{
903*b0a7a3cfSSteve Yin 			if(varChild.lVal==CHILDID_SELF)
904*b0a7a3cfSSteve Yin 			{
905*b0a7a3cfSSteve Yin 
906*b0a7a3cfSSteve Yin 				if(pUNOInterface)
907*b0a7a3cfSSteve Yin 				{
908*b0a7a3cfSSteve Yin 					Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext();
909*b0a7a3cfSSteve Yin 					if( !pRContext.is() )
910*b0a7a3cfSSteve Yin 						return S_FALSE;
911*b0a7a3cfSSteve Yin 					Reference< XAccessibleComponent > pRComponent(pRContext,UNO_QUERY);
912*b0a7a3cfSSteve Yin 					if( !pRComponent.is() )
913*b0a7a3cfSSteve Yin 						return S_FALSE;
914*b0a7a3cfSSteve Yin 
915*b0a7a3cfSSteve Yin 					::com::sun::star::awt::Point pCPoint = pRComponent->getLocationOnScreen();
916*b0a7a3cfSSteve Yin 					::com::sun::star::awt::Size pCSize = pRComponent->getSize();
917*b0a7a3cfSSteve Yin 					*pxLeft = pCPoint.X;
918*b0a7a3cfSSteve Yin 					*pyTop =  pCPoint.Y;
919*b0a7a3cfSSteve Yin 					*pcxWidth = pCSize.Width;
920*b0a7a3cfSSteve Yin 					*pcyHeight = pCSize.Height;
921*b0a7a3cfSSteve Yin 					return S_OK;
922*b0a7a3cfSSteve Yin 				}
923*b0a7a3cfSSteve Yin 				else
924*b0a7a3cfSSteve Yin 				{
925*b0a7a3cfSSteve Yin 					*pxLeft = m_sLocation.m_dLeft;
926*b0a7a3cfSSteve Yin 					*pyTop = m_sLocation.m_dTop;
927*b0a7a3cfSSteve Yin 					*pcxWidth = m_sLocation.m_dWidth;
928*b0a7a3cfSSteve Yin 					*pcyHeight = m_sLocation.m_dHeight;
929*b0a7a3cfSSteve Yin 					return S_OK;
930*b0a7a3cfSSteve Yin 				}
931*b0a7a3cfSSteve Yin 			}
932*b0a7a3cfSSteve Yin 
933*b0a7a3cfSSteve Yin 		}
934*b0a7a3cfSSteve Yin 		return S_FALSE;
935*b0a7a3cfSSteve Yin 
936*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
9375fdc4257SSteve Yin }
9385fdc4257SSteve Yin 
9395fdc4257SSteve Yin /**
9405fdc4257SSteve Yin * Returns the current focused child to AT.
9415fdc4257SSteve Yin * @param	navDir, the direction flag of the navigation.
9425fdc4257SSteve Yin * @param	varStart, the start child id of this navigation action.
9435fdc4257SSteve Yin * @param	pvarEndUpAt, [in,out] the end up child of this navigation action.
9445fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
9455fdc4257SSteve Yin */
9465fdc4257SSteve Yin STDMETHODIMP CMAccessible::accNavigate(long navDir, VARIANT varStart, VARIANT *pvarEndUpAt)
9475fdc4257SSteve Yin {
948*b0a7a3cfSSteve Yin 
9495fdc4257SSteve Yin 	CHECK_ENABLE_INF
950*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
951*b0a7a3cfSSteve Yin 		ISDESTROY()
952*b0a7a3cfSSteve Yin 		// #CHECK#
953*b0a7a3cfSSteve Yin 		if(pvarEndUpAt == NULL)
954*b0a7a3cfSSteve Yin 		{
955*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
956*b0a7a3cfSSteve Yin 		}
957*b0a7a3cfSSteve Yin 		HRESULT ret = E_FAIL;
958*b0a7a3cfSSteve Yin 		switch (navDir)
959*b0a7a3cfSSteve Yin 		{
960*b0a7a3cfSSteve Yin 		case NAVDIR_FIRSTCHILD:
961*b0a7a3cfSSteve Yin 			ret = GetFirstChild(varStart,pvarEndUpAt);
962*b0a7a3cfSSteve Yin 			break;
963*b0a7a3cfSSteve Yin 		case NAVDIR_LASTCHILD:
964*b0a7a3cfSSteve Yin 			ret = GetLastChild(varStart,pvarEndUpAt);
965*b0a7a3cfSSteve Yin 			break;
966*b0a7a3cfSSteve Yin 		case NAVDIR_NEXT:
967*b0a7a3cfSSteve Yin 			ret = GetNextSibling(varStart,pvarEndUpAt);
968*b0a7a3cfSSteve Yin 			break;
969*b0a7a3cfSSteve Yin 		case NAVDIR_PREVIOUS:
970*b0a7a3cfSSteve Yin 			ret = GetPreSibling(varStart,pvarEndUpAt);
971*b0a7a3cfSSteve Yin 			break;
972*b0a7a3cfSSteve Yin 		case NAVDIR_DOWN://do not implement temporarily
973*b0a7a3cfSSteve Yin 			break;
974*b0a7a3cfSSteve Yin 		case NAVDIR_UP://do not implement temporarily
975*b0a7a3cfSSteve Yin 			break;
976*b0a7a3cfSSteve Yin 		case NAVDIR_LEFT://do not implement temporarily
977*b0a7a3cfSSteve Yin 			break;
978*b0a7a3cfSSteve Yin 		case NAVDIR_RIGHT://do not implement temporarily
979*b0a7a3cfSSteve Yin 			break;
980*b0a7a3cfSSteve Yin 		default:
981*b0a7a3cfSSteve Yin 			break;
982*b0a7a3cfSSteve Yin 		};
983*b0a7a3cfSSteve Yin 		return ret;
984*b0a7a3cfSSteve Yin 
985*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
9865fdc4257SSteve Yin }
9875fdc4257SSteve Yin 
9885fdc4257SSteve Yin STDMETHODIMP CMAccessible::accHitTest(long xLeft, long yTop, VARIANT *pvarChild)
9895fdc4257SSteve Yin {
990*b0a7a3cfSSteve Yin 
9915fdc4257SSteve Yin 	CHECK_ENABLE_INF
992*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
993*b0a7a3cfSSteve Yin 		ISDESTROY()
994*b0a7a3cfSSteve Yin 		// #CHECK#
995*b0a7a3cfSSteve Yin 		if(pvarChild == NULL)
996*b0a7a3cfSSteve Yin 		{
997*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
998*b0a7a3cfSSteve Yin 		}
999*b0a7a3cfSSteve Yin 		long x, y, w, h;
1000*b0a7a3cfSSteve Yin 		VARIANT varSelf;
1001*b0a7a3cfSSteve Yin 		VariantInit(&varSelf);
1002*b0a7a3cfSSteve Yin 		varSelf.vt = VT_I4;
1003*b0a7a3cfSSteve Yin 		varSelf.lVal = CHILDID_SELF;
1004*b0a7a3cfSSteve Yin 		accLocation(&x,&y,&w,&h,varSelf);
1005*b0a7a3cfSSteve Yin 		if( (x < xLeft && (x + w) >xLeft) && (y < yTop && (y + h) >yTop) )
1006*b0a7a3cfSSteve Yin 		{
1007*b0a7a3cfSSteve Yin 			int i, nCount;
1008*b0a7a3cfSSteve Yin 			pvarChild->vt = VT_EMPTY;
1009*b0a7a3cfSSteve Yin 			Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface);
1010*b0a7a3cfSSteve Yin 			nCount = pRContext->getAccessibleChildCount();
1011*b0a7a3cfSSteve Yin 			if(nCount > 256)
1012*b0a7a3cfSSteve Yin 				return E_FAIL;
1013*b0a7a3cfSSteve Yin 			IMAccessible* child = NULL;
1014*b0a7a3cfSSteve Yin 			for( i = 0; i<nCount; i++)
1015*b0a7a3cfSSteve Yin 			{
1016*b0a7a3cfSSteve Yin 
1017*b0a7a3cfSSteve Yin 				child = GetChildInterface(i + 1);
1018*b0a7a3cfSSteve Yin 				if(child && child->accHitTest(xLeft,yTop,pvarChild) == S_OK)
1019*b0a7a3cfSSteve Yin 					break;
1020*b0a7a3cfSSteve Yin 			}
1021*b0a7a3cfSSteve Yin 
1022*b0a7a3cfSSteve Yin 			if(pvarChild->vt == VT_DISPATCH)
1023*b0a7a3cfSSteve Yin 				return S_OK;
1024*b0a7a3cfSSteve Yin 
1025*b0a7a3cfSSteve Yin 			if( i < nCount)
1026*b0a7a3cfSSteve Yin 			{
1027*b0a7a3cfSSteve Yin 				pvarChild->vt = VT_DISPATCH;
1028*b0a7a3cfSSteve Yin 				pvarChild->pdispVal = child;
1029*b0a7a3cfSSteve Yin 				child->AddRef();
1030*b0a7a3cfSSteve Yin 			}
1031*b0a7a3cfSSteve Yin 			else
1032*b0a7a3cfSSteve Yin 			{
1033*b0a7a3cfSSteve Yin 				pvarChild->vt = VT_I4;
1034*b0a7a3cfSSteve Yin 				pvarChild->lVal = CHILDID_SELF;
1035*b0a7a3cfSSteve Yin 			}
1036*b0a7a3cfSSteve Yin 			return S_OK;
1037*b0a7a3cfSSteve Yin 		}
1038*b0a7a3cfSSteve Yin 		return S_FALSE;
1039*b0a7a3cfSSteve Yin 
1040*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
10415fdc4257SSteve Yin }
10425fdc4257SSteve Yin 
10435fdc4257SSteve Yin /**
10445fdc4257SSteve Yin * Get The other Interface from CMAccessible.
10455fdc4257SSteve Yin * @param	guidService, must be IID_IAccessible here.
10465fdc4257SSteve Yin * @param	riid, the IID interface .
10475fdc4257SSteve Yin * @return   S_OK if successful and S_FALSE if failure.
10485fdc4257SSteve Yin */
10495fdc4257SSteve Yin STDMETHODIMP CMAccessible::QueryService(REFGUID guidService, REFIID riid, void** ppvObject)
10505fdc4257SSteve Yin {
1051*b0a7a3cfSSteve Yin 	if( InlineIsEqualGUID(guidService, IID_IAccessible) )
1052*b0a7a3cfSSteve Yin 		return QueryInterface(riid, ppvObject);
1053*b0a7a3cfSSteve Yin 	return S_FALSE;
10545fdc4257SSteve Yin }
10555fdc4257SSteve Yin 
10565fdc4257SSteve Yin /**
10575fdc4257SSteve Yin * Set the accessible name of the current COM object self or its one child from UNO.
10585fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
10595fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
10605fdc4257SSteve Yin * @param	szName, the name used to set the name of the proper object.
10615fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
10625fdc4257SSteve Yin */
10635fdc4257SSteve Yin STDMETHODIMP CMAccessible::put_accName(VARIANT varChild, BSTR szName)
10645fdc4257SSteve Yin {
1065*b0a7a3cfSSteve Yin 
1066*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1067*b0a7a3cfSSteve Yin 		ISDESTROY()
1068*b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
1069*b0a7a3cfSSteve Yin 		{
1070*b0a7a3cfSSteve Yin 			if(varChild.lVal==CHILDID_SELF)
1071*b0a7a3cfSSteve Yin 			{
1072*b0a7a3cfSSteve Yin 				SAFE_SYSFREESTRING(m_pszName);
1073*b0a7a3cfSSteve Yin 				m_pszName=SysAllocString(szName);
1074*b0a7a3cfSSteve Yin 				return S_OK;
1075*b0a7a3cfSSteve Yin 			}
1076*b0a7a3cfSSteve Yin 
1077*b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
1078*b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
1079*b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
1080*b0a7a3cfSSteve Yin 			if(!pChild)
1081*b0a7a3cfSSteve Yin 				return E_FAIL;
1082*b0a7a3cfSSteve Yin 			return pChild->put_accName(varChild,szName);
1083*b0a7a3cfSSteve Yin 		}
1084*b0a7a3cfSSteve Yin 		return E_FAIL;
1085*b0a7a3cfSSteve Yin 
1086*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
10875fdc4257SSteve Yin }
10885fdc4257SSteve Yin 
10895fdc4257SSteve Yin /**
10905fdc4257SSteve Yin * Set the accessible value of the current COM object self or its one child from UNO.
10915fdc4257SSteve Yin * @param	varChild, vt member of varChild must be VT_I4,and lVal member stores the child ID,
10925fdc4257SSteve Yin * the child ID specify child index from 0 to children count, 0 stands for object self.
10935fdc4257SSteve Yin * @param	szValue, the value used to set the value of the proper object.
10945fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
10955fdc4257SSteve Yin */
10965fdc4257SSteve Yin STDMETHODIMP CMAccessible::put_accValue(VARIANT varChild, BSTR szValue)
10975fdc4257SSteve Yin {
1098*b0a7a3cfSSteve Yin 
1099*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1100*b0a7a3cfSSteve Yin 		ISDESTROY()
1101*b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
1102*b0a7a3cfSSteve Yin 		{
1103*b0a7a3cfSSteve Yin 			if(varChild.lVal==CHILDID_SELF)
1104*b0a7a3cfSSteve Yin 			{
1105*b0a7a3cfSSteve Yin 				SysAllocString(m_pszValue);
1106*b0a7a3cfSSteve Yin 				m_pszValue=SysAllocString(szValue);
1107*b0a7a3cfSSteve Yin 				return S_OK;
1108*b0a7a3cfSSteve Yin 			}
1109*b0a7a3cfSSteve Yin 
1110*b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
1111*b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
1112*b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
1113*b0a7a3cfSSteve Yin 			if(!pChild)
1114*b0a7a3cfSSteve Yin 				return E_FAIL;
1115*b0a7a3cfSSteve Yin 			return pChild->put_accValue(varChild,szValue);
1116*b0a7a3cfSSteve Yin 		}
1117*b0a7a3cfSSteve Yin 		return E_FAIL;
1118*b0a7a3cfSSteve Yin 
1119*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
11205fdc4257SSteve Yin }
11215fdc4257SSteve Yin 
11225fdc4257SSteve Yin /**
11235fdc4257SSteve Yin * Set the accessible name of the current COM object self from UNO.
11245fdc4257SSteve Yin * @param	pszName, the name value used to set the name of the current object.
11255fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
11265fdc4257SSteve Yin */
11275fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccName(const OLECHAR __RPC_FAR *pszName)
11285fdc4257SSteve Yin {
11295fdc4257SSteve Yin 
1130*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1131*b0a7a3cfSSteve Yin 		ISDESTROY()
1132*b0a7a3cfSSteve Yin 		// #CHECK#
1133*b0a7a3cfSSteve Yin 		if(pszName == NULL)
1134*b0a7a3cfSSteve Yin 		{
1135*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1136*b0a7a3cfSSteve Yin 		}
1137*b0a7a3cfSSteve Yin 
1138*b0a7a3cfSSteve Yin 		SAFE_SYSFREESTRING(m_pszName);//??
1139*b0a7a3cfSSteve Yin 		m_pszName = SysAllocString(pszName);
1140*b0a7a3cfSSteve Yin 		if(m_pszName==NULL)
1141*b0a7a3cfSSteve Yin 			return E_FAIL;
1142*b0a7a3cfSSteve Yin 		return S_OK;
11435fdc4257SSteve Yin 
1144*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
11455fdc4257SSteve Yin }
11465fdc4257SSteve Yin 
11475fdc4257SSteve Yin /**
11485fdc4257SSteve Yin * Set the accessible role of the current COM object self from UNO.
11495fdc4257SSteve Yin * @param	pRole, the role value used to set the role of the current object.
11505fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
11515fdc4257SSteve Yin */
11525fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccRole(unsigned short pRole)
11535fdc4257SSteve Yin {
1154*b0a7a3cfSSteve Yin 	m_iRole = pRole;
1155*b0a7a3cfSSteve Yin 	return S_OK;
11565fdc4257SSteve Yin }
11575fdc4257SSteve Yin 
11585fdc4257SSteve Yin /**
11595fdc4257SSteve Yin * Add one state into the current state set for the current COM object from UNO.
11605fdc4257SSteve Yin * @param	pXSate, the state used to set the name of the current object.
11615fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
11625fdc4257SSteve Yin */
11635fdc4257SSteve Yin STDMETHODIMP CMAccessible::DecreaseState(DWORD pXSate)
11645fdc4257SSteve Yin {
1165*b0a7a3cfSSteve Yin 	m_dState &= (~pXSate);
1166*b0a7a3cfSSteve Yin 	return S_OK;
11675fdc4257SSteve Yin }
11685fdc4257SSteve Yin 
11695fdc4257SSteve Yin /**
11705fdc4257SSteve Yin * Delete one state into the current state set for the current COM object from UNO.
11715fdc4257SSteve Yin * @param	pXSate, the state used to set the name of the current object.
11725fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
11735fdc4257SSteve Yin */
11745fdc4257SSteve Yin STDMETHODIMP CMAccessible::IncreaseState(DWORD pXSate)
11755fdc4257SSteve Yin {
1176*b0a7a3cfSSteve Yin 	m_dState |= pXSate;
1177*b0a7a3cfSSteve Yin 	return S_OK;
11785fdc4257SSteve Yin }
11795fdc4257SSteve Yin 
11805fdc4257SSteve Yin /**
11815fdc4257SSteve Yin * Set state into the current state set for the current COM object from UNO.
11825fdc4257SSteve Yin * @param	pXSate, the state used to set the name of the current object.
11835fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
11845fdc4257SSteve Yin */
11855fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetState(DWORD pXSate)
11865fdc4257SSteve Yin {
1187*b0a7a3cfSSteve Yin 	m_dState = pXSate;
1188*b0a7a3cfSSteve Yin 	return S_OK;
11895fdc4257SSteve Yin }
11905fdc4257SSteve Yin 
11915fdc4257SSteve Yin 
11925fdc4257SSteve Yin 
11935fdc4257SSteve Yin /**
11945fdc4257SSteve Yin * Set the accessible description of the current COM object self from UNO.
11955fdc4257SSteve Yin * @param	pszDescription, the name used to set the description of the current object.
11965fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
11975fdc4257SSteve Yin */
11985fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccDescription(const OLECHAR __RPC_FAR *pszDescription)
11995fdc4257SSteve Yin {
12005fdc4257SSteve Yin 
1201*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1202*b0a7a3cfSSteve Yin 		ISDESTROY()
1203*b0a7a3cfSSteve Yin 		// #CHECK#
1204*b0a7a3cfSSteve Yin 		if(pszDescription == NULL)
1205*b0a7a3cfSSteve Yin 		{
1206*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1207*b0a7a3cfSSteve Yin 		}
12085fdc4257SSteve Yin 
1209*b0a7a3cfSSteve Yin 		SAFE_SYSFREESTRING(m_pszDescription);
1210*b0a7a3cfSSteve Yin 		m_pszDescription = SysAllocString(pszDescription);
12115fdc4257SSteve Yin 
1212*b0a7a3cfSSteve Yin 		if(m_pszDescription==NULL)
1213*b0a7a3cfSSteve Yin 			return E_FAIL;
1214*b0a7a3cfSSteve Yin 		return S_OK;
1215*b0a7a3cfSSteve Yin 
1216*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
12175fdc4257SSteve Yin }
12185fdc4257SSteve Yin 
12195fdc4257SSteve Yin /**
12205fdc4257SSteve Yin * Set the accessible value of the current COM object self from UNO.
12215fdc4257SSteve Yin * @param	pszAccValue, the name used to set the value of the current object.
12225fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
12235fdc4257SSteve Yin */
12245fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccValue(const OLECHAR __RPC_FAR *pszAccValue)
12255fdc4257SSteve Yin {
12265fdc4257SSteve Yin 
1227*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1228*b0a7a3cfSSteve Yin 		ISDESTROY()
1229*b0a7a3cfSSteve Yin 		// #CHECK#
1230*b0a7a3cfSSteve Yin 		if(pszAccValue == NULL)
1231*b0a7a3cfSSteve Yin 		{
1232*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1233*b0a7a3cfSSteve Yin 		}
1234*b0a7a3cfSSteve Yin 		SAFE_SYSFREESTRING(m_pszValue);
1235*b0a7a3cfSSteve Yin 		m_pszValue = SysAllocString(pszAccValue);
1236*b0a7a3cfSSteve Yin 		if(m_pszValue==NULL)
1237*b0a7a3cfSSteve Yin 			return E_FAIL;
1238*b0a7a3cfSSteve Yin 		return S_OK;
1239*b0a7a3cfSSteve Yin 
1240*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
12415fdc4257SSteve Yin }
12425fdc4257SSteve Yin 
12435fdc4257SSteve Yin /**
12445fdc4257SSteve Yin * Set the HWND value of the current COM object self from UNO. It should set the parent IAccessible
12455fdc4257SSteve Yin * Object through the method AccessibleObjectFromWindow(...).
12465fdc4257SSteve Yin * @param	hwnd, the HWND used to set the value of the current object.
12475fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
12485fdc4257SSteve Yin */
12495fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccWindowHandle(HWND hwnd)
12505fdc4257SSteve Yin {
12515fdc4257SSteve Yin 
1252*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1253*b0a7a3cfSSteve Yin 		ISDESTROY()
1254*b0a7a3cfSSteve Yin 		m_hwnd = hwnd;
1255*b0a7a3cfSSteve Yin 	return S_OK;
1256*b0a7a3cfSSteve Yin 
1257*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
12585fdc4257SSteve Yin }
12595fdc4257SSteve Yin 
12605fdc4257SSteve Yin /**
12615fdc4257SSteve Yin * Set accessible focus by specifying child ID
12625fdc4257SSteve Yin * @param	dChildID, the child id identifies the focus child.
12635fdc4257SSteve Yin * @return   S_OK if successful and E_FAIL if failure.
12645fdc4257SSteve Yin */
12655fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccFocus(long dChildID)
12665fdc4257SSteve Yin {
12675fdc4257SSteve Yin 
1268*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1269*b0a7a3cfSSteve Yin 		ISDESTROY()
1270*b0a7a3cfSSteve Yin 
1271*b0a7a3cfSSteve Yin 		if(dChildID==CHILDID_SELF)
1272*b0a7a3cfSSteve Yin 		{
1273*b0a7a3cfSSteve Yin 			if(m_pIParent)
1274*b0a7a3cfSSteve Yin 			{
1275*b0a7a3cfSSteve Yin 				m_pIParent->Put_XAccFocus(m_dChildID);
1276*b0a7a3cfSSteve Yin 			}
1277*b0a7a3cfSSteve Yin 		}
1278*b0a7a3cfSSteve Yin 		else
1279*b0a7a3cfSSteve Yin 		{
1280*b0a7a3cfSSteve Yin 			m_dFocusChildID = dChildID;
1281*b0a7a3cfSSteve Yin 			//traverse all ancestors to set the focused child ID so that when the get_accFocus is called on
1282*b0a7a3cfSSteve Yin 			//any of the ancestors, this id can be used to get the IAccessible of focused object.
1283*b0a7a3cfSSteve Yin 			if(m_pIParent)
1284*b0a7a3cfSSteve Yin 			{
1285*b0a7a3cfSSteve Yin 				m_pIParent->Put_XAccFocus(dChildID);
1286*b0a7a3cfSSteve Yin 			}
1287*b0a7a3cfSSteve Yin 		}
1288*b0a7a3cfSSteve Yin 		return S_OK;
1289*b0a7a3cfSSteve Yin 
1290*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
12915fdc4257SSteve Yin }
12925fdc4257SSteve Yin 
12935fdc4257SSteve Yin /**
1294*b0a7a3cfSSteve Yin *Set accessible object location for the current COM object
1295*b0a7a3cfSSteve Yin * @param	sLocation, the location of the current object.
1296*b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1297*b0a7a3cfSSteve Yin */
12985fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccLocation(const Location sLocation)
12995fdc4257SSteve Yin {
1300*b0a7a3cfSSteve Yin 
1301*b0a7a3cfSSteve Yin 	this->m_sLocation = sLocation;
1302*b0a7a3cfSSteve Yin 	return S_OK;
13035fdc4257SSteve Yin }
13045fdc4257SSteve Yin 
13055fdc4257SSteve Yin /**
1306*b0a7a3cfSSteve Yin * Set accessible parent object for the current COM object if
1307*b0a7a3cfSSteve Yin * the current object is a child of some COM object
1308*b0a7a3cfSSteve Yin * @param	pIParent, the parent of the current object.
1309*b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1310*b0a7a3cfSSteve Yin */
13115fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccParent(IMAccessible __RPC_FAR *pIParent)
13125fdc4257SSteve Yin {
1313*b0a7a3cfSSteve Yin 	this->m_pIParent = pIParent;
13145fdc4257SSteve Yin 
1315*b0a7a3cfSSteve Yin 	if(pIParent)
1316*b0a7a3cfSSteve Yin 		m_pIParent->AddRef();
13175fdc4257SSteve Yin 
1318*b0a7a3cfSSteve Yin 	return S_OK;
13195fdc4257SSteve Yin }
13205fdc4257SSteve Yin 
13215fdc4257SSteve Yin /**
1322*b0a7a3cfSSteve Yin * Set unique child id to COM
1323*b0a7a3cfSSteve Yin * @param	dChildID, the id of the current object.
1324*b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1325*b0a7a3cfSSteve Yin */
13265fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccChildID(long dChildID)
13275fdc4257SSteve Yin {
1328*b0a7a3cfSSteve Yin 
1329*b0a7a3cfSSteve Yin 	this->m_dChildID = dChildID;
1330*b0a7a3cfSSteve Yin 	return S_OK;
13315fdc4257SSteve Yin }
13325fdc4257SSteve Yin 
13335fdc4257SSteve Yin /**
1334*b0a7a3cfSSteve Yin * Set AccObjectManagerAgent object pointer to COM
1335*b0a7a3cfSSteve Yin * @param	pAgent, the AccObjectManagerAgent point.
1336*b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1337*b0a7a3cfSSteve Yin */
13385fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_XAccAgent(long pAgent)
13395fdc4257SSteve Yin {
1340*b0a7a3cfSSteve Yin 	g_pAgent = (AccObjectManagerAgent*)pAgent;
1341*b0a7a3cfSSteve Yin 	return S_OK;
13425fdc4257SSteve Yin }
13435fdc4257SSteve Yin 
13445fdc4257SSteve Yin /**
1345*b0a7a3cfSSteve Yin * When a UNO control disposing, it disposes its listeners,
1346*b0a7a3cfSSteve Yin * then notify AccObject in bridge management, then notify
1347*b0a7a3cfSSteve Yin * COM that the XAccessible is invalid,so set pUNOInterface as NULL
1348*b0a7a3cfSSteve Yin * @param	isDestroy, true is it need to be destroyed.
1349*b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1350*b0a7a3cfSSteve Yin */
13515fdc4257SSteve Yin STDMETHODIMP CMAccessible::NotifyDestroy(BOOL isDestroy)
13525fdc4257SSteve Yin {
1353*b0a7a3cfSSteve Yin 
1354*b0a7a3cfSSteve Yin 	m_isDestroy = isDestroy;
1355*b0a7a3cfSSteve Yin 	pUNOInterface = NULL;
1356*b0a7a3cfSSteve Yin 	return S_OK;
13575fdc4257SSteve Yin }
13585fdc4257SSteve Yin 
13595fdc4257SSteve Yin /**
1360*b0a7a3cfSSteve Yin *private methods that help implement public functions
1361*b0a7a3cfSSteve Yin */
13625fdc4257SSteve Yin 
13635fdc4257SSteve Yin /**
1364*b0a7a3cfSSteve Yin * Return child interface pointer by child ID,note: need to call AddRef()
1365*b0a7a3cfSSteve Yin * @param	lChildID, specify child index,which AT(such as Inspect32) gives.
1366*b0a7a3cfSSteve Yin * @return  IMAccessible*, pointer to the corresponding child object.
1367*b0a7a3cfSSteve Yin */
13685fdc4257SSteve Yin IMAccessible* CMAccessible::GetChildInterface(long dChildID)//for test
13695fdc4257SSteve Yin {
1370*b0a7a3cfSSteve Yin 
1371*b0a7a3cfSSteve Yin 	long dChildIndex = 0;
1372*b0a7a3cfSSteve Yin 	if(dChildID<0)
1373*b0a7a3cfSSteve Yin 	{
1374*b0a7a3cfSSteve Yin 		if(g_pAgent)
1375*b0a7a3cfSSteve Yin 		{
1376*b0a7a3cfSSteve Yin 			IMAccessible* pIMAcc = NULL;
1377*b0a7a3cfSSteve Yin 			g_pAgent->GetIAccessibleFromResID(dChildID,&pIMAcc);
1378*b0a7a3cfSSteve Yin 			return pIMAcc;
1379*b0a7a3cfSSteve Yin 		}
1380*b0a7a3cfSSteve Yin 		return NULL;
1381*b0a7a3cfSSteve Yin 	}
1382*b0a7a3cfSSteve Yin 	else
1383*b0a7a3cfSSteve Yin 	{
1384*b0a7a3cfSSteve Yin 		Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext();
1385*b0a7a3cfSSteve Yin 		if( !pRContext.is() )
1386*b0a7a3cfSSteve Yin 			return NULL;
1387*b0a7a3cfSSteve Yin 
1388*b0a7a3cfSSteve Yin 		if(dChildID<1 || dChildID>pRContext->getAccessibleChildCount())
1389*b0a7a3cfSSteve Yin 			return NULL;
1390*b0a7a3cfSSteve Yin 
1391*b0a7a3cfSSteve Yin 		IAccessible* pChild = NULL;
1392*b0a7a3cfSSteve Yin 		Reference< XAccessible > pXChild = pRContext->getAccessibleChild(dChildID-1);
1393*b0a7a3cfSSteve Yin 		BOOL isGet = get_IAccessibleFromXAccessible((long)pXChild.get(),&pChild);
1394*b0a7a3cfSSteve Yin 
1395*b0a7a3cfSSteve Yin 		if(!isGet)
1396*b0a7a3cfSSteve Yin 		{
1397*b0a7a3cfSSteve Yin 			g_pAgent->InsertAccObj(pXChild.get(),pUNOInterface,(long)m_hwnd);
1398*b0a7a3cfSSteve Yin 			isGet = get_IAccessibleFromXAccessible((long)pXChild.get(),&pChild);
1399*b0a7a3cfSSteve Yin 		}
1400*b0a7a3cfSSteve Yin 
1401*b0a7a3cfSSteve Yin 		if(isGet)
1402*b0a7a3cfSSteve Yin 		{
1403*b0a7a3cfSSteve Yin 			IMAccessible* pIMAcc =  (IMAccessible*)pChild;
1404*b0a7a3cfSSteve Yin 			return pIMAcc;
1405*b0a7a3cfSSteve Yin 		}
1406*b0a7a3cfSSteve Yin 	}
1407*b0a7a3cfSSteve Yin 
1408*b0a7a3cfSSteve Yin 	return NULL;
14095fdc4257SSteve Yin }
14105fdc4257SSteve Yin 
14115fdc4257SSteve Yin /**
1412*b0a7a3cfSSteve Yin * For List, tree and table,these roles belong to manage_decendant in UNO,
1413*b0a7a3cfSSteve Yin * need to process specifically when navigate
1414*b0a7a3cfSSteve Yin * @return  BOOL, if it is decendantmanager, return true.
1415*b0a7a3cfSSteve Yin */
14165fdc4257SSteve Yin BOOL CMAccessible::IsDecendantManage()
14175fdc4257SSteve Yin {
1418*b0a7a3cfSSteve Yin 
1419*b0a7a3cfSSteve Yin 	return (m_iRole==ROLE_SYSTEM_LIST)||(m_iRole==ROLE_SYSTEM_OUTLINE)||(m_iRole==ROLE_SYSTEM_TABLE);
14205fdc4257SSteve Yin }
14215fdc4257SSteve Yin 
14225fdc4257SSteve Yin /**
1423*b0a7a3cfSSteve Yin * for decendantmanager circumstance,provide child interface when navigate
1424*b0a7a3cfSSteve Yin * @param	varCur, the current child.
1425*b0a7a3cfSSteve Yin * @param	flags, the navigation direction.
1426*b0a7a3cfSSteve Yin * @return  IMAccessible*, the child of the end up node.
1427*b0a7a3cfSSteve Yin */
14285fdc4257SSteve Yin IMAccessible* CMAccessible::GetNavigateChildForDM(VARIANT varCur, short flags)
14295fdc4257SSteve Yin {
1430*b0a7a3cfSSteve Yin 
1431*b0a7a3cfSSteve Yin 	XAccessibleContext* pXContext = GetContextByXAcc(pUNOInterface);
1432*b0a7a3cfSSteve Yin 	if(pXContext==NULL)
1433*b0a7a3cfSSteve Yin 	{
1434*b0a7a3cfSSteve Yin 		return NULL;
1435*b0a7a3cfSSteve Yin 	}
1436*b0a7a3cfSSteve Yin 
1437*b0a7a3cfSSteve Yin 	int count = pXContext->getAccessibleChildCount();
1438*b0a7a3cfSSteve Yin 	if(count<1)
1439*b0a7a3cfSSteve Yin 	{
1440*b0a7a3cfSSteve Yin 		return NULL;
1441*b0a7a3cfSSteve Yin 	}
1442*b0a7a3cfSSteve Yin 
1443*b0a7a3cfSSteve Yin 	IMAccessible* pCurChild = NULL;
1444*b0a7a3cfSSteve Yin 	XAccessible* pChildXAcc = NULL;
1445*b0a7a3cfSSteve Yin 	Reference<XAccessible> pRChildXAcc;
1446*b0a7a3cfSSteve Yin 	XAccessibleContext* pChildContext = NULL;
1447*b0a7a3cfSSteve Yin 	int index = 0,delta=0;
1448*b0a7a3cfSSteve Yin 	switch(flags)
1449*b0a7a3cfSSteve Yin 	{
1450*b0a7a3cfSSteve Yin 	case DM_FIRSTCHILD:
1451*b0a7a3cfSSteve Yin 		pRChildXAcc = pXContext->getAccessibleChild(0);
1452*b0a7a3cfSSteve Yin 		break;
1453*b0a7a3cfSSteve Yin 	case DM_LASTCHILD:
1454*b0a7a3cfSSteve Yin 		pRChildXAcc = pXContext->getAccessibleChild(count-1);
1455*b0a7a3cfSSteve Yin 		break;
1456*b0a7a3cfSSteve Yin 	case DM_NEXTCHILD:
1457*b0a7a3cfSSteve Yin 	case DM_PREVCHILD:
1458*b0a7a3cfSSteve Yin 		pCurChild = GetChildInterface(varCur.lVal);
1459*b0a7a3cfSSteve Yin 		if(pCurChild==NULL)
1460*b0a7a3cfSSteve Yin 		{
1461*b0a7a3cfSSteve Yin 			return NULL;
1462*b0a7a3cfSSteve Yin 		}
1463*b0a7a3cfSSteve Yin 		pCurChild->GetUNOInterface((long*)&pChildXAcc);
1464*b0a7a3cfSSteve Yin 		if(pChildXAcc==NULL)
1465*b0a7a3cfSSteve Yin 		{
1466*b0a7a3cfSSteve Yin 			return NULL;
1467*b0a7a3cfSSteve Yin 		}
1468*b0a7a3cfSSteve Yin 		pChildContext = GetContextByXAcc(pChildXAcc);
1469*b0a7a3cfSSteve Yin 		if(pChildContext == NULL)
1470*b0a7a3cfSSteve Yin 		{
1471*b0a7a3cfSSteve Yin 			return NULL;
1472*b0a7a3cfSSteve Yin 		}
1473*b0a7a3cfSSteve Yin 		delta = (flags==DM_NEXTCHILD)?1:-1;
1474*b0a7a3cfSSteve Yin 		//currently, getAccessibleIndexInParent is error in UNO for
1475*b0a7a3cfSSteve Yin 		//some kind of List,such as ValueSet, the index will be less 1 than
1476*b0a7a3cfSSteve Yin 		//what should be, need to fix UNO code
1477*b0a7a3cfSSteve Yin 		index = pChildContext->getAccessibleIndexInParent()+delta;
1478*b0a7a3cfSSteve Yin 		if((index>=0)&&(index<=count-1))
1479*b0a7a3cfSSteve Yin 		{
1480*b0a7a3cfSSteve Yin 			pRChildXAcc = pXContext->getAccessibleChild(index);
1481*b0a7a3cfSSteve Yin 		}
1482*b0a7a3cfSSteve Yin 		break;
1483*b0a7a3cfSSteve Yin 	default:
1484*b0a7a3cfSSteve Yin 		break;
1485*b0a7a3cfSSteve Yin 	}
1486*b0a7a3cfSSteve Yin 
1487*b0a7a3cfSSteve Yin 	if(!pRChildXAcc.is())
1488*b0a7a3cfSSteve Yin 	{
1489*b0a7a3cfSSteve Yin 		return NULL;
1490*b0a7a3cfSSteve Yin 	}
1491*b0a7a3cfSSteve Yin 	pChildXAcc = pRChildXAcc.get();
1492*b0a7a3cfSSteve Yin 	g_pAgent->InsertAccObj(pChildXAcc,pUNOInterface);
1493*b0a7a3cfSSteve Yin 	return g_pAgent->GetIMAccByXAcc(pChildXAcc);
14945fdc4257SSteve Yin }
14955fdc4257SSteve Yin 
14965fdc4257SSteve Yin /**
1497*b0a7a3cfSSteve Yin *the following 4 private methods are for accNavigate implementation
1498*b0a7a3cfSSteve Yin */
14995fdc4257SSteve Yin 
15005fdc4257SSteve Yin /**
1501*b0a7a3cfSSteve Yin * Return first child for parent container, process differently according
1502*b0a7a3cfSSteve Yin * to whether it is decendant manage
1503*b0a7a3cfSSteve Yin * @param	varStart, the start child id of this navigation action.
1504*b0a7a3cfSSteve Yin * @param	pvarEndUpAt, [in,out] the end up child of this navigation action.
1505*b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1506*b0a7a3cfSSteve Yin */
15075fdc4257SSteve Yin HRESULT CMAccessible::GetFirstChild(VARIANT varStart,VARIANT* pvarEndUpAt)
15085fdc4257SSteve Yin {
1509*b0a7a3cfSSteve Yin 
1510*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1511*b0a7a3cfSSteve Yin 		ISDESTROY()
1512*b0a7a3cfSSteve Yin 		// #CHECK#
1513*b0a7a3cfSSteve Yin 		if(pvarEndUpAt == NULL)
1514*b0a7a3cfSSteve Yin 		{
1515*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1516*b0a7a3cfSSteve Yin 		}
1517*b0a7a3cfSSteve Yin 		if(varStart.vt != VT_I4)
1518*b0a7a3cfSSteve Yin 		{
1519*b0a7a3cfSSteve Yin 			pvarEndUpAt->vt = VT_EMPTY;
1520*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1521*b0a7a3cfSSteve Yin 		}
1522*b0a7a3cfSSteve Yin 
1523*b0a7a3cfSSteve Yin 		pvarEndUpAt->pdispVal = GetNavigateChildForDM(varStart, DM_FIRSTCHILD);
1524*b0a7a3cfSSteve Yin 		if(pvarEndUpAt->pdispVal)
1525*b0a7a3cfSSteve Yin 		{
1526*b0a7a3cfSSteve Yin 			pvarEndUpAt->pdispVal->AddRef();
1527*b0a7a3cfSSteve Yin 			pvarEndUpAt->vt = VT_DISPATCH;
1528*b0a7a3cfSSteve Yin 			return S_OK;
1529*b0a7a3cfSSteve Yin 		}
1530*b0a7a3cfSSteve Yin 
1531*b0a7a3cfSSteve Yin 		pvarEndUpAt->vt = VT_EMPTY;
1532*b0a7a3cfSSteve Yin 		return E_FAIL;
1533*b0a7a3cfSSteve Yin 
1534*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
15355fdc4257SSteve Yin }
15365fdc4257SSteve Yin 
15375fdc4257SSteve Yin /**
1538*b0a7a3cfSSteve Yin * Return last child for parent container, process differently according
1539*b0a7a3cfSSteve Yin * to whether it is decendant manage
1540*b0a7a3cfSSteve Yin * @param	varStart, the start child id of this navigation action.
1541*b0a7a3cfSSteve Yin * @param	pvarEndUpAt, [in,out] the end up child of this navigation action.
1542*b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1543*b0a7a3cfSSteve Yin */
15445fdc4257SSteve Yin HRESULT CMAccessible::GetLastChild(VARIANT varStart,VARIANT* pvarEndUpAt)
15455fdc4257SSteve Yin {
1546*b0a7a3cfSSteve Yin 
1547*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1548*b0a7a3cfSSteve Yin 		ISDESTROY()
1549*b0a7a3cfSSteve Yin 		// #CHECK#
1550*b0a7a3cfSSteve Yin 		if(pvarEndUpAt == NULL)
1551*b0a7a3cfSSteve Yin 		{
1552*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1553*b0a7a3cfSSteve Yin 		}
1554*b0a7a3cfSSteve Yin 		if(varStart.vt != VT_I4)
1555*b0a7a3cfSSteve Yin 		{
1556*b0a7a3cfSSteve Yin 			pvarEndUpAt->vt = VT_EMPTY;
1557*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1558*b0a7a3cfSSteve Yin 		}
1559*b0a7a3cfSSteve Yin 
1560*b0a7a3cfSSteve Yin 		pvarEndUpAt->pdispVal = GetNavigateChildForDM(varStart, DM_LASTCHILD);
1561*b0a7a3cfSSteve Yin 		if(pvarEndUpAt->pdispVal)
1562*b0a7a3cfSSteve Yin 		{
1563*b0a7a3cfSSteve Yin 			pvarEndUpAt->pdispVal->AddRef();
1564*b0a7a3cfSSteve Yin 			pvarEndUpAt->vt = VT_DISPATCH;
1565*b0a7a3cfSSteve Yin 			return S_OK;
1566*b0a7a3cfSSteve Yin 		}
1567*b0a7a3cfSSteve Yin 		pvarEndUpAt->vt = VT_EMPTY;
1568*b0a7a3cfSSteve Yin 		return E_FAIL;
1569*b0a7a3cfSSteve Yin 
1570*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
15715fdc4257SSteve Yin }
15725fdc4257SSteve Yin 
15735fdc4257SSteve Yin /**
1574*b0a7a3cfSSteve Yin * The method GetNextSibling is general, whatever it is decendant manage or not
1575*b0a7a3cfSSteve Yin * Get the next sibling object.
1576*b0a7a3cfSSteve Yin * @param	varStart, the start child id of this navigation action.
1577*b0a7a3cfSSteve Yin * @param	pvarEndUpAt, [in,out] the end up child of this navigation action.
1578*b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1579*b0a7a3cfSSteve Yin */
15805fdc4257SSteve Yin HRESULT CMAccessible::GetNextSibling(VARIANT varStart,VARIANT* pvarEndUpAt)
15815fdc4257SSteve Yin {
1582*b0a7a3cfSSteve Yin 
1583*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1584*b0a7a3cfSSteve Yin 		ISDESTROY()
1585*b0a7a3cfSSteve Yin 		if(varStart.vt != VT_I4)
1586*b0a7a3cfSSteve Yin 		{
1587*b0a7a3cfSSteve Yin 			pvarEndUpAt->vt = VT_EMPTY;
1588*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1589*b0a7a3cfSSteve Yin 		}
1590*b0a7a3cfSSteve Yin 
1591*b0a7a3cfSSteve Yin 		Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface);
1592*b0a7a3cfSSteve Yin 		if(pRContext.is())
1593*b0a7a3cfSSteve Yin 		{
1594*b0a7a3cfSSteve Yin 			varStart.iVal = sal_Int16(pRContext->getAccessibleIndexInParent() + 2);
1595*b0a7a3cfSSteve Yin 			if(m_pIParent)
1596*b0a7a3cfSSteve Yin 				if( m_pIParent->get_accChild(varStart,&pvarEndUpAt->pdispVal) == S_OK)
1597*b0a7a3cfSSteve Yin 				{
1598*b0a7a3cfSSteve Yin 					pvarEndUpAt->vt = VT_DISPATCH;
1599*b0a7a3cfSSteve Yin 					return S_OK;
1600*b0a7a3cfSSteve Yin 				}
1601*b0a7a3cfSSteve Yin 		}
1602*b0a7a3cfSSteve Yin 		pvarEndUpAt->vt = VT_EMPTY;
1603*b0a7a3cfSSteve Yin 		return E_FAIL;
1604*b0a7a3cfSSteve Yin 
1605*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
16065fdc4257SSteve Yin }
16075fdc4257SSteve Yin 
16085fdc4257SSteve Yin /**
1609*b0a7a3cfSSteve Yin *the method GetPreSibling is general, whatever it is decendant manage or not
1610*b0a7a3cfSSteve Yin * @param	varStart, the start child id of this navigation action.
1611*b0a7a3cfSSteve Yin * @param	pvarEndUpAt, [in,out] the end up child of this navigation action.
1612*b0a7a3cfSSteve Yin * @return   S_OK if successful and E_FAIL if failure.
1613*b0a7a3cfSSteve Yin */
16145fdc4257SSteve Yin HRESULT CMAccessible::GetPreSibling(VARIANT varStart,VARIANT* pvarEndUpAt)
16155fdc4257SSteve Yin {
1616*b0a7a3cfSSteve Yin 
1617*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1618*b0a7a3cfSSteve Yin 		ISDESTROY()
1619*b0a7a3cfSSteve Yin 		// #CHECK#
1620*b0a7a3cfSSteve Yin 		if(pvarEndUpAt == NULL)
1621*b0a7a3cfSSteve Yin 		{
1622*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1623*b0a7a3cfSSteve Yin 		}
1624*b0a7a3cfSSteve Yin 		if(varStart.vt != VT_I4)
1625*b0a7a3cfSSteve Yin 		{
1626*b0a7a3cfSSteve Yin 			pvarEndUpAt->vt = VT_EMPTY;
1627*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1628*b0a7a3cfSSteve Yin 		}
1629*b0a7a3cfSSteve Yin 
1630*b0a7a3cfSSteve Yin 		Reference< XAccessibleContext > pRContext = GetContextByXAcc(pUNOInterface);
1631*b0a7a3cfSSteve Yin 		if(pRContext.is())
1632*b0a7a3cfSSteve Yin 		{
1633*b0a7a3cfSSteve Yin 			varStart.iVal = sal_Int16(pRContext->getAccessibleIndexInParent());
1634*b0a7a3cfSSteve Yin 			if(m_pIParent && varStart.iVal > 0)
1635*b0a7a3cfSSteve Yin 				if( m_pIParent->get_accChild(varStart,&pvarEndUpAt->pdispVal) == S_OK)
1636*b0a7a3cfSSteve Yin 				{
1637*b0a7a3cfSSteve Yin 					pvarEndUpAt->vt = VT_DISPATCH;
1638*b0a7a3cfSSteve Yin 					return S_OK;
1639*b0a7a3cfSSteve Yin 				}
1640*b0a7a3cfSSteve Yin 		}
1641*b0a7a3cfSSteve Yin 		pvarEndUpAt->vt = VT_EMPTY;
1642*b0a7a3cfSSteve Yin 		return E_FAIL;
1643*b0a7a3cfSSteve Yin 
1644*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
16455fdc4257SSteve Yin }
16465fdc4257SSteve Yin 
16475fdc4257SSteve Yin /**
1648*b0a7a3cfSSteve Yin * For IAccessible2 implementation methods
1649*b0a7a3cfSSteve Yin */
16505fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_nRelations( long __RPC_FAR *nRelations)
16515fdc4257SSteve Yin {
1652*b0a7a3cfSSteve Yin 
16535fdc4257SSteve Yin 	CHECK_ENABLE_INF
1654*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
16555fdc4257SSteve Yin 
1656*b0a7a3cfSSteve Yin 		// #CHECK#
1657*b0a7a3cfSSteve Yin 		if(nRelations == NULL)
1658*b0a7a3cfSSteve Yin 		{
1659*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1660*b0a7a3cfSSteve Yin 		}
16615fdc4257SSteve Yin 
1662*b0a7a3cfSSteve Yin 		*nRelations = 0;
16635fdc4257SSteve Yin 
1664*b0a7a3cfSSteve Yin 		if( !pRContext.is() )
1665*b0a7a3cfSSteve Yin 			return E_FAIL;
1666*b0a7a3cfSSteve Yin 		Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet();
1667*b0a7a3cfSSteve Yin 		if(!pRrelationSet.is())
1668*b0a7a3cfSSteve Yin 		{
1669*b0a7a3cfSSteve Yin 			*nRelations = 0;
1670*b0a7a3cfSSteve Yin 			return S_OK;
1671*b0a7a3cfSSteve Yin 		}
16725fdc4257SSteve Yin 
1673*b0a7a3cfSSteve Yin 		*nRelations = pRrelationSet->getRelationCount();
1674*b0a7a3cfSSteve Yin 		return S_OK;
16755fdc4257SSteve Yin 
1676*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
16775fdc4257SSteve Yin }
16785fdc4257SSteve Yin 
16795fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_relation( long relationIndex, IAccessibleRelation __RPC_FAR *__RPC_FAR *relation)
16805fdc4257SSteve Yin {
1681*b0a7a3cfSSteve Yin 
16825fdc4257SSteve Yin 	CHECK_ENABLE_INF
1683*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
1684*b0a7a3cfSSteve Yin 		ISDESTROY()
1685*b0a7a3cfSSteve Yin 		// #CHECK#
1686*b0a7a3cfSSteve Yin 		if(relation == NULL)
1687*b0a7a3cfSSteve Yin 		{
1688*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1689*b0a7a3cfSSteve Yin 		}
16905fdc4257SSteve Yin 
1691*b0a7a3cfSSteve Yin 		if( !pRContext.is() )
1692*b0a7a3cfSSteve Yin 			return E_FAIL;
16935fdc4257SSteve Yin 
16945fdc4257SSteve Yin 
1695*b0a7a3cfSSteve Yin 		long nMax = 0;
1696*b0a7a3cfSSteve Yin 		long nReal = 0;
1697*b0a7a3cfSSteve Yin 		get_nRelations(&nMax);
16985fdc4257SSteve Yin 
1699*b0a7a3cfSSteve Yin 		*relation = (IAccessibleRelation*)::CoTaskMemAlloc(sizeof(IAccessibleRelation));
17005fdc4257SSteve Yin 
1701*b0a7a3cfSSteve Yin 		// #CHECK Memory Allocation#
1702*b0a7a3cfSSteve Yin 		if(*relation == NULL)
1703*b0a7a3cfSSteve Yin 		{
1704*b0a7a3cfSSteve Yin 			return E_FAIL;
1705*b0a7a3cfSSteve Yin 		}
17065fdc4257SSteve Yin 
1707*b0a7a3cfSSteve Yin 		if( relationIndex < nMax )
1708*b0a7a3cfSSteve Yin 		{
17095fdc4257SSteve Yin 
17105fdc4257SSteve Yin 
1711*b0a7a3cfSSteve Yin 			Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet();
1712*b0a7a3cfSSteve Yin 			if(!pRrelationSet.is())
1713*b0a7a3cfSSteve Yin 			{
17145fdc4257SSteve Yin 
1715*b0a7a3cfSSteve Yin 				return E_FAIL;
1716*b0a7a3cfSSteve Yin 			}
17175fdc4257SSteve Yin 
1718*b0a7a3cfSSteve Yin 			IAccessibleRelation* pRelation = NULL;
1719*b0a7a3cfSSteve Yin 			ActivateActContext();
1720*b0a7a3cfSSteve Yin 			HRESULT hr = CoCreateInstance( CLSID_AccRelation, NULL, CLSCTX_SERVER ,
1721*b0a7a3cfSSteve Yin 				IID_IAccessibleRelation,
1722*b0a7a3cfSSteve Yin 				(void **)&pRelation);
1723*b0a7a3cfSSteve Yin 			DeactivateActContext();
1724*b0a7a3cfSSteve Yin 			if(SUCCEEDED(hr))
1725*b0a7a3cfSSteve Yin 			{
1726*b0a7a3cfSSteve Yin 				IUNOXWrapper* wrapper = NULL;
1727*b0a7a3cfSSteve Yin 				hr = pRelation->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper);
1728*b0a7a3cfSSteve Yin 				if(SUCCEEDED(hr))
1729*b0a7a3cfSSteve Yin 				{
1730*b0a7a3cfSSteve Yin 					AccessibleRelation accRelation = pRrelationSet->getRelation(relationIndex);
1731*b0a7a3cfSSteve Yin 					wrapper->put_XSubInterface((long)&accRelation);
1732*b0a7a3cfSSteve Yin 					wrapper->Release();
1733*b0a7a3cfSSteve Yin 					*relation = pRelation;
1734*b0a7a3cfSSteve Yin 					return S_OK;
1735*b0a7a3cfSSteve Yin 				}
17365fdc4257SSteve Yin 
1737*b0a7a3cfSSteve Yin 			}
1738*b0a7a3cfSSteve Yin 		}
17395fdc4257SSteve Yin 
1740*b0a7a3cfSSteve Yin 		return E_FAIL;
17415fdc4257SSteve Yin 
1742*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
17435fdc4257SSteve Yin }
17445fdc4257SSteve Yin 
17455fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_relations( long, IAccessibleRelation __RPC_FAR *__RPC_FAR *relation, long __RPC_FAR *nRelations)
17465fdc4257SSteve Yin {
1747*b0a7a3cfSSteve Yin 
17485fdc4257SSteve Yin 	CHECK_ENABLE_INF
1749*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
1750*b0a7a3cfSSteve Yin 
1751*b0a7a3cfSSteve Yin 		// #CHECK#
1752*b0a7a3cfSSteve Yin 		if(relation == NULL || nRelations == NULL)
1753*b0a7a3cfSSteve Yin 		{
1754*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1755*b0a7a3cfSSteve Yin 		}
1756*b0a7a3cfSSteve Yin 		// #CHECK XInterface#
1757*b0a7a3cfSSteve Yin 
1758*b0a7a3cfSSteve Yin 		if( !pRContext.is() )
1759*b0a7a3cfSSteve Yin 			return E_FAIL;
1760*b0a7a3cfSSteve Yin 
1761*b0a7a3cfSSteve Yin 		Reference<XAccessibleRelationSet> pRrelationSet = pRContext.get()->getAccessibleRelationSet();
1762*b0a7a3cfSSteve Yin 		if(!pRrelationSet.is())
1763*b0a7a3cfSSteve Yin 		{
1764*b0a7a3cfSSteve Yin 			*nRelations = 0;
1765*b0a7a3cfSSteve Yin 			return S_OK;
1766*b0a7a3cfSSteve Yin 		}
1767*b0a7a3cfSSteve Yin 
1768*b0a7a3cfSSteve Yin 		long nCount = pRrelationSet->getRelationCount();
1769*b0a7a3cfSSteve Yin 
1770*b0a7a3cfSSteve Yin 		*relation = (IAccessibleRelation*)::CoTaskMemAlloc(nCount*sizeof(IAccessibleRelation));
1771*b0a7a3cfSSteve Yin 
1772*b0a7a3cfSSteve Yin 		// #CHECK Memory Allocation#
1773*b0a7a3cfSSteve Yin 		if(*relation == NULL)
1774*b0a7a3cfSSteve Yin 		{
1775*b0a7a3cfSSteve Yin 			return E_FAIL;
1776*b0a7a3cfSSteve Yin 		}
1777*b0a7a3cfSSteve Yin 
1778*b0a7a3cfSSteve Yin 		for(int i=0; i<nCount ; i++)
1779*b0a7a3cfSSteve Yin 		{
1780*b0a7a3cfSSteve Yin 			IAccessibleRelation* pRelation = NULL;
1781*b0a7a3cfSSteve Yin 			ActivateActContext();
1782*b0a7a3cfSSteve Yin 			HRESULT hr = CoCreateInstance( CLSID_AccRelation, NULL, CLSCTX_SERVER ,
1783*b0a7a3cfSSteve Yin 				IID_IAccessibleRelation,
1784*b0a7a3cfSSteve Yin 				(void **)&pRelation);
1785*b0a7a3cfSSteve Yin 			DeactivateActContext();
1786*b0a7a3cfSSteve Yin 			if(SUCCEEDED(hr))
1787*b0a7a3cfSSteve Yin 			{
1788*b0a7a3cfSSteve Yin 				IUNOXWrapper* wrapper = NULL;
1789*b0a7a3cfSSteve Yin 				hr = pRelation->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper);
1790*b0a7a3cfSSteve Yin 				if(SUCCEEDED(hr))
1791*b0a7a3cfSSteve Yin 				{
1792*b0a7a3cfSSteve Yin 					AccessibleRelation accRelation = pRrelationSet->getRelation(i);
1793*b0a7a3cfSSteve Yin 					wrapper->put_XSubInterface((long)&accRelation);
1794*b0a7a3cfSSteve Yin 					wrapper->Release();
1795*b0a7a3cfSSteve Yin 				}
1796*b0a7a3cfSSteve Yin 				(relation)[i] = pRelation;
1797*b0a7a3cfSSteve Yin 			}
1798*b0a7a3cfSSteve Yin 		}
1799*b0a7a3cfSSteve Yin 
1800*b0a7a3cfSSteve Yin 		*nRelations = nCount;
1801*b0a7a3cfSSteve Yin 		return S_OK;
1802*b0a7a3cfSSteve Yin 
1803*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
18045fdc4257SSteve Yin }
18055fdc4257SSteve Yin 
18065fdc4257SSteve Yin STDMETHODIMP CMAccessible::role(long __RPC_FAR *role)
18075fdc4257SSteve Yin {
1808*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
18095fdc4257SSteve Yin 
1810*b0a7a3cfSSteve Yin 		(*role) = m_iRole;
18115fdc4257SSteve Yin 
1812*b0a7a3cfSSteve Yin 	return S_OK;
18135fdc4257SSteve Yin 
1814*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
18155fdc4257SSteve Yin }
18165fdc4257SSteve Yin 
18175fdc4257SSteve Yin 
18185fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_nActions(long __RPC_FAR *nActions)
18195fdc4257SSteve Yin {
1820*b0a7a3cfSSteve Yin 
1821*b0a7a3cfSSteve Yin 	try
1822*b0a7a3cfSSteve Yin 	{
1823*b0a7a3cfSSteve Yin 		ISDESTROY()
1824*b0a7a3cfSSteve Yin 			// #CHECK#
1825*b0a7a3cfSSteve Yin 			if(nActions == NULL)
1826*b0a7a3cfSSteve Yin 			{
1827*b0a7a3cfSSteve Yin 				return E_INVALIDARG;
1828*b0a7a3cfSSteve Yin 			}
1829*b0a7a3cfSSteve Yin 			*nActions = 0L;
1830*b0a7a3cfSSteve Yin 			IAccessibleAction* pAcc = NULL;
1831*b0a7a3cfSSteve Yin 			HRESULT hr = QueryInterface(IID_IAccessibleAction, (void**)&pAcc);
1832*b0a7a3cfSSteve Yin 			if( hr == S_OK )
1833*b0a7a3cfSSteve Yin 			{
1834*b0a7a3cfSSteve Yin 				pAcc->nActions(nActions);
1835*b0a7a3cfSSteve Yin 				pAcc->Release();
1836*b0a7a3cfSSteve Yin 			}
1837*b0a7a3cfSSteve Yin 
1838*b0a7a3cfSSteve Yin 			return S_OK;
1839*b0a7a3cfSSteve Yin 	}
1840*b0a7a3cfSSteve Yin 	catch(...)
1841*b0a7a3cfSSteve Yin 	{
1842*b0a7a3cfSSteve Yin 		*nActions = 0L;
1843*b0a7a3cfSSteve Yin 		return S_OK;
1844*b0a7a3cfSSteve Yin 	}
18455fdc4257SSteve Yin }
18465fdc4257SSteve Yin 
18475fdc4257SSteve Yin 
18485fdc4257SSteve Yin STDMETHODIMP CMAccessible:: scrollToPoint(enum IA2CoordinateType, long, long)
18495fdc4257SSteve Yin {
1850*b0a7a3cfSSteve Yin 
1851*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1852*b0a7a3cfSSteve Yin 	ISDESTROY()
1853*b0a7a3cfSSteve Yin 	return E_NOTIMPL;
1854*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
18555fdc4257SSteve Yin 
18565fdc4257SSteve Yin }
18575fdc4257SSteve Yin STDMETHODIMP CMAccessible:: scrollTo(enum IA2ScrollType)
18585fdc4257SSteve Yin {
18595fdc4257SSteve Yin 
1860*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
1861*b0a7a3cfSSteve Yin 	ISDESTROY()
1862*b0a7a3cfSSteve Yin 
1863*b0a7a3cfSSteve Yin 	return E_NOTIMPL;
18645fdc4257SSteve Yin 
1865*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
18665fdc4257SSteve Yin }
18675fdc4257SSteve Yin 
18685fdc4257SSteve Yin static XAccessible* getTheParentOfMember(XAccessible* pXAcc)
18695fdc4257SSteve Yin {
1870*b0a7a3cfSSteve Yin 	// #CHECK#
1871*b0a7a3cfSSteve Yin 	if(pXAcc == NULL)
1872*b0a7a3cfSSteve Yin 	{
1873*b0a7a3cfSSteve Yin 		return NULL;
1874*b0a7a3cfSSteve Yin 	}
1875*b0a7a3cfSSteve Yin 	Reference<XAccessibleContext> pRContext = pXAcc->getAccessibleContext();
1876*b0a7a3cfSSteve Yin 	Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet();
1877*b0a7a3cfSSteve Yin 	long nRelations = pRrelationSet->getRelationCount();
1878*b0a7a3cfSSteve Yin 	for(int i=0 ; i<nRelations ; i++)
1879*b0a7a3cfSSteve Yin 	{
1880*b0a7a3cfSSteve Yin 		AccessibleRelation accRelation = pRrelationSet->getRelation(i);
1881*b0a7a3cfSSteve Yin 		if(accRelation.RelationType == 7)
1882*b0a7a3cfSSteve Yin 		{
1883*b0a7a3cfSSteve Yin 			Sequence< Reference< XInterface > > xTargets = accRelation.TargetSet;
1884*b0a7a3cfSSteve Yin 			return (XAccessible*)xTargets[0].get();
1885*b0a7a3cfSSteve Yin 		}
1886*b0a7a3cfSSteve Yin 	}
1887*b0a7a3cfSSteve Yin 	return NULL;
18885fdc4257SSteve Yin }
18895fdc4257SSteve Yin 
18905fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_groupPosition(long __RPC_FAR *groupLevel,long __RPC_FAR *similarItemsInGroup,long __RPC_FAR *positionInGroup)
18915fdc4257SSteve Yin {
1892*b0a7a3cfSSteve Yin 
18935fdc4257SSteve Yin 	CHECK_ENABLE_INF
1894*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
1895*b0a7a3cfSSteve Yin 		ISDESTROY()
1896*b0a7a3cfSSteve Yin 		// #CHECK#
1897*b0a7a3cfSSteve Yin 		if(groupLevel == NULL || similarItemsInGroup == NULL || positionInGroup == NULL)
1898*b0a7a3cfSSteve Yin 		{
1899*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
1900*b0a7a3cfSSteve Yin 		}
1901*b0a7a3cfSSteve Yin 
1902*b0a7a3cfSSteve Yin 		Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
1903*b0a7a3cfSSteve Yin 		if(!pRContext.is())
1904*b0a7a3cfSSteve Yin 			return E_FAIL;
1905*b0a7a3cfSSteve Yin 		long Role = pRContext->getAccessibleRole();
1906*b0a7a3cfSSteve Yin 
1907*b0a7a3cfSSteve Yin 		*groupLevel = 0;
1908*b0a7a3cfSSteve Yin 		*similarItemsInGroup = 0;
1909*b0a7a3cfSSteve Yin 		*positionInGroup = 0;
1910*b0a7a3cfSSteve Yin 
1911*b0a7a3cfSSteve Yin 		if (Role != AccessibleRole::DOCUMENT)
1912*b0a7a3cfSSteve Yin 		{
1913*b0a7a3cfSSteve Yin 			Reference< XAccessibleGroupPosition > xGroupPosition( pRContext, UNO_QUERY );
1914*b0a7a3cfSSteve Yin 			if ( xGroupPosition.is() )
1915*b0a7a3cfSSteve Yin 			{
1916*b0a7a3cfSSteve Yin 				Sequence< sal_Int32 > rSeq = xGroupPosition->getGroupPosition( makeAny( pRContext ) );
1917*b0a7a3cfSSteve Yin 				sal_Int32* pSeq = rSeq.getArray();
1918*b0a7a3cfSSteve Yin 				if ( pSeq )
1919*b0a7a3cfSSteve Yin 				{
1920*b0a7a3cfSSteve Yin 					*groupLevel = pSeq[0];
1921*b0a7a3cfSSteve Yin 					*similarItemsInGroup = pSeq[1];
1922*b0a7a3cfSSteve Yin 					*positionInGroup = pSeq[2];
1923*b0a7a3cfSSteve Yin 					return S_OK;
1924*b0a7a3cfSSteve Yin 				}
1925*b0a7a3cfSSteve Yin 				return S_OK;
1926*b0a7a3cfSSteve Yin 			}
1927*b0a7a3cfSSteve Yin 		}
1928*b0a7a3cfSSteve Yin 
1929*b0a7a3cfSSteve Yin 		Reference< XAccessible> pParentAcc = pRContext->getAccessibleParent();
1930*b0a7a3cfSSteve Yin 		if( !pParentAcc.is() )
1931*b0a7a3cfSSteve Yin 		{
1932*b0a7a3cfSSteve Yin 			return S_OK;
1933*b0a7a3cfSSteve Yin 		}
1934*b0a7a3cfSSteve Yin 
1935*b0a7a3cfSSteve Yin 		Reference<XAccessibleContext> pRParentContext = pParentAcc->getAccessibleContext();
1936*b0a7a3cfSSteve Yin 
1937*b0a7a3cfSSteve Yin 		int level = 0;
1938*b0a7a3cfSSteve Yin 		int index = 0;
1939*b0a7a3cfSSteve Yin 		int number = 0;
1940*b0a7a3cfSSteve Yin 
1941*b0a7a3cfSSteve Yin 		if( Role ==  RADIO_BUTTON )
1942*b0a7a3cfSSteve Yin 		{
1943*b0a7a3cfSSteve Yin 			Reference<XAccessibleRelationSet> pRrelationSet = pRContext->getAccessibleRelationSet();
1944*b0a7a3cfSSteve Yin 			long nRel = pRrelationSet->getRelationCount();
1945*b0a7a3cfSSteve Yin 			for(int i=0 ; i<nRel ; i++)
1946*b0a7a3cfSSteve Yin 			{
1947*b0a7a3cfSSteve Yin 				AccessibleRelation accRelation = pRrelationSet->getRelation(i);
1948*b0a7a3cfSSteve Yin 				if(accRelation.RelationType == 7)
1949*b0a7a3cfSSteve Yin 				{
1950*b0a7a3cfSSteve Yin 					Sequence< Reference< XInterface > > xTargets = accRelation.TargetSet;
1951*b0a7a3cfSSteve Yin 					int nCount = xTargets.getLength();
1952*b0a7a3cfSSteve Yin 
1953*b0a7a3cfSSteve Yin 					Reference<XInterface> pRAcc = xTargets[0];
1954*b0a7a3cfSSteve Yin 					for(int j=0; j<pRParentContext->getAccessibleChildCount(); j++)
1955*b0a7a3cfSSteve Yin 					{
1956*b0a7a3cfSSteve Yin 						if( getTheParentOfMember(pRParentContext->getAccessibleChild(j).get())
1957*b0a7a3cfSSteve Yin 							== (XAccessible*)pRAcc.get() &&
1958*b0a7a3cfSSteve Yin 							pRParentContext->getAccessibleChild(j)->getAccessibleContext()->getAccessibleRole() == RADIO_BUTTON)
1959*b0a7a3cfSSteve Yin 							number++;
1960*b0a7a3cfSSteve Yin 						if(pRParentContext->getAccessibleChild(j).get() == pUNOInterface)
1961*b0a7a3cfSSteve Yin 							index = number;
1962*b0a7a3cfSSteve Yin 					}
1963*b0a7a3cfSSteve Yin 				}
1964*b0a7a3cfSSteve Yin 			}
1965*b0a7a3cfSSteve Yin 			*groupLevel = 1;
1966*b0a7a3cfSSteve Yin 			*similarItemsInGroup = number;
1967*b0a7a3cfSSteve Yin 			*positionInGroup = index;
1968*b0a7a3cfSSteve Yin 			return S_OK;
1969*b0a7a3cfSSteve Yin 		}
1970*b0a7a3cfSSteve Yin 
1971*b0a7a3cfSSteve Yin 		else if ( COMBO_BOX == Role )
1972*b0a7a3cfSSteve Yin 		{
1973*b0a7a3cfSSteve Yin 			*groupLevel = 1;
1974*b0a7a3cfSSteve Yin 			*similarItemsInGroup = 0;
1975*b0a7a3cfSSteve Yin 			*positionInGroup = -1;
1976*b0a7a3cfSSteve Yin 
1977*b0a7a3cfSSteve Yin 			long nCount = pRContext->getAccessibleChildCount();
1978*b0a7a3cfSSteve Yin 			if( 2 != nCount)
1979*b0a7a3cfSSteve Yin 			{
1980*b0a7a3cfSSteve Yin 				return S_OK;
1981*b0a7a3cfSSteve Yin 			}
1982*b0a7a3cfSSteve Yin 			Reference<XAccessible> xList=pRContext->getAccessibleChild(1);
1983*b0a7a3cfSSteve Yin 			if (!xList.is())
1984*b0a7a3cfSSteve Yin 			{
1985*b0a7a3cfSSteve Yin 				return S_OK;
1986*b0a7a3cfSSteve Yin 			}
1987*b0a7a3cfSSteve Yin 			Reference<XAccessibleContext> xListContext(xList,UNO_QUERY);
1988*b0a7a3cfSSteve Yin 			if (!xListContext.is())
1989*b0a7a3cfSSteve Yin 			{
1990*b0a7a3cfSSteve Yin 				return S_OK;
1991*b0a7a3cfSSteve Yin 			}
1992*b0a7a3cfSSteve Yin 			Reference<XAccessibleSelection> xListSel(xList,UNO_QUERY);
1993*b0a7a3cfSSteve Yin 			if (!xListSel.is())
1994*b0a7a3cfSSteve Yin 			{
1995*b0a7a3cfSSteve Yin 				return S_OK;
1996*b0a7a3cfSSteve Yin 			}
1997*b0a7a3cfSSteve Yin 			*similarItemsInGroup = xListContext->getAccessibleChildCount();
1998*b0a7a3cfSSteve Yin 			if (*similarItemsInGroup > 0 )
1999*b0a7a3cfSSteve Yin 			{
2000*b0a7a3cfSSteve Yin 				try
2001*b0a7a3cfSSteve Yin 				{
2002*b0a7a3cfSSteve Yin 					Reference<XAccessible> xChild = xListSel->getSelectedAccessibleChild(0);
2003*b0a7a3cfSSteve Yin 					if (xChild.is())
2004*b0a7a3cfSSteve Yin 					{
2005*b0a7a3cfSSteve Yin 						Reference<XAccessibleContext> xChildContext(xChild,UNO_QUERY);
2006*b0a7a3cfSSteve Yin 						if (xChildContext.is())
2007*b0a7a3cfSSteve Yin 						{
2008*b0a7a3cfSSteve Yin 							*positionInGroup=xChildContext->getAccessibleIndexInParent() + 1 ;
2009*b0a7a3cfSSteve Yin 							return S_OK;
2010*b0a7a3cfSSteve Yin 						}
2011*b0a7a3cfSSteve Yin 					}
2012*b0a7a3cfSSteve Yin 				}
2013*b0a7a3cfSSteve Yin 				catch(...)
2014*b0a7a3cfSSteve Yin 				{}
2015*b0a7a3cfSSteve Yin 			}
2016*b0a7a3cfSSteve Yin 			return S_OK;
2017*b0a7a3cfSSteve Yin 		}
2018*b0a7a3cfSSteve Yin 		else if ( PAGE_TAB == Role )
2019*b0a7a3cfSSteve Yin 		{
2020*b0a7a3cfSSteve Yin 			*groupLevel = 1;
2021*b0a7a3cfSSteve Yin 			*similarItemsInGroup = pRParentContext->getAccessibleChildCount();
2022*b0a7a3cfSSteve Yin 
2023*b0a7a3cfSSteve Yin 			if (*similarItemsInGroup > 0 )
2024*b0a7a3cfSSteve Yin 			{
2025*b0a7a3cfSSteve Yin 				*positionInGroup=pRContext->getAccessibleIndexInParent() + 1 ;
2026*b0a7a3cfSSteve Yin 			}
2027*b0a7a3cfSSteve Yin 			else
2028*b0a7a3cfSSteve Yin 			{
2029*b0a7a3cfSSteve Yin 				*positionInGroup = -1;
2030*b0a7a3cfSSteve Yin 			}
2031*b0a7a3cfSSteve Yin 			return S_OK;
2032*b0a7a3cfSSteve Yin 		}
2033*b0a7a3cfSSteve Yin 
2034*b0a7a3cfSSteve Yin 
2035*b0a7a3cfSSteve Yin 		BOOL isFound = FALSE;
2036*b0a7a3cfSSteve Yin 		while( pParentAcc.is() && !isFound)
2037*b0a7a3cfSSteve Yin 		{
2038*b0a7a3cfSSteve Yin 			level++;
2039*b0a7a3cfSSteve Yin 			pRParentContext = pParentAcc->getAccessibleContext();
2040*b0a7a3cfSSteve Yin 			Role = pRParentContext->getAccessibleRole();
2041*b0a7a3cfSSteve Yin 			if( (Role == TREE) || (Role == LIST) )
2042*b0a7a3cfSSteve Yin 				isFound = TRUE;
2043*b0a7a3cfSSteve Yin 			pParentAcc = pRParentContext->getAccessibleParent();
2044*b0a7a3cfSSteve Yin 		}
2045*b0a7a3cfSSteve Yin 
2046*b0a7a3cfSSteve Yin 		if( isFound )
2047*b0a7a3cfSSteve Yin 		{
2048*b0a7a3cfSSteve Yin 			Reference< XAccessible> pTempAcc = pRContext->getAccessibleParent();
2049*b0a7a3cfSSteve Yin 			pRParentContext = pTempAcc->getAccessibleContext();
2050*b0a7a3cfSSteve Yin 			*groupLevel = level;
2051*b0a7a3cfSSteve Yin 			*similarItemsInGroup = pRParentContext->getAccessibleChildCount();
2052*b0a7a3cfSSteve Yin 			*positionInGroup = pRContext->getAccessibleIndexInParent() + 1;
2053*b0a7a3cfSSteve Yin 		}
2054*b0a7a3cfSSteve Yin 		else
2055*b0a7a3cfSSteve Yin 		{
2056*b0a7a3cfSSteve Yin 			*groupLevel = 0;
2057*b0a7a3cfSSteve Yin 			*similarItemsInGroup = 0;
2058*b0a7a3cfSSteve Yin 			*positionInGroup = 0;
2059*b0a7a3cfSSteve Yin 		}
2060*b0a7a3cfSSteve Yin 		return S_OK;
2061*b0a7a3cfSSteve Yin 
2062*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
20635fdc4257SSteve Yin }
20645fdc4257SSteve Yin 
20655fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_extendedStates( long, BSTR __RPC_FAR *__RPC_FAR *, long __RPC_FAR *)
20665fdc4257SSteve Yin {
2067*b0a7a3cfSSteve Yin 
20685fdc4257SSteve Yin 	CHECK_ENABLE_INF
2069*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
2070*b0a7a3cfSSteve Yin 		ISDESTROY()
20715fdc4257SSteve Yin 
2072*b0a7a3cfSSteve Yin 		return E_NOTIMPL;
20735fdc4257SSteve Yin 
2074*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
20755fdc4257SSteve Yin }
20765fdc4257SSteve Yin 
20775fdc4257SSteve Yin 
20785fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_uniqueID(long __RPC_FAR *uniqueID)
20795fdc4257SSteve Yin {
20805fdc4257SSteve Yin 
2081*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2082*b0a7a3cfSSteve Yin 		ISDESTROY()
2083*b0a7a3cfSSteve Yin 		// #CHECK#
2084*b0a7a3cfSSteve Yin 		if(uniqueID == NULL)
2085*b0a7a3cfSSteve Yin 		{
2086*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2087*b0a7a3cfSSteve Yin 		}
2088*b0a7a3cfSSteve Yin 		*uniqueID = m_dChildID;
2089*b0a7a3cfSSteve Yin 		return S_OK;
2090*b0a7a3cfSSteve Yin 
2091*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
20925fdc4257SSteve Yin }
20935fdc4257SSteve Yin 
20945fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_windowHandle(HWND __RPC_FAR *windowHandle)
20955fdc4257SSteve Yin {
2096*b0a7a3cfSSteve Yin 
2097*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2098*b0a7a3cfSSteve Yin 		ISDESTROY()
2099*b0a7a3cfSSteve Yin 		// #CHECK#
2100*b0a7a3cfSSteve Yin 		if(windowHandle == NULL)
2101*b0a7a3cfSSteve Yin 		{
2102*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2103*b0a7a3cfSSteve Yin 		}
2104*b0a7a3cfSSteve Yin 
2105*b0a7a3cfSSteve Yin 		HWND nHwnd = m_hwnd;
2106*b0a7a3cfSSteve Yin 		IAccessible* pParent = m_pIParent;
2107*b0a7a3cfSSteve Yin 		CMAccessible* pChild = this;
2108*b0a7a3cfSSteve Yin 		while((nHwnd==0) && pParent)
2109*b0a7a3cfSSteve Yin 		{
2110*b0a7a3cfSSteve Yin 			pChild = (CMAccessible*)pParent;
2111*b0a7a3cfSSteve Yin 			if(pChild)
2112*b0a7a3cfSSteve Yin 			{
2113*b0a7a3cfSSteve Yin 				pParent = (IAccessible*)pChild->m_pIParent;
2114*b0a7a3cfSSteve Yin 				nHwnd = (HWND)pChild->m_hwnd;
2115*b0a7a3cfSSteve Yin 			}
2116*b0a7a3cfSSteve Yin 			else
2117*b0a7a3cfSSteve Yin 				pParent = NULL;
2118*b0a7a3cfSSteve Yin 		}
2119*b0a7a3cfSSteve Yin 
2120*b0a7a3cfSSteve Yin 		*windowHandle = nHwnd;
2121*b0a7a3cfSSteve Yin 		return S_OK;
2122*b0a7a3cfSSteve Yin 
2123*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
21245fdc4257SSteve Yin }
21255fdc4257SSteve Yin 
21265fdc4257SSteve Yin /**
2127*b0a7a3cfSSteve Yin * Get XAccessibleContext directly from UNO by the stored XAccessible pointer
2128*b0a7a3cfSSteve Yin * @param	pXAcc, UNO XAccessible object point.
2129*b0a7a3cfSSteve Yin * @return   XAccessibleContext*, the context of the pXAcc.
2130*b0a7a3cfSSteve Yin */
21315fdc4257SSteve Yin XAccessibleContext* CMAccessible::GetContextByXAcc( XAccessible* pXAcc )
21325fdc4257SSteve Yin {
2133*b0a7a3cfSSteve Yin 	Reference< XAccessibleContext > pRContext;
2134*b0a7a3cfSSteve Yin 	if( pXAcc == NULL)
2135*b0a7a3cfSSteve Yin 		return NULL;
21365fdc4257SSteve Yin 
2137*b0a7a3cfSSteve Yin 	pRContext = pXAcc->getAccessibleContext();
2138*b0a7a3cfSSteve Yin 	if( !pRContext.is() )
2139*b0a7a3cfSSteve Yin 		return NULL;
2140*b0a7a3cfSSteve Yin 	return pRContext.get();
21415fdc4257SSteve Yin }
21425fdc4257SSteve Yin 
21435fdc4257SSteve Yin /**
2144*b0a7a3cfSSteve Yin * Return the member variable m_pXAccessibleSelection, instead of
2145*b0a7a3cfSSteve Yin * get XAccessibleSelection according to XAccessibleContext because if so,it will
2146*b0a7a3cfSSteve Yin * depend on the UNO implementation code,so when COM is created, put XAccessibleSelection
2147*b0a7a3cfSSteve Yin * by bridge management system
2148*b0a7a3cfSSteve Yin * @return   XAccessibleSelection*, the selection of the current object.
2149*b0a7a3cfSSteve Yin */
21505fdc4257SSteve Yin Reference< XAccessibleSelection > CMAccessible::GetSelection()
21515fdc4257SSteve Yin {
2152*b0a7a3cfSSteve Yin 	if( pUNOInterface == NULL )
2153*b0a7a3cfSSteve Yin 		return NULL;
2154*b0a7a3cfSSteve Yin 	Reference< XAccessibleContext > pRContext = pUNOInterface->getAccessibleContext();
2155*b0a7a3cfSSteve Yin 	if(pRContext.is())
2156*b0a7a3cfSSteve Yin 	{
2157*b0a7a3cfSSteve Yin 		Reference< XAccessibleSelection > pRSelection(pRContext,UNO_QUERY);
2158*b0a7a3cfSSteve Yin 		return pRSelection;
2159*b0a7a3cfSSteve Yin 	}
2160*b0a7a3cfSSteve Yin 	return NULL;
21615fdc4257SSteve Yin }
21625fdc4257SSteve Yin 
21635fdc4257SSteve Yin /**
2164*b0a7a3cfSSteve Yin * Select one XAccessible item, for accSelect implementation
2165*b0a7a3cfSSteve Yin * @param	pItem, the item should be selected.
2166*b0a7a3cfSSteve Yin * @return  S_OK if successful.
2167*b0a7a3cfSSteve Yin */
21685fdc4257SSteve Yin HRESULT CMAccessible::SelectChild(XAccessible* pItem)
21695fdc4257SSteve Yin {
21705fdc4257SSteve Yin 
2171*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2172*b0a7a3cfSSteve Yin 		ISDESTROY()
2173*b0a7a3cfSSteve Yin 		XAccessibleContext* pParentContext = GetContextByXAcc( pUNOInterface );
2174*b0a7a3cfSSteve Yin 	XAccessibleContext* pContext = GetContextByXAcc( pItem );
2175*b0a7a3cfSSteve Yin 	if( pParentContext == NULL || pContext == NULL )
2176*b0a7a3cfSSteve Yin 		return E_FAIL;
2177*b0a7a3cfSSteve Yin 
2178*b0a7a3cfSSteve Yin 	Reference< XAccessibleSelection > pRSelection = GetSelection();
2179*b0a7a3cfSSteve Yin 	if( !pRSelection.is() )
2180*b0a7a3cfSSteve Yin 		return E_FAIL;
2181*b0a7a3cfSSteve Yin 	long Index = pContext->getAccessibleIndexInParent();
2182*b0a7a3cfSSteve Yin 	pRSelection->selectAccessibleChild( Index );
2183*b0a7a3cfSSteve Yin 	return S_OK;
21845fdc4257SSteve Yin 
2185*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
21865fdc4257SSteve Yin }
21875fdc4257SSteve Yin 
21885fdc4257SSteve Yin /**
2189*b0a7a3cfSSteve Yin * Deselect one XAccessible item, for accSelect implimentation
2190*b0a7a3cfSSteve Yin * @param	pItem, the item should be deselected.
2191*b0a7a3cfSSteve Yin * @return  S_OK if successful.
2192*b0a7a3cfSSteve Yin */
21935fdc4257SSteve Yin HRESULT CMAccessible::DeSelectChild(XAccessible* pItem)
21945fdc4257SSteve Yin {
21955fdc4257SSteve Yin 
2196*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2197*b0a7a3cfSSteve Yin 		ISDESTROY()
2198*b0a7a3cfSSteve Yin 		XAccessibleContext* pParentContext = GetContextByXAcc( pUNOInterface );
2199*b0a7a3cfSSteve Yin 	;
2200*b0a7a3cfSSteve Yin 	XAccessibleContext* pContext = GetContextByXAcc( pItem );
2201*b0a7a3cfSSteve Yin 	if( pParentContext == NULL || pContext == NULL )
2202*b0a7a3cfSSteve Yin 		return E_INVALIDARG;
2203*b0a7a3cfSSteve Yin 
2204*b0a7a3cfSSteve Yin 	Reference< XAccessibleSelection > pRSelection = GetSelection();
2205*b0a7a3cfSSteve Yin 	if( !pRSelection.is() )
2206*b0a7a3cfSSteve Yin 		return E_FAIL;
2207*b0a7a3cfSSteve Yin 	long Index = pContext->getAccessibleIndexInParent();
2208*b0a7a3cfSSteve Yin 	pRSelection->deselectAccessibleChild( Index );
22095fdc4257SSteve Yin 
2210*b0a7a3cfSSteve Yin 	return S_OK;
22115fdc4257SSteve Yin 
2212*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
22135fdc4257SSteve Yin }
22145fdc4257SSteve Yin 
22155fdc4257SSteve Yin /**
2216*b0a7a3cfSSteve Yin * Select multiple XAccessible items,for implementation of accSelect
2217*b0a7a3cfSSteve Yin * @param	pItem, the items should be selected.
2218*b0a7a3cfSSteve Yin * @param	size, the size of the items.
2219*b0a7a3cfSSteve Yin * @return  S_OK if successful.
2220*b0a7a3cfSSteve Yin */
22215fdc4257SSteve Yin HRESULT	CMAccessible::SelectMutipleChidren( XAccessible** pItem,int size )
22225fdc4257SSteve Yin {
22235fdc4257SSteve Yin 
2224*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2225*b0a7a3cfSSteve Yin 		ISDESTROY()
2226*b0a7a3cfSSteve Yin 		// #CHECK#
2227*b0a7a3cfSSteve Yin 		if(pItem == NULL)
2228*b0a7a3cfSSteve Yin 		{
2229*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2230*b0a7a3cfSSteve Yin 		}
2231*b0a7a3cfSSteve Yin 		for(int index = 0;index < size;index++)
2232*b0a7a3cfSSteve Yin 		{
2233*b0a7a3cfSSteve Yin 			SelectChild( pItem[index] );
2234*b0a7a3cfSSteve Yin 		}
2235*b0a7a3cfSSteve Yin 		return S_OK;
2236*b0a7a3cfSSteve Yin 
2237*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
22385fdc4257SSteve Yin }
22395fdc4257SSteve Yin 
22405fdc4257SSteve Yin /**
2241*b0a7a3cfSSteve Yin * Deselect multiple XAccessible items,for implementation of accSelect
2242*b0a7a3cfSSteve Yin * @param	pItem, the items should be selected.
2243*b0a7a3cfSSteve Yin * @param	size, the size of the items.
2244*b0a7a3cfSSteve Yin * @return  S_OK if successful.
2245*b0a7a3cfSSteve Yin */
22465fdc4257SSteve Yin HRESULT CMAccessible::DeSelectMutipleChildren( XAccessible** pItem,int size )
22475fdc4257SSteve Yin {
22485fdc4257SSteve Yin 
2249*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2250*b0a7a3cfSSteve Yin 		ISDESTROY()
2251*b0a7a3cfSSteve Yin 		// #CHECK#
2252*b0a7a3cfSSteve Yin 		if(pItem == NULL)
2253*b0a7a3cfSSteve Yin 		{
2254*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2255*b0a7a3cfSSteve Yin 		}
2256*b0a7a3cfSSteve Yin 		for(int index = 0;index < size;index++)
2257*b0a7a3cfSSteve Yin 		{
2258*b0a7a3cfSSteve Yin 			DeSelectChild( pItem[index] );
2259*b0a7a3cfSSteve Yin 		}
2260*b0a7a3cfSSteve Yin 		return S_OK;
2261*b0a7a3cfSSteve Yin 
2262*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
22635fdc4257SSteve Yin }
22645fdc4257SSteve Yin 
22655fdc4257SSteve Yin /**
2266*b0a7a3cfSSteve Yin * When COM is created, UNO set XAccessible pointer to it
2267*b0a7a3cfSSteve Yin * in order to COM can operate UNO information
2268*b0a7a3cfSSteve Yin * @param	pXAcc, the XAccessible object of current object.
2269*b0a7a3cfSSteve Yin * @return  S_OK if successful.
2270*b0a7a3cfSSteve Yin */
22715fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetXAccessible(long pXAcc)
22725fdc4257SSteve Yin {
2273*b0a7a3cfSSteve Yin 	pUNOInterface = (XAccessible*)pXAcc;
2274*b0a7a3cfSSteve Yin 	pRef = pUNOInterface;
2275*b0a7a3cfSSteve Yin 	m_pEnumVar->PutSelection(/*XAccessibleSelection*/(long)pUNOInterface);
22765fdc4257SSteve Yin 
2277*b0a7a3cfSSteve Yin 	pRContext = pUNOInterface->getAccessibleContext();
2278*b0a7a3cfSSteve Yin 	pRContextInterface = (XAccessibleContext*)pRContext.is();
22795fdc4257SSteve Yin 
2280*b0a7a3cfSSteve Yin 	return S_OK;
22815fdc4257SSteve Yin }
22825fdc4257SSteve Yin 
22835fdc4257SSteve Yin /**
2284*b0a7a3cfSSteve Yin * accSelect method has many optional flags, needs to process comprehensively
2285*b0a7a3cfSSteve Yin * Mozilla and Microsoft do not implement SELFLAG_EXTENDSELECTION flag.
2286*b0a7a3cfSSteve Yin * The implementation of this flag is a little trouble-shooting,so we also
2287*b0a7a3cfSSteve Yin * do not implement it now
2288*b0a7a3cfSSteve Yin * @param	flagsSelect, the selection flag of the select action.
2289*b0a7a3cfSSteve Yin * @param	varChild, the child object pointer of current action.
2290*b0a7a3cfSSteve Yin * @return  S_OK if successful.
2291*b0a7a3cfSSteve Yin */
22925fdc4257SSteve Yin STDMETHODIMP CMAccessible::accSelect(long flagsSelect, VARIANT varChild)
22935fdc4257SSteve Yin {
2294*b0a7a3cfSSteve Yin 
22955fdc4257SSteve Yin 	CHECK_ENABLE_INF
2296*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
2297*b0a7a3cfSSteve Yin 		ISDESTROY()
2298*b0a7a3cfSSteve Yin 		if( (flagsSelect&SELFLAG_ADDSELECTION) &&
2299*b0a7a3cfSSteve Yin 			(SELFLAG_REMOVESELECTION&flagsSelect) )
2300*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2301*b0a7a3cfSSteve Yin 
2302*b0a7a3cfSSteve Yin 	if ( (flagsSelect&SELFLAG_TAKESELECTION) &&
2303*b0a7a3cfSSteve Yin 		(
2304*b0a7a3cfSSteve Yin 		(flagsSelect&SELFLAG_ADDSELECTION) ||
2305*b0a7a3cfSSteve Yin 		(flagsSelect&SELFLAG_REMOVESELECTION) ||
2306*b0a7a3cfSSteve Yin 		(flagsSelect&SELFLAG_EXTENDSELECTION )
2307*b0a7a3cfSSteve Yin 		)
2308*b0a7a3cfSSteve Yin 		)
2309*b0a7a3cfSSteve Yin 		return E_INVALIDARG;
2310*b0a7a3cfSSteve Yin 
2311*b0a7a3cfSSteve Yin 	if ( varChild.vt !=	VT_I4 )
2312*b0a7a3cfSSteve Yin 		return E_INVALIDARG;
2313*b0a7a3cfSSteve Yin 
2314*b0a7a3cfSSteve Yin 	IMAccessible* pSelectAcc;
2315*b0a7a3cfSSteve Yin 	if( varChild.lVal == CHILDID_SELF )
2316*b0a7a3cfSSteve Yin 	{
2317*b0a7a3cfSSteve Yin 		pSelectAcc = this;
2318*b0a7a3cfSSteve Yin 		pSelectAcc->AddRef();
2319*b0a7a3cfSSteve Yin 	}
2320*b0a7a3cfSSteve Yin 	else
2321*b0a7a3cfSSteve Yin 	{
2322*b0a7a3cfSSteve Yin 		pSelectAcc = GetChildInterface(varChild.lVal);
2323*b0a7a3cfSSteve Yin 	}
2324*b0a7a3cfSSteve Yin 
2325*b0a7a3cfSSteve Yin 	if( pSelectAcc == NULL )
2326*b0a7a3cfSSteve Yin 		return E_INVALIDARG;
2327*b0a7a3cfSSteve Yin 
2328*b0a7a3cfSSteve Yin 	if( flagsSelect&SELFLAG_TAKEFOCUS )
2329*b0a7a3cfSSteve Yin 	{
2330*b0a7a3cfSSteve Yin 		long pTempUNO = 0;
2331*b0a7a3cfSSteve Yin 		pSelectAcc->GetUNOInterface( &pTempUNO);
2332*b0a7a3cfSSteve Yin 
2333*b0a7a3cfSSteve Yin 		if( pTempUNO == NULL )
2334*b0a7a3cfSSteve Yin 			return NULL;
2335*b0a7a3cfSSteve Yin 
2336*b0a7a3cfSSteve Yin 		Reference< XAccessibleContext > pRContext = ( (XAccessible*)pTempUNO)->getAccessibleContext();
2337*b0a7a3cfSSteve Yin 		Reference< XAccessibleComponent > pRComponent(pRContext,UNO_QUERY);
2338*b0a7a3cfSSteve Yin 		Reference< XAccessible > pRParentXAcc = pRContext->getAccessibleParent();
2339*b0a7a3cfSSteve Yin 		Reference< XAccessibleContext > pRParentContext = pRParentXAcc->getAccessibleContext();
2340*b0a7a3cfSSteve Yin 		Reference< XAccessibleComponent > pRParentComponent(pRParentContext,UNO_QUERY);
2341*b0a7a3cfSSteve Yin 		Reference< XAccessibleSelection > pRParentSelection(pRParentContext,UNO_QUERY);
2342*b0a7a3cfSSteve Yin 
2343*b0a7a3cfSSteve Yin 
2344*b0a7a3cfSSteve Yin 		pRComponent->grabFocus();
2345*b0a7a3cfSSteve Yin 
2346*b0a7a3cfSSteve Yin 		if( flagsSelect & SELFLAG_TAKESELECTION )
2347*b0a7a3cfSSteve Yin 		{
2348*b0a7a3cfSSteve Yin 			pRParentSelection->clearAccessibleSelection();
2349*b0a7a3cfSSteve Yin 			pRParentSelection->selectAccessibleChild( pRContext->getAccessibleIndexInParent() );
2350*b0a7a3cfSSteve Yin 		}
2351*b0a7a3cfSSteve Yin 
2352*b0a7a3cfSSteve Yin 		if( flagsSelect & SELFLAG_ADDSELECTION  )
2353*b0a7a3cfSSteve Yin 		{
2354*b0a7a3cfSSteve Yin 			pRParentSelection->selectAccessibleChild( pRContext->getAccessibleIndexInParent() );
2355*b0a7a3cfSSteve Yin 		}
2356*b0a7a3cfSSteve Yin 
2357*b0a7a3cfSSteve Yin 		if( flagsSelect & SELFLAG_REMOVESELECTION )
2358*b0a7a3cfSSteve Yin 		{
2359*b0a7a3cfSSteve Yin 			pRParentSelection->deselectAccessibleChild( pRContext->getAccessibleIndexInParent() );
2360*b0a7a3cfSSteve Yin 		}
2361*b0a7a3cfSSteve Yin 
2362*b0a7a3cfSSteve Yin 		if( flagsSelect & SELFLAG_EXTENDSELECTION  )
2363*b0a7a3cfSSteve Yin 		{
2364*b0a7a3cfSSteve Yin 			long indexInParrent = pRContext->getAccessibleIndexInParent();
2365*b0a7a3cfSSteve Yin 
2366*b0a7a3cfSSteve Yin 			if( pRParentSelection->isAccessibleChildSelected( indexInParrent + 1 ) ||
2367*b0a7a3cfSSteve Yin 				pRParentSelection->isAccessibleChildSelected( indexInParrent - 1 ) )
2368*b0a7a3cfSSteve Yin 			{
2369*b0a7a3cfSSteve Yin 				pRParentSelection->selectAccessibleChild( indexInParrent );
2370*b0a7a3cfSSteve Yin 			}
2371*b0a7a3cfSSteve Yin 		}
2372*b0a7a3cfSSteve Yin 
2373*b0a7a3cfSSteve Yin 	}
2374*b0a7a3cfSSteve Yin 
2375*b0a7a3cfSSteve Yin 	pSelectAcc->Release();
2376*b0a7a3cfSSteve Yin 	return S_OK;
2377*b0a7a3cfSSteve Yin 
2378*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
23795fdc4257SSteve Yin }
23805fdc4257SSteve Yin 
23815fdc4257SSteve Yin /**
2382*b0a7a3cfSSteve Yin * Return XAccessible interface pointer when needed
2383*b0a7a3cfSSteve Yin * @param pXAcc, [in, out] the Uno interface of the current object.
2384*b0a7a3cfSSteve Yin * @return S_OK if successful.
2385*b0a7a3cfSSteve Yin */
23865fdc4257SSteve Yin STDMETHODIMP CMAccessible::GetUNOInterface(long* pXAcc)
23875fdc4257SSteve Yin {
2388*b0a7a3cfSSteve Yin 	// #CHECK#
2389*b0a7a3cfSSteve Yin 	if(pXAcc == NULL)
2390*b0a7a3cfSSteve Yin 		return E_INVALIDARG;
23915fdc4257SSteve Yin 
2392*b0a7a3cfSSteve Yin 	*pXAcc = (long)pUNOInterface;
2393*b0a7a3cfSSteve Yin 	return S_OK;
23945fdc4257SSteve Yin }
23955fdc4257SSteve Yin 
23965fdc4257SSteve Yin /**
2397*b0a7a3cfSSteve Yin * Helper method for Implementation of get_accDefaultAction
2398*b0a7a3cfSSteve Yin * @param pAction, the default action point of the current object.
2399*b0a7a3cfSSteve Yin * @return S_OK if successful.
2400*b0a7a3cfSSteve Yin */
24015fdc4257SSteve Yin STDMETHODIMP CMAccessible::SetDefaultAction(long pAction)
24025fdc4257SSteve Yin {
2403*b0a7a3cfSSteve Yin 	m_pXAction = (XAccessibleAction*)pAction;
2404*b0a7a3cfSSteve Yin 	return S_OK;
24055fdc4257SSteve Yin }
24065fdc4257SSteve Yin 
24075fdc4257SSteve Yin /**
2408*b0a7a3cfSSteve Yin * This method is called when AT open some UI elements initially
2409*b0a7a3cfSSteve Yin * the UI element takes the default action defined here
2410*b0a7a3cfSSteve Yin * @param varChild, the child id of the defaultaction.
2411*b0a7a3cfSSteve Yin * @param pszDefaultAction,[in/out] the description of the current action.
2412*b0a7a3cfSSteve Yin * @return S_OK if successful.
2413*b0a7a3cfSSteve Yin */
24145fdc4257SSteve Yin HRESULT STDMETHODCALLTYPE CMAccessible::get_accDefaultAction(VARIANT varChild, BSTR *pszDefaultAction)
24155fdc4257SSteve Yin {
2416*b0a7a3cfSSteve Yin 
2417*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2418*b0a7a3cfSSteve Yin 		ISDESTROY()
2419*b0a7a3cfSSteve Yin 		// #CHECK#
2420*b0a7a3cfSSteve Yin 		if(pszDefaultAction == NULL)
2421*b0a7a3cfSSteve Yin 		{
2422*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2423*b0a7a3cfSSteve Yin 		}
2424*b0a7a3cfSSteve Yin 		if(varChild.vt==VT_I4)
2425*b0a7a3cfSSteve Yin 		{
2426*b0a7a3cfSSteve Yin 			if(varChild.lVal==CHILDID_SELF)
2427*b0a7a3cfSSteve Yin 			{
2428*b0a7a3cfSSteve Yin 				if( m_pXAction == NULL )
2429*b0a7a3cfSSteve Yin 					return DISP_E_MEMBERNOTFOUND;
2430*b0a7a3cfSSteve Yin 				SAFE_SYSFREESTRING(*pszDefaultAction);
2431*b0a7a3cfSSteve Yin 				*pszDefaultAction = SysAllocString(m_pszActionDescription);
2432*b0a7a3cfSSteve Yin 				return S_OK;
2433*b0a7a3cfSSteve Yin 			}
2434*b0a7a3cfSSteve Yin 
2435*b0a7a3cfSSteve Yin 			long lVal = varChild.lVal;
2436*b0a7a3cfSSteve Yin 			varChild.lVal = CHILDID_SELF;
2437*b0a7a3cfSSteve Yin 			IMAccessible *pChild = this->GetChildInterface(lVal);
2438*b0a7a3cfSSteve Yin 			if(!pChild)
2439*b0a7a3cfSSteve Yin 				return E_FAIL;
2440*b0a7a3cfSSteve Yin 			return pChild->get_accDefaultAction(varChild,pszDefaultAction);
2441*b0a7a3cfSSteve Yin 		}
2442*b0a7a3cfSSteve Yin 		return S_FALSE;
2443*b0a7a3cfSSteve Yin 
2444*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
24455fdc4257SSteve Yin }
24465fdc4257SSteve Yin 
24475fdc4257SSteve Yin /**
2448*b0a7a3cfSSteve Yin * AT call this method to operate application
2449*b0a7a3cfSSteve Yin * @param varChild, the child id of the action object.
2450*b0a7a3cfSSteve Yin * @return S_OK if successful.
2451*b0a7a3cfSSteve Yin */
24525fdc4257SSteve Yin HRESULT STDMETHODCALLTYPE CMAccessible::accDoDefaultAction(VARIANT varChild)
24535fdc4257SSteve Yin {
2454*b0a7a3cfSSteve Yin 
2455*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2456*b0a7a3cfSSteve Yin 		ISDESTROY()
2457*b0a7a3cfSSteve Yin 		if( varChild.vt != VT_I4 )
2458*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2459*b0a7a3cfSSteve Yin 	if( m_pXAction == NULL )
2460*b0a7a3cfSSteve Yin 		return E_FAIL;
2461*b0a7a3cfSSteve Yin 	if( m_pXAction->getAccessibleActionCount() == 0 )
2462*b0a7a3cfSSteve Yin 		return E_FAIL;
2463*b0a7a3cfSSteve Yin 
2464*b0a7a3cfSSteve Yin 	if(varChild.lVal==CHILDID_SELF)
2465*b0a7a3cfSSteve Yin 	{
2466*b0a7a3cfSSteve Yin 		if(m_pXAction->getAccessibleActionCount() > 0)
2467*b0a7a3cfSSteve Yin 			m_pXAction->doAccessibleAction(0);
2468*b0a7a3cfSSteve Yin 		return S_OK;
2469*b0a7a3cfSSteve Yin 	}
2470*b0a7a3cfSSteve Yin 
2471*b0a7a3cfSSteve Yin 	long lVal = varChild.lVal;
2472*b0a7a3cfSSteve Yin 	varChild.lVal = CHILDID_SELF;
2473*b0a7a3cfSSteve Yin 	IMAccessible *pChild = this->GetChildInterface(lVal);
2474*b0a7a3cfSSteve Yin 	if(!pChild)
2475*b0a7a3cfSSteve Yin 		return E_FAIL;
2476*b0a7a3cfSSteve Yin 	return pChild->accDoDefaultAction( varChild );
2477*b0a7a3cfSSteve Yin 
2478*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
24795fdc4257SSteve Yin }
24805fdc4257SSteve Yin 
24815fdc4257SSteve Yin /**
2482*b0a7a3cfSSteve Yin * UNO set description information for action to COM.
2483*b0a7a3cfSSteve Yin * @param szAction, the action description of the current object.
2484*b0a7a3cfSSteve Yin * @return S_OK if successful.
2485*b0a7a3cfSSteve Yin */
24865fdc4257SSteve Yin STDMETHODIMP CMAccessible::Put_ActionDescription( const OLECHAR* szAction)
24875fdc4257SSteve Yin {
24885fdc4257SSteve Yin 
2489*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2490*b0a7a3cfSSteve Yin 		ISDESTROY()
2491*b0a7a3cfSSteve Yin 		// #CHECK#
2492*b0a7a3cfSSteve Yin 		if(szAction == NULL)
2493*b0a7a3cfSSteve Yin 		{
2494*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2495*b0a7a3cfSSteve Yin 		}
2496*b0a7a3cfSSteve Yin 		SAFE_SYSFREESTRING(m_pszActionDescription );
2497*b0a7a3cfSSteve Yin 		m_pszActionDescription = SysAllocString( szAction );
2498*b0a7a3cfSSteve Yin 		return S_OK;
2499*b0a7a3cfSSteve Yin 
2500*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
25015fdc4257SSteve Yin }
25025fdc4257SSteve Yin 
25035fdc4257SSteve Yin BOOL CMAccessible::GetXInterfaceFromXAccessible(XAccessible* pXAcc, XInterface** ppXI, int index)
25045fdc4257SSteve Yin {
2505*b0a7a3cfSSteve Yin 	Reference< XAccessibleContext > pRContext;
2506*b0a7a3cfSSteve Yin 
2507*b0a7a3cfSSteve Yin 	switch(index)
2508*b0a7a3cfSSteve Yin 	{
2509*b0a7a3cfSSteve Yin 	case XI_COMPONENT:
2510*b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleComponent)
2511*b0a7a3cfSSteve Yin 			break;
2512*b0a7a3cfSSteve Yin 	case XI_TEXT:
2513*b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleText)
2514*b0a7a3cfSSteve Yin 			break;
2515*b0a7a3cfSSteve Yin 	case XI_EDITABLETEXT:
2516*b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleEditableText)
2517*b0a7a3cfSSteve Yin 			break;
2518*b0a7a3cfSSteve Yin 	case XI_TABLE:
2519*b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleTable)
2520*b0a7a3cfSSteve Yin 			break;
2521*b0a7a3cfSSteve Yin 	case XI_SELECTION:
2522*b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleSelection)
2523*b0a7a3cfSSteve Yin 			break;
2524*b0a7a3cfSSteve Yin 	case XI_EXTENDEDCOMP:
2525*b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleExtendedComponent)
2526*b0a7a3cfSSteve Yin 			break;
2527*b0a7a3cfSSteve Yin 	case XI_KEYBINDING:
2528*b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleKeyBinding)
2529*b0a7a3cfSSteve Yin 			break;
2530*b0a7a3cfSSteve Yin 	case XI_ACTION:
2531*b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleAction)
2532*b0a7a3cfSSteve Yin 			break;
2533*b0a7a3cfSSteve Yin 	case XI_VALUE:
2534*b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleValue)
2535*b0a7a3cfSSteve Yin 			break;
2536*b0a7a3cfSSteve Yin 	case XI_HYPERTEXT:
2537*b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleHypertext)
2538*b0a7a3cfSSteve Yin 			break;
2539*b0a7a3cfSSteve Yin 	case XI_HYPERLINK:
2540*b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleHyperlink)
2541*b0a7a3cfSSteve Yin 			break;
2542*b0a7a3cfSSteve Yin 	case XI_IMAGE:
2543*b0a7a3cfSSteve Yin 		QUERYXINTERFACE(AccessibleImage)
2544*b0a7a3cfSSteve Yin 			break;
2545*b0a7a3cfSSteve Yin 	default:
2546*b0a7a3cfSSteve Yin 		break;
2547*b0a7a3cfSSteve Yin 	}
2548*b0a7a3cfSSteve Yin 
2549*b0a7a3cfSSteve Yin 	return FALSE;
25505fdc4257SSteve Yin }
25515fdc4257SSteve Yin 
25525fdc4257SSteve Yin HRESULT WINAPI CMAccessible::SmartQI(void* pv, REFIID iid, void** ppvObject)
25535fdc4257SSteve Yin {
2554*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2555*b0a7a3cfSSteve Yin 		ISDESTROY()
2556*b0a7a3cfSSteve Yin 		if( ImplIsEqualGUID(iid,IID_IAccIdentity) ||
2557*b0a7a3cfSSteve Yin 			ImplIsEqualGUID(iid,IID_IStdMarshalInfo) ||
2558*b0a7a3cfSSteve Yin 			ImplIsEqualGUID(iid,IID_IMarshal) ||
2559*b0a7a3cfSSteve Yin 			ImplIsEqualGUID(iid,IID_IExternalConnection)||
2560*b0a7a3cfSSteve Yin 			ImplIsEqualGUID(iid,IID_IOleWindow))
2561*b0a7a3cfSSteve Yin 			return E_FAIL;
2562*b0a7a3cfSSteve Yin 
2563*b0a7a3cfSSteve Yin 
2564*b0a7a3cfSSteve Yin 	_UNO_AGGMAP_ENTRY* pMap = _GetAggEntries();
2565*b0a7a3cfSSteve Yin 	while(pMap && pMap->piid)
2566*b0a7a3cfSSteve Yin 	{
2567*b0a7a3cfSSteve Yin 		if(ImplIsEqualGUID(iid, *pMap->piid))
2568*b0a7a3cfSSteve Yin 		{
2569*b0a7a3cfSSteve Yin 			XInterface* pXI = NULL;
2570*b0a7a3cfSSteve Yin 			BOOL bFound = GetXInterfaceFromXAccessible(pUNOInterface,&pXI,pMap->XIFIndex);
2571*b0a7a3cfSSteve Yin 			if(!bFound)
2572*b0a7a3cfSSteve Yin 			{
2573*b0a7a3cfSSteve Yin 				return E_FAIL;
2574*b0a7a3cfSSteve Yin 			}
2575*b0a7a3cfSSteve Yin 
2576*b0a7a3cfSSteve Yin 			XGUIDToComObjHash::iterator pIndTemp = m_containedObjects.find( iid );
2577*b0a7a3cfSSteve Yin 			if ( pIndTemp != m_containedObjects.end() )
2578*b0a7a3cfSSteve Yin 			{
2579*b0a7a3cfSSteve Yin 				return pIndTemp->second.p->QueryInterface( iid, ppvObject );
2580*b0a7a3cfSSteve Yin 			}
2581*b0a7a3cfSSteve Yin 			else
2582*b0a7a3cfSSteve Yin 			{
2583*b0a7a3cfSSteve Yin 				ActivateActContext();
2584*b0a7a3cfSSteve Yin 				HRESULT hr = pMap->pfnCreateInstance(pv, iid, ppvObject);
2585*b0a7a3cfSSteve Yin 				DeactivateActContext();
2586*b0a7a3cfSSteve Yin 				if(hr == S_OK)
2587*b0a7a3cfSSteve Yin 				{
2588*b0a7a3cfSSteve Yin 					m_containedObjects.insert(XGUIDToComObjHash::value_type(*pMap->piid,(IUnknown*)*ppvObject));
2589*b0a7a3cfSSteve Yin 					IUNOXWrapper* wrapper = NULL;
2590*b0a7a3cfSSteve Yin 					((IUnknown*)*ppvObject)->QueryInterface(IID_IUNOXWrapper, (void**)&wrapper);
2591*b0a7a3cfSSteve Yin 					if(wrapper)
2592*b0a7a3cfSSteve Yin 					{
2593*b0a7a3cfSSteve Yin 						wrapper->put_XInterface((long)pUNOInterface);
2594*b0a7a3cfSSteve Yin 						wrapper->Release();
2595*b0a7a3cfSSteve Yin 					}
2596*b0a7a3cfSSteve Yin 					return S_OK;
2597*b0a7a3cfSSteve Yin 				}
2598*b0a7a3cfSSteve Yin 			}
2599*b0a7a3cfSSteve Yin 			return E_FAIL;
2600*b0a7a3cfSSteve Yin 		}
2601*b0a7a3cfSSteve Yin 		pMap++;
2602*b0a7a3cfSSteve Yin 	}
2603*b0a7a3cfSSteve Yin 	return E_FAIL;
2604*b0a7a3cfSSteve Yin 
2605*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
26065fdc4257SSteve Yin }
26075fdc4257SSteve Yin 
26085fdc4257SSteve Yin BOOL CMAccessible::get_IAccessibleFromXAccessible(long pXAcc, IAccessible **ppIA)
26095fdc4257SSteve Yin {
26105fdc4257SSteve Yin 
2611*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
2612*b0a7a3cfSSteve Yin 
2613*b0a7a3cfSSteve Yin 		// #CHECK#
2614*b0a7a3cfSSteve Yin 		if(ppIA == NULL)
2615*b0a7a3cfSSteve Yin 		{
2616*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
2617*b0a7a3cfSSteve Yin 		}
2618*b0a7a3cfSSteve Yin 		BOOL isGet = FALSE;
2619*b0a7a3cfSSteve Yin 		if(g_pAgent)
2620*b0a7a3cfSSteve Yin 			isGet = g_pAgent->GetIAccessibleFromXAccessible((XAccessible*)pXAcc,ppIA);
2621*b0a7a3cfSSteve Yin 
2622*b0a7a3cfSSteve Yin 		if(isGet)
2623*b0a7a3cfSSteve Yin 			return TRUE;
2624*b0a7a3cfSSteve Yin 		else
2625*b0a7a3cfSSteve Yin 			return FALSE;
26265fdc4257SSteve Yin 
2627*b0a7a3cfSSteve Yin 		LEAVE_PROTECTED_BLOCK
26285fdc4257SSteve Yin }
26295fdc4257SSteve Yin 
26305fdc4257SSteve Yin void CMAccessible::get_OLECHARFromAny(Any& pAny, OLECHAR* pChar)
26315fdc4257SSteve Yin {
2632*b0a7a3cfSSteve Yin 	// #CHECK#
2633*b0a7a3cfSSteve Yin 	if(pChar == NULL)
2634*b0a7a3cfSSteve Yin 		return;
2635*b0a7a3cfSSteve Yin 
2636*b0a7a3cfSSteve Yin 	switch(pAny.getValueTypeClass())
2637*b0a7a3cfSSteve Yin 	{
2638*b0a7a3cfSSteve Yin 	case TypeClass_CHAR:
2639*b0a7a3cfSSteve Yin 		{
2640*b0a7a3cfSSteve Yin 			sal_Int8 val;
2641*b0a7a3cfSSteve Yin 			pAny >>= val;
2642*b0a7a3cfSSteve Yin 			swprintf( pChar, L"%d", val);
2643*b0a7a3cfSSteve Yin 			break;
2644*b0a7a3cfSSteve Yin 		}
2645*b0a7a3cfSSteve Yin 	case TypeClass_BOOLEAN:
2646*b0a7a3cfSSteve Yin 		{
2647*b0a7a3cfSSteve Yin 			sal_Bool val;
2648*b0a7a3cfSSteve Yin 			pAny >>= val;
2649*b0a7a3cfSSteve Yin 			swprintf( pChar, L"%d", val);
2650*b0a7a3cfSSteve Yin 			break;
2651*b0a7a3cfSSteve Yin 		}
2652*b0a7a3cfSSteve Yin 	case TypeClass_BYTE:
2653*b0a7a3cfSSteve Yin 		{
2654*b0a7a3cfSSteve Yin 			sal_Int8 val;
2655*b0a7a3cfSSteve Yin 			pAny >>= val;
2656*b0a7a3cfSSteve Yin 			swprintf( pChar, L"%d", val);
2657*b0a7a3cfSSteve Yin 			break;
2658*b0a7a3cfSSteve Yin 		}
2659*b0a7a3cfSSteve Yin 	case TypeClass_SHORT:
2660*b0a7a3cfSSteve Yin 		{
2661*b0a7a3cfSSteve Yin 			SHORT val;
2662*b0a7a3cfSSteve Yin 			pAny >>= val;
2663*b0a7a3cfSSteve Yin 			swprintf( pChar, L"%d", val);
2664*b0a7a3cfSSteve Yin 			break;
2665*b0a7a3cfSSteve Yin 		}
2666*b0a7a3cfSSteve Yin 	case TypeClass_UNSIGNED_SHORT:
2667*b0a7a3cfSSteve Yin 		{
2668*b0a7a3cfSSteve Yin 			USHORT val;
2669*b0a7a3cfSSteve Yin 			pAny >>= val;
2670*b0a7a3cfSSteve Yin 			swprintf( pChar, L"%d", val);
2671*b0a7a3cfSSteve Yin 			break;
2672*b0a7a3cfSSteve Yin 		}
2673*b0a7a3cfSSteve Yin 	case TypeClass_LONG:
2674*b0a7a3cfSSteve Yin 		{
2675*b0a7a3cfSSteve Yin 			LONG val;
2676*b0a7a3cfSSteve Yin 			pAny >>= val;
2677*b0a7a3cfSSteve Yin 			swprintf( pChar, L"%ld", val);
2678*b0a7a3cfSSteve Yin 			break;
2679*b0a7a3cfSSteve Yin 		}
2680*b0a7a3cfSSteve Yin 	case TypeClass_UNSIGNED_LONG:
2681*b0a7a3cfSSteve Yin 		{
2682*b0a7a3cfSSteve Yin 			ULONG val;
2683*b0a7a3cfSSteve Yin 			pAny >>= val;
2684*b0a7a3cfSSteve Yin 			swprintf( pChar, L"%ld", val);
2685*b0a7a3cfSSteve Yin 			break;
2686*b0a7a3cfSSteve Yin 		}
2687*b0a7a3cfSSteve Yin 	case TypeClass_FLOAT:
2688*b0a7a3cfSSteve Yin 		{
2689*b0a7a3cfSSteve Yin 			FLOAT val;
2690*b0a7a3cfSSteve Yin 			pAny >>= val;
2691*b0a7a3cfSSteve Yin 			swprintf( pChar, L"%.3f", val);
2692*b0a7a3cfSSteve Yin 			break;
2693*b0a7a3cfSSteve Yin 		}
2694*b0a7a3cfSSteve Yin 	case TypeClass_DOUBLE:
2695*b0a7a3cfSSteve Yin 		{
2696*b0a7a3cfSSteve Yin 			DOUBLE val;
2697*b0a7a3cfSSteve Yin 			pAny >>= val;
2698*b0a7a3cfSSteve Yin 			swprintf( pChar, L"%.6lf", val);
2699*b0a7a3cfSSteve Yin 			break;
2700*b0a7a3cfSSteve Yin 		}
2701*b0a7a3cfSSteve Yin 	case TypeClass_STRING:
2702*b0a7a3cfSSteve Yin 		{
2703*b0a7a3cfSSteve Yin 			::rtl::OUString val;
2704*b0a7a3cfSSteve Yin 			pAny >>= val;
2705*b0a7a3cfSSteve Yin 			wcscpy(pChar, val.getStr());
2706*b0a7a3cfSSteve Yin 			break;
2707*b0a7a3cfSSteve Yin 		}
2708*b0a7a3cfSSteve Yin 	case TypeClass_SEQUENCE:
2709*b0a7a3cfSSteve Yin 		{
2710*b0a7a3cfSSteve Yin 			if(pAny.getValueType() == getCppuType( (Sequence< ::rtl::OUString > *)0 ) )
2711*b0a7a3cfSSteve Yin 			{
2712*b0a7a3cfSSteve Yin 				Sequence < ::rtl::OUString > val;
2713*b0a7a3cfSSteve Yin 				pAny >>= val;
2714*b0a7a3cfSSteve Yin 
2715*b0a7a3cfSSteve Yin 				::rtl::OUString pString;
2716*b0a7a3cfSSteve Yin 
2717*b0a7a3cfSSteve Yin 				int count = val.getLength();
2718*b0a7a3cfSSteve Yin 
2719*b0a7a3cfSSteve Yin 				for( int iIndex = 0;iIndex < count;iIndex++ )
2720*b0a7a3cfSSteve Yin 				{
2721*b0a7a3cfSSteve Yin 					pString += val[iIndex];
2722*b0a7a3cfSSteve Yin 				}
2723*b0a7a3cfSSteve Yin 				wcscpy(pChar, pString.getStr());
2724*b0a7a3cfSSteve Yin 			}
2725*b0a7a3cfSSteve Yin 			else if (pAny.getValueType() == getCppuType( (Sequence< ::com::sun::star::style::TabStop >* )0 ) )
2726*b0a7a3cfSSteve Yin 			{
2727*b0a7a3cfSSteve Yin 				Sequence < ::com::sun::star::style::TabStop > val;
2728*b0a7a3cfSSteve Yin 				pAny >>= val;
2729*b0a7a3cfSSteve Yin 				int count = val.getLength();
2730*b0a7a3cfSSteve Yin 
2731*b0a7a3cfSSteve Yin 				for( int iIndex = 0;iIndex < count;iIndex++ )
2732*b0a7a3cfSSteve Yin 				{
2733*b0a7a3cfSSteve Yin 					OLECHAR pAttrs[512] = {NULL};
2734*b0a7a3cfSSteve Yin 
2735*b0a7a3cfSSteve Yin 					OLECHAR pAttrsPosition[512] = {NULL};
2736*b0a7a3cfSSteve Yin 					OLECHAR pAttrsDescimalChar[512] = {NULL};
2737*b0a7a3cfSSteve Yin 					OLECHAR pAttrsFillChar[512] = {NULL};
2738*b0a7a3cfSSteve Yin 
2739*b0a7a3cfSSteve Yin 					::com::sun::star::style::TabStop sigleVal = val[iIndex];
2740*b0a7a3cfSSteve Yin 
2741*b0a7a3cfSSteve Yin 					swprintf( pAttrsPosition, L"Position=%ld,TabAlign=%ld",
2742*b0a7a3cfSSteve Yin 						sigleVal.Position, sigleVal.Alignment);
2743*b0a7a3cfSSteve Yin 
2744*b0a7a3cfSSteve Yin 					if(sigleVal.DecimalChar==';' || sigleVal.DecimalChar == ':' || sigleVal.DecimalChar == ',' ||
2745*b0a7a3cfSSteve Yin 						sigleVal.DecimalChar == '=' || sigleVal.DecimalChar == '\\')
2746*b0a7a3cfSSteve Yin 						swprintf( pAttrsDescimalChar, L"DecimalChar=\\%c",sigleVal.DecimalChar);
2747*b0a7a3cfSSteve Yin 					else
2748*b0a7a3cfSSteve Yin 						swprintf( pAttrsDescimalChar, L"DecimalChar=%c",sigleVal.DecimalChar);
2749*b0a7a3cfSSteve Yin 
2750*b0a7a3cfSSteve Yin 					if(sigleVal.FillChar==';' || sigleVal.FillChar == ':' || sigleVal.FillChar == ',' ||
2751*b0a7a3cfSSteve Yin 						sigleVal.FillChar == '=' || sigleVal.FillChar == '\\')
2752*b0a7a3cfSSteve Yin 						swprintf( pAttrsFillChar, L"FillChar=\\%c",sigleVal.FillChar);
2753*b0a7a3cfSSteve Yin 					else
2754*b0a7a3cfSSteve Yin 						swprintf( pAttrsFillChar, L"FillChar=%c",sigleVal.FillChar);
2755*b0a7a3cfSSteve Yin 
2756*b0a7a3cfSSteve Yin 					swprintf( pAttrs, L"%s,%s,%s,",pAttrsPosition,pAttrsDescimalChar,pAttrsFillChar);
2757*b0a7a3cfSSteve Yin 
2758*b0a7a3cfSSteve Yin 					wcscat(pChar,pAttrs);
2759*b0a7a3cfSSteve Yin 				}
2760*b0a7a3cfSSteve Yin 			}
2761*b0a7a3cfSSteve Yin 			break;
2762*b0a7a3cfSSteve Yin 		}
2763*b0a7a3cfSSteve Yin 	case TypeClass_ENUM:
2764*b0a7a3cfSSteve Yin 		{
2765*b0a7a3cfSSteve Yin 			if (pAny.getValueType() == getCppuType( (::com::sun::star::awt::FontSlant* )0 ) )
2766*b0a7a3cfSSteve Yin 			{
2767*b0a7a3cfSSteve Yin 				com::sun::star::awt::FontSlant val;
2768*b0a7a3cfSSteve Yin 				pAny >>= val;
2769*b0a7a3cfSSteve Yin 				swprintf( pChar, L"%d", val);
2770*b0a7a3cfSSteve Yin 			}
2771*b0a7a3cfSSteve Yin 		}
2772*b0a7a3cfSSteve Yin 	case TypeClass_STRUCT:
2773*b0a7a3cfSSteve Yin 		{
2774*b0a7a3cfSSteve Yin 			if (pAny.getValueType() == getCppuType( (::com::sun::star::style::LineSpacing* )0 ) )
2775*b0a7a3cfSSteve Yin 			{
2776*b0a7a3cfSSteve Yin 				com::sun::star::style::LineSpacing val;
2777*b0a7a3cfSSteve Yin 				pAny >>= val;
2778*b0a7a3cfSSteve Yin 				swprintf( pChar, L"Mode=%ld,Height=%ld,", val.Mode, val.Height);
2779*b0a7a3cfSSteve Yin 			}
2780*b0a7a3cfSSteve Yin 			else if (pAny.getValueType() == getCppuType( (com::sun::star::accessibility::TextSegment *)0 ) )
2781*b0a7a3cfSSteve Yin 			{
2782*b0a7a3cfSSteve Yin 				com::sun::star::accessibility::TextSegment val;
2783*b0a7a3cfSSteve Yin 				pAny >>= val;
2784*b0a7a3cfSSteve Yin 				::rtl::OUString realVal(val.SegmentText);
2785*b0a7a3cfSSteve Yin 				wcscpy(pChar, realVal.getStr());
2786*b0a7a3cfSSteve Yin 			}
2787*b0a7a3cfSSteve Yin 			break;
2788*b0a7a3cfSSteve Yin 		}
2789*b0a7a3cfSSteve Yin 	case TypeClass_VOID:
2790*b0a7a3cfSSteve Yin 	case TypeClass_HYPER:
2791*b0a7a3cfSSteve Yin 	case TypeClass_UNSIGNED_HYPER:
2792*b0a7a3cfSSteve Yin 	case TypeClass_TYPE:
2793*b0a7a3cfSSteve Yin 	case TypeClass_ANY:
2794*b0a7a3cfSSteve Yin 	case TypeClass_TYPEDEF:
2795*b0a7a3cfSSteve Yin 	case TypeClass_UNION:
2796*b0a7a3cfSSteve Yin 	case TypeClass_EXCEPTION:
2797*b0a7a3cfSSteve Yin 	case TypeClass_ARRAY:
2798*b0a7a3cfSSteve Yin 	case TypeClass_INTERFACE:
2799*b0a7a3cfSSteve Yin 	case TypeClass_SERVICE:
2800*b0a7a3cfSSteve Yin 	case TypeClass_MODULE:
2801*b0a7a3cfSSteve Yin 	case TypeClass_INTERFACE_METHOD:
2802*b0a7a3cfSSteve Yin 	case TypeClass_INTERFACE_ATTRIBUTE:
2803*b0a7a3cfSSteve Yin 	case TypeClass_UNKNOWN:
2804*b0a7a3cfSSteve Yin 	case TypeClass_PROPERTY:
2805*b0a7a3cfSSteve Yin 	case TypeClass_CONSTANT:
2806*b0a7a3cfSSteve Yin 	case TypeClass_CONSTANTS:
2807*b0a7a3cfSSteve Yin 	case TypeClass_SINGLETON:
2808*b0a7a3cfSSteve Yin 	case TypeClass_MAKE_FIXED_SIZE:
2809*b0a7a3cfSSteve Yin 		break;
2810*b0a7a3cfSSteve Yin 	default:
2811*b0a7a3cfSSteve Yin 		break;
2812*b0a7a3cfSSteve Yin 	}
28135fdc4257SSteve Yin }
28145fdc4257SSteve Yin 
28155fdc4257SSteve Yin void CMAccessible::get_OLECHAR4Numbering(const Any& pAny, short numberingLevel,const OUString& numberingPrefix,OLECHAR* pChar)
28165fdc4257SSteve Yin {
2817*b0a7a3cfSSteve Yin 	if(pChar == NULL)
2818*b0a7a3cfSSteve Yin 		return;
2819*b0a7a3cfSSteve Yin 	Reference< ::com::sun::star::container::XIndexReplace > pXIndex;
2820*b0a7a3cfSSteve Yin 	if((pAny>>=pXIndex) && (numberingLevel !=-1))//numbering level is -1,means invalid value
2821*b0a7a3cfSSteve Yin 	{
2822*b0a7a3cfSSteve Yin 		Any aAny = pXIndex->getByIndex(numberingLevel);
2823*b0a7a3cfSSteve Yin 		Sequence< ::com::sun::star::beans::PropertyValue > aProps;
2824*b0a7a3cfSSteve Yin 		aAny >>= aProps;
2825*b0a7a3cfSSteve Yin 		const ::com::sun::star::beans::PropertyValue* pPropArray = aProps.getConstArray();
2826*b0a7a3cfSSteve Yin 		sal_Int32 nCount = aProps.getLength();
2827*b0a7a3cfSSteve Yin 		swprintf(pChar,L"Numbering:NumberingLevel=%d,",numberingLevel);
2828*b0a7a3cfSSteve Yin 		for( sal_Int32 i=0; i<nCount; i++ )
2829*b0a7a3cfSSteve Yin 		{
2830*b0a7a3cfSSteve Yin 			::com::sun::star::beans::PropertyValue rProp = pPropArray[i];
2831*b0a7a3cfSSteve Yin 			if(	(rProp.Name.compareTo(OUString::createFromAscii("BulletChar"))==0)||
2832*b0a7a3cfSSteve Yin 				(rProp.Name.compareTo(OUString::createFromAscii("GraphicURL"))==0)||
2833*b0a7a3cfSSteve Yin 				(rProp.Name.compareTo(OUString::createFromAscii("NumberingType"))==0))
2834*b0a7a3cfSSteve Yin 			{
2835*b0a7a3cfSSteve Yin 				OLECHAR propStr[512] = {NULL};
2836*b0a7a3cfSSteve Yin 				swprintf(propStr,L"%s=",rProp.Name.getStr());
2837*b0a7a3cfSSteve Yin 				OLECHAR pTemp[256] = {NULL};
2838*b0a7a3cfSSteve Yin 				CMAccessible::get_OLECHARFromAny(rProp.Value,pTemp);
2839*b0a7a3cfSSteve Yin 				if(rProp.Name.compareTo(OUString::createFromAscii("GraphicURL"))==0)
2840*b0a7a3cfSSteve Yin 				{
2841*b0a7a3cfSSteve Yin 					OLECHAR* pOccur = wcschr(pTemp,':');
2842*b0a7a3cfSSteve Yin 					if(pOccur)
2843*b0a7a3cfSSteve Yin 						*pOccur = '.';
2844*b0a7a3cfSSteve Yin 				}
2845*b0a7a3cfSSteve Yin 				wcscat(propStr,pTemp);
2846*b0a7a3cfSSteve Yin 				wcscat(pChar,propStr);
2847*b0a7a3cfSSteve Yin 				wcscat(pChar,L",");
2848*b0a7a3cfSSteve Yin 
2849*b0a7a3cfSSteve Yin 				if(rProp.Name.compareTo(OUString::createFromAscii("NumberingType"))==0)
2850*b0a7a3cfSSteve Yin 				{
2851*b0a7a3cfSSteve Yin 					if(numberingPrefix.getLength()!=0)
2852*b0a7a3cfSSteve Yin 					{
2853*b0a7a3cfSSteve Yin 						swprintf(pTemp,L"NumberingPrefix=%s,",numberingPrefix.getStr());
2854*b0a7a3cfSSteve Yin 						wcscat(pChar,pTemp);
2855*b0a7a3cfSSteve Yin 					}
2856*b0a7a3cfSSteve Yin 				}
2857*b0a7a3cfSSteve Yin 			}
2858*b0a7a3cfSSteve Yin 		}
2859*b0a7a3cfSSteve Yin 	}
2860*b0a7a3cfSSteve Yin 
2861*b0a7a3cfSSteve Yin 	//Because now have three types numbering level:
2862*b0a7a3cfSSteve Yin 	//1.real numbering list,numbering level>=0 and numbering Rule !=NULL;
2863*b0a7a3cfSSteve Yin 	//2.common paragraph, numbering level >=0, and numbering Rule == NULL;
2864*b0a7a3cfSSteve Yin 	//3.TOC paragraph, numbering level >0, and numbering Rule ==NULL;
2865*b0a7a3cfSSteve Yin 	// IAText:numberinglevel base on 0, but TOC's level base on 1,
2866*b0a7a3cfSSteve Yin 	// so NumberingLevel value will be decreased 1 in bridge code.
2867*b0a7a3cfSSteve Yin 	else if(numberingLevel >0)
2868*b0a7a3cfSSteve Yin 	{
2869*b0a7a3cfSSteve Yin 		swprintf(pChar,L"Numbering:NumberingLevel=%d,NumberingType=4,NumberingPrefix=,",numberingLevel-1);
2870*b0a7a3cfSSteve Yin 	}
2871*b0a7a3cfSSteve Yin 	else
2872*b0a7a3cfSSteve Yin 	{
2873*b0a7a3cfSSteve Yin 		swprintf(pChar,L"Numbering:");
2874*b0a7a3cfSSteve Yin 	}
28755fdc4257SSteve Yin }
28765fdc4257SSteve Yin 
28775fdc4257SSteve Yin void CMAccessible::ConvertAnyToVariant(const ::com::sun::star::uno::Any &rAnyVal, VARIANT *pvData)
28785fdc4257SSteve Yin {
2879*b0a7a3cfSSteve Yin 	if(rAnyVal.hasValue())
2880*b0a7a3cfSSteve Yin 	{
2881*b0a7a3cfSSteve Yin 		// Clear VARIANT variable.
2882*b0a7a3cfSSteve Yin 		VariantClear(pvData);
2883*b0a7a3cfSSteve Yin 
2884*b0a7a3cfSSteve Yin 		// Set value according to value type.
2885*b0a7a3cfSSteve Yin 		switch(rAnyVal.getValueTypeClass())
2886*b0a7a3cfSSteve Yin 		{
2887*b0a7a3cfSSteve Yin 		case TypeClass_CHAR:
2888*b0a7a3cfSSteve Yin 			pvData->vt = VT_UI1;
2889*b0a7a3cfSSteve Yin 			memcpy(&pvData->bVal, rAnyVal.getValue(), sizeof(sal_Char));
2890*b0a7a3cfSSteve Yin 			break;
2891*b0a7a3cfSSteve Yin 
2892*b0a7a3cfSSteve Yin 		case TypeClass_BOOLEAN:
2893*b0a7a3cfSSteve Yin 			pvData->vt = VT_BOOL;
2894*b0a7a3cfSSteve Yin 			memcpy(&pvData->boolVal, rAnyVal.getValue(), sizeof(sal_Bool));
2895*b0a7a3cfSSteve Yin 			break;
2896*b0a7a3cfSSteve Yin 
2897*b0a7a3cfSSteve Yin 		case TypeClass_BYTE:
2898*b0a7a3cfSSteve Yin 			pvData->vt = VT_UI1;
2899*b0a7a3cfSSteve Yin 			memcpy(&pvData->bVal, rAnyVal.getValue(), sizeof(sal_Int8));
2900*b0a7a3cfSSteve Yin 			break;
2901*b0a7a3cfSSteve Yin 
2902*b0a7a3cfSSteve Yin 		case TypeClass_SHORT:
2903*b0a7a3cfSSteve Yin 			pvData->vt = VT_I2;
2904*b0a7a3cfSSteve Yin 			memcpy(&pvData->iVal, rAnyVal.getValue(), sizeof(sal_Int16));
2905*b0a7a3cfSSteve Yin 			break;
2906*b0a7a3cfSSteve Yin 
2907*b0a7a3cfSSteve Yin 		case TypeClass_UNSIGNED_SHORT:
2908*b0a7a3cfSSteve Yin 			pvData->vt = VT_I2;
2909*b0a7a3cfSSteve Yin 			memcpy(&pvData->iVal, rAnyVal.getValue(), sizeof(sal_uInt16));
2910*b0a7a3cfSSteve Yin 			break;
2911*b0a7a3cfSSteve Yin 
2912*b0a7a3cfSSteve Yin 		case TypeClass_LONG:
2913*b0a7a3cfSSteve Yin 			pvData->vt = VT_I4;
2914*b0a7a3cfSSteve Yin 			memcpy(&pvData->lVal, rAnyVal.getValue(), sizeof(sal_Int32));
2915*b0a7a3cfSSteve Yin 			break;
2916*b0a7a3cfSSteve Yin 
2917*b0a7a3cfSSteve Yin 		case TypeClass_UNSIGNED_LONG:
2918*b0a7a3cfSSteve Yin 			pvData->vt = VT_I4;
2919*b0a7a3cfSSteve Yin 			memcpy(&pvData->lVal, rAnyVal.getValue(), sizeof(sal_uInt32));
2920*b0a7a3cfSSteve Yin 			break;
2921*b0a7a3cfSSteve Yin 
2922*b0a7a3cfSSteve Yin 		case TypeClass_FLOAT:
2923*b0a7a3cfSSteve Yin 			pvData->vt = VT_R4;
2924*b0a7a3cfSSteve Yin 			memcpy(&pvData->fltVal, rAnyVal.getValue(), sizeof(float));
2925*b0a7a3cfSSteve Yin 			break;
2926*b0a7a3cfSSteve Yin 
2927*b0a7a3cfSSteve Yin 		case TypeClass_DOUBLE:
2928*b0a7a3cfSSteve Yin 			pvData->vt = VT_R8;
2929*b0a7a3cfSSteve Yin 			memcpy(&pvData->dblVal, rAnyVal.getValue(), sizeof(double));
2930*b0a7a3cfSSteve Yin 			break;
2931*b0a7a3cfSSteve Yin 
2932*b0a7a3cfSSteve Yin 		case TypeClass_STRING:
2933*b0a7a3cfSSteve Yin 			{
2934*b0a7a3cfSSteve Yin 				pvData->vt = VT_BSTR;
2935*b0a7a3cfSSteve Yin 				::rtl::OUString val;
2936*b0a7a3cfSSteve Yin 				rAnyVal >>= val;
2937*b0a7a3cfSSteve Yin 				pvData->bstrVal = SysAllocString((OLECHAR *)val.getStr());
2938*b0a7a3cfSSteve Yin 				break;
2939*b0a7a3cfSSteve Yin 			}
2940*b0a7a3cfSSteve Yin 
2941*b0a7a3cfSSteve Yin 		case TypeClass_VOID:
2942*b0a7a3cfSSteve Yin 		case TypeClass_HYPER:
2943*b0a7a3cfSSteve Yin 		case TypeClass_UNSIGNED_HYPER:
2944*b0a7a3cfSSteve Yin 		case TypeClass_TYPE:
2945*b0a7a3cfSSteve Yin 		case TypeClass_ANY:
2946*b0a7a3cfSSteve Yin 		case TypeClass_ENUM:
2947*b0a7a3cfSSteve Yin 		case TypeClass_TYPEDEF:
2948*b0a7a3cfSSteve Yin 		case TypeClass_STRUCT:
2949*b0a7a3cfSSteve Yin 		case TypeClass_UNION:
2950*b0a7a3cfSSteve Yin 		case TypeClass_EXCEPTION:
2951*b0a7a3cfSSteve Yin 		case TypeClass_SEQUENCE:
2952*b0a7a3cfSSteve Yin 		case TypeClass_ARRAY:
2953*b0a7a3cfSSteve Yin 		case TypeClass_INTERFACE:
2954*b0a7a3cfSSteve Yin 			{
2955*b0a7a3cfSSteve Yin 				Reference< XAccessible > pXAcc;
2956*b0a7a3cfSSteve Yin 				if(rAnyVal >>= pXAcc)
2957*b0a7a3cfSSteve Yin 				{
2958*b0a7a3cfSSteve Yin 					if(pXAcc.is())
2959*b0a7a3cfSSteve Yin 					{
2960*b0a7a3cfSSteve Yin 						IAccessible* pIAcc = NULL;
2961*b0a7a3cfSSteve Yin 						get_IAccessibleFromXAccessible((long)pXAcc.get(), &pIAcc);
2962*b0a7a3cfSSteve Yin 						if(pIAcc == NULL)
2963*b0a7a3cfSSteve Yin 						{
2964*b0a7a3cfSSteve Yin 							Reference< XAccessibleContext > pXAccContext = pXAcc->getAccessibleContext();
2965*b0a7a3cfSSteve Yin 							g_pAgent->InsertAccObj(pXAcc.get(),pXAccContext->getAccessibleParent().get());
2966*b0a7a3cfSSteve Yin 							get_IAccessibleFromXAccessible((long)pXAcc.get(), &pIAcc);
2967*b0a7a3cfSSteve Yin 						}
2968*b0a7a3cfSSteve Yin 						if(pIAcc)
2969*b0a7a3cfSSteve Yin 						{
2970*b0a7a3cfSSteve Yin 							pIAcc->AddRef();
2971*b0a7a3cfSSteve Yin 
2972*b0a7a3cfSSteve Yin 							pvData->vt = VT_UNKNOWN;
2973*b0a7a3cfSSteve Yin 							pvData->pdispVal = (IAccessible2*)pIAcc;
2974*b0a7a3cfSSteve Yin 							break;
2975*b0a7a3cfSSteve Yin 						}
2976*b0a7a3cfSSteve Yin 					}
2977*b0a7a3cfSSteve Yin 				}
2978*b0a7a3cfSSteve Yin 			}
2979*b0a7a3cfSSteve Yin 		case TypeClass_SERVICE:
2980*b0a7a3cfSSteve Yin 		case TypeClass_MODULE:
2981*b0a7a3cfSSteve Yin 		case TypeClass_INTERFACE_METHOD:
2982*b0a7a3cfSSteve Yin 		case TypeClass_INTERFACE_ATTRIBUTE:
2983*b0a7a3cfSSteve Yin 		case TypeClass_UNKNOWN:
2984*b0a7a3cfSSteve Yin 		case TypeClass_PROPERTY:
2985*b0a7a3cfSSteve Yin 		case TypeClass_CONSTANT:
2986*b0a7a3cfSSteve Yin 		case TypeClass_CONSTANTS:
2987*b0a7a3cfSSteve Yin 		case TypeClass_SINGLETON:
2988*b0a7a3cfSSteve Yin 		case TypeClass_MAKE_FIXED_SIZE:
2989*b0a7a3cfSSteve Yin 			// Output the type string, if there is other uno value type.
2990*b0a7a3cfSSteve Yin 			pvData->vt = VT_BSTR;
2991*b0a7a3cfSSteve Yin 			pvData->bstrVal = SysAllocString(rAnyVal.getValueTypeName().getStr());
2992*b0a7a3cfSSteve Yin 			break;
2993*b0a7a3cfSSteve Yin 
2994*b0a7a3cfSSteve Yin 		default:
2995*b0a7a3cfSSteve Yin 			break;
2996*b0a7a3cfSSteve Yin 		}
2997*b0a7a3cfSSteve Yin 	}
2998*b0a7a3cfSSteve Yin 	else
2999*b0a7a3cfSSteve Yin 	{
3000*b0a7a3cfSSteve Yin 		VariantClear(pvData);
3001*b0a7a3cfSSteve Yin 	}
30025fdc4257SSteve Yin }
30035fdc4257SSteve Yin 
30045fdc4257SSteve Yin STDMETHODIMP CMAccessible::Get_XAccChildID(long* childID)
30055fdc4257SSteve Yin {
3006*b0a7a3cfSSteve Yin 	// #CHECK#
3007*b0a7a3cfSSteve Yin 	if(childID == NULL)
3008*b0a7a3cfSSteve Yin 	{
3009*b0a7a3cfSSteve Yin 		return E_FAIL;
3010*b0a7a3cfSSteve Yin 	}
3011*b0a7a3cfSSteve Yin 	*childID = m_dChildID;
3012*b0a7a3cfSSteve Yin 	return S_OK;
30135fdc4257SSteve Yin }
30145fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_states(AccessibleStates __RPC_FAR *states )
30155fdc4257SSteve Yin {
3016*b0a7a3cfSSteve Yin 
30175fdc4257SSteve Yin 	CHECK_ENABLE_INF
3018*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
3019*b0a7a3cfSSteve Yin 		ISDESTROY()
3020*b0a7a3cfSSteve Yin 		// #CHECK XInterface#
3021*b0a7a3cfSSteve Yin 		if( !pRContext.is() )
3022*b0a7a3cfSSteve Yin 			return E_FAIL;
3023*b0a7a3cfSSteve Yin 
3024*b0a7a3cfSSteve Yin 	Reference<XAccessibleStateSet> pRStateSet = pRContext.get()->getAccessibleStateSet();
3025*b0a7a3cfSSteve Yin 	if(!pRStateSet.is())
3026*b0a7a3cfSSteve Yin 	{
3027*b0a7a3cfSSteve Yin 		return S_OK;
3028*b0a7a3cfSSteve Yin 	}
3029*b0a7a3cfSSteve Yin 	Sequence<short> pStates = pRStateSet->getStates();
3030*b0a7a3cfSSteve Yin 
3031*b0a7a3cfSSteve Yin 
3032*b0a7a3cfSSteve Yin 	long count = pStates.getLength() ;
3033*b0a7a3cfSSteve Yin 	*states = 0x0;
3034*b0a7a3cfSSteve Yin 	for( int i = 0; i < count; i++  )
3035*b0a7a3cfSSteve Yin 	{
3036*b0a7a3cfSSteve Yin 		for( int j = 0; j < sizeof(UNO_STATES) / sizeof(UNO_STATES[0]); j++ )
3037*b0a7a3cfSSteve Yin 		{
3038*b0a7a3cfSSteve Yin 			if( pStates[i] == UNO_STATES[j] )
3039*b0a7a3cfSSteve Yin 			{
3040*b0a7a3cfSSteve Yin 				*states |= IA2_STATES[j];
3041*b0a7a3cfSSteve Yin 				break;
3042*b0a7a3cfSSteve Yin 			}
3043*b0a7a3cfSSteve Yin 		}
3044*b0a7a3cfSSteve Yin 	}
3045*b0a7a3cfSSteve Yin 	return S_OK;
3046*b0a7a3cfSSteve Yin 
3047*b0a7a3cfSSteve Yin 
3048*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
30495fdc4257SSteve Yin }
30505fdc4257SSteve Yin 
30515fdc4257SSteve Yin // return the UNO roles
30525fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_extendedRole( BSTR __RPC_FAR *  )
30535fdc4257SSteve Yin {
3054*b0a7a3cfSSteve Yin 
30555fdc4257SSteve Yin 	CHECK_ENABLE_INF
3056*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
3057*b0a7a3cfSSteve Yin 		ISDESTROY()
30585fdc4257SSteve Yin 
3059*b0a7a3cfSSteve Yin 		return E_NOTIMPL;
30605fdc4257SSteve Yin 
3061*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
30625fdc4257SSteve Yin }
30635fdc4257SSteve Yin 
30645fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_localizedExtendedRole( BSTR __RPC_FAR *  )
30655fdc4257SSteve Yin {
30665fdc4257SSteve Yin 
3067*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
3068*b0a7a3cfSSteve Yin 		ISDESTROY()
3069*b0a7a3cfSSteve Yin 		return E_NOTIMPL;
3070*b0a7a3cfSSteve Yin 
3071*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
30725fdc4257SSteve Yin }
30735fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_nExtendedStates( long __RPC_FAR * )
30745fdc4257SSteve Yin {
3075*b0a7a3cfSSteve Yin 
30765fdc4257SSteve Yin 	CHECK_ENABLE_INF
3077*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
3078*b0a7a3cfSSteve Yin 		ISDESTROY()
30795fdc4257SSteve Yin 
3080*b0a7a3cfSSteve Yin 		return E_NOTIMPL;
30815fdc4257SSteve Yin 
3082*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
30835fdc4257SSteve Yin }
30845fdc4257SSteve Yin 
30855fdc4257SSteve Yin 
30865fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_localizedExtendedStates( long, BSTR __RPC_FAR *__RPC_FAR *, long __RPC_FAR *)
30875fdc4257SSteve Yin {
30885fdc4257SSteve Yin 
3089*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
3090*b0a7a3cfSSteve Yin 		ISDESTROY()
3091*b0a7a3cfSSteve Yin 		return E_NOTIMPL;
3092*b0a7a3cfSSteve Yin 
3093*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
30945fdc4257SSteve Yin }
30955fdc4257SSteve Yin 
30965fdc4257SSteve Yin 
30975fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_indexInParent( long __RPC_FAR *accParentIndex)
30985fdc4257SSteve Yin {
3099*b0a7a3cfSSteve Yin 
31005fdc4257SSteve Yin 	CHECK_ENABLE_INF
3101*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
3102*b0a7a3cfSSteve Yin 		ISDESTROY()
3103*b0a7a3cfSSteve Yin 		// #CHECK#
3104*b0a7a3cfSSteve Yin 		if(accParentIndex == NULL)
3105*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
31065fdc4257SSteve Yin 
3107*b0a7a3cfSSteve Yin 	// #CHECK XInterface#
3108*b0a7a3cfSSteve Yin 	if( !pRContext.is() )
3109*b0a7a3cfSSteve Yin 		return E_FAIL;
31105fdc4257SSteve Yin 
3111*b0a7a3cfSSteve Yin 	*accParentIndex = pRContext.get()->getAccessibleIndexInParent();
3112*b0a7a3cfSSteve Yin 	return S_OK;
31135fdc4257SSteve Yin 
31145fdc4257SSteve Yin 
3115*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
31165fdc4257SSteve Yin }
31175fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_locale( IA2Locale __RPC_FAR *locale  )
31185fdc4257SSteve Yin {
3119*b0a7a3cfSSteve Yin 
31205fdc4257SSteve Yin 	CHECK_ENABLE_INF
3121*b0a7a3cfSSteve Yin 		ENTER_PROTECTED_BLOCK
3122*b0a7a3cfSSteve Yin 		ISDESTROY()
3123*b0a7a3cfSSteve Yin 		if(locale == NULL)
3124*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
3125*b0a7a3cfSSteve Yin 	// #CHECK XInterface#
31265fdc4257SSteve Yin 
3127*b0a7a3cfSSteve Yin 	if( !pRContext.is() )
3128*b0a7a3cfSSteve Yin 		return E_FAIL;
31295fdc4257SSteve Yin 
3130*b0a7a3cfSSteve Yin 	::com::sun::star::lang::Locale unoLoc = pRContext.get()->getLocale();
3131*b0a7a3cfSSteve Yin 	locale->language = SysAllocString((OLECHAR*)unoLoc.Language.getStr());
3132*b0a7a3cfSSteve Yin 	locale->country = SysAllocString((OLECHAR*)unoLoc.Country.getStr());
3133*b0a7a3cfSSteve Yin 	locale->variant = SysAllocString((OLECHAR*)unoLoc.Variant.getStr());
31345fdc4257SSteve Yin 
3135*b0a7a3cfSSteve Yin 	return S_OK;
31365fdc4257SSteve Yin 
3137*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
31385fdc4257SSteve Yin }
31395fdc4257SSteve Yin 
31405fdc4257SSteve Yin DWORD GetMSAAStateFromUNO(short xState)
31415fdc4257SSteve Yin {
3142*b0a7a3cfSSteve Yin 	DWORD IState = STATE_SYSTEM_UNAVAILABLE;
3143*b0a7a3cfSSteve Yin 	switch( xState )
3144*b0a7a3cfSSteve Yin 	{
3145*b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::BUSY:
3146*b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_BUSY;
3147*b0a7a3cfSSteve Yin 		break;
3148*b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::CHECKED:
3149*b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_CHECKED;
3150*b0a7a3cfSSteve Yin 		break;
3151*b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::DEFUNC:
3152*b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_UNAVAILABLE;
3153*b0a7a3cfSSteve Yin 		break;
3154*b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::EXPANDED:
3155*b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_EXPANDED;
3156*b0a7a3cfSSteve Yin 		break;
3157*b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::FOCUSABLE:
3158*b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_FOCUSABLE;
3159*b0a7a3cfSSteve Yin 		break;
3160*b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::FOCUSED:
3161*b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_FOCUSED;
3162*b0a7a3cfSSteve Yin 		break;
3163*b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::INDETERMINATE:
3164*b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_MIXED;
3165*b0a7a3cfSSteve Yin 		break;
3166*b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::MULTI_SELECTABLE:
3167*b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_MULTISELECTABLE;
3168*b0a7a3cfSSteve Yin 		break;
3169*b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::PRESSED:
3170*b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_PRESSED;
3171*b0a7a3cfSSteve Yin 		break;
3172*b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::RESIZABLE:
3173*b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_SIZEABLE;
3174*b0a7a3cfSSteve Yin 		break;
3175*b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::SELECTABLE:
3176*b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_SELECTABLE;
3177*b0a7a3cfSSteve Yin 		break;
3178*b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::SELECTED:
3179*b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_SELECTED;
3180*b0a7a3cfSSteve Yin 		break;
3181*b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::ARMED:
3182*b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_FOCUSED;
3183*b0a7a3cfSSteve Yin 		break;
3184*b0a7a3cfSSteve Yin 	case /*AccessibleStateType::*/AccessibleStateType::EXPANDABLE:
3185*b0a7a3cfSSteve Yin 		IState = STATE_SYSTEM_COLLAPSED;
3186*b0a7a3cfSSteve Yin 		break;
3187*b0a7a3cfSSteve Yin 	default:
3188*b0a7a3cfSSteve Yin 		break;
3189*b0a7a3cfSSteve Yin 	}
3190*b0a7a3cfSSteve Yin 	return IState;
31915fdc4257SSteve Yin }
31925fdc4257SSteve Yin 
31935fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_appName( BSTR __RPC_FAR *name)
31945fdc4257SSteve Yin {
31955fdc4257SSteve Yin 
3196*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
3197*b0a7a3cfSSteve Yin 		ISDESTROY()
3198*b0a7a3cfSSteve Yin 		if(name == NULL)
3199*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
3200*b0a7a3cfSSteve Yin 
3201*b0a7a3cfSSteve Yin 	*name = SysAllocString(OLESTR("Hannover"));
3202*b0a7a3cfSSteve Yin 	return S_OK;
3203*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
32045fdc4257SSteve Yin }
32055fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_appVersion(BSTR __RPC_FAR *version)
32065fdc4257SSteve Yin {
3207*b0a7a3cfSSteve Yin 
3208*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
3209*b0a7a3cfSSteve Yin 		ISDESTROY()
3210*b0a7a3cfSSteve Yin 		if(version == NULL)
3211*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
3212*b0a7a3cfSSteve Yin 	*version=SysAllocString(OLESTR("3.0"));
3213*b0a7a3cfSSteve Yin 	return S_OK;
3214*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
32155fdc4257SSteve Yin }
32165fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_toolkitName(BSTR __RPC_FAR *name)
32175fdc4257SSteve Yin {
3218*b0a7a3cfSSteve Yin 
3219*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
3220*b0a7a3cfSSteve Yin 		ISDESTROY()
3221*b0a7a3cfSSteve Yin 		if(name == NULL)
3222*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
3223*b0a7a3cfSSteve Yin 	*name = SysAllocString(OLESTR(" "));
3224*b0a7a3cfSSteve Yin 	return S_OK;
3225*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
32265fdc4257SSteve Yin }
32275fdc4257SSteve Yin STDMETHODIMP CMAccessible:: get_toolkitVersion(BSTR __RPC_FAR *version)
32285fdc4257SSteve Yin {
3229*b0a7a3cfSSteve Yin 
3230*b0a7a3cfSSteve Yin 	ENTER_PROTECTED_BLOCK
3231*b0a7a3cfSSteve Yin 		ISDESTROY()
3232*b0a7a3cfSSteve Yin 		if(version == NULL)
3233*b0a7a3cfSSteve Yin 			return E_INVALIDARG;
3234*b0a7a3cfSSteve Yin 	*version = SysAllocString(OLESTR(" "));
3235*b0a7a3cfSSteve Yin 	return S_OK;
3236*b0a7a3cfSSteve Yin 	LEAVE_PROTECTED_BLOCK
32375fdc4257SSteve Yin }
32385fdc4257SSteve Yin 
32395fdc4257SSteve Yin 
32405fdc4257SSteve Yin STDMETHODIMP CMAccessible::get_attributes(/*[out]*/ BSTR *pAttr)
32415fdc4257SSteve Yin {
32425fdc4257SSteve Yin 	CHECK_ENABLE_INF
3243*b0a7a3cfSSteve Yin 		Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
3244*b0a7a3cfSSteve Yin 	if( !pRContext.is() )
3245*b0a7a3cfSSteve Yin 	{
3246*b0a7a3cfSSteve Yin 		return E_FAIL;
3247*b0a7a3cfSSteve Yin 	}
3248*b0a7a3cfSSteve Yin 	Reference<XAccessibleExtendedAttributes> pRXI(pRContext,UNO_QUERY);
3249*b0a7a3cfSSteve Yin 	if( !pRXI.is() )
3250*b0a7a3cfSSteve Yin 		return E_FAIL;
3251*b0a7a3cfSSteve Yin 	else
3252*b0a7a3cfSSteve Yin 	{
3253*b0a7a3cfSSteve Yin 		com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessibleExtendedAttributes> pRXAttr;
3254*b0a7a3cfSSteve Yin 		pRXAttr = pRXI.get();
3255*b0a7a3cfSSteve Yin 		::com::sun::star::uno::Any	anyVal = pRXAttr->getExtendedAttributes();
3256*b0a7a3cfSSteve Yin 
3257*b0a7a3cfSSteve Yin 		::rtl::OUString val;
3258*b0a7a3cfSSteve Yin 		anyVal >>= val;
3259*b0a7a3cfSSteve Yin 
3260*b0a7a3cfSSteve Yin 		if(*pAttr)
3261*b0a7a3cfSSteve Yin 			SAFE_SYSFREESTRING(*pAttr);
3262*b0a7a3cfSSteve Yin 		*pAttr = SysAllocString((OLECHAR *)val.getStr());
3263*b0a7a3cfSSteve Yin 
3264*b0a7a3cfSSteve Yin 		return S_OK;
3265*b0a7a3cfSSteve Yin 	}
32665fdc4257SSteve Yin }
32675fdc4257SSteve Yin 
3268